/ Hex Artifact Content
Login

Artifact 1318ab0eaad158aad791d73611c1c63c9b5e981f:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 24 49 64 3a 20 62 74 72 65 65 2e  *.** $Id: btree.
0180: 63 2c 76 20 31 2e 34 39 31 20 32 30 30 38 2f 30  c,v 1.491 2008/0
0190: 37 2f 31 39 20 31 34 3a 32 35 3a 31 36 20 64 61  7/19 14:25:16 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 30 2c 20 70 43  Cur->pKey, 0, pC
2a40: 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26 70 43  ur->nKey, 0, &pC
2a50: 75 72 2d 3e 73 6b 69 70 29 3b 0a 20 20 69 66 28  ur->skip);.  if(
2a60: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2a70: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
2a80: 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a  ee(pCur->pKey);.
2a90: 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d      pCur->pKey =
2aa0: 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
2ab0: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2ac0: 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43  RSOR_VALID || pC
2ad0: 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2ae0: 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20  OR_INVALID );.  
2af0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2b00: 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74 6f 72  ..#define restor
2b10: 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
2b20: 70 29 20 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74  p) \.  (p->eStat
2b30: 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
2b40: 45 53 45 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20  ESEEK ? \.      
2b50: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52     sqlite3BtreeR
2b60: 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
2b70: 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20  tion(p) : \.    
2b80: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a       SQLITE_OK).
2b90: 0a 2f 2a 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65  ./*.** Determine
2ba0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
2bb0: 61 20 63 75 72 73 6f 72 20 68 61 73 20 6d 6f 76  a cursor has mov
2bc0: 65 64 20 66 72 6f 6d 20 74 68 65 20 70 6f 73 69  ed from the posi
2bd0: 74 69 6f 6e 20 69 74 0a 2a 2a 20 77 61 73 20 6c  tion it.** was l
2be0: 61 73 74 20 70 6c 61 63 65 64 20 61 74 2e 20 20  ast placed at.  
2bf0: 43 75 72 73 6f 72 20 63 61 6e 20 6d 6f 76 65 20  Cursor can move 
2c00: 77 68 65 6e 20 74 68 65 20 72 6f 77 20 74 68 65  when the row the
2c10: 79 20 61 72 65 20 70 6f 69 6e 74 69 6e 67 0a 2a  y are pointing.*
2c20: 2a 20 61 74 20 69 73 20 64 65 6c 65 74 65 64 20  * at is deleted 
2c30: 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20 74  out from under t
2c40: 68 65 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  hem..**.** This 
2c50: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
2c60: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
2c70: 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20   something goes 
2c80: 77 72 6f 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 69  wrong.  The.** i
2c90: 6e 74 65 67 65 72 20 2a 70 48 61 73 4d 6f 76 65  nteger *pHasMove
2ca0: 64 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65 20  d is set to one 
2cb0: 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 68 61  if the cursor ha
2cc0: 73 20 6d 6f 76 65 64 20 61 6e 64 20 30 20 69 66  s moved and 0 if
2cd0: 20 6e 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c   not..*/.int sql
2ce0: 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 48  ite3BtreeCursorH
2cf0: 61 73 4d 6f 76 65 64 28 42 74 43 75 72 73 6f 72  asMoved(BtCursor
2d00: 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 48 61   *pCur, int *pHa
2d10: 73 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72  sMoved){.  int r
2d20: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 73 74 6f  c;..  rc = resto
2d30: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
2d40: 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
2d50: 20 29 7b 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76   ){.    *pHasMov
2d60: 65 64 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75  ed = 1;.    retu
2d70: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
2d80: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
2d90: 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70  URSOR_VALID || p
2da0: 43 75 72 2d 3e 73 6b 69 70 21 3d 30 20 29 7b 0a  Cur->skip!=0 ){.
2db0: 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d      *pHasMoved =
2dc0: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
2dd0: 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b   *pHasMoved = 0;
2de0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
2df0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
2e00: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2e10: 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
2e20: 20 47 69 76 65 6e 20 61 20 70 61 67 65 20 6e 75   Given a page nu
2e30: 6d 62 65 72 20 6f 66 20 61 20 72 65 67 75 6c 61  mber of a regula
2e40: 72 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c  r database page,
2e50: 20 72 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   return the page
2e60: 0a 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  .** number for t
2e70: 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  he pointer-map p
2e80: 61 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  age that contain
2e90: 73 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20  s the entry for 
2ea0: 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67  the.** input pag
2eb0: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61  e number..*/.sta
2ec0: 74 69 63 20 50 67 6e 6f 20 70 74 72 6d 61 70 50  tic Pgno ptrmapP
2ed0: 61 67 65 6e 6f 28 42 74 53 68 61 72 65 64 20 2a  ageno(BtShared *
2ee0: 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pBt, Pgno pgno){
2ef0: 0a 20 20 69 6e 74 20 6e 50 61 67 65 73 50 65 72  .  int nPagesPer
2f00: 4d 61 70 50 61 67 65 2c 20 69 50 74 72 4d 61 70  MapPage, iPtrMap
2f10: 2c 20 72 65 74 3b 0a 20 20 61 73 73 65 72 74 28  , ret;.  assert(
2f20: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2f30: 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
2f40: 29 3b 0a 20 20 6e 50 61 67 65 73 50 65 72 4d 61  );.  nPagesPerMa
2f50: 70 50 61 67 65 20 3d 20 28 70 42 74 2d 3e 75 73  pPage = (pBt->us
2f60: 61 62 6c 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20  ableSize/5)+1;. 
2f70: 20 69 50 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f   iPtrMap = (pgno
2f80: 2d 32 29 2f 6e 50 61 67 65 73 50 65 72 4d 61 70  -2)/nPagesPerMap
2f90: 50 61 67 65 3b 0a 20 20 72 65 74 20 3d 20 28 69  Page;.  ret = (i
2fa0: 50 74 72 4d 61 70 2a 6e 50 61 67 65 73 50 65 72  PtrMap*nPagesPer
2fb0: 4d 61 70 50 61 67 65 29 20 2b 20 32 3b 20 0a 20  MapPage) + 2; . 
2fc0: 20 69 66 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e   if( ret==PENDIN
2fd0: 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
2fe0: 20 29 7b 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20   ){.    ret++;. 
2ff0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 65 74 3b   }.  return ret;
3000: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
3010: 61 6e 20 65 6e 74 72 79 20 69 6e 74 6f 20 74 68  an entry into th
3020: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a  e pointer map..*
3030: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
3040: 65 20 75 70 64 61 74 65 73 20 74 68 65 20 70 6f  e updates the po
3050: 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79 20  inter map entry 
3060: 66 6f 72 20 70 61 67 65 20 6e 75 6d 62 65 72 20  for page number 
3070: 27 6b 65 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74  'key'.** so that
3080: 20 69 74 20 6d 61 70 73 20 74 6f 20 74 79 70 65   it maps to type
3090: 20 27 65 54 79 70 65 27 20 61 6e 64 20 70 61 72   'eType' and par
30a0: 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ent page number 
30b0: 27 70 67 6e 6f 27 2e 0a 2a 2a 20 41 6e 20 65 72  'pgno'..** An er
30c0: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
30d0: 72 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e  rned if somethin
30e0: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74  g goes wrong, ot
30f0: 68 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f  herwise SQLITE_O
3100: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
3110: 20 70 74 72 6d 61 70 50 75 74 28 42 74 53 68 61   ptrmapPut(BtSha
3120: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b  red *pBt, Pgno k
3130: 65 79 2c 20 75 38 20 65 54 79 70 65 2c 20 50 67  ey, u8 eType, Pg
3140: 6e 6f 20 70 61 72 65 6e 74 29 7b 0a 20 20 44 62  no parent){.  Db
3150: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20  Page *pDbPage;  
3160: 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d  /* The pointer m
3170: 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  ap page */.  u8 
3180: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 2f  *pPtrmap;      /
3190: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
31a0: 70 20 64 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f  p data */.  Pgno
31b0: 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a   iPtrmap;     /*
31c0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
31d0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   page number */.
31e0: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
31f0: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
3200: 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   pointer map pag
3210: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  e */.  int rc;..
3220: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3230: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
3240: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a  ->mutex) );.  /*
3250: 20 54 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   The master-jour
3260: 6e 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20  nal page number 
3270: 6d 75 73 74 20 6e 65 76 65 72 20 62 65 20 75 73  must never be us
3280: 65 64 20 61 73 20 61 20 70 6f 69 6e 74 65 72 20  ed as a pointer 
3290: 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 61 73  map page */.  as
32a0: 73 65 72 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f  sert( 0==PTRMAP_
32b0: 49 53 50 41 47 45 28 70 42 74 2c 20 50 45 4e 44  ISPAGE(pBt, PEND
32c0: 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
32d0: 74 29 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74  t)) );..  assert
32e0: 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
32f0: 6d 20 29 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d  m );.  if( key==
3300: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
3310: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
3320: 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d  KPT;.  }.  iPtrm
3330: 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41 47 45  ap = PTRMAP_PAGE
3340: 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20  NO(pBt, key);.  
3350: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
3360: 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
3370: 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44 62 50  , iPtrmap, &pDbP
3380: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
3390: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
33a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
33b0: 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41    offset = PTRMA
33c0: 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50 74 72  P_PTROFFSET(iPtr
33d0: 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 70 50 74  map, key);.  pPt
33e0: 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c  rmap = (u8 *)sql
33f0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
3400: 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69 66  (pDbPage);..  if
3410: 28 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61 70  ( eType!=pPtrmap
3420: 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74 34  [offset] || get4
3430: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
3440: 66 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74  fset+1])!=parent
3450: 20 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22   ){.    TRACE(("
3460: 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20 25  PTRMAP_UPDATE: %
3470: 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b  d->(%d,%d)\n", k
3480: 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65 6e  ey, eType, paren
3490: 74 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  t));.    rc = sq
34a0: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
34b0: 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
34c0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
34d0: 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61 70  ){.      pPtrmap
34e0: 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70 65  [offset] = eType
34f0: 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
3500: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
3510: 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20  +1], parent);.  
3520: 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74    }.  }..  sqlit
3530: 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
3540: 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Page);.  return 
3550: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  rc;.}../*.** Rea
3560: 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20  d an entry from 
3570: 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
3580: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
3590: 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74 68  ine retrieves th
35a0: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
35b0: 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b 65  try for page 'ke
35c0: 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  y', writing.** t
35d0: 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72 65  he type and pare
35e0: 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  nt page number t
35f0: 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a 70  o *pEType and *p
3600: 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65 6c  Pgno respectivel
3610: 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63  y..** An error c
3620: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
3630: 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  if something goe
3640: 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69  s wrong, otherwi
3650: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f  se SQLITE_OK..*/
3660: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d  .static int ptrm
3670: 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20 2a  apGet(BtShared *
3680: 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75  pBt, Pgno key, u
3690: 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f 20  8 *pEType, Pgno 
36a0: 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67  *pPgno){.  DbPag
36b0: 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f 2a  e *pDbPage;   /*
36c0: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   The pointer map
36d0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69   page */.  int i
36e0: 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a  Ptrmap;       /*
36f0: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67   Pointer map pag
3700: 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20  e index */.  u8 
3710: 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20  *pPtrmap;       
3720: 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70  /* Pointer map p
3730: 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  age data */.  in
3740: 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20 20  t offset;       
3750: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65 6e   /* Offset of en
3760: 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d  try in pointer m
3770: 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  ap */.  int rc;.
3780: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
3790: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
37a0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
37b0: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
37c0: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
37d0: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
37e0: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
37f0: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
3800: 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  &pDbPage);.  if(
3810: 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72 65   rc!=0 ){.    re
3820: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
3830: 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73  Ptrmap = (u8 *)s
3840: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
3850: 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20  ta(pDbPage);..  
3860: 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f  offset = PTRMAP_
3870: 50 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61  PTROFFSET(iPtrma
3880: 70 2c 20 6b 65 79 29 3b 0a 20 20 61 73 73 65 72  p, key);.  asser
3890: 74 28 20 70 45 54 79 70 65 21 3d 30 20 29 3b 0a  t( pEType!=0 );.
38a0: 20 20 2a 70 45 54 79 70 65 20 3d 20 70 50 74 72    *pEType = pPtr
38b0: 6d 61 70 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69  map[offset];.  i
38c0: 66 28 20 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e  f( pPgno ) *pPgn
38d0: 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  o = get4byte(&pP
38e0: 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29  trmap[offset+1])
38f0: 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  ;..  sqlite3Page
3900: 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
3910: 0a 20 20 69 66 28 20 2a 70 45 54 79 70 65 3c 31  .  if( *pEType<1
3920: 20 7c 7c 20 2a 70 45 54 79 70 65 3e 35 20 29 20   || *pEType>5 ) 
3930: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
3940: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65  RRUPT_BKPT;.  re
3950: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
3960: 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 64  }..#else /* if d
3970: 65 66 69 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d  efined SQLITE_OM
3980: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f  IT_AUTOVACUUM */
3990: 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61  .  #define ptrma
39a0: 70 50 75 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51  pPut(w,x,y,z) SQ
39b0: 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e  LITE_OK.  #defin
39c0: 65 20 70 74 72 6d 61 70 47 65 74 28 77 2c 78 2c  e ptrmapGet(w,x,
39d0: 79 2c 7a 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20  y,z) SQLITE_OK. 
39e0: 20 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50   #define ptrmapP
39f0: 75 74 4f 76 66 6c 28 79 2c 7a 29 20 53 51 4c 49  utOvfl(y,z) SQLI
3a00: 54 45 5f 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a  TE_OK.#endif../*
3a10: 0a 2a 2a 20 47 69 76 65 6e 20 61 20 62 74 72 65  .** Given a btre
3a20: 65 20 70 61 67 65 20 61 6e 64 20 61 20 63 65 6c  e page and a cel
3a30: 6c 20 69 6e 64 65 78 20 28 30 20 6d 65 61 6e 73  l index (0 means
3a40: 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20   the first cell 
3a50: 6f 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 2c 20  on.** the page, 
3a60: 31 20 6d 65 61 6e 73 20 74 68 65 20 73 65 63 6f  1 means the seco
3a70: 6e 64 20 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20  nd cell, and so 
3a80: 66 6f 72 74 68 29 20 72 65 74 75 72 6e 20 61 20  forth) return a 
3a90: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
3aa0: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a  e cell content..
3ab0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
3ac0: 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f  ne works only fo
3ad0: 72 20 70 61 67 65 73 20 74 68 61 74 20 64 6f 20  r pages that do 
3ae0: 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72  not contain over
3af0: 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23  flow cells..*/.#
3b00: 64 65 66 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28  define findCell(
3b10: 50 2c 49 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61  P,I) \.  ((P)->a
3b20: 44 61 74 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73  Data + ((P)->mas
3b30: 6b 50 61 67 65 20 26 20 67 65 74 32 62 79 74 65  kPage & get2byte
3b40: 28 26 28 50 29 2d 3e 61 44 61 74 61 5b 28 50 29  (&(P)->aData[(P)
3b50: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 28  ->cellOffset+2*(
3b60: 49 29 5d 29 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  I)])))../*.** Th
3b70: 69 73 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65  is a more comple
3b80: 78 20 76 65 72 73 69 6f 6e 20 6f 66 20 66 69 6e  x version of fin
3b90: 64 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f 72  dCell() that wor
3ba0: 6b 73 20 66 6f 72 0a 2a 2a 20 70 61 67 65 73 20  ks for.** pages 
3bb0: 74 68 61 74 20 64 6f 20 63 6f 6e 74 61 69 6e 20  that do contain 
3bc0: 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 20  overflow cells. 
3bd0: 20 53 65 65 20 69 6e 73 65 72 74 0a 2a 2f 0a 73   See insert.*/.s
3be0: 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64 4f 76  tatic u8 *findOv
3bf0: 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61  erflowCell(MemPa
3c00: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
3c10: 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  Cell){.  int i;.
3c20: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
3c30: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
3c40: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
3c50: 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61 67 65  );.  for(i=pPage
3c60: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69  ->nOverflow-1; i
3c70: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  >=0; i--){.    i
3c80: 6e 74 20 6b 3b 0a 20 20 20 20 73 74 72 75 63 74  nt k;.    struct
3c90: 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a 70 4f 76 66   _OvflCell *pOvf
3ca0: 6c 3b 0a 20 20 20 20 70 4f 76 66 6c 20 3d 20 26  l;.    pOvfl = &
3cb0: 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 69 5d 3b  pPage->aOvfl[i];
3cc0: 0a 20 20 20 20 6b 20 3d 20 70 4f 76 66 6c 2d 3e  .    k = pOvfl->
3cd0: 69 64 78 3b 0a 20 20 20 20 69 66 28 20 6b 3c 3d  idx;.    if( k<=
3ce0: 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69  iCell ){.      i
3cf0: 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20  f( k==iCell ){. 
3d00: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 4f         return pO
3d10: 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a 20 20 20 20  vfl->pCell;.    
3d20: 20 20 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c 2d    }.      iCell-
3d30: 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  -;.    }.  }.  r
3d40: 65 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70  eturn findCell(p
3d50: 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a  Page, iCell);.}.
3d60: 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20 63  ./*.** Parse a c
3d70: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63  ell content bloc
3d80: 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68  k and fill in th
3d90: 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63  e CellInfo struc
3da0: 74 75 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20  ture.  There.** 
3db0: 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e 73  are two versions
3dc0: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
3dd0: 6e 2e 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  n.  sqlite3Btree
3de0: 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b 65  ParseCell() take
3df0: 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 64  s a .** cell ind
3e00: 65 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ex as the second
3e10: 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 73 71   argument and sq
3e20: 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
3e30: 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61 6b  ellPtr() .** tak
3e40: 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  es a pointer to 
3e50: 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65 20  the body of the 
3e60: 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63 6f  cell as its seco
3e70: 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a  nd argument..**.
3e80: 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 66  ** Within this f
3e90: 69 6c 65 2c 20 74 68 65 20 70 61 72 73 65 43 65  ile, the parseCe
3ea0: 6c 6c 28 29 20 6d 61 63 72 6f 20 63 61 6e 20 62  ll() macro can b
3eb0: 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64  e called instead
3ec0: 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74   of.** sqlite3Bt
3ed0: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
3ee0: 29 2e 20 55 73 69 6e 67 20 73 6f 6d 65 20 63 6f  ). Using some co
3ef0: 6d 70 69 6c 65 72 73 2c 20 74 68 69 73 20 77 69  mpilers, this wi
3f00: 6c 6c 20 62 65 20 66 61 73 74 65 72 2e 0a 2a 2f  ll be faster..*/
3f10: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
3f20: 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 0a  eeParseCellPtr(.
3f30: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
3f40: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
3f50: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
3f60: 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70   cell */.  u8 *p
3f70: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
3f80: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
3f90: 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e 20   the cell text. 
3fa0: 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70  */.  CellInfo *p
3fb0: 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a 20  Info         /* 
3fc0: 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74 72  Fill in this str
3fd0: 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  ucture */.){.  i
3fe0: 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20  nt n;           
3ff0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4000: 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 20 63   bytes in cell c
4010: 6f 6e 74 65 6e 74 20 68 65 61 64 65 72 20 2a 2f  ontent header */
4020: 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b  .  u32 nPayload;
4030: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4040: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
4050: 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f   cell payload */
4060: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
4070: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
4080: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
4090: 29 20 29 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 70  ) );..  pInfo->p
40a0: 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20  Cell = pCell;.  
40b0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
40c0: 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d  eaf==0 || pPage-
40d0: 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 6e 20  >leaf==1 );.  n 
40e0: 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  = pPage->childPt
40f0: 72 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  rSize;.  assert(
4100: 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65 2d 3e 6c   n==4-4*pPage->l
4110: 65 61 66 20 29 3b 0a 20 20 69 66 28 20 70 50 61  eaf );.  if( pPa
4120: 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
4130: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
4140: 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 6e 20  Data ){.      n 
4150: 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26  += getVarint32(&
4160: 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f  pCell[n], nPaylo
4170: 61 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ad);.    }else{.
4180: 20 20 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d        nPayload =
4190: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20   0;.    }.    n 
41a0: 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26 70 43  += getVarint(&pC
41b0: 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 2a 29 26 70  ell[n], (u64*)&p
41c0: 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20  Info->nKey);.   
41d0: 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20   pInfo->nData = 
41e0: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73  nPayload;.  }els
41f0: 65 7b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44  e{.    pInfo->nD
4200: 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 6e 20 2b  ata = 0;.    n +
4210: 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 26 70  = getVarint32(&p
4220: 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61  Cell[n], nPayloa
4230: 64 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e  d);.    pInfo->n
4240: 4b 65 79 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a  Key = nPayload;.
4250: 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61    }.  pInfo->nPa
4260: 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64  yload = nPayload
4270: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48 65 61 64  ;.  pInfo->nHead
4280: 65 72 20 3d 20 6e 3b 0a 20 20 69 66 28 20 6c 69  er = n;.  if( li
4290: 6b 65 6c 79 28 6e 50 61 79 6c 6f 61 64 3c 3d 70  kely(nPayload<=p
42a0: 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 29 20  Page->maxLocal) 
42b0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69  ){.    /* This i
42c0: 73 20 74 68 65 20 28 65 61 73 79 29 20 63 6f 6d  s the (easy) com
42d0: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
42e0: 68 65 20 65 6e 74 69 72 65 20 70 61 79 6c 6f 61  he entire payloa
42f0: 64 20 66 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e  d fits.    ** on
4300: 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e   the local page.
4310: 20 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73    No overflow is
4320: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
4330: 2f 0a 20 20 20 20 69 6e 74 20 6e 53 69 7a 65 3b  /.    int nSize;
4340: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74            /* Tot
4350: 61 6c 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 20  al size of cell 
4360: 63 6f 6e 74 65 6e 74 20 69 6e 20 62 79 74 65 73  content in bytes
4370: 20 2a 2f 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20   */.    nSize = 
4380: 6e 50 61 79 6c 6f 61 64 20 2b 20 6e 3b 0a 20 20  nPayload + n;.  
4390: 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20    pInfo->nLocal 
43a0: 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20  = nPayload;.    
43b0: 70 49 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77  pInfo->iOverflow
43c0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 28 6e   = 0;.    if( (n
43d0: 53 69 7a 65 20 26 20 7e 33 29 3d 3d 30 20 29 7b  Size & ~3)==0 ){
43e0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 34  .      nSize = 4
43f0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69  ;        /* Mini
4400: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
4410: 20 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20   4 */.    }.    
4420: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e  pInfo->nSize = n
4430: 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Size;.  }else{. 
4440: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79     /* If the pay
4450: 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69  load will not fi
4460: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20  t completely on 
4470: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20  the local page, 
4480: 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74  we have.    ** t
4490: 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63  o decide how muc
44a0: 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  h to store local
44b0: 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20  ly and how much 
44c0: 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20  to spill onto.  
44d0: 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
44e0: 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65  ges.  The strate
44f0: 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a  gy is to minimiz
4500: 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
4510: 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73 70  unused.    ** sp
4520: 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20  ace on overflow 
4530: 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70  pages while keep
4540: 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ing the amount o
4550: 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a  f local storage.
4560: 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65      ** in betwee
4570: 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d  n minLocal and m
4580: 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a  axLocal..    **.
4590: 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20      ** Warning: 
45a0: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61   changing the wa
45b0: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  y overflow paylo
45c0: 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65  ad is distribute
45d0: 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20  d in any.    ** 
45e0: 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  way will result 
45f0: 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  in an incompatib
4600: 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a  le file format..
4610: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d      */.    int m
4620: 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e  inLocal;  /* Min
4630: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
4640: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
4650: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d  lly */.    int m
4660: 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78  axLocal;  /* Max
4670: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
4680: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
4690: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  lly */.    int s
46a0: 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65  urplus;   /* Ove
46b0: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76  rflow payload av
46c0: 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61  ailable for loca
46d0: 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20  l storage */..  
46e0: 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61    minLocal = pPa
46f0: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
4700: 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61    maxLocal = pPa
4710: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  ge->maxLocal;.  
4720: 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c    surplus = minL
4730: 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64  ocal + (nPayload
4740: 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50   - minLocal)%(pP
4750: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
4760: 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 69  Size - 4);.    i
4770: 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61  f( surplus <= ma
4780: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  xLocal ){.      
4790: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
47a0: 73 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c  surplus;.    }el
47b0: 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  se{.      pInfo-
47c0: 3e 6e 4c 6f 63 61 6c 20 3d 20 6d 69 6e 4c 6f 63  >nLocal = minLoc
47d0: 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  al;.    }.    pI
47e0: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d  nfo->iOverflow =
47f0: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b   pInfo->nLocal +
4800: 20 6e 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   n;.    pInfo->n
4810: 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f  Size = pInfo->iO
4820: 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d  verflow + 4;.  }
4830: 0a 7d 0a 23 64 65 66 69 6e 65 20 70 61 72 73 65  .}.#define parse
4840: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
4850: 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20 73 71  l, pInfo) \.  sq
4860: 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
4870: 65 6c 6c 50 74 72 28 28 70 50 61 67 65 29 2c 20  ellPtr((pPage), 
4880: 66 69 6e 64 43 65 6c 6c 28 28 70 50 61 67 65 29  findCell((pPage)
4890: 2c 20 28 69 43 65 6c 6c 29 29 2c 20 28 70 49 6e  , (iCell)), (pIn
48a0: 66 6f 29 29 0a 76 6f 69 64 20 73 71 6c 69 74 65  fo)).void sqlite
48b0: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
48c0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
48d0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
48e0: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
48f0: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  e cell */.  int 
4900: 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  iCell,          
4910: 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
4920: 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65  index.  First ce
4930: 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c  ll is 0 */.  Cel
4940: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
4950: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
4960: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
4970: 2f 0a 29 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c  /.){.  parseCell
4980: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70  (pPage, iCell, p
4990: 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Info);.}../*.** 
49a0: 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
49b0: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  l number of byte
49c0: 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65  s that a Cell ne
49d0: 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a  eds in the cell.
49e0: 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  ** data area of 
49f0: 74 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20  the btree-page. 
4a00: 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62   The return numb
4a10: 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  er includes the 
4a20: 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61  cell.** data hea
4a30: 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61  der and the loca
4a40: 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e  l payload, but n
4a50: 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ot any overflow 
4a60: 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73  page or.** the s
4a70: 70 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65  pace used by the
4a80: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a   cell pointer..*
4a90: 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
4aa0: 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c  .static u16 cell
4ab0: 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Size(MemPage *pP
4ac0: 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b  age, int iCell){
4ad0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
4ae0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
4af0: 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
4b00: 20 69 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   iCell, &info);.
4b10: 20 20 72 65 74 75 72 6e 20 69 6e 66 6f 2e 6e 53    return info.nS
4b20: 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 73 74  ize;.}.#endif.st
4b30: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
4b40: 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  ePtr(MemPage *pP
4b50: 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b  age, u8 *pCell){
4b60: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
4b70: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
4b80: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
4b90: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
4ba0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 66 6f  );.  return info
4bb0: 2e 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 6e 64  .nSize;.}..#ifnd
4bc0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
4bd0: 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
4be0: 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c  If the cell pCel
4bf0: 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65 20  l, part of page 
4c00: 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61  pPage contains a
4c10: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61   pointer.** to a
4c20: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
4c30: 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79   insert an entry
4c40: 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
4c50: 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65  r-map.** for the
4c60: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a   overflow page..
4c70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74  */.static int pt
4c80: 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d  rmapPutOvflPtr(M
4c90: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
4ca0: 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c  8 *pCell){.  Cel
4cb0: 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 61 73  lInfo info;.  as
4cc0: 73 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29  sert( pCell!=0 )
4cd0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
4ce0: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
4cf0: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
4d00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69 6e  );.  assert( (in
4d10: 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d  fo.nData+(pPage-
4d20: 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e  >intKey?0:info.n
4d30: 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79  Key))==info.nPay
4d40: 6c 6f 61 64 20 29 3b 0a 20 20 69 66 28 20 28 69  load );.  if( (i
4d50: 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65  nfo.nData+(pPage
4d60: 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e  ->intKey?0:info.
4d70: 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63  nKey))>info.nLoc
4d80: 61 6c 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f  al ){.    Pgno o
4d90: 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26  vfl = get4byte(&
4da0: 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
4db0: 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 72 65 74 75  flow]);.    retu
4dc0: 72 6e 20 70 74 72 6d 61 70 50 75 74 28 70 50 61  rn ptrmapPut(pPa
4dd0: 67 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50  ge->pBt, ovfl, P
4de0: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c  TRMAP_OVERFLOW1,
4df0: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
4e00: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
4e10: 54 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 49  TE_OK;.}./*.** I
4e20: 66 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20  f the cell with 
4e30: 69 6e 64 65 78 20 69 43 65 6c 6c 20 6f 6e 20 70  index iCell on p
4e40: 61 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69  age pPage contai
4e50: 6e 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  ns a pointer.** 
4e60: 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
4e70: 61 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65  age, insert an e
4e80: 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f  ntry into the po
4e90: 69 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72  inter-map.** for
4ea0: 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61   the overflow pa
4eb0: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ge..*/.static in
4ec0: 74 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28  t ptrmapPutOvfl(
4ed0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
4ee0: 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 75 38  int iCell){.  u8
4ef0: 20 2a 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72   *pCell;.  asser
4f00: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
4f10: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
4f20: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 43  ->mutex) );.  pC
4f30: 65 6c 6c 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c  ell = findOverfl
4f40: 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  owCell(pPage, iC
4f50: 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ell);.  return p
4f60: 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
4f70: 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 7d  pPage, pCell);.}
4f80: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
4f90: 44 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70  Defragment the p
4fa0: 61 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20  age given.  All 
4fb0: 43 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20  Cells are moved 
4fc0: 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66  to the.** end of
4fd0: 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c   the page and al
4fe0: 6c 20 66 72 65 65 20 73 70 61 63 65 20 69 73 20  l free space is 
4ff0: 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f  collected into o
5000: 6e 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c  ne.** big FreeBl
5010: 6b 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e  k that occurs in
5020: 20 62 65 74 77 65 65 6e 20 74 68 65 20 68 65 61   between the hea
5030: 64 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20  der and cell.** 
5040: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e  pointer array an
5050: 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  d the cell conte
5060: 6e 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74  nt area..*/.stat
5070: 69 63 20 76 6f 69 64 20 64 65 66 72 61 67 6d 65  ic void defragme
5080: 6e 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  ntPage(MemPage *
5090: 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
50a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50b0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
50c0: 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63  nter */.  int pc
50d0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
50e0: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
50f0: 6f 66 20 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a  of a i-th cell *
5100: 2f 0a 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20  /.  int addr;   
5110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5120: 2a 20 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73  * Offset of firs
5130: 74 20 62 79 74 65 20 61 66 74 65 72 20 63 65 6c  t byte after cel
5140: 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20  l pointer array 
5150: 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
5160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5170: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
5180: 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
5190: 20 20 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20    int size;     
51a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
51b0: 53 69 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a  Size of a cell *
51c0: 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
51d0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ze;            /
51e0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62  * Number of usab
51f0: 6c 65 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61  le bytes on a pa
5200: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  ge */.  int cell
5210: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
5220: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
5230: 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  the cell pointer
5240: 20 61 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20   array */.  int 
5250: 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  brk;            
5260: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
5270: 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   to the cell con
5280: 74 65 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69  tent area */.  i
5290: 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20  nt nCell;       
52a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
52b0: 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20  ber of cells on 
52c0: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e  the page */.  un
52d0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
52e0: 61 3b 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  a;       /* The 
52f0: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75  page data */.  u
5300: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65  nsigned char *te
5310: 6d 70 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  mp;       /* Tem
5320: 70 20 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20  p area for cell 
5330: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73  content */..  as
5340: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
5350: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
5360: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
5370: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
5380: 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73  ->pBt!=0 );.  as
5390: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74  sert( pPage->pBt
53a0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20  ->usableSize <= 
53b0: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
53c0: 53 49 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIZE );.  assert
53d0: 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
53e0: 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ow==0 );.  asser
53f0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
5400: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
5410: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65  ->mutex) );.  te
5420: 6d 70 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  mp = sqlite3Page
5430: 72 54 65 6d 70 53 70 61 63 65 28 70 50 61 67 65  rTempSpace(pPage
5440: 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
5450: 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
5460: 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70  aData;.  hdr = p
5470: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
5480: 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  .  cellOffset = 
5490: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
54a0: 74 3b 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61  t;.  nCell = pPa
54b0: 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73  ge->nCell;.  ass
54c0: 65 72 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32  ert( nCell==get2
54d0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33  byte(&data[hdr+3
54e0: 5d 29 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69  ]) );.  usableSi
54f0: 7a 65 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d  ze = pPage->pBt-
5500: 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 62  >usableSize;.  b
5510: 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  rk = get2byte(&d
5520: 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d  ata[hdr+5]);.  m
5530: 65 6d 63 70 79 28 26 74 65 6d 70 5b 62 72 6b 5d  emcpy(&temp[brk]
5540: 2c 20 26 64 61 74 61 5b 62 72 6b 5d 2c 20 75 73  , &data[brk], us
5550: 61 62 6c 65 53 69 7a 65 20 2d 20 62 72 6b 29 3b  ableSize - brk);
5560: 0a 20 20 62 72 6b 20 3d 20 75 73 61 62 6c 65 53  .  brk = usableS
5570: 69 7a 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ize;.  for(i=0; 
5580: 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
5590: 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20 20 20     u8 *pAddr;   
55a0: 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20 63 65    /* The i-th ce
55b0: 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
55c0: 20 20 70 41 64 64 72 20 3d 20 26 64 61 74 61 5b    pAddr = &data[
55d0: 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69 2a 32  cellOffset + i*2
55e0: 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65 74 32  ];.    pc = get2
55f0: 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20 20 20  byte(pAddr);.   
5600: 20 61 73 73 65 72 74 28 20 70 63 3c 70 50 61 67   assert( pc<pPag
5610: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
5620: 7a 65 20 29 3b 0a 20 20 20 20 73 69 7a 65 20 3d  ze );.    size =
5630: 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
5640: 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29 3b 0a  ge, &temp[pc]);.
5650: 20 20 20 20 62 72 6b 20 2d 3d 20 73 69 7a 65 3b      brk -= size;
5660: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
5670: 61 5b 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63  a[brk], &temp[pc
5680: 5d 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75  ], size);.    pu
5690: 74 32 62 79 74 65 28 70 41 64 64 72 2c 20 62 72  t2byte(pAddr, br
56a0: 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  k);.  }.  assert
56b0: 28 20 62 72 6b 3e 3d 63 65 6c 6c 4f 66 66 73 65  ( brk>=cellOffse
56c0: 74 2b 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 70  t+2*nCell );.  p
56d0: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  ut2byte(&data[hd
56e0: 72 2b 35 5d 2c 20 62 72 6b 29 3b 0a 20 20 64 61  r+5], brk);.  da
56f0: 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b 0a 20  ta[hdr+1] = 0;. 
5700: 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d 20 30   data[hdr+2] = 0
5710: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  ;.  data[hdr+7] 
5720: 3d 20 30 3b 0a 20 20 61 64 64 72 20 3d 20 63 65  = 0;.  addr = ce
5730: 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c  llOffset+2*nCell
5740: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
5750: 5b 61 64 64 72 5d 2c 20 30 2c 20 62 72 6b 2d 61  [addr], 0, brk-a
5760: 64 64 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ddr);.}../*.** A
5770: 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79  llocate nByte by
5780: 74 65 73 20 6f 66 20 73 70 61 63 65 20 6f 6e 20  tes of space on 
5790: 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  a page..**.** Re
57a0: 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69  turn the index i
57b0: 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  nto pPage->aData
57c0: 5b 5d 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  [] of the first 
57d0: 62 79 74 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6e  byte of.** the n
57e0: 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 20  ew allocation.  
57f0: 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72 61  The caller guara
5800: 6e 74 65 65 73 20 74 68 61 74 20 74 68 65 72 65  ntees that there
5810: 20 69 73 20 65 6e 6f 75 67 68 0a 2a 2a 20 73 70   is enough.** sp
5820: 61 63 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ace.  This routi
5830: 6e 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 66 61  ne will never fa
5840: 69 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  il..**.** If the
5850: 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
5860: 42 79 74 65 73 20 6f 66 20 66 72 65 65 20 73 70  Bytes of free sp
5870: 61 63 65 20 62 75 74 20 64 6f 65 73 20 6e 6f 74  ace but does not
5880: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 42 79 74   contain.** nByt
5890: 65 73 20 6f 66 20 63 6f 6e 74 69 67 75 6f 75 73  es of contiguous
58a0: 20 66 72 65 65 20 73 70 61 63 65 2c 20 74 68 65   free space, the
58b0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  n this routine a
58c0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a 20  utomatically.** 
58d0: 63 61 6c 6c 73 20 64 65 66 72 61 67 65 6d 65 6e  calls defragemen
58e0: 74 50 61 67 65 28 29 20 74 6f 20 63 6f 6e 73 6f  tPage() to conso
58f0: 6c 69 64 61 74 65 20 61 6c 6c 20 66 72 65 65 20  lidate all free 
5900: 73 70 61 63 65 20 62 65 66 6f 72 65 20 0a 2a 2a  space before .**
5910: 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65 20   allocating the 
5920: 6e 65 77 20 63 68 75 6e 6b 2e 0a 2a 2f 0a 73 74  new chunk..*/.st
5930: 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74  atic int allocat
5940: 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a  eSpace(MemPage *
5950: 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74 65  pPage, int nByte
5960: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70  ){.  int addr, p
5970: 63 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20 73 69  c, hdr;.  int si
5980: 7a 65 3b 0a 20 20 69 6e 74 20 6e 46 72 61 67 3b  ze;.  int nFrag;
5990: 0a 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 69 6e  .  int top;.  in
59a0: 74 20 6e 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 63  t nCell;.  int c
59b0: 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 75 6e 73  ellOffset;.  uns
59c0: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
59d0: 3b 0a 20 20 0a 20 20 64 61 74 61 20 3d 20 70 50  ;.  .  data = pP
59e0: 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 61 73  age->aData;.  as
59f0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
5a00: 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
5a10: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
5a20: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
5a30: 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65 72  ->pBt );.  asser
5a40: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
5a50: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
5a60: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
5a70: 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20 29  sert( nByte>=0 )
5a80: 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65  ;  /* Minimum ce
5a90: 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a  ll size is 4 */.
5aa0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
5ab0: 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29 3b  >nFree>=nByte );
5ac0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
5ad0: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
5ae0: 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  ;.  pPage->nFree
5af0: 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 68 64 72   -= nByte;.  hdr
5b00: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
5b10: 73 65 74 3b 0a 0a 20 20 6e 46 72 61 67 20 3d 20  set;..  nFrag = 
5b20: 64 61 74 61 5b 68 64 72 2b 37 5d 3b 0a 20 20 69  data[hdr+7];.  i
5b30: 66 28 20 6e 46 72 61 67 3c 36 30 20 29 7b 0a 20  f( nFrag<60 ){. 
5b40: 20 20 20 2f 2a 20 53 65 61 72 63 68 20 74 68 65     /* Search the
5b50: 20 66 72 65 65 6c 69 73 74 20 6c 6f 6f 6b 69 6e   freelist lookin
5b60: 67 20 66 6f 72 20 61 20 73 6c 6f 74 20 62 69 67  g for a slot big
5b70: 20 65 6e 6f 75 67 68 20 74 6f 20 73 61 74 69 73   enough to satis
5b80: 66 79 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 70  fy the.    ** sp
5b90: 61 63 65 20 72 65 71 75 65 73 74 2e 20 2a 2f 0a  ace request. */.
5ba0: 20 20 20 20 61 64 64 72 20 3d 20 68 64 72 2b 31      addr = hdr+1
5bb0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 70 63  ;.    while( (pc
5bc0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
5bd0: 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20  a[addr]))>0 ){. 
5be0: 20 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32       size = get2
5bf0: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
5c00: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 69 7a  );.      if( siz
5c10: 65 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20  e>=nByte ){.    
5c20: 20 20 20 20 69 66 28 20 73 69 7a 65 3c 6e 42 79      if( size<nBy
5c30: 74 65 2b 34 20 29 7b 0a 20 20 20 20 20 20 20 20  te+4 ){.        
5c40: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 61    memcpy(&data[a
5c50: 64 64 72 5d 2c 20 26 64 61 74 61 5b 70 63 5d 2c  ddr], &data[pc],
5c60: 20 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 64   2);.          d
5c70: 61 74 61 5b 68 64 72 2b 37 5d 20 3d 20 6e 46 72  ata[hdr+7] = nFr
5c80: 61 67 20 2b 20 73 69 7a 65 20 2d 20 6e 42 79 74  ag + size - nByt
5c90: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  e;.          ret
5ca0: 75 72 6e 20 70 63 3b 0a 20 20 20 20 20 20 20 20  urn pc;.        
5cb0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
5cc0: 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
5cd0: 70 63 2b 32 5d 2c 20 73 69 7a 65 2d 6e 42 79 74  pc+2], size-nByt
5ce0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  e);.          re
5cf0: 74 75 72 6e 20 70 63 20 2b 20 73 69 7a 65 20 2d  turn pc + size -
5d00: 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 20 20   nByte;.        
5d10: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
5d20: 61 64 64 72 20 3d 20 70 63 3b 0a 20 20 20 20 7d  addr = pc;.    }
5d30: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  .  }..  /* Alloc
5d40: 61 74 65 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20  ate memory from 
5d50: 74 68 65 20 67 61 70 20 69 6e 20 62 65 74 77 65  the gap in betwe
5d60: 65 6e 20 74 68 65 20 63 65 6c 6c 20 70 6f 69 6e  en the cell poin
5d70: 74 65 72 20 61 72 72 61 79 0a 20 20 2a 2a 20 61  ter array.  ** a
5d80: 6e 64 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  nd the cell cont
5d90: 65 6e 74 20 61 72 65 61 2e 0a 20 20 2a 2f 0a 20  ent area..  */. 
5da0: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
5db0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
5dc0: 20 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74   nCell = get2byt
5dd0: 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
5de0: 0a 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  .  cellOffset = 
5df0: 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
5e00: 74 3b 0a 20 20 69 66 28 20 6e 46 72 61 67 3e 3d  t;.  if( nFrag>=
5e10: 36 30 20 7c 7c 20 63 65 6c 6c 4f 66 66 73 65 74  60 || cellOffset
5e20: 20 2b 20 32 2a 6e 43 65 6c 6c 20 3e 20 74 6f 70   + 2*nCell > top
5e30: 20 2d 20 6e 42 79 74 65 20 29 7b 0a 20 20 20 20   - nByte ){.    
5e40: 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65 28 70  defragmentPage(p
5e50: 50 61 67 65 29 3b 0a 20 20 20 20 74 6f 70 20 3d  Page);.    top =
5e60: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
5e70: 68 64 72 2b 35 5d 29 3b 0a 20 20 7d 0a 20 20 74  hdr+5]);.  }.  t
5e80: 6f 70 20 2d 3d 20 6e 42 79 74 65 3b 0a 20 20 61  op -= nByte;.  a
5e90: 73 73 65 72 74 28 20 63 65 6c 6c 4f 66 66 73 65  ssert( cellOffse
5ea0: 74 20 2b 20 32 2a 6e 43 65 6c 6c 20 3c 3d 20 74  t + 2*nCell <= t
5eb0: 6f 70 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65  op );.  put2byte
5ec0: 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74  (&data[hdr+5], t
5ed0: 6f 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 74 6f  op);.  return to
5ee0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  p;.}../*.** Retu
5ef0: 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20  rn a section of 
5f00: 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
5f10: 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
5f20: 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62  ..** The first b
5f30: 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66  yte of the new f
5f40: 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61  ree block is pPa
5f50: 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d  ge->aDisk[start]
5f60: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65  .** and the size
5f70: 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73   of the block is
5f80: 20 22 73 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a   "size" bytes..*
5f90: 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65  *.** Most of the
5fa0: 20 65 66 66 6f 72 74 20 68 65 72 65 20 69 73 20   effort here is 
5fb0: 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c  involved in coal
5fc0: 65 73 69 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a  esing adjacent.*
5fd0: 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e  * free blocks in
5fe0: 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 69 67 20  to a single big 
5ff0: 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73  free block..*/.s
6000: 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 53  tatic void freeS
6010: 70 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  pace(MemPage *pP
6020: 61 67 65 2c 20 69 6e 74 20 73 74 61 72 74 2c 20  age, int start, 
6030: 69 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e 74  int size){.  int
6040: 20 61 64 64 72 2c 20 70 62 65 67 69 6e 2c 20 68   addr, pbegin, h
6050: 64 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  dr;.  unsigned c
6060: 68 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67  har *data = pPag
6070: 65 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73 73  e->aData;..  ass
6080: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
6090: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
60a0: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
60b0: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
60c0: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
60d0: 65 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61 67  ert( start>=pPag
60e0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 28  e->hdrOffset+6+(
60f0: 70 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29  pPage->leaf?0:4)
6100: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 73   );.  assert( (s
6110: 74 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70 50  tart + size)<=pP
6120: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
6130: 53 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Size );.  assert
6140: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
6150: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
6160: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
6170: 65 72 74 28 20 73 69 7a 65 3e 3d 30 20 29 3b 20  ert( size>=0 ); 
6180: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c    /* Minimum cel
6190: 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 0a  l size is 4 */..
61a0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45  #ifdef SQLITE_SE
61b0: 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a  CURE_DELETE.  /*
61c0: 20 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74   Overwrite delet
61d0: 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77  ed information w
61e0: 69 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74  ith zeros when t
61f0: 68 65 20 53 45 43 55 52 45 5f 44 45 4c 45 54 45  he SECURE_DELETE
6200: 20 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73   .  ** option is
6210: 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70   enabled at comp
6220: 69 6c 65 2d 74 69 6d 65 20 2a 2f 0a 20 20 6d 65  ile-time */.  me
6230: 6d 73 65 74 28 26 64 61 74 61 5b 73 74 61 72 74  mset(&data[start
6240: 5d 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 23 65 6e  ], 0, size);.#en
6250: 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68  dif..  /* Add th
6260: 65 20 73 70 61 63 65 20 62 61 63 6b 20 69 6e 74  e space back int
6270: 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73  o the linked lis
6280: 74 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20  t of freeblocks 
6290: 2a 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  */.  hdr = pPage
62a0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 61  ->hdrOffset;.  a
62b0: 64 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20  ddr = hdr + 1;. 
62c0: 20 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20   while( (pbegin 
62d0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
62e0: 5b 61 64 64 72 5d 29 29 3c 73 74 61 72 74 20 26  [addr]))<start &
62f0: 26 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20  & pbegin>0 ){.  
6300: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
6310: 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  <=pPage->pBt->us
6320: 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20  ableSize-4 );.  
6330: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
6340: 3e 61 64 64 72 20 29 3b 0a 20 20 20 20 61 64 64  >addr );.    add
6350: 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 7d 0a  r = pbegin;.  }.
6360: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
6370: 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  <=pPage->pBt->us
6380: 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20  ableSize-4 );.  
6390: 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61  assert( pbegin>a
63a0: 64 64 72 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30  ddr || pbegin==0
63b0: 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
63c0: 64 61 74 61 5b 61 64 64 72 5d 2c 20 73 74 61 72  data[addr], star
63d0: 74 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26  t);.  put2byte(&
63e0: 64 61 74 61 5b 73 74 61 72 74 5d 2c 20 70 62 65  data[start], pbe
63f0: 67 69 6e 29 3b 0a 20 20 70 75 74 32 62 79 74 65  gin);.  put2byte
6400: 28 26 64 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c  (&data[start+2],
6410: 20 73 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d   size);.  pPage-
6420: 3e 6e 46 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a  >nFree += size;.
6430: 0a 20 20 2f 2a 20 43 6f 61 6c 65 73 63 65 20 61  .  /* Coalesce a
6440: 64 6a 61 63 65 6e 74 20 66 72 65 65 20 62 6c 6f  djacent free blo
6450: 63 6b 73 20 2a 2f 0a 20 20 61 64 64 72 20 3d 20  cks */.  addr = 
6460: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
6470: 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 28   + 1;.  while( (
6480: 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74  pbegin = get2byt
6490: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e  e(&data[addr]))>
64a0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65  0 ){.    int pne
64b0: 78 74 2c 20 70 73 69 7a 65 3b 0a 20 20 20 20 61  xt, psize;.    a
64c0: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64  ssert( pbegin>ad
64d0: 64 72 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  dr );.    assert
64e0: 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d  ( pbegin<=pPage-
64f0: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
6500: 2d 34 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20  -4 );.    pnext 
6510: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
6520: 5b 70 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70  [pbegin]);.    p
6530: 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  size = get2byte(
6540: 26 64 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29  &data[pbegin+2])
6550: 3b 0a 20 20 20 20 69 66 28 20 70 62 65 67 69 6e  ;.    if( pbegin
6560: 20 2b 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20   + psize + 3 >= 
6570: 70 6e 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30  pnext && pnext>0
6580: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72   ){.      int fr
6590: 61 67 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62  ag = pnext - (pb
65a0: 65 67 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20  egin+psize);.   
65b0: 20 20 20 61 73 73 65 72 74 28 20 66 72 61 67 3c     assert( frag<
65c0: 3d 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  =data[pPage->hdr
65d0: 4f 66 66 73 65 74 2b 37 5d 20 29 3b 0a 20 20 20  Offset+7] );.   
65e0: 20 20 20 64 61 74 61 5b 70 50 61 67 65 2d 3e 68     data[pPage->h
65f0: 64 72 4f 66 66 73 65 74 2b 37 5d 20 2d 3d 20 66  drOffset+7] -= f
6600: 72 61 67 3b 0a 20 20 20 20 20 20 70 75 74 32 62  rag;.      put2b
6610: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
6620: 5d 2c 20 67 65 74 32 62 79 74 65 28 26 64 61 74  ], get2byte(&dat
6630: 61 5b 70 6e 65 78 74 5d 29 29 3b 0a 20 20 20 20  a[pnext]));.    
6640: 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
6650: 5b 70 62 65 67 69 6e 2b 32 5d 2c 20 70 6e 65 78  [pbegin+2], pnex
6660: 74 2b 67 65 74 32 62 79 74 65 28 26 64 61 74 61  t+get2byte(&data
6670: 5b 70 6e 65 78 74 2b 32 5d 29 2d 70 62 65 67 69  [pnext+2])-pbegi
6680: 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
6690: 20 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67       addr = pbeg
66a0: 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  in;.    }.  }.. 
66b0: 20 2f 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20   /* If the cell 
66c0: 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 62 65 67  content area beg
66d0: 69 6e 73 20 77 69 74 68 20 61 20 66 72 65 65 62  ins with a freeb
66e0: 6c 6f 63 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e  lock, remove it.
66f0: 20 2a 2f 0a 20 20 69 66 28 20 64 61 74 61 5b 68   */.  if( data[h
6700: 64 72 2b 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b  dr+1]==data[hdr+
6710: 35 5d 20 26 26 20 64 61 74 61 5b 68 64 72 2b 32  5] && data[hdr+2
6720: 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 36 5d 20 29  ]==data[hdr+6] )
6730: 7b 0a 20 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20  {.    int top;. 
6740: 20 20 20 70 62 65 67 69 6e 20 3d 20 67 65 74 32     pbegin = get2
6750: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
6760: 5d 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ]);.    memcpy(&
6770: 64 61 74 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61  data[hdr+1], &da
6780: 74 61 5b 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a  ta[pbegin], 2);.
6790: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
67a0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
67b0: 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
67c0: 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70  data[hdr+5], top
67d0: 20 2b 20 67 65 74 32 62 79 74 65 28 26 64 61 74   + get2byte(&dat
67e0: 61 5b 70 62 65 67 69 6e 2b 32 5d 29 29 3b 0a 20  a[pbegin+2]));. 
67f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f   }.}../*.** Deco
6800: 64 65 20 74 68 65 20 66 6c 61 67 73 20 62 79 74  de the flags byt
6810: 65 20 28 74 68 65 20 66 69 72 73 74 20 62 79 74  e (the first byt
6820: 65 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 29  e of the header)
6830: 20 66 6f 72 20 61 20 70 61 67 65 0a 2a 2a 20 61   for a page.** a
6840: 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 66 69  nd initialize fi
6850: 65 6c 64 73 20 6f 66 20 74 68 65 20 4d 65 6d 50  elds of the MemP
6860: 61 67 65 20 73 74 72 75 63 74 75 72 65 20 61 63  age structure ac
6870: 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a 0a 2a 2a  cordingly..**.**
6880: 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c 6c 6f 77   Only the follow
6890: 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ing combinations
68a0: 20 61 72 65 20 73 75 70 70 6f 72 74 65 64 2e 20   are supported. 
68b0: 20 41 6e 79 74 68 69 6e 67 20 64 69 66 66 65 72   Anything differ
68c0: 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61 74 65 73  ent.** indicates
68d0: 20 61 20 63 6f 72 72 75 70 74 20 64 61 74 61 62   a corrupt datab
68e0: 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a 0a 2a 2a  ase files:.**.**
68f0: 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52           PTF_ZER
6900: 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20 20 20 20  ODATA.**        
6910: 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 20 7c 20   PTF_ZERODATA | 
6920: 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20 20 20 20  PTF_LEAF.**     
6930: 20 20 20 20 50 54 46 5f 4c 45 41 46 44 41 54 41      PTF_LEAFDATA
6940: 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 0a 2a 2a   | PTF_INTKEY.**
6950: 20 20 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41           PTF_LEA
6960: 46 44 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b  FDATA | PTF_INTK
6970: 45 59 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2f  EY | PTF_LEAF.*/
6980: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f  .static int deco
6990: 64 65 46 6c 61 67 73 28 4d 65 6d 50 61 67 65 20  deFlags(MemPage 
69a0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 66 6c 61 67  *pPage, int flag
69b0: 42 79 74 65 29 7b 0a 20 20 42 74 53 68 61 72 65  Byte){.  BtShare
69c0: 64 20 2a 70 42 74 3b 20 20 20 20 20 2f 2a 20 41  d *pBt;     /* A
69d0: 20 63 6f 70 79 20 6f 66 20 70 50 61 67 65 2d 3e   copy of pPage->
69e0: 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  pBt */..  assert
69f0: 28 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  ( pPage->hdrOffs
6a00: 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70 67 6e 6f  et==(pPage->pgno
6a10: 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30 29 20 29  ==1 ? 100 : 0) )
6a20: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
6a30: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
6a40: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
6a50: 29 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6c 65  ) );.  pPage->le
6a60: 61 66 20 3d 20 66 6c 61 67 42 79 74 65 3e 3e 33  af = flagByte>>3
6a70: 3b 20 20 61 73 73 65 72 74 28 20 50 54 46 5f 4c  ;  assert( PTF_L
6a80: 45 41 46 20 3d 3d 20 31 3c 3c 33 20 29 3b 0a 20  EAF == 1<<3 );. 
6a90: 20 66 6c 61 67 42 79 74 65 20 26 3d 20 7e 50 54   flagByte &= ~PT
6aa0: 46 5f 4c 45 41 46 3b 0a 20 20 70 50 61 67 65 2d  F_LEAF;.  pPage-
6ab0: 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d 20  >childPtrSize = 
6ac0: 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b  4-4*pPage->leaf;
6ad0: 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
6ae0: 70 42 74 3b 0a 20 20 69 66 28 20 66 6c 61 67 42  pBt;.  if( flagB
6af0: 79 74 65 3d 3d 28 50 54 46 5f 4c 45 41 46 44 41  yte==(PTF_LEAFDA
6b00: 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59 29  TA | PTF_INTKEY)
6b10: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   ){.    pPage->i
6b20: 6e 74 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 70  ntKey = 1;.    p
6b30: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20  Page->hasData = 
6b40: 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 20  pPage->leaf;.   
6b50: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
6b60: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66 3b   = pBt->maxLeaf;
6b70: 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c  .    pPage->minL
6b80: 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c  ocal = pBt->minL
6b90: 65 61 66 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  eaf;.  }else if(
6ba0: 20 66 6c 61 67 42 79 74 65 3d 3d 50 54 46 5f 5a   flagByte==PTF_Z
6bb0: 45 52 4f 44 41 54 41 20 29 7b 0a 20 20 20 20 70  ERODATA ){.    p
6bc0: 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20 30  Page->intKey = 0
6bd0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61 73  ;.    pPage->has
6be0: 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20 70 50  Data = 0;.    pP
6bf0: 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20  age->maxLocal = 
6c00: 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20  pBt->maxLocal;. 
6c10: 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e 4c 6f 63     pPage->minLoc
6c20: 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e 4c 6f 63  al = pBt->minLoc
6c30: 61 6c 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  al;.  }else{.   
6c40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
6c50: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
6c60: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
6c70: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  _OK;.}../*.** In
6c80: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61 75 78  itialize the aux
6c90: 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61 74 69  iliary informati
6ca0: 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20 62 6c  on for a disk bl
6cb0: 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ock..**.** The p
6cc0: 50 61 72 65 6e 74 20 70 61 72 61 6d 65 74 65 72  Parent parameter
6cd0: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69 6e 74   must be a point
6ce0: 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  er to the MemPag
6cf0: 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 74 68  e which.** is th
6d00: 65 20 70 61 72 65 6e 74 20 6f 66 20 74 68 65 20  e parent of the 
6d10: 70 61 67 65 20 62 65 69 6e 67 20 69 6e 69 74 69  page being initi
6d20: 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 72 6f 6f  alized.  The roo
6d30: 74 20 6f 66 20 61 0a 2a 2a 20 42 54 72 65 65 20  t of a.** BTree 
6d40: 68 61 73 20 6e 6f 20 70 61 72 65 6e 74 20 61 6e  has no parent an
6d50: 64 20 73 6f 20 66 6f 72 20 74 68 61 74 20 70 61  d so for that pa
6d60: 67 65 2c 20 70 50 61 72 65 6e 74 3d 3d 4e 55 4c  ge, pParent==NUL
6d70: 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  L..**.** Return 
6d80: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
6d90: 63 65 73 73 2e 20 20 49 66 20 77 65 20 73 65 65  cess.  If we see
6da0: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 64   that the page d
6db0: 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 74 61  oes.** not conta
6dc0: 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64  in a well-formed
6dd0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2c 20   database page, 
6de0: 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a 2a 20  then return .** 
6df0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2e 20  SQLITE_CORRUPT. 
6e00: 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72 65 74   Note that a ret
6e10: 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f 4f 4b  urn of SQLITE_OK
6e20: 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67 75 61   does not.** gua
6e30: 72 61 6e 74 65 65 20 74 68 61 74 20 74 68 65 20  rantee that the 
6e40: 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66 6f 72  page is well-for
6e50: 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20 73 68  med.  It only sh
6e60: 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65 20 66  ows that.** we f
6e70: 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20  ailed to detect 
6e80: 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  any corruption..
6e90: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
6ea0: 72 65 65 49 6e 69 74 50 61 67 65 28 0a 20 20 4d  reeInitPage(.  M
6eb0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
6ec0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
6ed0: 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61 6c 69  e to be initiali
6ee0: 7a 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  zed */.  MemPage
6ef0: 20 2a 70 50 61 72 65 6e 74 20 20 20 20 20 20 20   *pParent       
6f00: 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 2e 20 20  /* The parent.  
6f10: 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  Might be NULL */
6f20: 0a 29 7b 0a 20 20 69 6e 74 20 70 63 3b 20 20 20  .){.  int pc;   
6f30: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
6f40: 65 73 73 20 6f 66 20 61 20 66 72 65 65 62 6c 6f  ess of a freeblo
6f50: 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67 65 2d  ck within pPage-
6f60: 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  >aData[] */.  in
6f70: 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  t hdr;          
6f80: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 62 65   /* Offset to be
6f90: 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67 65 20  ginning of page 
6fa0: 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 38 20 2a  header */.  u8 *
6fb0: 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f  data;          /
6fc0: 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65  * Equal to pPage
6fd0: 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 42 74 53  ->aData */.  BtS
6fe0: 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
6ff0: 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62     /* The main b
7000: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  tree structure *
7010: 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69  /.  int usableSi
7020: 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75 6e 74  ze;    /* Amount
7030: 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61 63 65   of usable space
7040: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 2a 2f   on each page */
7050: 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
7060: 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20  t;    /* Offset 
7070: 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20 70 61  from start of pa
7080: 67 65 20 74 6f 20 66 69 72 73 74 20 63 65 6c 6c  ge to first cell
7090: 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   pointer */.  in
70a0: 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20 20 20  t nFree;        
70b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 6e   /* Number of un
70c0: 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20 74 68  used bytes on th
70d0: 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  e page */.  int 
70e0: 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 20 2f  top;           /
70f0: 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
7100: 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  the cell content
7110: 20 61 72 65 61 20 2a 2f 0a 0a 20 20 70 42 74 20   area */..  pBt 
7120: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
7130: 61 73 73 65 72 74 28 20 70 42 74 21 3d 30 20 29  assert( pBt!=0 )
7140: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
7150: 65 6e 74 3d 3d 30 20 7c 7c 20 70 50 61 72 65 6e  ent==0 || pParen
7160: 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 20  t->pBt==pBt );. 
7170: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7180: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
7190: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
71a0: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ert( pPage->pgno
71b0: 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ==sqlite3PagerPa
71c0: 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e  genumber(pPage->
71d0: 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73  pDbPage) );.  as
71e0: 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d 20 73  sert( pPage == s
71f0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
7200: 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  tra(pPage->pDbPa
7210: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
7220: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 3d   pPage->aData ==
7230: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
7240: 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50  Data(pPage->pDbP
7250: 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20 70 50  age) );.  if( pP
7260: 61 67 65 2d 3e 70 50 61 72 65 6e 74 21 3d 70 50  age->pParent!=pP
7270: 61 72 65 6e 74 20 26 26 20 28 70 50 61 67 65 2d  arent && (pPage-
7280: 3e 70 50 61 72 65 6e 74 21 3d 30 20 7c 7c 20 70  >pParent!=0 || p
7290: 50 61 67 65 2d 3e 69 73 49 6e 69 74 29 20 29 7b  Page->isInit) ){
72a0: 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65  .    /* The pare
72b0: 6e 74 20 70 61 67 65 20 73 68 6f 75 6c 64 20 6e  nt page should n
72c0: 65 76 65 72 20 63 68 61 6e 67 65 20 75 6e 6c 65  ever change unle
72d0: 73 73 20 74 68 65 20 66 69 6c 65 20 69 73 20 63  ss the file is c
72e0: 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 72 65  orrupt */.    re
72f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
7300: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
7310: 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  if( pPage->isIni
7320: 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  t ) return SQLIT
7330: 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  E_OK;.  if( pPag
7340: 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 26 26  e->pParent==0 &&
7350: 20 70 50 61 72 65 6e 74 21 3d 30 20 29 7b 0a 20   pParent!=0 ){. 
7360: 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e     pPage->pParen
7370: 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 20  t = pParent;.   
7380: 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
7390: 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
73a0: 65 29 3b 0a 20 20 7d 0a 20 20 68 64 72 20 3d 20  e);.  }.  hdr = 
73b0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
73c0: 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65  ;.  data = pPage
73d0: 2d 3e 61 44 61 74 61 3b 0a 20 20 69 66 28 20 64  ->aData;.  if( d
73e0: 65 63 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65  ecodeFlags(pPage
73f0: 2c 20 64 61 74 61 5b 68 64 72 5d 29 20 29 20 72  , data[hdr]) ) r
7400: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
7410: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 61 73 73  RUPT_BKPT;.  ass
7420: 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53 69  ert( pBt->pageSi
7430: 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d 3e  ze>=512 && pBt->
7440: 70 61 67 65 53 69 7a 65 3c 3d 33 32 37 36 38 20  pageSize<=32768 
7450: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73 6b  );.  pPage->mask
7460: 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Page = pBt->page
7470: 53 69 7a 65 20 2d 20 31 3b 0a 20 20 70 50 61 67  Size - 1;.  pPag
7480: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30  e->nOverflow = 0
7490: 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68  ;.  pPage->idxSh
74a0: 69 66 74 20 3d 20 30 3b 0a 20 20 75 73 61 62 6c  ift = 0;.  usabl
74b0: 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61  eSize = pBt->usa
74c0: 62 6c 65 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  bleSize;.  pPage
74d0: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 63  ->cellOffset = c
74e0: 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64 72 20  ellOffset = hdr 
74f0: 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e  + 12 - 4*pPage->
7500: 6c 65 61 66 3b 0a 20 20 74 6f 70 20 3d 20 67 65  leaf;.  top = ge
7510: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
7520: 2b 35 5d 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  +5]);.  pPage->n
7530: 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28  Cell = get2byte(
7540: 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20  &data[hdr+3]);. 
7550: 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c   if( pPage->nCel
7560: 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29  l>MX_CELL(pBt) )
7570: 7b 0a 20 20 20 20 2f 2a 20 54 6f 20 6d 61 6e 79  {.    /* To many
7580: 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73 69 6e   cells for a sin
7590: 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65 20 70  gle page.  The p
75a0: 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f 72 72  age must be corr
75b0: 75 70 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  upt */.    retur
75c0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
75d0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
75e0: 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30   pPage->nCell==0
75f0: 20 26 26 20 70 50 61 72 65 6e 74 21 3d 30 20 26   && pParent!=0 &
7600: 26 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21  & pParent->pgno!
7610: 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 41 6c 6c  =1 ){.    /* All
7620: 20 70 61 67 65 73 20 6d 75 73 74 20 68 61 76 65   pages must have
7630: 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 65   at least one ce
7640: 6c 6c 2c 20 65 78 63 65 70 74 20 66 6f 72 20 72  ll, except for r
7650: 6f 6f 74 20 70 61 67 65 73 20 2a 2f 0a 20 20 20  oot pages */.   
7660: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
7670: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
7680: 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20 74  ..  /* Compute t
7690: 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20 73 70  he total free sp
76a0: 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ace on the page 
76b0: 2a 2f 0a 20 20 70 63 20 3d 20 67 65 74 32 62 79  */.  pc = get2by
76c0: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29  te(&data[hdr+1])
76d0: 3b 0a 20 20 6e 46 72 65 65 20 3d 20 64 61 74 61  ;.  nFree = data
76e0: 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 20 2d 20  [hdr+7] + top - 
76f0: 28 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  (cellOffset + 2*
7700: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20  pPage->nCell);. 
7710: 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29 7b 0a   while( pc>0 ){.
7720: 20 20 20 20 69 6e 74 20 6e 65 78 74 2c 20 73 69      int next, si
7730: 7a 65 3b 0a 20 20 20 20 69 66 28 20 70 63 3e 75  ze;.    if( pc>u
7740: 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20  sableSize-4 ){. 
7750: 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f       /* Free blo
7760: 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20 70 61  ck is off the pa
7770: 67 65 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  ge */.      retu
7780: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
7790: 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d 0a 20  T_BKPT; .    }. 
77a0: 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32 62 79     next = get2by
77b0: 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20  te(&data[pc]);. 
77c0: 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79     size = get2by
77d0: 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 29 3b  te(&data[pc+2]);
77e0: 0a 20 20 20 20 69 66 28 20 6e 65 78 74 3e 30 20  .    if( next>0 
77f0: 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69 7a 65  && next<=pc+size
7800: 2b 33 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46  +3 ){.      /* F
7810: 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20  ree blocks must 
7820: 62 65 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20  be in accending 
7830: 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20 20 72  order */.      r
7840: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
7850: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
7860: 7d 0a 20 20 20 20 6e 46 72 65 65 20 2b 3d 20 73  }.    nFree += s
7870: 69 7a 65 3b 0a 20 20 20 20 70 63 20 3d 20 6e 65  ize;.    pc = ne
7880: 78 74 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  xt;.  }.  pPage-
7890: 3e 6e 46 72 65 65 20 3d 20 6e 46 72 65 65 3b 0a  >nFree = nFree;.
78a0: 20 20 69 66 28 20 6e 46 72 65 65 3e 3d 75 73 61    if( nFree>=usa
78b0: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 2f  bleSize ){.    /
78c0: 2a 20 46 72 65 65 20 73 70 61 63 65 20 63 61 6e  * Free space can
78d0: 6e 6f 74 20 65 78 63 65 65 64 20 74 6f 74 61 6c  not exceed total
78e0: 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20   page size */.  
78f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7900: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
7910: 20 7d 0a 0a 23 69 66 20 30 0a 20 20 2f 2a 20 43   }..#if 0.  /* C
7920: 68 65 63 6b 20 74 68 61 74 20 61 6c 6c 20 74 68  heck that all th
7930: 65 20 6f 66 66 73 65 74 73 20 69 6e 20 74 68 65  e offsets in the
7940: 20 63 65 6c 6c 20 6f 66 66 73 65 74 20 61 72 72   cell offset arr
7950: 61 79 20 61 72 65 20 77 69 74 68 69 6e 20 72 61  ay are within ra
7960: 6e 67 65 2e 20 0a 20 20 2a 2a 20 0a 20 20 2a 2a  nge. .  ** .  **
7970: 20 4f 6d 69 74 74 69 6e 67 20 74 68 69 73 20 63   Omitting this c
7980: 6f 6e 73 69 73 74 65 6e 63 79 20 63 68 65 63 6b  onsistency check
7990: 20 61 6e 64 20 75 73 69 6e 67 20 74 68 65 20 70   and using the p
79a0: 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 6d  Page->maskPage m
79b0: 61 73 6b 0a 20 20 2a 2a 20 74 6f 20 70 72 65 76  ask.  ** to prev
79c0: 65 6e 74 20 6f 76 65 72 72 75 6e 6e 69 6e 67 20  ent overrunning 
79d0: 74 68 65 20 70 61 67 65 20 62 75 66 66 65 72 20  the page buffer 
79e0: 69 6e 20 66 69 6e 64 43 65 6c 6c 28 29 20 72 65  in findCell() re
79f0: 73 75 6c 74 73 20 69 6e 20 61 0a 20 20 2a 2a 20  sults in a.  ** 
7a00: 32 2e 35 25 20 70 65 72 66 6f 72 6d 61 6e 63 65  2.5% performance
7a10: 20 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 7b 0a   gain..  */.  {.
7a20: 20 20 20 20 75 38 20 2a 70 4f 66 66 3b 20 20 20      u8 *pOff;   
7a30: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
7a40: 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 61   used to check a
7a50: 6c 6c 20 63 65 6c 6c 20 6f 66 66 73 65 74 73 20  ll cell offsets 
7a60: 61 72 65 20 69 6e 20 72 61 6e 67 65 20 2a 2f 0a  are in range */.
7a70: 20 20 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20      u8 *pEnd;   
7a80: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
7a90: 74 6f 20 65 6e 64 20 6f 66 20 63 65 6c 6c 20 6f  to end of cell o
7aa0: 66 66 73 65 74 20 61 72 72 61 79 20 2a 2f 0a 20  ffset array */. 
7ab0: 20 20 20 75 38 20 6d 61 73 6b 3b 20 20 20 20 20     u8 mask;     
7ac0: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 62      /* Mask of b
7ad0: 69 74 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  its that must be
7ae0: 20 7a 65 72 6f 20 69 6e 20 4d 53 42 20 6f 66 20   zero in MSB of 
7af0: 63 65 6c 6c 20 6f 66 66 73 65 74 73 20 2a 2f 0a  cell offsets */.
7b00: 20 20 20 20 6d 61 73 6b 20 3d 20 7e 28 28 28 75      mask = ~(((u
7b10: 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  8)(pBt->pageSize
7b20: 3e 3e 38 29 29 2d 31 29 3b 0a 20 20 20 20 70 45  >>8))-1);.    pE
7b30: 6e 64 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  nd = &data[cellO
7b40: 66 66 73 65 74 20 2b 20 70 50 61 67 65 2d 3e 6e  ffset + pPage->n
7b50: 43 65 6c 6c 2a 32 5d 3b 0a 20 20 20 20 66 6f 72  Cell*2];.    for
7b60: 28 70 4f 66 66 3d 26 64 61 74 61 5b 63 65 6c 6c  (pOff=&data[cell
7b70: 4f 66 66 73 65 74 5d 3b 20 70 4f 66 66 21 3d 70  Offset]; pOff!=p
7b80: 45 6e 64 20 26 26 20 21 28 28 2a 70 4f 66 66 29  End && !((*pOff)
7b90: 26 6d 61 73 6b 29 3b 20 70 4f 66 66 2b 3d 32 29  &mask); pOff+=2)
7ba0: 3b 0a 20 20 20 20 69 66 28 20 70 4f 66 66 21 3d  ;.    if( pOff!=
7bb0: 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 72 65  pEnd ){.      re
7bc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
7bd0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
7be0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 70 50    }.#endif..  pP
7bf0: 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b  age->isInit = 1;
7c00: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
7c10: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
7c20: 74 20 75 70 20 61 20 72 61 77 20 70 61 67 65 20  t up a raw page 
7c30: 73 6f 20 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73  so that it looks
7c40: 20 6c 69 6b 65 20 61 20 64 61 74 61 62 61 73 65   like a database
7c50: 20 70 61 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a   page holding.**
7c60: 20 6e 6f 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a   no entries..*/.
7c70: 73 74 61 74 69 63 20 76 6f 69 64 20 7a 65 72 6f  static void zero
7c80: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
7c90: 61 67 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b  age, int flags){
7ca0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
7cb0: 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e   *data = pPage->
7cc0: 61 44 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65  aData;.  BtShare
7cd0: 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
7ce0: 70 42 74 3b 0a 20 20 69 6e 74 20 68 64 72 20 3d  pBt;.  int hdr =
7cf0: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
7d00: 74 3b 0a 20 20 69 6e 74 20 66 69 72 73 74 3b 0a  t;.  int first;.
7d10: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
7d20: 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
7d30: 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  r(pPage->pDbPage
7d40: 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29  )==pPage->pgno )
7d50: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
7d60: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
7d70: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
7d80: 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65   == (void*)pPage
7d90: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
7da0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
7db0: 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  a(pPage->pDbPage
7dc0: 29 20 3d 3d 20 64 61 74 61 20 29 3b 0a 20 20 61  ) == data );.  a
7dd0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
7de0: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
7df0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
7e00: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
7e10: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
7e20: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
7e30: 2f 2a 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 68  /*memset(&data[h
7e40: 64 72 5d 2c 20 30 2c 20 70 42 74 2d 3e 75 73 61  dr], 0, pBt->usa
7e50: 62 6c 65 53 69 7a 65 20 2d 20 68 64 72 29 3b 2a  bleSize - hdr);*
7e60: 2f 0a 20 20 64 61 74 61 5b 68 64 72 5d 20 3d 20  /.  data[hdr] = 
7e70: 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20 3d  flags;.  first =
7e80: 20 68 64 72 20 2b 20 38 20 2b 20 34 2a 28 28 66   hdr + 8 + 4*((f
7e90: 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d 3d  lags&PTF_LEAF)==
7ea0: 30 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61  0);.  memset(&da
7eb0: 74 61 5b 68 64 72 2b 31 5d 2c 20 30 2c 20 34 29  ta[hdr+1], 0, 4)
7ec0: 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  ;.  data[hdr+7] 
7ed0: 3d 20 30 3b 0a 20 20 70 75 74 32 62 79 74 65 28  = 0;.  put2byte(
7ee0: 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20 70 42  &data[hdr+5], pB
7ef0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a  t->usableSize);.
7f00: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
7f10: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
7f20: 20 2d 20 66 69 72 73 74 3b 0a 20 20 64 65 63 6f   - first;.  deco
7f30: 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20 66  deFlags(pPage, f
7f40: 6c 61 67 73 29 3b 0a 20 20 70 50 61 67 65 2d 3e  lags);.  pPage->
7f50: 68 64 72 4f 66 66 73 65 74 20 3d 20 68 64 72 3b  hdrOffset = hdr;
7f60: 0a 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  .  pPage->cellOf
7f70: 66 73 65 74 20 3d 20 66 69 72 73 74 3b 0a 20 20  fset = first;.  
7f80: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
7f90: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
7fa0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35  pBt->pageSize>=5
7fb0: 31 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53  12 && pBt->pageS
7fc0: 69 7a 65 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20  ize<=32768 );.  
7fd0: 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20  pPage->maskPage 
7fe0: 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
7ff0: 2d 20 31 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64  - 1;.  pPage->id
8000: 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 70 50  xShift = 0;.  pP
8010: 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a  age->nCell = 0;.
8020: 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
8030: 3d 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  = 1;.}../*.** Ge
8040: 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  t a page from th
8050: 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69 61  e pager.  Initia
8060: 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67 65  lize the MemPage
8070: 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d 50  .pBt and.** MemP
8080: 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65 6e  age.aData elemen
8090: 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a 2a  ts if needed..**
80a0: 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f 6e  .** If the noCon
80b0: 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73 65 74  tent flag is set
80c0: 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20  , it means that 
80d0: 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61  we do not care a
80e0: 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  bout.** the cont
80f0: 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  ent of the page 
8100: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20 53  at this time.  S
8110: 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20 74  o do not go to t
8120: 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66 65  he disk.** to fe
8130: 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 2e  tch the content.
8140: 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20 74    Just fill in t
8150: 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68 20  he content with 
8160: 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a 2a  zeros for now..*
8170: 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75 74 75  * If in the futu
8180: 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69 74  re we call sqlit
8190: 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f  e3PagerWrite() o
81a0: 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74 68 61  n this page, tha
81b0: 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68 61  t.** means we ha
81c0: 76 65 20 73 74 61 72 74 65 64 20 74 6f 20 62 65  ve started to be
81d0: 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75 74   concerned about
81e0: 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65   content and the
81f0: 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73 68   disk.** read sh
8200: 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68  ould occur at th
8210: 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e 74  at point..*/.int
8220: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
8230: 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
8240: 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a 20   *pBt,       /* 
8250: 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20 50  The btree */.  P
8260: 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20  gno pgno,       
8270: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
8280: 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65 74   the page to fet
8290: 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ch */.  MemPage 
82a0: 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20  **ppPage,    /* 
82b0: 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20  Return the page 
82c0: 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74 65  in this paramete
82d0: 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e  r */.  int noCon
82e0: 74 65 6e 74 20 20 20 20 20 20 20 20 2f 2a 20 44  tent        /* D
82f0: 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67 65 20  o not load page 
8300: 63 6f 6e 74 65 6e 74 20 69 66 20 74 72 75 65 20  content if true 
8310: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
8320: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
8330: 3b 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50  ;.  DbPage *pDbP
8340: 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
8350: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
8360: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
8370: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
8380: 50 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74  PagerAcquire(pBt
8390: 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20  ->pPager, pgno, 
83a0: 28 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61  (DbPage**)&pDbPa
83b0: 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a  ge, noContent);.
83c0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
83d0: 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 20 3d 20  n rc;.  pPage = 
83e0: 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74  (MemPage *)sqlit
83f0: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
8400: 70 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67  pDbPage);.  pPag
8410: 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74  e->aData = sqlit
8420: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
8430: 44 62 50 61 67 65 29 3b 0a 20 20 70 50 61 67 65  DbPage);.  pPage
8440: 2d 3e 70 44 62 50 61 67 65 20 3d 20 70 44 62 50  ->pDbPage = pDbP
8450: 61 67 65 3b 0a 20 20 70 50 61 67 65 2d 3e 70 42  age;.  pPage->pB
8460: 74 20 3d 20 70 42 74 3b 0a 20 20 70 50 61 67 65  t = pBt;.  pPage
8470: 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
8480: 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
8490: 74 20 3d 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d  t = pPage->pgno=
84a0: 3d 31 20 3f 20 31 30 30 20 3a 20 30 3b 0a 20 20  =1 ? 100 : 0;.  
84b0: 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b  *ppPage = pPage;
84c0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
84d0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  _OK;.}../*.** Ge
84e0: 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  t a page from th
84f0: 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e 69 74  e pager and init
8500: 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68 69 73  ialize it.  This
8510: 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 6a   routine.** is j
8520: 75 73 74 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63  ust a convenienc
8530: 65 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  e wrapper around
8540: 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c 73 20   separate calls 
8550: 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  to.** sqlite3Btr
8560: 65 65 47 65 74 50 61 67 65 28 29 20 61 6e 64 20  eeGetPage() and 
8570: 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
8580: 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  Page()..*/.stati
8590: 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e 69 74  c int getAndInit
85a0: 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
85b0: 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20 20   *pBt,          
85c0: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
85d0: 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
85e0: 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f  gno,           /
85f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  * Number of the 
8600: 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f 0a 20  page to get */. 
8610: 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67   MemPage **ppPag
8620: 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74  e,    /* Write t
8630: 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65 72 20  he page pointer 
8640: 68 65 72 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  here */.  MemPag
8650: 65 20 2a 70 50 61 72 65 6e 74 20 20 20 20 20 2f  e *pParent     /
8660: 2a 20 50 61 72 65 6e 74 20 6f 66 20 74 68 65 20  * Parent of the 
8670: 70 61 67 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  page */.){.  int
8680: 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73   rc;.  assert( s
8690: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
86a0: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
86b0: 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29  .  if( pgno==0 )
86c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
86d0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
86e0: 3b 20 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  ; .  }.  rc = sq
86f0: 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
8700: 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50  e(pBt, pgno, ppP
8710: 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  age, 0);.  if( r
8720: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
8730: 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e 69  (*ppPage)->isIni
8740: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  t==0 ){.    rc =
8750: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
8760: 74 50 61 67 65 28 2a 70 70 50 61 67 65 2c 20 70  tPage(*ppPage, p
8770: 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 69 66 28  Parent);.    if(
8780: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
8790: 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
87a0: 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
87b0: 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b      *ppPage = 0;
87c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
87d0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
87e0: 20 52 65 6c 65 61 73 65 20 61 20 4d 65 6d 50 61   Release a MemPa
87f0: 67 65 2e 20 20 54 68 69 73 20 73 68 6f 75 6c 64  ge.  This should
8800: 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 63 65 20   be called once 
8810: 66 6f 72 20 65 61 63 68 20 70 72 69 6f 72 0a 2a  for each prior.*
8820: 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  * call to sqlite
8830: 33 42 74 72 65 65 47 65 74 50 61 67 65 2e 0a 2a  3BtreeGetPage..*
8840: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
8850: 6c 65 61 73 65 50 61 67 65 28 4d 65 6d 50 61 67  leasePage(MemPag
8860: 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 66 28  e *pPage){.  if(
8870: 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 61 73   pPage ){.    as
8880: 73 65 72 74 28 20 70 50 61 67 65 2d 3e 61 44 61  sert( pPage->aDa
8890: 74 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ta );.    assert
88a0: 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a  ( pPage->pBt );.
88b0: 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
88c0: 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
88d0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
88e0: 20 3d 3d 20 28 76 6f 69 64 2a 29 70 50 61 67 65   == (void*)pPage
88f0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
8900: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
8910: 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ata(pPage->pDbPa
8920: 67 65 29 3d 3d 70 50 61 67 65 2d 3e 61 44 61 74  ge)==pPage->aDat
8930: 61 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  a );.    assert(
8940: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
8950: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
8960: 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 73 71  mutex) );.    sq
8970: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
8980: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
8990: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
89a0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
89b0: 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 72 65  lled when the re
89c0: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
89d0: 72 20 61 20 70 61 67 65 0a 2a 2a 20 72 65 61 63  r a page.** reac
89e0: 68 65 73 20 7a 65 72 6f 2e 20 20 57 65 20 6e 65  hes zero.  We ne
89f0: 65 64 20 74 6f 20 75 6e 72 65 66 20 74 68 65 20  ed to unref the 
8a00: 70 50 61 72 65 6e 74 20 70 6f 69 6e 74 65 72 20  pParent pointer 
8a10: 77 68 65 6e 20 74 68 61 74 0a 2a 2a 20 68 61 70  when that.** hap
8a20: 70 65 6e 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pens..*/.static 
8a30: 76 6f 69 64 20 70 61 67 65 44 65 73 74 72 75 63  void pageDestruc
8a40: 74 6f 72 28 44 62 50 61 67 65 20 2a 70 44 61 74  tor(DbPage *pDat
8a50: 61 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29  a, int pageSize)
8a60: 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
8a70: 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70  ge;.  assert( (p
8a80: 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
8a90: 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65  );.  pPage = (Me
8aa0: 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50  mPage *)sqlite3P
8ab0: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44 61  agerGetExtra(pDa
8ac0: 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ta);.  assert( p
8ad0: 50 61 67 65 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  Page->isInit==0 
8ae0: 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  || sqlite3_mutex
8af0: 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
8b00: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
8b10: 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  ( pPage->pParent
8b20: 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   ){.    MemPage 
8b30: 2a 70 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65  *pParent = pPage
8b40: 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 20 20 61  ->pParent;.    a
8b50: 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e  ssert( pParent->
8b60: 70 42 74 3d 3d 70 50 61 67 65 2d 3e 70 42 74 20  pBt==pPage->pBt 
8b70: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 50  );.    pPage->pP
8b80: 61 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 72  arent = 0;.    r
8b90: 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 72 65  eleasePage(pPare
8ba0: 6e 74 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  nt);.  }.  pPage
8bb0: 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 7d 0a  ->isInit = 0;.}.
8bc0: 0a 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20  ./*.** During a 
8bd0: 72 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74  rollback, when t
8be0: 68 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73  he pager reloads
8bf0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74   information int
8c00: 6f 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73  o the cache.** s
8c10: 6f 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65  o that the cache
8c20: 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20   is restored to 
8c30: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61  its original sta
8c40: 74 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  te at the start 
8c50: 6f 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61  of.** the transa
8c60: 63 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20  ction, for each 
8c70: 70 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68  page restored th
8c80: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
8c90: 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  lled..**.** This
8ca0: 20 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74   routine needs t
8cb0: 6f 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72  o reset the extr
8cc0: 61 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61  a data section a
8cd0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
8ce0: 0a 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65  .** page to agre
8cf0: 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f  e with the resto
8d00: 72 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61  red data..*/.sta
8d10: 74 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69  tic void pageRei
8d20: 6e 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74  nit(DbPage *pDat
8d30: 61 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29  a, int pageSize)
8d40: 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
8d50: 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 28 70  ge;.  assert( (p
8d60: 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
8d70: 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65  );.  pPage = (Me
8d80: 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50  mPage *)sqlite3P
8d90: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44 61  agerGetExtra(pDa
8da0: 74 61 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ta);.  if( pPage
8db0: 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20  ->isInit ){.    
8dc0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
8dd0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
8de0: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
8df0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
8e00: 69 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  it = 0;.    sqli
8e10: 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
8e20: 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 70  (pPage, pPage->p
8e30: 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  Parent);.  }.}..
8e40: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
8e50: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 6f   busy handler fo
8e60: 72 20 61 20 62 74 72 65 65 2e 0a 2a 2f 0a 73 74  r a btree..*/.st
8e70: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
8e80: 42 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48  BtreeInvokeBusyH
8e90: 61 6e 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72  andler(void *pAr
8ea0: 67 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 42 74 53  g, int n){.  BtS
8eb0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 28 42 74  hared *pBt = (Bt
8ec0: 53 68 61 72 65 64 2a 29 70 41 72 67 3b 0a 20 20  Shared*)pArg;.  
8ed0: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 64 62 20  assert( pBt->db 
8ee0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
8ef0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
8f00: 70 42 74 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  pBt->db->mutex) 
8f10: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
8f20: 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  te3InvokeBusyHan
8f30: 64 6c 65 72 28 26 70 42 74 2d 3e 64 62 2d 3e 62  dler(&pBt->db->b
8f40: 75 73 79 48 61 6e 64 6c 65 72 29 3b 0a 7d 0a 0a  usyHandler);.}..
8f50: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 64 61 74  /*.** Open a dat
8f60: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a  abase file..** .
8f70: 2a 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  ** zFilename is 
8f80: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
8f90: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
8fa0: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
8fb0: 4e 55 4c 4c 0a 2a 2a 20 61 20 6e 65 77 20 64 61  NULL.** a new da
8fc0: 74 61 62 61 73 65 20 77 69 74 68 20 61 20 72 61  tabase with a ra
8fd0: 6e 64 6f 6d 20 6e 61 6d 65 20 69 73 20 63 72 65  ndom name is cre
8fe0: 61 74 65 64 2e 20 20 54 68 69 73 20 72 61 6e 64  ated.  This rand
8ff0: 6f 6d 6c 79 20 6e 61 6d 65 64 0a 2a 2a 20 64 61  omly named.** da
9000: 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c  tabase file will
9010: 20 62 65 20 64 65 6c 65 74 65 64 20 77 68 65 6e   be deleted when
9020: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
9030: 73 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  se() is called..
9040: 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
9050: 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
9060: 65 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  en an in-memory 
9070: 64 61 74 61 62 61 73 65 20 69 73 20 63 72 65 61  database is crea
9080: 74 65 64 0a 2a 2a 20 74 68 61 74 20 69 73 20 61  ted.** that is a
9090: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 73  utomatically des
90a0: 74 72 6f 79 65 64 20 77 68 65 6e 20 69 74 20 69  troyed when it i
90b0: 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74  s closed..*/.int
90c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65   sqlite3BtreeOpe
90d0: 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n(.  const char 
90e0: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 2f 2a 20  *zFilename,  /* 
90f0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  Name of the file
9100: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
9110: 42 54 72 65 65 20 64 61 74 61 62 61 73 65 20 2a  BTree database *
9120: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  /.  sqlite3 *db,
9130: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
9140: 73 73 6f 63 69 61 74 65 64 20 64 61 74 61 62 61  ssociated databa
9150: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 42  se handle */.  B
9160: 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65 2c 20  tree **ppBtree, 
9170: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
9180: 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65 20 6f  r to new Btree o
9190: 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20 68 65  bject written he
91a0: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  re */.  int flag
91b0: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
91c0: 2f 2a 20 4f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20  /* Options */.  
91d0: 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20 20  int vfsFlags    
91e0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
91f0: 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
9200: 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78  to sqlite3_vfs.x
9210: 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 73  Open() */.){.  s
9220: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
9230: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 56 46  ;      /* The VF
9240: 53 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 69  S to use for thi
9250: 73 20 62 74 72 65 65 20 2a 2f 0a 20 20 42 74 53  s btree */.  BtS
9260: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 30 3b 20  hared *pBt = 0; 
9270: 20 20 20 20 20 2f 2a 20 53 68 61 72 65 64 20 70       /* Shared p
9280: 61 72 74 20 6f 66 20 62 74 72 65 65 20 73 74 72  art of btree str
9290: 75 63 74 75 72 65 20 2a 2f 0a 20 20 42 74 72 65  ucture */.  Btre
92a0: 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20  e *p;           
92b0: 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 74 6f      /* Handle to
92c0: 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74   return */.  int
92d0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
92e0: 0a 20 20 69 6e 74 20 6e 52 65 73 65 72 76 65 3b  .  int nReserve;
92f0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
9300: 20 7a 44 62 48 65 61 64 65 72 5b 31 30 30 5d 3b   zDbHeader[100];
9310: 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 76  ..  /* Set the v
9320: 61 72 69 61 62 6c 65 20 69 73 4d 65 6d 64 62 20  ariable isMemdb 
9330: 74 6f 20 74 72 75 65 20 66 6f 72 20 61 6e 20 69  to true for an i
9340: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
9350: 65 2c 20 6f 72 20 0a 20 20 2a 2a 20 66 61 6c 73  e, or .  ** fals
9360: 65 20 66 6f 72 20 61 20 66 69 6c 65 2d 62 61 73  e for a file-bas
9370: 65 64 20 64 61 74 61 62 61 73 65 2e 20 54 68 69  ed database. Thi
9380: 73 20 73 79 6d 62 6f 6c 20 69 73 20 6f 6e 6c 79  s symbol is only
9390: 20 72 65 71 75 69 72 65 64 20 69 66 0a 20 20 2a   required if.  *
93a0: 2a 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  * either of the 
93b0: 73 68 61 72 65 64 2d 64 61 74 61 20 6f 72 20 61  shared-data or a
93c0: 75 74 6f 76 61 63 75 75 6d 20 66 65 61 74 75 72  utovacuum featur
93d0: 65 73 20 61 72 65 20 63 6f 6d 70 69 6c 65 64 20  es are compiled 
93e0: 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c  .  ** into the l
93f0: 69 62 72 61 72 79 2e 0a 20 20 2a 2f 0a 23 69 66  ibrary..  */.#if
9400: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
9410: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
9420: 48 45 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28  HE) || !defined(
9430: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
9440: 56 41 43 55 55 4d 29 0a 20 20 23 69 66 64 65 66  VACUUM).  #ifdef
9450: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
9460: 4f 52 59 44 42 0a 20 20 20 20 63 6f 6e 73 74 20  ORYDB.    const 
9470: 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d 20 30 3b  int isMemdb = 0;
9480: 0a 20 20 23 65 6c 73 65 0a 20 20 20 20 63 6f 6e  .  #else.    con
9490: 73 74 20 69 6e 74 20 69 73 4d 65 6d 64 62 20 3d  st int isMemdb =
94a0: 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 73   zFilename && !s
94b0: 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
94c0: 20 22 3a 6d 65 6d 6f 72 79 3a 22 29 3b 0a 20 20   ":memory:");.  
94d0: 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20  #endif.#endif.. 
94e0: 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20 29   assert( db!=0 )
94f0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
9500: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
9510: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  b->mutex) );..  
9520: 70 56 66 73 20 3d 20 64 62 2d 3e 70 56 66 73 3b  pVfs = db->pVfs;
9530: 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 4d 61  .  p = sqlite3Ma
9540: 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28  llocZero(sizeof(
9550: 42 74 72 65 65 29 29 3b 0a 20 20 69 66 28 20 21  Btree));.  if( !
9560: 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  p ){.    return 
9570: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
9580: 7d 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d  }.  p->inTrans =
9590: 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70   TRANS_NONE;.  p
95a0: 2d 3e 64 62 20 3d 20 64 62 3b 0a 0a 23 69 66 20  ->db = db;..#if 
95b0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
95c0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
95d0: 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
95e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
95f0: 4f 29 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20  O).  /*.  ** If 
9600: 74 68 69 73 20 42 74 72 65 65 20 69 73 20 61 20  this Btree is a 
9610: 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 73 68  candidate for sh
9620: 61 72 65 64 20 63 61 63 68 65 2c 20 74 72 79 20  ared cache, try 
9630: 74 6f 20 66 69 6e 64 20 61 6e 0a 20 20 2a 2a 20  to find an.  ** 
9640: 65 78 69 73 74 69 6e 67 20 42 74 53 68 61 72 65  existing BtShare
9650: 64 20 6f 62 6a 65 63 74 20 74 68 61 74 20 77 65  d object that we
9660: 20 63 61 6e 20 73 68 61 72 65 20 77 69 74 68 0a   can share with.
9670: 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 4d 65 6d    */.  if( isMem
9680: 64 62 3d 3d 30 0a 20 20 20 26 26 20 28 64 62 2d  db==0.   && (db-
9690: 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
96a0: 56 74 61 62 29 3d 3d 30 0a 20 20 20 26 26 20 7a  Vtab)==0.   && z
96b0: 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
96c0: 65 6e 61 6d 65 5b 30 5d 0a 20 20 29 7b 0a 20 20  ename[0].  ){.  
96d0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 68 61    if( sqlite3Sha
96e0: 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20  redCacheEnabled 
96f0: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 46 75  ){.      int nFu
9700: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 70 56 66  llPathname = pVf
9710: 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
9720: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 75  .      char *zFu
9730: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
9740: 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46 75 6c 6c  ite3Malloc(nFull
9750: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
9760: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
9770: 6d 75 74 65 78 53 68 61 72 65 64 3b 0a 20 20 20  mutexShared;.   
9780: 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 3d     p->sharable =
9790: 20 31 3b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c   1;.      db->fl
97a0: 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68  ags |= SQLITE_Sh
97b0: 61 72 65 64 43 61 63 68 65 3b 0a 20 20 20 20 20  aredCache;.     
97c0: 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74 68 6e   if( !zFullPathn
97d0: 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ame ){.        s
97e0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
97f0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
9800: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
9810: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
9820: 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
9830: 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
9840: 2c 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  , nFullPathname,
9850: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
9860: 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72  .      mutexShar
9870: 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ed = sqlite3Mute
9880: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
9890: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
98a0: 52 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  R);.      sqlite
98b0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75  3_mutex_enter(mu
98c0: 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20  texShared);.    
98d0: 20 20 66 6f 72 28 70 42 74 3d 73 71 6c 69 74 65    for(pBt=sqlite
98e0: 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74  3SharedCacheList
98f0: 3b 20 70 42 74 3b 20 70 42 74 3d 70 42 74 2d 3e  ; pBt; pBt=pBt->
9900: 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20  pNext){.        
9910: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 52 65  assert( pBt->nRe
9920: 66 3e 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  f>0 );.        i
9930: 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 46 75  f( 0==strcmp(zFu
9940: 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 73 71 6c 69  llPathname, sqli
9950: 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65  te3PagerFilename
9960: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 29 0a 20  (pBt->pPager)). 
9970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9980: 26 26 20 73 71 6c 69 74 65 33 50 61 67 65 72 56  && sqlite3PagerV
9990: 66 73 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d  fs(pBt->pPager)=
99a0: 3d 70 56 66 73 20 29 7b 0a 20 20 20 20 20 20 20  =pVfs ){.       
99b0: 20 20 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b     p->pBt = pBt;
99c0: 0a 20 20 20 20 20 20 20 20 20 20 70 42 74 2d 3e  .          pBt->
99d0: 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nRef++;.        
99e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
99f0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
9a00: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
9a10: 65 61 76 65 28 6d 75 74 65 78 53 68 61 72 65 64  eave(mutexShared
9a20: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9a30: 5f 66 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  _free(zFullPathn
9a40: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66 64  ame);.    }.#ifd
9a50: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
9a60: 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
9a70: 2f 2a 20 49 6e 20 64 65 62 75 67 20 6d 6f 64 65  /* In debug mode
9a80: 2c 20 77 65 20 6d 61 72 6b 20 61 6c 6c 20 70 65  , we mark all pe
9a90: 72 73 69 73 74 65 6e 74 20 64 61 74 61 62 61 73  rsistent databas
9aa0: 65 73 20 61 73 20 73 68 61 72 61 62 6c 65 0a 20  es as sharable. 
9ab0: 20 20 20 20 20 2a 2a 20 65 76 65 6e 20 77 68 65       ** even whe
9ac0: 6e 20 74 68 65 79 20 61 72 65 20 6e 6f 74 2e 20  n they are not. 
9ad0: 20 54 68 69 73 20 65 78 65 72 63 69 73 65 73 20   This exercises 
9ae0: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 63 6f 64 65  the locking code
9af0: 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 67 69   and.      ** gi
9b00: 76 65 73 20 6d 6f 72 65 20 6f 70 70 6f 72 74 75  ves more opportu
9b10: 6e 69 74 79 20 66 6f 72 20 61 73 73 65 72 74 73  nity for asserts
9b20: 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68  (sqlite3_mutex_h
9b30: 65 6c 64 28 29 29 0a 20 20 20 20 20 20 2a 2a 20  eld()).      ** 
9b40: 73 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 66 69  statements to fi
9b50: 6e 64 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 62 6c  nd locking probl
9b60: 65 6d 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ems..      */.  
9b70: 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c 65 20      p->sharable 
9b80: 3d 20 31 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  = 1;.    }.#endi
9b90: 66 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  f.  }.#endif.  i
9ba0: 66 28 20 70 42 74 3d 3d 30 20 29 7b 0a 20 20 20  f( pBt==0 ){.   
9bb0: 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 66   /*.    ** The f
9bc0: 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 73  ollowing asserts
9bd0: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
9be0: 73 74 72 75 63 74 75 72 65 73 20 75 73 65 64 20  structures used 
9bf0: 62 79 20 74 68 65 20 62 74 72 65 65 20 61 72 65  by the btree are
9c00: 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 69 67 68  .    ** the righ
9c10: 74 20 73 69 7a 65 2e 20 20 54 68 69 73 20 69 73  t size.  This is
9c20: 20 74 6f 20 67 75 61 72 64 20 61 67 61 69 6e 73   to guard agains
9c30: 74 20 73 69 7a 65 20 63 68 61 6e 67 65 73 20 74  t size changes t
9c40: 68 61 74 20 72 65 73 75 6c 74 0a 20 20 20 20 2a  hat result.    *
9c50: 2a 20 77 68 65 6e 20 63 6f 6d 70 69 6c 69 6e 67  * when compiling
9c60: 20 6f 6e 20 61 20 64 69 66 66 65 72 65 6e 74 20   on a different 
9c70: 61 72 63 68 69 74 65 63 74 75 72 65 2e 0a 20 20  architecture..  
9c80: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
9c90: 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d 38 20   sizeof(i64)==8 
9ca0: 7c 7c 20 73 69 7a 65 6f 66 28 69 36 34 29 3d 3d  || sizeof(i64)==
9cb0: 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4 );.    assert(
9cc0: 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d 38 20   sizeof(u64)==8 
9cd0: 7c 7c 20 73 69 7a 65 6f 66 28 75 36 34 29 3d 3d  || sizeof(u64)==
9ce0: 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  4 );.    assert(
9cf0: 20 73 69 7a 65 6f 66 28 75 33 32 29 3d 3d 34 20   sizeof(u32)==4 
9d00: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
9d10: 69 7a 65 6f 66 28 75 31 36 29 3d 3d 32 20 29 3b  izeof(u16)==2 );
9d20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a  .    assert( siz
9d30: 65 6f 66 28 50 67 6e 6f 29 3d 3d 34 20 29 3b 0a  eof(Pgno)==4 );.
9d40: 20 20 0a 20 20 20 20 70 42 74 20 3d 20 73 71 6c    .    pBt = sql
9d50: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
9d60: 73 69 7a 65 6f 66 28 2a 70 42 74 29 20 29 3b 0a  sizeof(*pBt) );.
9d70: 20 20 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29      if( pBt==0 )
9d80: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
9d90: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20  ITE_NOMEM;.     
9da0: 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e   goto btree_open
9db0: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
9dc0: 70 42 74 2d 3e 62 75 73 79 48 64 72 2e 78 46 75  pBt->busyHdr.xFu
9dd0: 6e 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  nc = sqlite3Btre
9de0: 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
9df0: 65 72 3b 0a 20 20 20 20 70 42 74 2d 3e 62 75 73  er;.    pBt->bus
9e00: 79 48 64 72 2e 70 41 72 67 20 3d 20 70 42 74 3b  yHdr.pArg = pBt;
9e10: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
9e20: 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c  3PagerOpen(pVfs,
9e30: 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a   &pBt->pPager, z
9e40: 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
9e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e60: 20 20 20 20 45 58 54 52 41 5f 53 49 5a 45 2c 20      EXTRA_SIZE, 
9e70: 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73 29  flags, vfsFlags)
9e80: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
9e90: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
9ea0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
9eb0: 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72  erReadFileheader
9ec0: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a  (pBt->pPager,siz
9ed0: 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a  eof(zDbHeader),z
9ee0: 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d  DbHeader);.    }
9ef0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
9f00: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
9f10: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
9f20: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  out;.    }.    s
9f30: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
9f40: 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70  syhandler(pBt->p
9f50: 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 62 75 73  Pager, &pBt->bus
9f60: 79 48 64 72 29 3b 0a 20 20 20 20 70 2d 3e 70 42  yHdr);.    p->pB
9f70: 74 20 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20  t = pBt;.  .    
9f80: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 44  sqlite3PagerSetD
9f90: 65 73 74 72 75 63 74 6f 72 28 70 42 74 2d 3e 70  estructor(pBt->p
9fa0: 50 61 67 65 72 2c 20 70 61 67 65 44 65 73 74 72  Pager, pageDestr
9fb0: 75 63 74 6f 72 29 3b 0a 20 20 20 20 73 71 6c 69  uctor);.    sqli
9fc0: 74 65 33 50 61 67 65 72 53 65 74 52 65 69 6e 69  te3PagerSetReini
9fd0: 74 65 72 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ter(pBt->pPager,
9fe0: 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a 20 20   pageReinit);.  
9ff0: 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d    pBt->pCursor =
a000: 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70 50 61   0;.    pBt->pPa
a010: 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  ge1 = 0;.    pBt
a020: 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 73 71 6c  ->readOnly = sql
a030: 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f  ite3PagerIsreado
a040: 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65 72 29  nly(pBt->pPager)
a050: 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  ;.    pBt->pageS
a060: 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26  ize = get2byte(&
a070: 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 29 3b 0a  zDbHeader[16]);.
a080: 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67      if( pBt->pag
a090: 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70 42 74  eSize<512 || pBt
a0a0: 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c 49 54  ->pageSize>SQLIT
a0b0: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 0a  E_MAX_PAGE_SIZE.
a0c0: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28 70 42           || ((pB
a0d0: 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29 26 70  t->pageSize-1)&p
a0e0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21 3d 30  Bt->pageSize)!=0
a0f0: 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70   ){.      pBt->p
a100: 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  ageSize = 0;.   
a110: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
a120: 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e  etPagesize(pBt->
a130: 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61  pPager, &pBt->pa
a140: 67 65 53 69 7a 65 29 3b 0a 23 69 66 6e 64 65 66  geSize);.#ifndef
a150: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
a160: 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
a170: 20 49 66 20 74 68 65 20 6d 61 67 69 63 20 6e 61   If the magic na
a180: 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 77 69  me ":memory:" wi
a190: 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69 6e 2d  ll create an in-
a1a0: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2c  memory database,
a1b0: 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 6c   then.      ** l
a1c0: 65 61 76 65 20 74 68 65 20 61 75 74 6f 56 61 63  eave the autoVac
a1d0: 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20 28 64  uum mode at 0 (d
a1e0: 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63 75 75  o not auto-vacuu
a1f0: 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20 20 20  m), even if.    
a200: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45 46 41    ** SQLITE_DEFA
a210: 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 69  ULT_AUTOVACUUM i
a220: 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65 20 6f  s true. On the o
a230: 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a 20 20  ther hand, if.  
a240: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 4d      ** SQLITE_OM
a250: 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61 73 20  IT_MEMORYDB has 
a260: 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20 74 68  been defined, th
a270: 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 69 73  en ":memory:" is
a280: 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20 2a 2a   just a.      **
a290: 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d 6e 61   regular file-na
a2a0: 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  me. In this case
a2b0: 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
a2c0: 20 61 70 70 6c 69 65 73 20 61 73 20 70 65 72 20   applies as per 
a2d0: 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20 2a 2f  normal..      */
a2e0: 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65  .      if( zFile
a2f0: 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d 64 62  name && !isMemdb
a300: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74 2d   ){.        pBt-
a310: 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 53  >autoVacuum = (S
a320: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
a330: 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a 20 30  TOVACUUM ? 1 : 0
a340: 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e  );.        pBt->
a350: 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28 53 51  incrVacuum = (SQ
a360: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
a370: 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31 20 3a  OVACUUM==2 ? 1 :
a380: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
a390: 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73 65 72  dif.      nReser
a3a0: 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ve = 0;.    }els
a3b0: 65 7b 0a 20 20 20 20 20 20 6e 52 65 73 65 72 76  e{.      nReserv
a3c0: 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b 32 30  e = zDbHeader[20
a3d0: 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  ];.      pBt->pa
a3e0: 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b  geSizeFixed = 1;
a3f0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
a400: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
a410: 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56        pBt->autoV
a420: 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
a430: 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20  e(&zDbHeader[36 
a440: 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20 20  + 4*4])?1:0);.  
a450: 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
a460: 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
a470: 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20 2b 20  &zDbHeader[36 + 
a480: 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64  7*4])?1:0);.#end
a490: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  if.    }.    pBt
a4a0: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70  ->usableSize = p
a4b0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e  Bt->pageSize - n
a4c0: 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73 73  Reserve;.    ass
a4d0: 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67 65 53  ert( (pBt->pageS
a4e0: 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 20 20  ize & 7)==0 );  
a4f0: 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
a500: 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a 65 20  ent of pageSize 
a510: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  */.    sqlite3Pa
a520: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
a530: 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
a540: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
a550: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
a560: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
a570: 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
a580: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
a590: 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a 20 41  DISKIO).    /* A
a5a0: 64 64 20 74 68 65 20 6e 65 77 20 42 74 53 68 61  dd the new BtSha
a5b0: 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20 74 68  red object to th
a5c0: 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 73 68  e linked list sh
a5d0: 61 72 61 62 6c 65 20 42 74 53 68 61 72 65 64 73  arable BtShareds
a5e0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
a5f0: 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a   p->sharable ){.
a600: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
a610: 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64  tex *mutexShared
a620: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 52 65  ;.      pBt->nRe
a630: 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 6d 75 74  f = 1;.      mut
a640: 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74  exShared = sqlit
a650: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
a660: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
a670: 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20  _MASTER);.      
a680: 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52 45 41  if( SQLITE_THREA
a690: 44 53 41 46 45 20 26 26 20 73 71 6c 69 74 65 33  DSAFE && sqlite3
a6a0: 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
a6b0: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  x ){.        pBt
a6c0: 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  ->mutex = sqlite
a6d0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
a6e0: 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
a6f0: 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d          if( pBt-
a700: 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
a710: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
a720: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
a730: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
a740: 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  iled = 0;.      
a750: 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
a760: 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  pen_out;.       
a770: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
a780: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
a790: 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64  nter(mutexShared
a7a0: 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e  );.      pBt->pN
a7b0: 65 78 74 20 3d 20 73 71 6c 69 74 65 33 53 68 61  ext = sqlite3Sha
a7c0: 72 65 64 43 61 63 68 65 4c 69 73 74 3b 0a 20 20  redCacheList;.  
a7d0: 20 20 20 20 73 71 6c 69 74 65 33 53 68 61 72 65      sqlite3Share
a7e0: 64 43 61 63 68 65 4c 69 73 74 20 3d 20 70 42 74  dCacheList = pBt
a7f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
a800: 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65  mutex_leave(mute
a810: 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 7d 0a  xShared);.    }.
a820: 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 23 69 66 20  #endif.  }..#if 
a830: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
a840: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
a850: 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
a860: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49  QLITE_OMIT_DISKI
a870: 4f 29 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6e  O).  /* If the n
a880: 65 77 20 42 74 72 65 65 20 75 73 65 73 20 61 20  ew Btree uses a 
a890: 73 68 61 72 61 62 6c 65 20 70 42 74 53 68 61 72  sharable pBtShar
a8a0: 65 64 2c 20 74 68 65 6e 20 6c 69 6e 6b 20 74 68  ed, then link th
a8b0: 65 20 6e 65 77 0a 20 20 2a 2a 20 42 74 72 65 65  e new.  ** Btree
a8c0: 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 20 6f   into the list o
a8d0: 66 20 61 6c 6c 20 73 68 61 72 61 62 6c 65 20 42  f all sharable B
a8e0: 74 72 65 65 73 20 66 6f 72 20 74 68 65 20 73 61  trees for the sa
a8f0: 6d 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20  me connection.. 
a900: 20 2a 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20   ** The list is 
a910: 6b 65 70 74 20 69 6e 20 61 73 63 65 6e 64 69 6e  kept in ascendin
a920: 67 20 6f 72 64 65 72 20 62 79 20 70 42 74 20 61  g order by pBt a
a930: 64 64 72 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 69  ddress..  */.  i
a940: 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
a950: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
a960: 20 42 74 72 65 65 20 2a 70 53 69 62 3b 0a 20 20   Btree *pSib;.  
a970: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
a980: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
a990: 20 20 69 66 28 20 28 70 53 69 62 20 3d 20 64 62    if( (pSib = db
a9a0: 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 21 3d 30  ->aDb[i].pBt)!=0
a9b0: 20 26 26 20 70 53 69 62 2d 3e 73 68 61 72 61 62   && pSib->sharab
a9c0: 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68  le ){.        wh
a9d0: 69 6c 65 28 20 70 53 69 62 2d 3e 70 50 72 65 76  ile( pSib->pPrev
a9e0: 20 29 7b 20 70 53 69 62 20 3d 20 70 53 69 62 2d   ){ pSib = pSib-
a9f0: 3e 70 50 72 65 76 3b 20 7d 0a 20 20 20 20 20 20  >pPrev; }.      
aa00: 20 20 69 66 28 20 70 2d 3e 70 42 74 3c 70 53 69    if( p->pBt<pSi
aa10: 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20  b->pBt ){.      
aa20: 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
aa30: 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Sib;.          p
aa40: 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20  ->pPrev = 0;.   
aa50: 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 50 72         pSib->pPr
aa60: 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20  ev = p;.        
aa70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
aa80: 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70 4e   while( pSib->pN
aa90: 65 78 74 20 26 26 20 70 53 69 62 2d 3e 70 4e 65  ext && pSib->pNe
aaa0: 78 74 2d 3e 70 42 74 3c 70 2d 3e 70 42 74 20 29  xt->pBt<p->pBt )
aab0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  {.            pS
aac0: 69 62 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74  ib = pSib->pNext
aad0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
aae0: 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
aaf0: 20 3d 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a   = pSib->pNext;.
ab00: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50 72            p->pPr
ab10: 65 76 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20  ev = pSib;.     
ab20: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78       if( p->pNex
ab30: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  t ){.           
ab40: 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
ab50: 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 20 20   = p;.          
ab60: 7d 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62  }.          pSib
ab70: 2d 3e 70 4e 65 78 74 20 3d 20 70 3b 0a 20 20 20  ->pNext = p;.   
ab80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62       }.        b
ab90: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
aba0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
abb0: 20 2a 70 70 42 74 72 65 65 20 3d 20 70 3b 0a 0a   *ppBtree = p;..
abc0: 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a  btree_open_out:.
abd0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
abe0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  _OK ){.    if( p
abf0: 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  Bt && pBt->pPage
ac00: 72 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  r ){.      sqlit
ac10: 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42 74  e3PagerClose(pBt
ac20: 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  ->pPager);.    }
ac30: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
ac40: 65 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  e(pBt);.    sqli
ac50: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
ac60: 20 2a 70 70 42 74 72 65 65 20 3d 20 30 3b 0a 20   *ppBtree = 0;. 
ac70: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
ac80: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 72 65 6d 65  }../*.** Decreme
ac90: 6e 74 20 74 68 65 20 42 74 53 68 61 72 65 64 2e  nt the BtShared.
aca0: 6e 52 65 66 20 63 6f 75 6e 74 65 72 2e 20 20 57  nRef counter.  W
acb0: 68 65 6e 20 69 74 20 72 65 61 63 68 65 73 20 7a  hen it reaches z
acc0: 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f 76 65 20 74  ero,.** remove t
acd0: 68 65 20 42 74 53 68 61 72 65 64 20 73 74 72 75  he BtShared stru
ace0: 63 74 75 72 65 20 66 72 6f 6d 20 74 68 65 20 73  cture from the s
acf0: 68 61 72 69 6e 67 20 6c 69 73 74 2e 20 20 52 65  haring list.  Re
ad00: 74 75 72 6e 0a 2a 2a 20 74 72 75 65 20 69 66 20  turn.** true if 
ad10: 74 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65  the BtShared.nRe
ad20: 66 20 63 6f 75 6e 74 65 72 20 72 65 61 63 68 65  f counter reache
ad30: 73 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  s zero and retur
ad40: 6e 0a 2a 2a 20 66 61 6c 73 65 20 69 66 20 69 74  n.** false if it
ad50: 20 69 73 20 73 74 69 6c 6c 20 70 6f 73 69 74 69   is still positi
ad60: 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ve..*/.static in
ad70: 74 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72  t removeFromShar
ad80: 69 6e 67 4c 69 73 74 28 42 74 53 68 61 72 65 64  ingList(BtShared
ad90: 20 2a 70 42 74 29 7b 0a 23 69 66 6e 64 65 66 20   *pBt){.#ifndef 
ada0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
adb0: 45 44 5f 43 41 43 48 45 0a 20 20 73 71 6c 69 74  ED_CACHE.  sqlit
adc0: 65 33 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65  e3_mutex *pMaste
add0: 72 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  r;.  BtShared *p
ade0: 4c 69 73 74 3b 0a 20 20 69 6e 74 20 72 65 6d 6f  List;.  int remo
adf0: 76 65 64 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ved = 0;..  asse
ae00: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
ae10: 78 5f 6e 6f 74 68 65 6c 64 28 70 42 74 2d 3e 6d  x_notheld(pBt->m
ae20: 75 74 65 78 29 20 29 3b 0a 20 20 70 4d 61 73 74  utex) );.  pMast
ae30: 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  er = sqlite3Mute
ae40: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
ae50: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
ae60: 52 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  R);.  sqlite3_mu
ae70: 74 65 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65  tex_enter(pMaste
ae80: 72 29 3b 0a 20 20 70 42 74 2d 3e 6e 52 65 66 2d  r);.  pBt->nRef-
ae90: 2d 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6e 52  -;.  if( pBt->nR
aea0: 65 66 3c 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  ef<=0 ){.    if(
aeb0: 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61   sqlite3SharedCa
aec0: 63 68 65 4c 69 73 74 3d 3d 70 42 74 20 29 7b 0a  cheList==pBt ){.
aed0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 68 61        sqlite3Sha
aee0: 72 65 64 43 61 63 68 65 4c 69 73 74 20 3d 20 70  redCacheList = p
aef0: 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  Bt->pNext;.    }
af00: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73  else{.      pLis
af10: 74 20 3d 20 73 71 6c 69 74 65 33 53 68 61 72 65  t = sqlite3Share
af20: 64 43 61 63 68 65 4c 69 73 74 3b 0a 20 20 20 20  dCacheList;.    
af30: 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59 53 28    while( ALWAYS(
af40: 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73 74 2d  pList) && pList-
af50: 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b 0a 20  >pNext!=pBt ){. 
af60: 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70 4c 69         pList=pLi
af70: 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  st->pNext;.     
af80: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57   }.      if( ALW
af90: 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a 20 20  AYS(pList) ){.  
afa0: 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70 4e 65        pList->pNe
afb0: 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b  xt = pBt->pNext;
afc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
afd0: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48     if( SQLITE_TH
afe0: 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20 20 20  READSAFE ){.    
aff0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
b000: 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65 78 29  free(pBt->mutex)
b010: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6d 6f  ;.    }.    remo
b020: 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 73  ved = 1;.  }.  s
b030: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
b040: 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 72  ve(pMaster);.  r
b050: 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b 0a 23  eturn removed;.#
b060: 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 31 3b  else.  return 1;
b070: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
b080: 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74 2d 3e   Make sure pBt->
b090: 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e 74 73  pTmpSpace points
b0a0: 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f   to an allocatio
b0b0: 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45 4c 4c  n of .** MX_CELL
b0c0: 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74 65 73  _SIZE(pBt) bytes
b0d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b0e0: 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61   allocateTempSpa
b0f0: 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ce(BtShared *pBt
b100: 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  ){.  if( !pBt->p
b110: 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20  TmpSpace ){.    
b120: 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d  pBt->pTmpSpace =
b130: 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c   sqlite3PageMall
b140: 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  oc( pBt->pageSiz
b150: 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  e );.  }.}../*.*
b160: 2a 20 46 72 65 65 20 74 68 65 20 70 42 74 2d 3e  * Free the pBt->
b170: 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f 63 61  pTmpSpace alloca
b180: 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  tion.*/.static v
b190: 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70 61 63  oid freeTempSpac
b1a0: 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
b1b0: 7b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46  {.  sqlite3PageF
b1c0: 72 65 65 28 20 70 42 74 2d 3e 70 54 6d 70 53 70  ree( pBt->pTmpSp
b1d0: 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e 70 54 6d  ace);.  pBt->pTm
b1e0: 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d 0a 0a 2f  pSpace = 0;.}../
b1f0: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f 70  *.** Close an op
b200: 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  en database and 
b210: 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63  invalidate all c
b220: 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  ursors..*/.int s
b230: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
b240: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
b250: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
b260: 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f 72  >pBt;.  BtCursor
b270: 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43 6c   *pCur;..  /* Cl
b280: 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  ose all cursors 
b290: 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73 20  opened via this 
b2a0: 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61 73  handle.  */.  as
b2b0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
b2c0: 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
b2d0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
b2e0: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
b2f0: 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d  ;.  pBt->db = p-
b300: 3e 64 62 3b 0a 20 20 70 43 75 72 20 3d 20 70 42  >db;.  pCur = pB
b310: 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77 68  t->pCursor;.  wh
b320: 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20 20  ile( pCur ){.   
b330: 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70 20   BtCursor *pTmp 
b340: 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75 72  = pCur;.    pCur
b350: 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
b360: 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70 42      if( pTmp->pB
b370: 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20  tree==p ){.     
b380: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
b390: 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b 0a  seCursor(pTmp);.
b3a0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
b3b0: 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63 74  Rollback any act
b3c0: 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ive transaction 
b3d0: 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61 6e  and free the han
b3e0: 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a 20  dle structure.. 
b3f0: 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20   ** The call to 
b400: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
b410: 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e 79  back() drops any
b420: 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65 6c   table-locks hel
b430: 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20 68  d by.  ** this h
b440: 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73 71  andle..  */.  sq
b450: 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
b460: 63 6b 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ck(p);.  sqlite3
b470: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 0a  BtreeLeave(p);..
b480: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
b490: 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f 75  e still other ou
b4a0: 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65  tstanding refere
b4b0: 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68 61 72  nces to the shar
b4c0: 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73 74  ed-btree.  ** st
b4d0: 72 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e 20  ructure, return 
b4e0: 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e 64  now. The remaind
b4f0: 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63 65  er of this proce
b500: 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20 2a  dure cleans .  *
b510: 2a 20 75 70 20 74 68 65 20 73 68 61 72 65 64 2d  * up the shared-
b520: 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  btree..  */.  as
b530: 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c  sert( p->wantToL
b540: 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f 63  ock==0 && p->loc
b550: 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  ked==0 );.  if( 
b560: 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20  !p->sharable || 
b570: 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e  removeFromSharin
b580: 67 4c 69 73 74 28 70 42 74 29 20 29 7b 0a 20 20  gList(pBt) ){.  
b590: 20 20 2f 2a 20 54 68 65 20 70 42 74 20 69 73 20    /* The pBt is 
b5a0: 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68 65  no longer on the
b5b0: 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2c 20 73   sharing list, s
b5c0: 6f 20 77 65 20 63 61 6e 20 61 63 63 65 73 73 0a  o we can access.
b5d0: 20 20 20 20 2a 2a 20 69 74 20 77 69 74 68 6f 75      ** it withou
b5e0: 74 20 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c 64  t having to hold
b5f0: 20 74 68 65 20 6d 75 74 65 78 2e 0a 20 20 20 20   the mutex..    
b600: 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e 20  **.    ** Clean 
b610: 6f 75 74 20 61 6e 64 20 64 65 6c 65 74 65 20 74  out and delete t
b620: 68 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  he BtShared obje
b630: 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ct..    */.    a
b640: 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43 75  ssert( !pBt->pCu
b650: 72 73 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c 69  rsor );.    sqli
b660: 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70 42  te3PagerClose(pB
b670: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
b680: 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53 63  if( pBt->xFreeSc
b690: 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53 63  hema && pBt->pSc
b6a0: 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 70 42  hema ){.      pB
b6b0: 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28 70  t->xFreeSchema(p
b6c0: 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Bt->pSchema);.  
b6d0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
b6e0: 66 72 65 65 28 70 42 74 2d 3e 70 53 63 68 65 6d  free(pBt->pSchem
b6f0: 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70  a);.    freeTemp
b700: 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
b710: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 74  sqlite3_free(pBt
b720: 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
b730: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
b740: 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73 65 72  ED_CACHE.  asser
b750: 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b  t( p->wantToLock
b760: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
b770: 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b   p->locked==0 );
b780: 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65 76 20  .  if( p->pPrev 
b790: 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78  ) p->pPrev->pNex
b7a0: 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20  t = p->pNext;.  
b7b0: 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 20 70  if( p->pNext ) p
b7c0: 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
b7d0: 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e 64 69   p->pPrev;.#endi
b7e0: 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  f..  sqlite3_fre
b7f0: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
b800: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
b810: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6c 69  ** Change the li
b820: 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d 62 65  mit on the numbe
b830: 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c 6f 77  r of pages allow
b840: 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65 2e  ed in the cache.
b850: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  .**.** The maxim
b860: 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 63  um number of cac
b870: 68 65 20 70 61 67 65 73 20 69 73 20 73 65 74 20  he pages is set 
b880: 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74 65 0a  to the absolute.
b890: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61  ** value of mxPa
b8a0: 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65 20 69  ge.  If mxPage i
b8b0: 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20  s negative, the 
b8c0: 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20 6f 70  pager will.** op
b8d0: 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f 6e 6f  erate asynchrono
b8e0: 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c 20 6e  usly - it will n
b8f0: 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20 66 73  ot stop to do fs
b900: 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69 6e 73  ync()s.** to ins
b910: 75 72 65 20 64 61 74 61 20 69 73 20 77 72 69 74  ure data is writ
b920: 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73 6b 20  ten to the disk 
b930: 73 75 72 66 61 63 65 20 62 65 66 6f 72 65 0a 2a  surface before.*
b940: 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20 20 54  * continuing.  T
b950: 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74 69 6c  ransactions stil
b960: 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63 68 72  l work if synchr
b970: 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a 2a 2a  onous is off,.**
b980: 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73   and the databas
b990: 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 72 72  e cannot be corr
b9a0: 75 70 74 65 64 20 69 66 20 74 68 69 73 20 70 72  upted if this pr
b9b0: 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68 65 73  ogram.** crashes
b9c0: 2e 20 20 42 75 74 20 69 66 20 74 68 65 20 6f 70  .  But if the op
b9d0: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
b9e0: 72 61 73 68 65 73 20 6f 72 20 74 68 65 72 65 20  rashes or there 
b9f0: 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70 74 20  is.** an abrupt 
ba00: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 77 68  power failure wh
ba10: 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 69  en synchronous i
ba20: 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74 61 62  s off, the datab
ba30: 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62 65 20  ase.** could be 
ba40: 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e  left in an incon
ba50: 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e 72 65  sistent and unre
ba60: 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74 65 2e  coverable state.
ba70: 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75 73 20  .** Synchronous 
ba80: 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75 6c 74  is on by default
ba90: 20 73 6f 20 64 61 74 61 62 61 73 65 20 63 6f 72   so database cor
baa0: 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 2a  ruption is not.*
bab0: 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77 6f 72  * normally a wor
bac0: 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ry..*/.int sqlit
bad0: 65 33 42 74 72 65 65 53 65 74 43 61 63 68 65 53  e3BtreeSetCacheS
bae0: 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ize(Btree *p, in
baf0: 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42 74 53  t mxPage){.  BtS
bb00: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
bb10: 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
bb20: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
bb30: 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
bb40: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
bb50: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c  eEnter(p);.  sql
bb60: 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
bb70: 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65  esize(pBt->pPage
bb80: 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71  r, mxPage);.  sq
bb90: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
bba0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
bbb0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
bbc0: 20 43 68 61 6e 67 65 20 74 68 65 20 77 61 79 20   Change the way 
bbd0: 64 61 74 61 20 69 73 20 73 79 6e 63 65 64 20 74  data is synced t
bbe0: 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65 72 20  o disk in order 
bbf0: 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72 20 64  to increase or d
bc00: 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77 20 77  ecrease.** how w
bc10: 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61 73 65  ell the database
bc20: 20 72 65 73 69 73 74 73 20 64 61 6d 61 67 65 20   resists damage 
bc30: 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65  due to OS crashe
bc40: 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a 20 66  s and power.** f
bc50: 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65 6c 20  ailures.  Level 
bc60: 31 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  1 is the same as
bc70: 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20 28 6e   asynchronous (n
bc80: 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75 72 20  o syncs() occur 
bc90: 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69 73 20  and.** there is 
bca0: 61 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69  a high probabili
bcb0: 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20 20 4c  ty of damage)  L
bcc0: 65 76 65 6c 20 32 20 69 73 20 74 68 65 20 64 65  evel 2 is the de
bcd0: 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a 2a 2a  fault.  There.**
bce0: 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77 20 62   is a very low b
bcf0: 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72 6f 62  ut non-zero prob
bd00: 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
bd10: 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65 64 75  e.  Level 3 redu
bd20: 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f 62 61  ces the.** proba
bd30: 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65  bility of damage
bd40: 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20 62 75   to near zero bu
bd50: 74 20 77 69 74 68 20 61 20 77 72 69 74 65 20 70  t with a write p
bd60: 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75 63  erformance reduc
bd70: 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  tion..*/.#ifndef
bd80: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47   SQLITE_OMIT_PAG
bd90: 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74 20 73  ER_PRAGMAS.int s
bda0: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 53 61  qlite3BtreeSetSa
bdb0: 66 65 74 79 4c 65 76 65 6c 28 42 74 72 65 65 20  fetyLevel(Btree 
bdc0: 2a 70 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69  *p, int level, i
bdd0: 6e 74 20 66 75 6c 6c 53 79 6e 63 29 7b 0a 20 20  nt fullSync){.  
bde0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
bdf0: 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  p->pBt;.  assert
be00: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
be10: 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
be20: 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
be30: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
be40: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 53  sqlite3PagerSetS
be50: 61 66 65 74 79 4c 65 76 65 6c 28 70 42 74 2d 3e  afetyLevel(pBt->
be60: 70 50 61 67 65 72 2c 20 6c 65 76 65 6c 2c 20 66  pPager, level, f
be70: 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71 6c 69  ullSync);.  sqli
be80: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
be90: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
bea0: 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
beb0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
bec0: 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 62  E if the given b
bed0: 74 72 65 65 20 69 73 20 73 65 74 20 74 6f 20 73  tree is set to s
bee0: 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e 20 20  afety level 1.  
bef0: 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f 72 64  In other.** word
bf00: 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69  s, return TRUE i
bf10: 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63 63 75  f no sync() occu
bf20: 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66  rs on the disk f
bf30: 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  iles..*/.int sql
bf40: 69 74 65 33 42 74 72 65 65 53 79 6e 63 44 69 73  ite3BtreeSyncDis
bf50: 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70 29 7b  abled(Btree *p){
bf60: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
bf70: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
bf80: 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 73   rc;.  assert( s
bf90: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
bfa0: 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
bfb0: 29 3b 20 20 0a 20 20 73 71 6c 69 74 65 33 42 74  );  .  sqlite3Bt
bfc0: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 61  reeEnter(p);.  a
bfd0: 73 73 65 72 74 28 20 70 42 74 20 26 26 20 70 42  ssert( pBt && pB
bfe0: 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20 20 72  t->pPager );.  r
bff0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
c000: 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50 61 67  Nosync(pBt->pPag
c010: 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  er);.  sqlite3Bt
c020: 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
c030: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
c040: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
c050: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
c060: 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  MAS) || !defined
c070: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43  (SQLITE_OMIT_VAC
c080: 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  UUM)./*.** Chang
c090: 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 70 61  e the default pa
c0a0: 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74 68 65  ges size and the
c0b0: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
c0c0: 76 65 64 20 62 79 74 65 73 20 70 65 72 20 70 61  ved bytes per pa
c0d0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ge..**.** The pa
c0e0: 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20  ge size must be 
c0f0: 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62 65 74  a power of 2 bet
c100: 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36 35 35  ween 512 and 655
c110: 33 36 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  36.  If the page
c120: 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c 69 65  .** size supplie
c130: 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65 74 20  d does not meet 
c140: 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e 74 20  this constraint 
c150: 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 73 69  then the page si
c160: 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63 68 61  ze is not.** cha
c170: 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61 67 65  nged..**.** Page
c180: 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e 73 74   sizes are const
c190: 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61 20 70  rained to be a p
c1a0: 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f 20 74  ower of two so t
c1b0: 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e 0a 2a  hat the region.*
c1c0: 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
c1d0: 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f 72 20  e file used for 
c1e0: 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e 6e 69  locking (beginni
c1f0: 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f 42 59  ng at PENDING_BY
c200: 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  TE,.** the first
c210: 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20 31   byte past the 1
c220: 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30 78 34  GB boundary, 0x4
c230: 30 30 30 30 30 30 30 29 20 6e 65 65 64 73 20 74  0000000) needs t
c240: 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20 74 68  o occur.** at th
c250: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
c260: 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
c270: 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73 65 72  parameter nReser
c280: 76 65 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ve is less than 
c290: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6e  zero, then the n
c2a0: 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72 76 65  umber of reserve
c2b0: 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72 20 70  d.** bytes per p
c2c0: 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e 63 68  age is left unch
c2d0: 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  anged..*/.int sq
c2e0: 6c 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67  lite3BtreeSetPag
c2f0: 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
c300: 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20 69 6e  int pageSize, in
c310: 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20 20 69  t nReserve){.  i
c320: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
c330: 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  K;.  BtShared *p
c340: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
c350: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
c360: 28 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  (p);.  if( pBt->
c370: 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 29 7b  pageSizeFixed ){
c380: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
c390: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72  eLeave(p);.    r
c3a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
c3b0: 44 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28  DONLY;.  }.  if(
c3c0: 20 6e 52 65 73 65 72 76 65 3c 30 20 29 7b 0a 20   nReserve<0 ){. 
c3d0: 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 70 42     nReserve = pB
c3e0: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
c3f0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
c400: 20 7d 0a 20 20 69 66 28 20 70 61 67 65 53 69 7a   }.  if( pageSiz
c410: 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
c420: 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
c430: 41 47 45 5f 53 49 5a 45 20 26 26 0a 20 20 20 20  AGE_SIZE &&.    
c440: 20 20 20 20 28 28 70 61 67 65 53 69 7a 65 2d 31      ((pageSize-1
c450: 29 26 70 61 67 65 53 69 7a 65 29 3d 3d 30 20 29  )&pageSize)==0 )
c460: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  {.    assert( (p
c470: 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
c480: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
c490: 70 42 74 2d 3e 70 50 61 67 65 31 20 26 26 20 21  pBt->pPage1 && !
c4a0: 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a  pBt->pCursor );.
c4b0: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
c4c0: 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
c4d0: 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
c4e0: 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  pBt);.    rc = s
c4f0: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
c500: 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
c510: 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
c520: 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e  ze);.  }.  pBt->
c530: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74  usableSize = pBt
c540: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 6e 52 65  ->pageSize - nRe
c550: 73 65 72 76 65 3b 0a 20 20 73 71 6c 69 74 65 33  serve;.  sqlite3
c560: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
c570: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
c580: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
c590: 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e 65  currently define
c5a0: 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69  d page size.*/.i
c5b0: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  nt sqlite3BtreeG
c5c0: 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
c5d0: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70   *p){.  return p
c5e0: 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b  ->pBt->pageSize;
c5f0: 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
c600: 72 65 65 47 65 74 52 65 73 65 72 76 65 28 42 74  reeGetReserve(Bt
c610: 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e  ree *p){.  int n
c620: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
c630: 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
c640: 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
c650: 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c   - p->pBt->usabl
c660: 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74 65 33  eSize;.  sqlite3
c670: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
c680: 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
c690: 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78 69  .** Set the maxi
c6a0: 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 66  mum page count f
c6b0: 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 69 66  or a database if
c6c0: 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74   mxPage is posit
c6d0: 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67  ive..** No chang
c6e0: 65 73 20 61 72 65 20 6d 61 64 65 20 69 66 20 6d  es are made if m
c6f0: 78 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e 65  xPage is 0 or ne
c700: 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72  gative..** Regar
c710: 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61 6c  dless of the val
c720: 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65  ue of mxPage, re
c730: 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d  turn the maximum
c740: 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a   page count..*/.
c750: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
c760: 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74 72  MaxPageCount(Btr
c770: 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67  ee *p, int mxPag
c780: 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73  e){.  int n;.  s
c790: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
c7a0: 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74  (p);.  n = sqlit
c7b0: 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f  e3PagerMaxPageCo
c7c0: 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  unt(p->pBt->pPag
c7d0: 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20 73  er, mxPage);.  s
c7e0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
c7f0: 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b  (p);.  return n;
c800: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  .}.#endif /* !de
c810: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
c820: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29  T_PAGER_PRAGMAS)
c830: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
c840: 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29  ITE_OMIT_VACUUM)
c850: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67   */../*.** Chang
c860: 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75  e the 'auto-vacu
c870: 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66 20  um' property of 
c880: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66  the database. If
c890: 20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75 6d   the 'autoVacuum
c8a0: 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  '.** parameter i
c8b0: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
c8c0: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
c8d0: 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49 66  e is enabled. If
c8e0: 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20   zero, it.** is 
c8f0: 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64 65  disabled. The de
c900: 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72 20  fault value for 
c910: 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  the auto-vacuum 
c920: 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a 20  property is .** 
c930: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
c940: 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  e SQLITE_DEFAULT
c950: 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63 72  _AUTOVACUUM macr
c960: 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
c970: 33 42 74 72 65 65 53 65 74 41 75 74 6f 56 61 63  3BtreeSetAutoVac
c980: 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  uum(Btree *p, in
c990: 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23  t autoVacuum){.#
c9a0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
c9b0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
c9c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41  eturn SQLITE_REA
c9d0: 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42  DONLY;.#else.  B
c9e0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
c9f0: 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
ca00: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
ca10: 6e 74 20 61 76 20 3d 20 28 61 75 74 6f 56 61 63  nt av = (autoVac
ca20: 75 75 6d 3f 31 3a 30 29 3b 0a 0a 20 20 73 71 6c  uum?1:0);..  sql
ca30: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
ca40: 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61  );.  if( pBt->pa
ca50: 67 65 53 69 7a 65 46 69 78 65 64 20 26 26 20 61  geSizeFixed && a
ca60: 76 21 3d 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  v!=pBt->autoVacu
ca70: 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  um ){.    rc = S
ca80: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
ca90: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 42 74    }else{.    pBt
caa0: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 61  ->autoVacuum = a
cab0: 76 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  v;.  }.  sqlite3
cac0: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
cad0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
cae0: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  if.}../*.** Retu
caf0: 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  rn the value of 
cb00: 74 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d  the 'auto-vacuum
cb10: 27 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61  ' property. If a
cb20: 75 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a  uto-vacuum is .*
cb30: 2a 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72  * enabled 1 is r
cb40: 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
cb50: 73 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  se 0..*/.int sql
cb60: 69 74 65 33 42 74 72 65 65 47 65 74 41 75 74 6f  ite3BtreeGetAuto
cb70: 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29  Vacuum(Btree *p)
cb80: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
cb90: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
cba0: 20 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41    return BTREE_A
cbb0: 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a  UTOVACUUM_NONE;.
cbc0: 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a  #else.  int rc;.
cbd0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
cbe0: 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28  ter(p);.  rc = (
cbf0: 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61  .    (!p->pBt->a
cc00: 75 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45  utoVacuum)?BTREE
cc10: 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45  _AUTOVACUUM_NONE
cc20: 3a 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e  :.    (!p->pBt->
cc30: 69 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45  incrVacuum)?BTRE
cc40: 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c  E_AUTOVACUUM_FUL
cc50: 4c 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54  L:.    BTREE_AUT
cc60: 4f 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29  OVACUUM_INCR.  )
cc70: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
cc80: 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
cc90: 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a  rn rc;.#endif.}.
cca0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65  ../*.** Get a re
ccb0: 66 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65  ference to pPage
ccc0: 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  1 of the databas
ccd0: 65 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69  e file.  This wi
cce0: 6c 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69  ll.** also acqui
ccf0: 72 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e  re a readlock on
cd00: 20 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a   that file..**.*
cd10: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
cd20: 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
cd30: 73 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65  ss.  If the file
cd40: 20 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c   is not a.** wel
cd50: 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  l-formed databas
cd60: 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c  e file, then SQL
cd70: 49 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72  ITE_CORRUPT is r
cd80: 65 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49  eturned..** SQLI
cd90: 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72  TE_BUSY is retur
cda0: 6e 65 64 20 69 66 20 74 68 65 20 64 61 74 61 62  ned if the datab
cdb0: 61 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20  ase is locked.  
cdc0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20  SQLITE_NOMEM.** 
cdd0: 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 77  is returned if w
cde0: 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d  e run out of mem
cdf0: 6f 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  ory. .*/.static 
ce00: 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74  int lockBtree(Bt
ce10: 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20  Shared *pBt){.  
ce20: 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67  int rc;.  MemPag
ce30: 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74  e *pPage1;.  int
ce40: 20 6e 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72   nPage;..  asser
ce50: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
ce60: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
ce70: 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  ) );.  if( pBt->
ce80: 70 50 61 67 65 31 20 29 20 72 65 74 75 72 6e 20  pPage1 ) return 
ce90: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 63 20  SQLITE_OK;.  rc 
cea0: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
ceb0: 74 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70  tPage(pBt, 1, &p
cec0: 50 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28  Page1, 0);.  if(
ced0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
cee0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
cef0: 2a 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69  * Do some checki
cf00: 6e 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72  ng to help insur
cf10: 65 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70  e the file we op
cf20: 65 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20  ened really is. 
cf30: 20 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61   ** a valid data
cf40: 62 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f  base file. .  */
cf50: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
cf60: 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
cf70: 74 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67  t->pPager, &nPag
cf80: 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
cf90: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
cfa0: 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
cfb0: 61 69 6c 65 64 3b 0a 20 20 7d 65 6c 73 65 20 69  ailed;.  }else i
cfc0: 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20  f( nPage>0 ){.  
cfd0: 20 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 0a    int pageSize;.
cfe0: 20 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69      int usableSi
cff0: 7a 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65  ze;.    u8 *page
d000: 31 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74  1 = pPage1->aDat
d010: 61 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  a;.    rc = SQLI
d020: 54 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 69  TE_NOTADB;.    i
d030: 66 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c  f( memcmp(page1,
d040: 20 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31   zMagicHeader, 1
d050: 36 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67  6)!=0 ){.      g
d060: 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
d070: 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
d080: 20 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31   if( page1[18]>1
d090: 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 72   ){.      pBt->r
d0a0: 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20  eadOnly = 1;.   
d0b0: 20 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31   }.    if( page1
d0c0: 5b 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20  [19]>1 ){.      
d0d0: 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
d0e0: 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20  failed;.    }.. 
d0f0: 20 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75     /* The maximu
d100: 6d 20 65 6d 62 65 64 64 65 64 20 66 72 61 63 74  m embedded fract
d110: 69 6f 6e 20 6d 75 73 74 20 62 65 20 65 78 61 63  ion must be exac
d120: 74 6c 79 20 32 35 25 2e 20 20 41 6e 64 20 74 68  tly 25%.  And th
d130: 65 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a  e minimum.    **
d140: 20 65 6d 62 65 64 64 65 64 20 66 72 61 63 74 69   embedded fracti
d150: 6f 6e 20 6d 75 73 74 20 62 65 20 31 32 2e 35 25  on must be 12.5%
d160: 20 66 6f 72 20 62 6f 74 68 20 6c 65 61 66 2d 64   for both leaf-d
d170: 61 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66  ata and non-leaf
d180: 2d 64 61 74 61 2e 0a 20 20 20 20 2a 2a 20 54 68  -data..    ** Th
d190: 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67  e original desig
d1a0: 6e 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20  n allowed these 
d1b0: 61 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c  amounts to vary,
d1c0: 20 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a   but as of.    *
d1d0: 2a 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c  * version 3.6.0,
d1e0: 20 77 65 20 72 65 71 75 69 72 65 20 74 68 65 6d   we require them
d1f0: 20 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20   to be fixed..  
d200: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d    */.    if( mem
d210: 63 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20  cmp(&page1[21], 
d220: 22 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33  "\100\040\040",3
d230: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  )!=0 ){.      go
d240: 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
d250: 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
d260: 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62  pageSize = get2b
d270: 79 74 65 28 26 70 61 67 65 31 5b 31 36 5d 29 3b  yte(&page1[16]);
d280: 0a 20 20 20 20 69 66 28 20 28 28 70 61 67 65 53  .    if( ((pageS
d290: 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29  ize-1)&pageSize)
d2a0: 21 3d 30 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c  !=0 || pageSize<
d2b0: 35 31 32 20 7c 7c 0a 20 20 20 20 20 20 20 20 28  512 ||.        (
d2c0: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
d2d0: 53 49 5a 45 3c 33 32 37 36 38 20 26 26 20 70 61  SIZE<32768 && pa
d2e0: 67 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41  geSize>SQLITE_MA
d2f0: 58 5f 50 41 47 45 5f 53 49 5a 45 29 0a 20 20 20  X_PAGE_SIZE).   
d300: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
d310: 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
d320: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
d330: 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20  rt( (pageSize & 
d340: 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73 61  7)==0 );.    usa
d350: 62 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69  bleSize = pageSi
d360: 7a 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a  ze - page1[20];.
d370: 20 20 20 20 69 66 28 20 70 61 67 65 53 69 7a 65      if( pageSize
d380: 21 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  !=pBt->pageSize 
d390: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65  ){.      /* Afte
d3a0: 72 20 72 65 61 64 69 6e 67 20 74 68 65 20 66 69  r reading the fi
d3b0: 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  rst page of the 
d3c0: 64 61 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e  database assumin
d3d0: 67 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20  g a page size.  
d3e0: 20 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72      ** of BtShar
d3f0: 65 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20  ed.pageSize, we 
d400: 68 61 76 65 20 64 69 73 63 6f 76 65 72 65 64 20  have discovered 
d410: 74 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69  that the page-si
d420: 7a 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  ze is.      ** a
d430: 63 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65  ctually pageSize
d440: 2e 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  . Unlock the dat
d450: 61 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74  abase, leave pBt
d460: 2d 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20 20  ->pPage1 at.    
d470: 20 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65    ** zero and re
d480: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
d490: 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20  The caller will 
d4a0: 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
d4b0: 6f 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69  on.      ** agai
d4c0: 6e 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65  n with the corre
d4d0: 63 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20  ct page-size..  
d4e0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c      */.      rel
d4f0: 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
d500: 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61  ;.      pBt->usa
d510: 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62 6c 65  bleSize = usable
d520: 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74 2d  Size;.      pBt-
d530: 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
d540: 53 69 7a 65 3b 0a 20 20 20 20 20 20 66 72 65 65  Size;.      free
d550: 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
d560: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
d570: 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42  erSetPagesize(pB
d580: 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d  t->pPager, &pBt-
d590: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
d5a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d5b0: 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  OK;.    }.    if
d5c0: 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 35 30 30  ( usableSize<500
d5d0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
d5e0: 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
d5f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
d600: 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65  >pageSize = page
d610: 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75  Size;.    pBt->u
d620: 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61 62  sableSize = usab
d630: 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20  leSize;.#ifndef 
d640: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
d650: 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e  VACUUM.    pBt->
d660: 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
d670: 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36  t4byte(&page1[36
d680: 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20   + 4*4])?1:0);. 
d690: 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
d6a0: 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
d6b0: 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29  page1[36 + 7*4])
d6c0: 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ?1:0);.#endif.  
d6d0: 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c  }..  /* maxLocal
d6e0: 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
d6f0: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
d700: 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  d to store local
d710: 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65  ly for.  ** a ce
d720: 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69  ll.  Make sure i
d730: 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  t is small enoug
d740: 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61  h so that at lea
d750: 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a  st minFanout.  *
d760: 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c  * cells can will
d770: 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65   fit on one page
d780: 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31  .  We assume a 1
d790: 30 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64  0-byte page head
d7a0: 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73  er..  ** Besides
d7b0: 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68   the payload, th
d7c0: 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72  e cell must stor
d7d0: 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79  e:.  **     2-by
d7e0: 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  te pointer to th
d7f0: 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  e cell.  **     
d800: 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69  4-byte child poi
d810: 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d  nter.  **     9-
d820: 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a  byte nKey value.
d830: 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
d840: 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a  nData value.  **
d850: 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72       4-byte over
d860: 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
d870: 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c  r.  ** So a cell
d880: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32   consists of a 2
d890: 2d 62 79 74 65 20 70 6f 69 6e 65 72 2c 20 61 20  -byte poiner, a 
d8a0: 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20  header which is 
d8b0: 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20  as much as.  ** 
d8c0: 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30  17 bytes long, 0
d8d0: 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70   to N bytes of p
d8e0: 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f  ayload, and an o
d8f0: 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f  ptional 4 byte o
d900: 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67  verflow.  ** pag
d910: 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a  e pointer..  */.
d920: 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20    pBt->maxLocal 
d930: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
d940: 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20  ze-12)*64/255 - 
d950: 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f  23;.  pBt->minLo
d960: 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62  cal = (pBt->usab
d970: 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35  leSize-12)*32/25
d980: 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d  5 - 23;.  pBt->m
d990: 61 78 4c 65 61 66 20 3d 20 70 42 74 2d 3e 75 73  axLeaf = pBt->us
d9a0: 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 3b 0a 20  ableSize - 35;. 
d9b0: 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20   pBt->minLeaf = 
d9c0: 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
d9d0: 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33  -12)*32/255 - 23
d9e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
d9f0: 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d  >maxLeaf + 23 <=
da00: 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
da10: 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  t) );.  pBt->pPa
da20: 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20  ge1 = pPage1;.  
da30: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
da40: 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  ;..page1_init_fa
da50: 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50  iled:.  releaseP
da60: 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70  age(pPage1);.  p
da70: 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
da80: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
da90: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
daa0: 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 6c 6f  ne works like lo
dab0: 63 6b 42 74 72 65 65 28 29 20 65 78 63 65 70 74  ckBtree() except
dac0: 20 74 68 61 74 20 69 74 20 61 6c 73 6f 20 69 6e   that it also in
dad0: 76 6f 6b 65 73 20 74 68 65 0a 2a 2a 20 62 75 73  vokes the.** bus
dae0: 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68  y callback if th
daf0: 65 72 65 20 69 73 20 6c 6f 63 6b 20 63 6f 6e 74  ere is lock cont
db00: 65 6e 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ention..*/.stati
db10: 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 57  c int lockBtreeW
db20: 69 74 68 52 65 74 72 79 28 42 74 72 65 65 20 2a  ithRetry(Btree *
db30: 70 52 65 66 29 7b 0a 20 20 69 6e 74 20 72 63 20  pRef){.  int rc 
db40: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
db50: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
db60: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
db70: 52 65 66 29 20 29 3b 0a 20 20 69 66 28 20 70 52  Ref) );.  if( pR
db80: 65 66 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41  ef->inTrans==TRA
db90: 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 75  NS_NONE ){.    u
dba0: 38 20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  8 inTransaction 
dbb0: 3d 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54  = pRef->pBt->inT
dbc0: 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20  ransaction;.    
dbd0: 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
dbe0: 52 65 66 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  Ref);.    rc = s
dbf0: 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
dc00: 54 72 61 6e 73 28 70 52 65 66 2c 20 30 29 3b 0a  Trans(pRef, 0);.
dc10: 20 20 20 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69      pRef->pBt->i
dc20: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 69  nTransaction = i
dc30: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20  nTransaction;.  
dc40: 20 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73 20    pRef->inTrans 
dc50: 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
dc60: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
dc70: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 52 65  _OK ){.      pRe
dc80: 66 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  f->pBt->nTransac
dc90: 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  tion--;.    }.  
dca0: 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
dcb0: 28 70 52 65 66 29 3b 0a 20 20 7d 0a 20 20 72 65  (pRef);.  }.  re
dcc0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 20 20 20 20  turn rc;.}.     
dcd0: 20 20 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65    ../*.** If the
dce0: 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
dcf0: 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e  nding cursors an
dd00: 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20  d we are not in 
dd10: 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66  the middle.** of
dd20: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62   a transaction b
dd30: 75 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65  ut there is a re
dd40: 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
dd50: 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a  atabase, then.**
dd60: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e   this routine un
dd70: 72 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70  refs the first p
dd80: 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
dd90: 61 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a  ase file which .
dda0: 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63  ** has the effec
ddb0: 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74  t of releasing t
ddc0: 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a  he read lock..**
ddd0: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
dde0: 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67   any outstanding
ddf0: 20 63 75 72 73 6f 72 73 2c 20 74 68 69 73 20 72   cursors, this r
de00: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
de10: 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  p..**.** If ther
de20: 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69  e is a transacti
de30: 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20  on in progress, 
de40: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
de50: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
de60: 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74  ic void unlockBt
de70: 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53 68  reeIfUnused(BtSh
de80: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61 73  ared *pBt){.  as
de90: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
dea0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
deb0: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42  tex) );.  if( pB
dec0: 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
ded0: 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20  ==TRANS_NONE && 
dee0: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 20  pBt->pCursor==0 
def0: 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d  && pBt->pPage1!=
df00: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  0 ){.    if( sql
df10: 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
df20: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3e 3d  t(pBt->pPager)>=
df30: 31 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  1 ){.      asser
df40: 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  t( pBt->pPage1->
df50: 61 44 61 74 61 20 29 3b 0a 23 69 66 20 30 0a 20  aData );.#if 0. 
df60: 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 50       if( pBt->pP
df70: 61 67 65 31 2d 3e 61 44 61 74 61 3d 3d 30 20 29  age1->aData==0 )
df80: 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  {.        MemPag
df90: 65 20 2a 70 50 61 67 65 20 3d 20 70 42 74 2d 3e  e *pPage = pBt->
dfa0: 70 50 61 67 65 31 3b 0a 20 20 20 20 20 20 20 20  pPage1;.        
dfb0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73  pPage->aData = s
dfc0: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
dfd0: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
dfe0: 65 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  e);.        pPag
dff0: 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  e->pBt = pBt;.  
e000: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e        pPage->pgn
e010: 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 23  o = 1;.      }.#
e020: 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65 6c 65  endif.      rele
e030: 61 73 65 50 61 67 65 28 70 42 74 2d 3e 70 50 61  asePage(pBt->pPa
e040: 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ge1);.    }.    
e050: 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
e060: 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74  .    pBt->inStmt
e070: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
e080: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
e090: 64 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74  database by init
e0a0: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72  ializing the fir
e0b0: 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a  st page of the.*
e0c0: 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  * file..*/.stati
e0d0: 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73  c int newDatabas
e0e0: 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
e0f0: 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31  {.  MemPage *pP1
e100: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
e110: 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72  r *data;.  int r
e120: 63 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a  c;.  int nPage;.
e130: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
e140: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
e150: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
e160: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
e170: 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
e180: 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
e190: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
e1a0: 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65 3e 30 20 29  _OK || nPage>0 )
e1b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
e1c0: 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74  .  }.  pP1 = pBt
e1d0: 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65  ->pPage1;.  asse
e1e0: 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20  rt( pP1!=0 );.  
e1f0: 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74  data = pP1->aDat
e200: 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  a;.  rc = sqlite
e210: 33 50 61 67 65 72 57 72 69 74 65 28 70 50 31 2d  3PagerWrite(pP1-
e220: 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
e230: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
e240: 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20  .  memcpy(data, 
e250: 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73 69  zMagicHeader, si
e260: 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65  zeof(zMagicHeade
e270: 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  r));.  assert( s
e280: 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64  izeof(zMagicHead
e290: 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 70 75 74  er)==16 );.  put
e2a0: 32 62 79 74 65 28 26 64 61 74 61 5b 31 36 5d 2c  2byte(&data[16],
e2b0: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b   pBt->pageSize);
e2c0: 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b  .  data[18] = 1;
e2d0: 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b  .  data[19] = 1;
e2e0: 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 70 42  .  data[20] = pB
e2f0: 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 42  t->pageSize - pB
e300: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  t->usableSize;. 
e310: 20 64 61 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a   data[21] = 64;.
e320: 20 20 64 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b    data[22] = 32;
e330: 0a 20 20 64 61 74 61 5b 32 33 5d 20 3d 20 33 32  .  data[23] = 32
e340: 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61 74 61  ;.  memset(&data
e350: 5b 32 34 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29  [24], 0, 100-24)
e360: 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50 31  ;.  zeroPage(pP1
e370: 2c 20 50 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46  , PTF_INTKEY|PTF
e380: 5f 4c 45 41 46 7c 50 54 46 5f 4c 45 41 46 44 41  _LEAF|PTF_LEAFDA
e390: 54 41 20 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67  TA );.  pBt->pag
e3a0: 65 53 69 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a  eSizeFixed = 1;.
e3b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e3c0: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
e3d0: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
e3e0: 74 6f 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70  toVacuum==1 || p
e3f0: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d  Bt->autoVacuum==
e400: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
e410: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d  Bt->incrVacuum==
e420: 31 20 7c 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61  1 || pBt->incrVa
e430: 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74  cuum==0 );.  put
e440: 34 62 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b  4byte(&data[36 +
e450: 20 34 2a 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f   4*4], pBt->auto
e460: 56 61 63 75 75 6d 29 3b 0a 20 20 70 75 74 34 62  Vacuum);.  put4b
e470: 79 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 37  yte(&data[36 + 7
e480: 2a 34 5d 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61  *4], pBt->incrVa
e490: 63 75 75 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20  cuum);.#endif.  
e4a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e4b0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ;.}../*.** Attem
e4c0: 70 74 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65  pt to start a ne
e4d0: 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41  w transaction. A
e4e0: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
e4f0: 6f 6e 0a 2a 2a 20 69 73 20 73 74 61 72 74 65 64  on.** is started
e500: 20 69 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   if the second a
e510: 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65  rgument is nonze
e520: 72 6f 2c 20 6f 74 68 65 72 77 69 73 65 20 61 20  ro, otherwise a 
e530: 72 65 61 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63  read-.** transac
e540: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 73 65  tion.  If the se
e550: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
e560: 20 32 20 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65   2 or more and e
e570: 78 63 6c 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e  xclusive.** tran
e580: 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74  saction is start
e590: 65 64 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ed, meaning that
e5a0: 20 6e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   no other proces
e5b0: 73 20 69 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20  s is allowed.** 
e5c0: 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
e5d0: 74 61 62 61 73 65 2e 20 20 41 20 70 72 65 65 78  tabase.  A preex
e5e0: 69 73 74 69 6e 67 20 74 72 61 6e 73 61 63 74 69  isting transacti
e5f0: 6f 6e 20 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a  on may not be.**
e600: 20 75 70 67 72 61 64 65 64 20 74 6f 20 65 78 63   upgraded to exc
e610: 6c 75 73 69 76 65 20 62 79 20 63 61 6c 6c 69 6e  lusive by callin
e620: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  g this routine a
e630: 20 73 65 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74   second time - t
e640: 68 65 0a 2a 2a 20 65 78 63 6c 75 73 69 76 69 74  he.** exclusivit
e650: 79 20 66 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b  y flag only work
e660: 73 20 66 6f 72 20 61 20 6e 65 77 20 74 72 61 6e  s for a new tran
e670: 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41  saction..**.** A
e680: 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
e690: 6f 6e 20 6d 75 73 74 20 62 65 20 73 74 61 72 74  on must be start
e6a0: 65 64 20 62 65 66 6f 72 65 20 61 74 74 65 6d 70  ed before attemp
e6b0: 74 69 6e 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61  ting any .** cha
e6c0: 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nges to the data
e6d0: 62 61 73 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74  base.  None of t
e6e0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
e6f0: 74 69 6e 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77  tines .** will w
e700: 6f 72 6b 20 75 6e 6c 65 73 73 20 61 20 74 72 61  ork unless a tra
e710: 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
e720: 74 65 64 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a  ted first:.**.**
e730: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
e740: 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 29 0a  eeCreateTable().
e750: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
e760: 74 72 65 65 43 72 65 61 74 65 49 6e 64 65 78 28  treeCreateIndex(
e770: 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
e780: 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65  3BtreeClearTable
e790: 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
e7a0: 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65  e3BtreeDropTable
e7b0: 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  ().**      sqlit
e7c0: 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 29 0a  e3BtreeInsert().
e7d0: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
e7e0: 74 72 65 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20  treeDelete().** 
e7f0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
e800: 65 55 70 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a  eUpdateMeta().**
e810: 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 69 74 69 61  .** If an initia
e820: 6c 20 61 74 74 65 6d 70 74 20 74 6f 20 61 63 71  l attempt to acq
e830: 75 69 72 65 20 74 68 65 20 6c 6f 63 6b 20 66 61  uire the lock fa
e840: 69 6c 73 20 62 65 63 61 75 73 65 20 6f 66 20 6c  ils because of l
e850: 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a  ock contention.*
e860: 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62 61  * and the databa
e870: 73 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  se was previousl
e880: 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e  y unlocked, then
e890: 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
e8a0: 20 68 61 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74   handler.** if t
e8b0: 68 65 72 65 20 69 73 20 6f 6e 65 2e 20 20 42 75  here is one.  Bu
e8c0: 74 20 69 66 20 74 68 65 72 65 20 77 61 73 20 70  t if there was p
e8d0: 72 65 76 69 6f 75 73 6c 79 20 61 20 72 65 61 64  reviously a read
e8e0: 2d 6c 6f 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a  -lock, do not.**
e8f0: 20 69 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   invoke the busy
e900: 20 68 61 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20   handler - just 
e910: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
e920: 53 59 2e 20 20 53 51 4c 49 54 45 5f 42 55 53 59  SY.  SQLITE_BUSY
e930: 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64   is .** returned
e940: 20 77 68 65 6e 20 74 68 65 72 65 20 69 73 20 61   when there is a
e950: 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f  lready a read-lo
e960: 63 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61  ck in order to a
e970: 76 6f 69 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e  void a deadlock.
e980: 0a 2a 2a 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74  .**.** Suppose t
e990: 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 72 6f  here are two pro
e9a0: 63 65 73 73 65 73 20 41 20 61 6e 64 20 42 2e 20  cesses A and B. 
e9b0: 20 41 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f   A has a read lo
e9c0: 63 6b 20 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20  ck and B has.** 
e9d0: 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e  a reserved lock.
e9e0: 20 20 42 20 74 72 69 65 73 20 74 6f 20 70 72 6f    B tries to pro
e9f0: 6d 6f 74 65 20 74 6f 20 65 78 63 6c 75 73 69 76  mote to exclusiv
ea00: 65 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65 64  e but is blocked
ea10: 20 62 65 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41   because.** of A
ea20: 27 73 20 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41  's read lock.  A
ea30: 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
ea40: 65 20 74 6f 20 72 65 73 65 72 76 65 64 20 62 75  e to reserved bu
ea50: 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 79 20  t is blocked by 
ea60: 42 2e 0a 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65  B..** One or the
ea70: 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 74 77   other of the tw
ea80: 6f 20 70 72 6f 63 65 73 73 65 73 20 6d 75 73 74  o processes must
ea90: 20 67 69 76 65 20 77 61 79 20 6f 72 20 74 68 65   give way or the
eaa0: 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20  re can be.** no 
eab0: 70 72 6f 67 72 65 73 73 2e 20 20 42 79 20 72 65  progress.  By re
eac0: 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42  turning SQLITE_B
ead0: 55 53 59 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f  USY and not invo
eae0: 6b 69 6e 67 20 74 68 65 20 62 75 73 79 20 63 61  king the busy ca
eaf0: 6c 6c 62 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41  llback.** when A
eb00: 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72   already has a r
eb10: 65 61 64 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63  ead lock, we enc
eb20: 6f 75 72 61 67 65 20 41 20 74 6f 20 67 69 76 65  ourage A to give
eb30: 20 75 70 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a   up and let B.**
eb40: 20 70 72 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74   proceed..*/.int
eb50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
eb60: 69 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70  inTrans(Btree *p
eb70: 2c 20 69 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20  , int wrflag){. 
eb80: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
eb90: 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72   p->pBt;.  int r
eba0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
ebb0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
ebc0: 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64  ter(p);.  pBt->d
ebd0: 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 62 74 72  b = p->db;.  btr
ebe0: 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
ebf0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72  .  /* If the btr
ec00: 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e  ee is already in
ec10: 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
ec20: 74 69 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a  tion, or it.  **
ec30: 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61   is already in a
ec40: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
ec50: 6e 20 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61  n and a read-tra
ec60: 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  nsaction.  ** is
ec70: 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 69 73   requested, this
ec80: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
ec90: 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  /.  if( p->inTra
eca0: 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
ecb0: 7c 7c 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  || (p->inTrans==
ecc0: 54 52 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77  TRANS_READ && !w
ecd0: 72 66 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f  rflag) ){.    go
ece0: 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a  to trans_begun;.
ecf0: 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20    }..  /* Write 
ed00: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65  transactions are
ed10: 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e   not possible on
ed20: 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74   a read-only dat
ed30: 61 62 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  abase */.  if( p
ed40: 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20  Bt->readOnly && 
ed50: 77 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63  wrflag ){.    rc
ed60: 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e   = SQLITE_READON
ed70: 4c 59 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61  LY;.    goto tra
ed80: 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20  ns_begun;.  }.. 
ed90: 20 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64   /* If another d
eda0: 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68  atabase handle h
edb0: 61 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65  as already opene
edc0: 64 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61  d a write transa
edd0: 63 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74  ction .  ** on t
ede0: 68 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65  his shared-btree
edf0: 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
ee00: 20 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72   second write tr
ee10: 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a  ansaction is.  *
ee20: 2a 20 72 65 71 75 65 73 74 65 64 2c 20 72 65 74  * requested, ret
ee30: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
ee40: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
ee50: 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
ee60: 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 77  TRANS_WRITE && w
ee70: 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20  rflag ){.    rc 
ee80: 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
ee90: 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
eea0: 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  gun;.  }..#ifnde
eeb0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
eec0: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 69 66 28  ARED_CACHE.  if(
eed0: 20 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20   wrflag>1 ){.   
eee0: 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a   BtLock *pIter;.
eef0: 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42      for(pIter=pB
ef00: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
ef10: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
ef20: 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
ef30: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70  pIter->pBtree!=p
ef40: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
ef50: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
ef60: 20 20 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73        goto trans
ef70: 5f 62 65 67 75 6e 3b 0a 20 20 20 20 20 20 7d 0a  _begun;.      }.
ef80: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
ef90: 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 66 28  ..  do {.    if(
efa0: 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
efb0: 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  ){.      do{.   
efc0: 20 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74       rc = lockBt
efd0: 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ree(pBt);.      
efe0: 7d 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61  }while( pBt->pPa
eff0: 67 65 31 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51  ge1==0 && rc==SQ
f000: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 7d  LITE_OK );.    }
f010: 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
f020: 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
f030: 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  g ){.      if( p
f040: 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  Bt->readOnly ){.
f050: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
f060: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
f070: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f080: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
f090: 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70  agerBegin(pBt->p
f0a0: 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 2c 20  Page1->pDbPage, 
f0b0: 77 72 66 6c 61 67 3e 31 29 3b 0a 20 20 20 20 20  wrflag>1);.     
f0c0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
f0d0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
f0e0: 20 20 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61    rc = newDataba
f0f0: 73 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 20  se(pBt);.       
f100: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
f110: 0a 20 20 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  .  .    if( rc==
f120: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f130: 20 20 20 69 66 28 20 77 72 66 6c 61 67 20 29 20     if( wrflag ) 
f140: 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  pBt->inStmt = 0;
f150: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f160: 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
f170: 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20  nused(pBt);.    
f180: 7d 0a 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d  }.  }while( rc==
f190: 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70  SQLITE_BUSY && p
f1a0: 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
f1b0: 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26  n==TRANS_NONE &&
f1c0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
f1d0: 65 33 42 74 72 65 65 49 6e 76 6f 6b 65 42 75 73  e3BtreeInvokeBus
f1e0: 79 48 61 6e 64 6c 65 72 28 70 42 74 2c 20 30 29  yHandler(pBt, 0)
f1f0: 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53   );..  if( rc==S
f200: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f210: 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
f220: 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
f230: 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
f240: 63 74 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ction++;.    }. 
f250: 20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20     p->inTrans = 
f260: 28 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52  (wrflag?TRANS_WR
f270: 49 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b  ITE:TRANS_READ);
f280: 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  .    if( p->inTr
f290: 61 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73  ans>pBt->inTrans
f2a0: 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
f2b0: 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
f2c0: 6f 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b  on = p->inTrans;
f2d0: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
f2e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
f2f0: 44 5f 43 41 43 48 45 0a 20 20 20 20 69 66 28 20  D_CACHE.    if( 
f300: 77 72 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20  wrflag>1 ){.    
f310: 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
f320: 70 45 78 63 6c 75 73 69 76 65 20 29 3b 0a 20 20  pExclusive );.  
f330: 20 20 20 20 70 42 74 2d 3e 70 45 78 63 6c 75 73      pBt->pExclus
f340: 69 76 65 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 23  ive = p;.    }.#
f350: 65 6e 64 69 66 0a 20 20 7d 0a 0a 0a 74 72 61 6e  endif.  }...tran
f360: 73 5f 62 65 67 75 6e 3a 0a 20 20 62 74 72 65 65  s_begun:.  btree
f370: 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
f380: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
f390: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
f3a0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
f3b0: 72 6e 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  rn the size of t
f3c0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
f3d0: 20 69 6e 20 70 61 67 65 73 2e 20 20 4f 72 20 72   in pages.  Or r
f3e0: 65 74 75 72 6e 20 2d 31 20 69 66 0a 2a 2a 20 74  eturn -1 if.** t
f3f0: 68 65 72 65 20 69 73 20 61 6e 79 20 6b 69 6e 64  here is any kind
f400: 20 6f 66 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73 74   of error..*/.st
f410: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 61  atic int pagerPa
f420: 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70  gecount(Pager *p
f430: 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
f440: 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20  ;.  int nPage;. 
f450: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
f460: 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
f470: 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 72  er, &nPage);.  r
f480: 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
f490: 45 5f 4f 4b 3f 6e 50 61 67 65 3a 2d 31 29 3b 0a  E_OK?nPage:-1);.
f4a0: 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
f4b0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
f4c0: 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  UM../*.** Set th
f4d0: 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e  e pointer-map en
f4e0: 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68  tries for all ch
f4f0: 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70  ildren of page p
f500: 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a  Page. Also, if.*
f510: 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73  * pPage contains
f520: 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e   cells that poin
f530: 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
f540: 67 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69  ges, set the poi
f550: 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72  nter.** map entr
f560: 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72  ies for the over
f570: 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65  flow pages as we
f580: 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
f590: 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  t setChildPtrmap
f5a0: 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  s(MemPage *pPage
f5b0: 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
f5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5d0: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74          /* Count
f5e0: 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  er variable */. 
f5f0: 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20   int nCell;     
f600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f610: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
f620: 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70   cells in page p
f630: 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  Page */.  int rc
f640: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f650: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f660: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
f670: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
f680: 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69   pPage->pBt;.  i
f690: 6e 74 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20  nt isInitOrig = 
f6a0: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20  pPage->isInit;. 
f6b0: 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61   Pgno pgno = pPa
f6c0: 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73  ge->pgno;..  ass
f6d0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
f6e0: 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
f6f0: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
f700: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
f710: 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c  eInitPage(pPage,
f720: 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 29   pPage->pParent)
f730: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
f740: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
f750: 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d  o set_child_ptrm
f760: 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e  aps_out;.  }.  n
f770: 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
f780: 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  ell;..  for(i=0;
f790: 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
f7a0: 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20      u8 *pCell = 
f7b0: 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
f7c0: 69 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 74  i);..    rc = pt
f7d0: 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
f7e0: 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  Page, pCell);.  
f7f0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
f800: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
f810: 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d  o set_child_ptrm
f820: 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a  aps_out;.    }..
f830: 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
f840: 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67  leaf ){.      Pg
f850: 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67  no childPgno = g
f860: 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a  et4byte(pCell);.
f870: 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
f880: 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50  pPut(pBt, childP
f890: 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
f8a0: 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  E, pgno);.      
f8b0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f8c0: 4f 4b 20 29 20 67 6f 74 6f 20 73 65 74 5f 63 68  OK ) goto set_ch
f8d0: 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b  ild_ptrmaps_out;
f8e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
f8f0: 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
f900: 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64  {.    Pgno child
f910: 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
f920: 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
f930: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
f940: 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 74 72  ]);.    rc = ptr
f950: 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c  mapPut(pBt, chil
f960: 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  dPgno, PTRMAP_BT
f970: 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  REE, pgno);.  }.
f980: 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61  .set_child_ptrma
f990: 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d  ps_out:.  pPage-
f9a0: 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74  >isInit = isInit
f9b0: 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72  Orig;.  return r
f9c0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  c;.}../*.** Some
f9d0: 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 2c 20  where on pPage, 
f9e0: 77 68 69 63 68 20 69 73 20 67 75 61 72 65 6e 74  which is guarent
f9f0: 65 65 64 20 74 6f 20 62 65 20 61 20 62 74 72 65  eed to be a btre
fa00: 65 20 70 61 67 65 2c 20 6e 6f 74 20 61 6e 20 6f  e page, not an o
fa10: 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 2c  verflow.** page,
fa20: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
fa30: 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 4d 6f 64   page iFrom. Mod
fa40: 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72  ify this pointer
fa50: 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
fa60: 74 73 20 74 6f 0a 2a 2a 20 69 54 6f 2e 20 50 61  ts to.** iTo. Pa
fa70: 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65  rameter eType de
fa80: 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65  scribes the type
fa90: 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 20 62   of pointer to b
faa0: 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 0a  e modified, as .
fab0: 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  ** follows:.**.*
fac0: 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20  * PTRMAP_BTREE: 
fad0: 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62      pPage is a b
fae0: 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
faf0: 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
fb00: 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20   a child .**    
fb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
fb20: 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a  age of pPage..**
fb30: 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
fb40: 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61  LOW1: pPage is a
fb50: 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65   btree-page. The
fb60: 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
fb70: 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a  at an overflow.*
fb80: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
fb90: 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64      page pointed
fba0: 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68   to by one of th
fbb0: 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65  e cells on pPage
fbc0: 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
fbd0: 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20  VERFLOW2: pPage 
fbe0: 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70  is an overflow-p
fbf0: 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
fc00: 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e   points at the n
fc10: 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ext.**          
fc20: 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f           overflo
fc30: 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
fc40: 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
fc50: 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  t modifyPagePoin
fc60: 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ter(MemPage *pPa
fc70: 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20  ge, Pgno iFrom, 
fc80: 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79  Pgno iTo, u8 eTy
fc90: 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  pe){.  assert( s
fca0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
fcb0: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
fcc0: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 65 54  tex) );.  if( eT
fcd0: 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
fce0: 46 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20  FLOW2 ){.    /* 
fcf0: 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61  The pointer is a
fd00: 6c 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20  lways the first 
fd10: 34 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70  4 bytes of the p
fd20: 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  age in this case
fd30: 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65  .  */.    if( ge
fd40: 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
fd50: 61 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20  ata)!=iFrom ){. 
fd60: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
fd70: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
fd80: 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62  .    }.    put4b
fd90: 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
fda0: 2c 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  , iTo);.  }else{
fdb0: 0a 20 20 20 20 69 6e 74 20 69 73 49 6e 69 74 4f  .    int isInitO
fdc0: 72 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49  rig = pPage->isI
fdd0: 6e 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  nit;.    int i;.
fde0: 20 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a      int nCell;..
fdf0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
fe00: 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20  InitPage(pPage, 
fe10: 30 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20  0);.    nCell = 
fe20: 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20  pPage->nCell;.. 
fe30: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
fe40: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
fe50: 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e   u8 *pCell = fin
fe60: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
fe70: 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
fe80: 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
fe90: 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65  W1 ){.        Ce
fea0: 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
feb0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
fec0: 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
fed0: 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
fee0: 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  o);.        if( 
fef0: 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29  info.iOverflow )
ff00: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
ff10: 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28  iFrom==get4byte(
ff20: 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
ff30: 72 66 6c 6f 77 5d 29 20 29 7b 0a 20 20 20 20 20  rflow]) ){.     
ff40: 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
ff50: 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
ff60: 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20  rflow], iTo);.  
ff70: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
ff80: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
ff90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
ffa0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  se{.        if( 
ffb0: 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d  get4byte(pCell)=
ffc0: 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
ffd0: 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65      put4byte(pCe
ffe0: 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20  ll, iTo);.      
fff0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
10000 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
10010 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d   }.  .    if( i=
10020 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =nCell ){.      
10030 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  if( eType!=PTRMA
10040 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20  P_BTREE || .    
10050 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26        get4byte(&
10060 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
10070 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
10080 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )!=iFrom ){.    
10090 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
100a0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
100b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75        }.      pu
100c0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
100d0 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  Data[pPage->hdrO
100e0 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a  ffset+8], iTo);.
100f0 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65      }..    pPage
10100 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69  ->isInit = isIni
10110 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74  tOrig;.  }.  ret
10120 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10130 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  .../*.** Move th
10140 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  e open database 
10150 70 61 67 65 20 70 44 62 50 61 67 65 20 74 6f 20  page pDbPage to 
10160 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61  location iFreePa
10170 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61  ge in the .** da
10180 74 61 62 61 73 65 2e 20 54 68 65 20 70 44 62 50  tabase. The pDbP
10190 61 67 65 20 72 65 66 65 72 65 6e 63 65 20 72 65  age reference re
101a0 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2f 0a  mains valid..*/.
101b0 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63  static int reloc
101c0 61 74 65 50 61 67 65 28 0a 20 20 42 74 53 68 61  atePage(.  BtSha
101d0 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
101e0 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a      /* Btree */.
101f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61    MemPage *pDbPa
10200 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70  ge,        /* Op
10210 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  en page to move 
10220 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20  */.  u8 eType,  
10230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10240 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79   Pointer map 'ty
10250 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44  pe' entry for pD
10260 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
10270 69 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20  iPtrPage,       
10280 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
10290 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74  ap 'page-no' ent
102a0 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a  ry for pDbPage *
102b0 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61  /.  Pgno iFreePa
102c0 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ge,          /* 
102d0 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20  The location to 
102e0 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20  move pDbPage to 
102f0 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d 69  */.  int isCommi
10300 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t.){.  MemPage *
10310 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54  pPtrPage;   /* T
10320 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
10330 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
10340 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  to pDbPage */.  
10350 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70  Pgno iDbPage = p
10360 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20  DbPage->pgno;.  
10370 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
10380 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pBt->pPager;.  i
10390 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
103a0 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
103b0 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79  OVERFLOW2 || eTy
103c0 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
103d0 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65  LOW1 || .      e
103e0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  Type==PTRMAP_BTR
103f0 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  EE || eType==PTR
10400 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a  MAP_ROOTPAGE );.
10410 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
10420 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
10430 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
10440 73 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70  sert( pDbPage->p
10450 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a  Bt==pBt );..  /*
10460 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50 61   Move page iDbPa
10470 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72  ge from its curr
10480 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20  ent location to 
10490 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65  page number iFre
104a0 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45  ePage */.  TRACE
104b0 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d  (("AUTOVACUUM: M
104c0 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65  oving %d to free
104d0 20 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61   page %d (ptr pa
104e0 67 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e  ge %d type %d)\n
104f0 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67  ", .      iDbPag
10500 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50  e, iFreePage, iP
10510 74 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b  trPage, eType));
10520 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
10530 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61  agerMovepage(pPa
10540 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44  ger, pDbPage->pD
10550 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
10560 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20 69  , isCommit);.  i
10570 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10580 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
10590 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67 65  c;.  }.  pDbPage
105a0 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50 61  ->pgno = iFreePa
105b0 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44 62  ge;..  /* If pDb
105c0 50 61 67 65 20 77 61 73 20 61 20 62 74 72 65 65  Page was a btree
105d0 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20 6d  -page, then it m
105e0 61 79 20 68 61 76 65 20 63 68 69 6c 64 20 70 61  ay have child pa
105f0 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c 73  ges and/or cells
10600 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74  .  ** that point
10610 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
10620 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  es. The pointer 
10630 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72 20  map entries for 
10640 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20 70  all these.  ** p
10650 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65 20  ages need to be 
10660 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20 20  changed..  **.  
10670 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20 69 73  ** If pDbPage is
10680 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
10690 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72 73  e, then the firs
106a0 74 20 34 20 62 79 74 65 73 20 6d 61 79 20 73 74  t 4 bytes may st
106b0 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e 74  ore a.  ** point
106c0 65 72 20 74 6f 20 61 20 73 75 62 73 65 71 75 65  er to a subseque
106d0 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  nt overflow page
106e0 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
106f0 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a 2a   case, then.  **
10700 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
10710 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64   needs to be upd
10720 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 75 62  ated for the sub
10730 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77  sequent overflow
10740 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   page..  */.  if
10750 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
10760 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d  BTREE || eType==
10770 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
10780 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74 43  ){.    rc = setC
10790 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62 50  hildPtrmaps(pDbP
107a0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
107b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
107c0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
107d0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
107e0 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66 6c     Pgno nextOvfl
107f0 20 3d 20 67 65 74 34 62 79 74 65 28 70 44 62 50   = get4byte(pDbP
10800 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20  age->aData);.   
10810 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d 30   if( nextOvfl!=0
10820 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
10830 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e 65  trmapPut(pBt, ne
10840 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f  xtOvfl, PTRMAP_O
10850 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65 50  VERFLOW2, iFreeP
10860 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
10870 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10880 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
10890 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
108a0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78 20  }.  }..  /* Fix 
108b0 74 68 65 20 64 61 74 61 62 61 73 65 20 70 6f 69  the database poi
108c0 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50 74  nter on page iPt
108d0 72 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e 74  rPage that point
108e0 65 64 20 61 74 20 69 44 62 50 61 67 65 20 73 6f  ed at iDbPage so
108f0 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70 6f  .  ** that it po
10900 69 6e 74 73 20 61 74 20 69 46 72 65 65 50 61 67  ints at iFreePag
10910 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65 20  e. Also fix the 
10920 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72  pointer map entr
10930 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72 50  y for.  ** iPtrP
10940 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
10950 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f  eType!=PTRMAP_RO
10960 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63  OTPAGE ){.    rc
10970 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
10980 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 74 72  etPage(pBt, iPtr
10990 50 61 67 65 2c 20 26 70 50 74 72 50 61 67 65 2c  Page, &pPtrPage,
109a0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
109b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
109c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
109d0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
109e0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
109f0 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61 67  pPtrPage->pDbPag
10a00 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
10a10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10a20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
10a30 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20  PtrPage);.      
10a40 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
10a50 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66 79  .    rc = modify
10a60 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74 72  PagePointer(pPtr
10a70 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20 69  Page, iDbPage, i
10a80 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65 29  FreePage, eType)
10a90 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
10aa0 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20  e(pPtrPage);.   
10ab0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10ac0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
10ad0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
10ae0 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65  iFreePage, eType
10af0 2c 20 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20  , iPtrPage);.   
10b00 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
10b10 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72  rc;.}../* Forwar
10b20 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72 65  d declaration re
10b30 71 75 69 72 65 64 20 62 79 20 69 6e 63 72 56 61  quired by incrVa
10b40 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a 73  cuumStep(). */.s
10b50 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
10b60 74 65 42 74 72 65 65 50 61 67 65 28 42 74 53 68  teBtreePage(BtSh
10b70 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65 20  ared *, MemPage 
10b80 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e 6f  **, Pgno *, Pgno
10b90 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65  , u8);../*.** Pe
10ba0 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20 73  rform a single s
10bb0 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65 6d  tep of an increm
10bc0 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49 66  ental-vacuum. If
10bd0 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a 20   successful,.** 
10be0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10bf0 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  . If there is no
10c00 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e 64   work to do (and
10c10 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 0a 2a 2a   therefore no.**
10c20 20 70 6f 69 6e 74 20 69 6e 20 63 61 6c 6c 69 6e   point in callin
10c30 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  g this function 
10c40 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20 53  again), return S
10c50 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a  QLITE_DONE..**.*
10c60 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63 6c  * More specificl
10c70 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  y, this function
10c80 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65 2d   attempts to re-
10c90 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 0a 2a 2a  organize the .**
10ca0 20 64 61 74 61 62 61 73 65 20 73 6f 20 74 68 61   database so tha
10cb0 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  t the last page 
10cc0 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72 72  of the file curr
10cd0 65 6e 74 6c 79 20 69 6e 20 75 73 65 0a 2a 2a 20  ently in use.** 
10ce0 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e 20  is no longer in 
10cf0 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  use..**.** If th
10d00 65 20 6e 46 69 6e 20 70 61 72 61 6d 65 74 65 72  e nFin parameter
10d10 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
10d20 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
10d30 20 61 73 73 75 6d 65 73 0a 2a 2a 20 74 68 61 74   assumes.** that
10d40 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   the caller will
10d50 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69 6e   keep calling in
10d60 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 20 75  crVacuumStep() u
10d70 6e 74 69 6c 0a 2a 2a 20 69 74 20 72 65 74 75 72  ntil.** it retur
10d80 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f  ns SQLITE_DONE o
10d90 72 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64 20  r an error, and 
10da0 74 68 61 74 20 6e 46 69 6e 20 69 73 20 74 68 65  that nFin is the
10db0 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  .** number of pa
10dc0 67 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ges the database
10dd0 20 66 69 6c 65 20 77 69 6c 6c 20 63 6f 6e 74 61   file will conta
10de0 69 6e 20 61 66 74 65 72 20 74 68 69 73 20 0a 2a  in after this .*
10df0 2a 20 70 72 6f 63 65 73 73 20 69 73 20 63 6f 6d  * process is com
10e00 70 6c 65 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  plete..*/.static
10e10 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d 53   int incrVacuumS
10e20 74 65 70 28 42 74 53 68 61 72 65 64 20 2a 70 42  tep(BtShared *pB
10e30 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 29 7b 0a 20  t, Pgno nFin){. 
10e40 20 50 67 6e 6f 20 69 4c 61 73 74 50 67 3b 20 20   Pgno iLastPg;  
10e50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61             /* La
10e60 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  st page in the d
10e70 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e  atabase */.  Pgn
10e80 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20 20 20 20  o nFreeList;    
10e90 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
10ea0 20 6f 66 20 70 61 67 65 73 20 73 74 69 6c 6c 20   of pages still 
10eb0 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
10ec0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
10ed0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
10ee0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
10ef0 0a 20 20 69 4c 61 73 74 50 67 20 3d 20 70 42 74  .  iLastPg = pBt
10f00 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20 69 66 28 20  ->nTrunc;.  if( 
10f10 69 4c 61 73 74 50 67 3d 3d 30 20 29 7b 0a 20 20  iLastPg==0 ){.  
10f20 20 20 69 4c 61 73 74 50 67 20 3d 20 70 61 67 65    iLastPg = page
10f30 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
10f40 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
10f50 69 66 28 20 21 50 54 52 4d 41 50 5f 49 53 50 41  if( !PTRMAP_ISPA
10f60 47 45 28 70 42 74 2c 20 69 4c 61 73 74 50 67 29  GE(pBt, iLastPg)
10f70 20 26 26 20 69 4c 61 73 74 50 67 21 3d 50 45 4e   && iLastPg!=PEN
10f80 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
10f90 42 74 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  Bt) ){.    int r
10fa0 63 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65 3b  c;.    u8 eType;
10fb0 0a 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61  .    Pgno iPtrPa
10fc0 67 65 3b 0a 0a 20 20 20 20 6e 46 72 65 65 4c 69  ge;..    nFreeLi
10fd0 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  st = get4byte(&p
10fe0 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74  Bt->pPage1->aDat
10ff0 61 5b 33 36 5d 29 3b 0a 20 20 20 20 69 66 28 20  a[36]);.    if( 
11000 6e 46 72 65 65 4c 69 73 74 3d 3d 30 20 7c 7c 20  nFreeList==0 || 
11010 6e 46 69 6e 3d 3d 69 4c 61 73 74 50 67 20 29 7b  nFin==iLastPg ){
11020 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
11030 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
11040 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  ..    rc = ptrma
11050 70 47 65 74 28 70 42 74 2c 20 69 4c 61 73 74 50  pGet(pBt, iLastP
11060 67 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74 72  g, &eType, &iPtr
11070 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
11080 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
11090 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
110a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65  .    }.    if( e
110b0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
110c0 54 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 72  TPAGE ){.      r
110d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
110e0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
110f0 0a 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  ..    if( eType=
11100 3d 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45  =PTRMAP_FREEPAGE
11110 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 46   ){.      if( nF
11120 69 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  in==0 ){.       
11130 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70   /* Remove the p
11140 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  age from the fil
11150 65 73 20 66 72 65 65 2d 6c 69 73 74 2e 20 54 68  es free-list. Th
11160 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  is is not requir
11170 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 66  ed.        ** if
11180 20 6e 46 69 6e 20 69 73 20 6e 6f 6e 2d 7a 65 72   nFin is non-zer
11190 6f 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 2c  o. In that case,
111a0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 77   the free-list w
111b0 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 20 20 2a  ill be.        *
111c0 2a 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  * truncated to z
111d0 65 72 6f 20 61 66 74 65 72 20 74 68 69 73 20 66  ero after this f
111e0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2c  unction returns,
111f0 20 73 6f 20 69 74 20 64 6f 65 73 6e 27 74 20 0a   so it doesn't .
11200 20 20 20 20 20 20 20 20 2a 2a 20 6d 61 74 74 65          ** matte
11210 72 20 69 66 20 69 74 20 73 74 69 6c 6c 20 63 6f  r if it still co
11220 6e 74 61 69 6e 73 20 73 6f 6d 65 20 67 61 72 62  ntains some garb
11230 61 67 65 20 65 6e 74 72 69 65 73 2e 0a 20 20 20  age entries..   
11240 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
11250 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 0a 20 20  Pgno iFreePg;.  
11260 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70        MemPage *p
11270 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
11280 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
11290 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 46 72  eePage(pBt, &pFr
112a0 65 65 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20  eePg, &iFreePg, 
112b0 69 4c 61 73 74 50 67 2c 20 31 29 3b 0a 20 20 20  iLastPg, 1);.   
112c0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
112d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
112e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
112f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11300 20 61 73 73 65 72 74 28 20 69 46 72 65 65 50 67   assert( iFreePg
11310 3d 3d 69 4c 61 73 74 50 67 20 29 3b 0a 20 20 20  ==iLastPg );.   
11320 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
11330 28 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20  (pFreePg);.     
11340 20 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a   }.    } else {.
11350 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65        Pgno iFree
11360 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Pg;             
11370 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 72 65 65  /* Index of free
11380 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 70 4c   page to move pL
11390 61 73 74 50 67 20 74 6f 20 2a 2f 0a 20 20 20 20  astPg to */.    
113a0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 61 73 74    MemPage *pLast
113b0 50 67 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20  Pg;..      rc = 
113c0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
113d0 61 67 65 28 70 42 74 2c 20 69 4c 61 73 74 50 67  age(pBt, iLastPg
113e0 2c 20 26 70 4c 61 73 74 50 67 2c 20 30 29 3b 0a  , &pLastPg, 0);.
113f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
11400 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11410 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11420 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
11430 49 66 20 6e 46 69 6e 20 69 73 20 7a 65 72 6f 2c  If nFin is zero,
11440 20 74 68 69 73 20 6c 6f 6f 70 20 72 75 6e 73 20   this loop runs 
11450 65 78 61 63 74 6c 79 20 6f 6e 63 65 20 61 6e 64  exactly once and
11460 20 70 61 67 65 20 70 4c 61 73 74 50 67 0a 20 20   page pLastPg.  
11470 20 20 20 20 2a 2a 20 69 73 20 73 77 61 70 70 65      ** is swappe
11480 64 20 77 69 74 68 20 74 68 65 20 66 69 72 73 74  d with the first
11490 20 66 72 65 65 20 70 61 67 65 20 70 75 6c 6c 65   free page pulle
114a0 64 20 6f 66 66 20 74 68 65 20 66 72 65 65 20 6c  d off the free l
114b0 69 73 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ist..      **.  
114c0 20 20 20 20 2a 2a 20 4f 6e 20 74 68 65 20 6f 74      ** On the ot
114d0 68 65 72 20 68 61 6e 64 2c 20 69 66 20 6e 46 69  her hand, if nFi
114e0 6e 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  n is greater tha
114f0 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 6b 65 65  n zero, then kee
11500 70 0a 20 20 20 20 20 20 2a 2a 20 6c 6f 6f 70 69  p.      ** loopi
11510 6e 67 20 75 6e 74 69 6c 20 61 20 66 72 65 65 2d  ng until a free-
11520 70 61 67 65 20 6c 6f 63 61 74 65 64 20 77 69 74  page located wit
11530 68 69 6e 20 74 68 65 20 66 69 72 73 74 20 6e 46  hin the first nF
11540 69 6e 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  in pages.      *
11550 2a 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  * of the file is
11560 20 66 6f 75 6e 64 2e 0a 20 20 20 20 20 20 2a 2f   found..      */
11570 0a 20 20 20 20 20 20 64 6f 20 7b 0a 20 20 20 20  .      do {.    
11580 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 46 72      MemPage *pFr
11590 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 72 63  eePg;.        rc
115a0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
115b0 50 61 67 65 28 70 42 74 2c 20 26 70 46 72 65 65  Page(pBt, &pFree
115c0 50 67 2c 20 26 69 46 72 65 65 50 67 2c 20 30 2c  Pg, &iFreePg, 0,
115d0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
115e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
115f0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65  {.          rele
11600 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29  asePage(pLastPg)
11610 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
11620 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
11630 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
11640 50 61 67 65 28 70 46 72 65 65 50 67 29 3b 0a 20  Page(pFreePg);. 
11650 20 20 20 20 20 7d 77 68 69 6c 65 28 20 6e 46 69       }while( nFi
11660 6e 21 3d 30 20 26 26 20 69 46 72 65 65 50 67 3e  n!=0 && iFreePg>
11670 6e 46 69 6e 20 29 3b 0a 20 20 20 20 20 20 61 73  nFin );.      as
11680 73 65 72 74 28 20 69 46 72 65 65 50 67 3c 69 4c  sert( iFreePg<iL
11690 61 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 0a  astPg );.      .
116a0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
116b0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 4c 61  e3PagerWrite(pLa
116c0 73 74 50 67 2d 3e 70 44 62 50 61 67 65 29 3b 0a  stPg->pDbPage);.
116d0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
116e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
116f0 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65     rc = relocate
11700 50 61 67 65 28 70 42 74 2c 20 70 4c 61 73 74 50  Page(pBt, pLastP
11710 67 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  g, eType, iPtrPa
11720 67 65 2c 20 69 46 72 65 65 50 67 2c 20 6e 46 69  ge, iFreePg, nFi
11730 6e 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  n!=0);.      }. 
11740 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
11750 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20  (pLastPg);.     
11760 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11770 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
11780 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
11790 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 42  .    }.  }..  pB
117a0 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 69 4c 61 73  t->nTrunc = iLas
117b0 74 50 67 20 2d 20 31 3b 0a 20 20 77 68 69 6c 65  tPg - 1;.  while
117c0 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 50  ( pBt->nTrunc==P
117d0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
117e0 28 70 42 74 29 7c 7c 50 54 52 4d 41 50 5f 49 53  (pBt)||PTRMAP_IS
117f0 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e  PAGE(pBt, pBt->n
11800 54 72 75 6e 63 29 20 29 7b 0a 20 20 20 20 70 42  Trunc) ){.    pB
11810 74 2d 3e 6e 54 72 75 6e 63 2d 2d 3b 0a 20 20 7d  t->nTrunc--;.  }
11820 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
11830 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  _OK;.}../*.** A 
11840 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
11850 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64  n must be opened
11860 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
11870 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
11880 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20  * It performs a 
11890 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77  single unit of w
118a0 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69  ork towards an i
118b0 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
118c0 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  m..**.** If the 
118d0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
118e0 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20 61  um is finished a
118f0 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
11900 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53  on has run,.** S
11910 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65  QLITE_DONE is re
11920 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73  turned. If it is
11930 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62   not finished, b
11940 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ut no error occu
11950 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  red,.** SQLITE_O
11960 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  K is returned. O
11970 74 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69  therwise an SQLi
11980 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a  te error code. .
11990 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
119a0 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74  reeIncrVacuum(Bt
119b0 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
119c0 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
119d0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
119e0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
119f0 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20  r(p);.  pBt->db 
11a00 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72  = p->db;.  asser
11a10 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
11a20 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
11a30 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73  TE && p->inTrans
11a40 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
11a50 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74  .  if( !pBt->aut
11a60 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
11a70 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  c = SQLITE_DONE;
11a80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
11a90 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
11aa0 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20  lowCache(pBt);. 
11ab0 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75     rc = incrVacu
11ac0 75 6d 53 74 65 70 28 70 42 74 2c 20 30 29 3b 0a  umStep(pBt, 0);.
11ad0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
11ae0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
11af0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11b00 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
11b10 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20 74  s called prior t
11b20 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  o sqlite3PagerCo
11b30 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61 6e  mmit when a tran
11b40 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f  saction.** is co
11b50 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e 20 61 75  mmited for an au
11b60 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
11b70 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c  se..**.** If SQL
11b80 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
11b90 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e  ed, then *pnTrun
11ba0 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  c is set to the 
11bb0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a  number of pages.
11bc0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
11bd0 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20 74  file should be t
11be0 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72 69  runcated to duri
11bf0 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72  ng the commit pr
11c00 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20  ocess. .** i.e. 
11c10 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
11c20 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65   been reorganize
11c30 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74  d so that only t
11c40 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75 6e  he first *pnTrun
11c50 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20 69  c.** pages are i
11c60 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  n use..*/.static
11c70 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 43   int autoVacuumC
11c80 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20 2a  ommit(BtShared *
11c90 70 42 74 2c 20 50 67 6e 6f 20 2a 70 6e 54 72 75  pBt, Pgno *pnTru
11ca0 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nc){.  int rc = 
11cb0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67  SQLITE_OK;.  Pag
11cc0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74  er *pPager = pBt
11cd0 2d 3e 70 50 61 67 65 72 3b 0a 23 69 66 6e 64 65  ->pPager;.#ifnde
11ce0 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20 6e  f NDEBUG.  int n
11cf0 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Ref = sqlite3Pag
11d00 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
11d10 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73  r);.#endif..  as
11d20 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
11d30 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
11d40 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69  tex) );.  invali
11d50 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43  dateAllOverflowC
11d60 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73 73  ache(pBt);.  ass
11d70 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61 63  ert(pBt->autoVac
11d80 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42 74  uum);.  if( !pBt
11d90 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a  ->incrVacuum ){.
11da0 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20      Pgno nFin = 
11db0 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 42 74 2d  0;..    if( pBt-
11dc0 3e 6e 54 72 75 6e 63 3d 3d 30 20 29 7b 0a 20 20  >nTrunc==0 ){.  
11dd0 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b 0a      Pgno nFree;.
11de0 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 74 72 6d        Pgno nPtrm
11df0 61 70 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  ap;.      const 
11e00 69 6e 74 20 70 67 73 7a 20 3d 20 70 42 74 2d 3e  int pgsz = pBt->
11e10 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  pageSize;.      
11e20 69 6e 74 20 6e 4f 72 69 67 20 3d 20 70 61 67 65  int nOrig = page
11e30 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
11e40 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20  pPager);..      
11e50 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47  if( PTRMAP_ISPAG
11e60 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 29 7b  E(pBt, nOrig) ){
11e70 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
11e80 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
11e90 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  KPT;.      }.   
11ea0 20 20 20 69 66 28 20 6e 4f 72 69 67 3d 3d 50 45     if( nOrig==PE
11eb0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
11ec0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
11ed0 6e 4f 72 69 67 2d 2d 3b 0a 20 20 20 20 20 20 7d  nOrig--;.      }
11ee0 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20 67  .      nFree = g
11ef0 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
11f00 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
11f10 3b 0a 20 20 20 20 20 20 6e 50 74 72 6d 61 70 20  ;.      nPtrmap 
11f20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50  = (nFree-nOrig+P
11f30 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74  TRMAP_PAGENO(pBt
11f40 2c 20 6e 4f 72 69 67 29 2b 70 67 73 7a 2f 35 29  , nOrig)+pgsz/5)
11f50 2f 28 70 67 73 7a 2f 35 29 3b 0a 20 20 20 20 20  /(pgsz/5);.     
11f60 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20   nFin = nOrig - 
11f70 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b  nFree - nPtrmap;
11f80 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 72 69 67  .      if( nOrig
11f90 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  >PENDING_BYTE_PA
11fa0 47 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e 3c  GE(pBt) && nFin<
11fb0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
11fc0 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
11fd0 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 20     nFin--;.     
11fe0 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20   }.      while( 
11ff0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
12000 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e  t, nFin) || nFin
12010 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
12020 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
12030 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20      nFin--;.    
12040 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77    }.    }..    w
12050 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
12060 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
12070 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70  = incrVacuumStep
12080 28 70 42 74 2c 20 6e 46 69 6e 29 3b 0a 20 20 20  (pBt, nFin);.   
12090 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
120a0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
120b0 20 20 20 20 61 73 73 65 72 74 28 6e 46 69 6e 3d      assert(nFin=
120c0 3d 30 20 7c 7c 20 70 42 74 2d 3e 6e 54 72 75 6e  =0 || pBt->nTrun
120d0 63 3d 3d 30 20 7c 7c 20 6e 46 69 6e 3c 3d 70 42  c==0 || nFin<=pB
120e0 74 2d 3e 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20  t->nTrunc);.    
120f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
12100 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  ;.      if( pBt-
12110 3e 6e 54 72 75 6e 63 20 26 26 20 6e 46 69 6e 20  >nTrunc && nFin 
12120 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
12130 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
12140 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70  e(pBt->pPage1->p
12150 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
12160 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
12170 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
12180 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  ], 0);.        p
12190 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  ut4byte(&pBt->pP
121a0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
121b0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74   0);.        pBt
121c0 2d 3e 6e 54 72 75 6e 63 20 3d 20 6e 46 69 6e 3b  ->nTrunc = nFin;
121d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
121e0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
121f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
12200 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
12210 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
12220 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  }.  }..  if( rc=
12230 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12240 20 20 2a 70 6e 54 72 75 6e 63 20 3d 20 70 42 74    *pnTrunc = pBt
12250 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20 20 20 70 42  ->nTrunc;.    pB
12260 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 20  t->nTrunc = 0;. 
12270 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52 65   }.  assert( nRe
12280 66 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72 52  f==sqlite3PagerR
12290 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 20  efcount(pPager) 
122a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
122b0 7d 0a 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  }..#endif../*.**
122c0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
122d0 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
122e0 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73  se of a two-phas
122f0 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20  e commit.  This 
12300 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65  routine.** cause
12310 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  s a rollback jou
12320 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74  rnal to be creat
12330 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e  ed (if it does n
12340 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
12350 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74  ).** and populat
12360 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69  ed with enough i
12370 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68  nformation so th
12380 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f  at if a power lo
12390 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65  ss occurs.** the
123a0 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
123b0 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
123c0 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
123d0 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a  by playing back.
123e0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  ** the journal. 
123f0 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   Then the conten
12400 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ts of the journa
12410 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75  l are flushed ou
12420 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b  t to.** the disk
12430 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75  .  After the jou
12440 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f  rnal is safely o
12450 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61  n oxide, the cha
12460 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64  nges to the.** d
12470 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74  atabase are writ
12480 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ten into the dat
12490 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66  abase file and f
124a0 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e  lushed to oxide.
124b0 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
124c0 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65  f this call, the
124d0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
124e0 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f  l still exists o
124f0 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e  n the.** disk an
12500 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68  d we are still h
12510 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73  olding all locks
12520 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63  , so the transac
12530 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20  tion has not.** 
12540 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20  committed.  See 
12550 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
12560 69 74 28 29 20 66 6f 72 20 74 68 65 20 73 65 63  it() for the sec
12570 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68 65  ond phase of the
12580 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65  .** commit proce
12590 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ss..**.** This c
125a0 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  all is a no-op i
125b0 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73  f no write-trans
125c0 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e  action is curren
125d0 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42  tly active on pB
125e0 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  t..**.** Otherwi
125f0 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74  se, sync the dat
12600 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
12610 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d  he btree pBt. zM
12620 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a  aster points to.
12630 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ** the name of a
12640 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
12650 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64  file that should
12660 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
12670 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
12680 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  al journal file,
12690 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64   or is NULL, ind
126a0 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65  icating no maste
126b0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a  r journal file .
126c0 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62  ** (single datab
126d0 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
126e0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
126f0 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  s is called, the
12700 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
12710 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68  should already h
12720 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61  ave been.** crea
12730 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77  ted, populated w
12740 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ith this journal
12750 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e   pointer and syn
12760 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
12770 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20  ** Once this is 
12780 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74 75  routine has retu
12790 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74  rned, the only t
127a0 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f  hing required to
127b0 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77   commit.** the w
127c0 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
127d0 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61   for this databa
127e0 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65  se file is to de
127f0 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
12800 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12810 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
12820 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f  One(Btree *p, co
12830 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
12840 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
12850 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
12860 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
12870 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42  S_WRITE ){.    B
12880 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
12890 2d 3e 70 42 74 3b 0a 20 20 20 20 50 67 6e 6f 20  ->pBt;.    Pgno 
128a0 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 20 20 20 20  nTrunc = 0;.    
128b0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
128c0 72 28 70 29 3b 0a 20 20 20 20 70 42 74 2d 3e 64  r(p);.    pBt->d
128d0 62 20 3d 20 70 2d 3e 64 62 3b 0a 23 69 66 6e 64  b = p->db;.#ifnd
128e0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
128f0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
12900 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
12910 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  m ){.      rc = 
12920 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74  autoVacuumCommit
12930 28 70 42 74 2c 20 26 6e 54 72 75 6e 63 29 3b 20  (pBt, &nTrunc); 
12940 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
12950 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12960 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
12970 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
12980 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
12990 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
129a0 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  f.    rc = sqlit
129b0 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
129c0 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67 65  seOne(pBt->pPage
129d0 72 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75  r, zMaster, nTru
129e0 6e 63 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  nc, 0);.    sqli
129f0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
12a00 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
12a10 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  c;.}../*.** Comm
12a20 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  it the transacti
12a30 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  on currently in 
12a40 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20  progress..**.** 
12a50 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70  This routine imp
12a60 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63 6f  lements the seco
12a70 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20 32 2d  nd phase of a 2-
12a80 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54  phase commit.  T
12a90 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72  he.** sqlite3Btr
12aa0 65 65 53 79 6e 63 28 29 20 72 6f 75 74 69 6e 65  eeSync() routine
12ab0 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20   does the first 
12ac0 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c 64  phase and should
12ad0 20 62 65 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20 70   be invoked.** p
12ae0 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20  rior to calling 
12af0 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20 54  this routine.  T
12b00 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  he sqlite3BtreeS
12b10 79 6e 63 28 29 20 72 6f 75 74 69 6e 65 20 64 69  ync() routine di
12b20 64 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 77 6f 72  d.** all the wor
12b30 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e 66  k of writing inf
12b40 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20  ormation out to 
12b50 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e  disk and flushin
12b60 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  g the.** content
12b70 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 61  s so that they a
12b80 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20  re written onto 
12b90 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65 72  the disk platter
12ba0 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72  .  All this.** r
12bb0 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64 6f  outine has to do
12bc0 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74 72   is delete or tr
12bd0 75 6e 63 61 74 65 20 74 68 65 20 72 6f 6c 6c 62  uncate the rollb
12be0 61 63 6b 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 28  ack journal.** (
12bf0 77 68 69 63 68 20 63 61 75 73 65 73 20 74 68 65  which causes the
12c00 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20   transaction to 
12c10 63 6f 6d 6d 69 74 29 20 61 6e 64 20 64 72 6f 70  commit) and drop
12c20 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54 68   locks..**.** Th
12c30 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20  is will release 
12c40 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
12c50 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
12c60 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a  ile.  If there.*
12c70 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
12c80 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f  cursors, it also
12c90 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65   releases the re
12ca0 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20  ad lock..*/.int 
12cb0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
12cc0 69 74 50 68 61 73 65 54 77 6f 28 42 74 72 65 65  itPhaseTwo(Btree
12cd0 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
12ce0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
12cf0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
12d00 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e  nter(p);.  pBt->
12d10 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 62 74  db = p->db;.  bt
12d20 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
12d30 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68 61  ..  /* If the ha
12d40 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74 65  ndle has a write
12d50 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65  -transaction ope
12d60 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73 68  n, commit the sh
12d70 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20 2a  ared-btrees .  *
12d80 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  * transaction an
12d90 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65 64  d set the shared
12da0 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
12db0 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  READ..  */.  if(
12dc0 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
12dd0 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
12de0 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73 65  int rc;.    asse
12df0 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
12e00 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
12e10 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ITE );.    asser
12e20 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  t( pBt->nTransac
12e30 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63  tion>0 );.    rc
12e40 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 43   = sqlite3PagerC
12e50 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70 42  ommitPhaseTwo(pB
12e60 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
12e70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12e80 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
12e90 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
12ea0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
12eb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d  ;.    }.    pBt-
12ec0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
12ed0 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20   TRANS_READ;.   
12ee0 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pBt->inStmt = 0
12ef0 3b 0a 20 20 7d 0a 20 20 75 6e 6c 6f 63 6b 41 6c  ;.  }.  unlockAl
12f00 6c 54 61 62 6c 65 73 28 70 29 3b 0a 0a 20 20 2f  lTables(p);..  /
12f10 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20  * If the handle 
12f20 68 61 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20  has any kind of 
12f30 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e  transaction open
12f40 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65 20  , decrement the 
12f50 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
12f60 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73 68   count of the sh
12f70 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20 74  ared btree. If t
12f80 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  he transaction c
12f90 6f 75 6e 74 20 72 65 61 63 68 65 73 20 30 2c 20  ount reaches 0, 
12fa0 73 65 74 0a 20 20 2a 2a 20 74 68 65 20 73 68 61  set.  ** the sha
12fb0 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41  red state to TRA
12fc0 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c  NS_NONE. The unl
12fd0 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
12fe0 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77 0a 20 20  () call below.  
12ff0 2a 2a 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74  ** will unlock t
13000 68 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20  he pager..  */. 
13010 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
13020 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
13030 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
13040 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66 28 20  tion--;.    if( 
13050 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  0==pBt->nTransac
13060 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42  tion ){.      pB
13070 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
13080 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
13090 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53     }.  }..  /* S
130a0 65 74 20 74 68 65 20 68 61 6e 64 6c 65 73 20 63  et the handles c
130b0 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69  urrent transacti
130c0 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  on state to TRAN
130d0 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63  S_NONE and unloc
130e0 6b 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 72  k.  ** the pager
130f0 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63 6c   if this call cl
13100 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72 65  osed the only re
13110 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
13120 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20  saction..  */.  
13130 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41  p->inTrans = TRA
13140 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 75 6e 6c 6f 63  NS_NONE;.  unloc
13150 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
13160 42 74 29 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74  Bt);..  btreeInt
13170 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c  egrity(p);.  sql
13180 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
13190 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
131a0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
131b0 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f  Do both phases o
131c0 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69  f a commit..*/.i
131d0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
131e0 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b  ommit(Btree *p){
131f0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
13200 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
13210 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
13220 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
13230 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66  eOne(p, 0);.  if
13240 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13250 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
13260 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
13270 61 73 65 54 77 6f 28 70 29 3b 0a 20 20 7d 0a 20  aseTwo(p);.  }. 
13280 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
13290 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
132a0 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  rc;.}..#ifndef N
132b0 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75  DEBUG./*.** Retu
132c0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
132d0 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6f   write-cursors o
132e0 70 65 6e 20 6f 6e 20 74 68 69 73 20 68 61 6e 64  pen on this hand
132f0 6c 65 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20  le. This is for 
13300 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74  use.** in assert
13310 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  () expressions, 
13320 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f  so it is only co
13330 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47  mpiled if NDEBUG
13340 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e   is not.** defin
13350 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  ed..**.** For th
13360 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
13370 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 77 72  is routine, a wr
13380 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 61 6e  ite-cursor is an
13390 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a  y cursor that.**
133a0 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20 77   is capable of w
133b0 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61  riting to the da
133c0 74 61 62 73 65 2e 20 20 54 68 61 74 20 6d 65 61  tabse.  That mea
133d0 6e 73 20 74 68 65 20 63 75 72 73 6f 72 20 77 61  ns the cursor wa
133e0 73 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 6c 79 20  s.** originally 
133f0 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69  opened for writi
13400 6e 67 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f  ng and the curso
13410 72 20 68 61 73 20 6e 6f 74 20 62 65 20 64 69 73  r has not be dis
13420 61 62 6c 65 64 0a 2a 2a 20 62 79 20 68 61 76 69  abled.** by havi
13430 6e 67 20 69 74 73 20 73 74 61 74 65 20 63 68 61  ng its state cha
13440 6e 67 65 64 20 74 6f 20 43 55 52 53 4f 52 5f 46  nged to CURSOR_F
13450 41 55 4c 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  AULT..*/.static 
13460 69 6e 74 20 63 6f 75 6e 74 57 72 69 74 65 43 75  int countWriteCu
13470 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a  rsors(BtShared *
13480 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  pBt){.  BtCursor
13490 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20   *pCur;.  int r 
134a0 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d  = 0;.  for(pCur=
134b0 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43  pBt->pCursor; pC
134c0 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70  ur; pCur=pCur->p
134d0 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
134e0 43 75 72 2d 3e 77 72 46 6c 61 67 20 26 26 20 70  Cur->wrFlag && p
134f0 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52  Cur->eState!=CUR
13500 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b  SOR_FAULT ) r++;
13510 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72   .  }.  return r
13520 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
13530 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
13540 65 74 73 20 74 68 65 20 73 74 61 74 65 20 74 6f  ets the state to
13550 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e   CURSOR_FAULT an
13560 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63  d the error.** c
13570 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66  ode to errCode f
13580 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f 72 20  or every cursor 
13590 6f 6e 20 42 74 53 68 61 72 65 64 20 74 68 61 74  on BtShared that
135a0 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72   pBtree.** refer
135b0 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65  ences..**.** Eve
135c0 72 79 20 63 75 72 73 6f 72 20 69 73 20 74 72 69  ry cursor is tri
135d0 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20  pped, including 
135e0 63 75 72 73 6f 72 73 20 74 68 61 74 20 62 65 6c  cursors that bel
135f0 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68 65 72 20  ong.** to other 
13600 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
13610 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e  ions that happen
13620 20 74 6f 20 62 65 20 73 68 61 72 69 6e 67 0a 2a   to be sharing.*
13630 2a 20 74 68 65 20 63 61 63 68 65 20 77 69 74 68  * the cache with
13640 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54   pBtree..**.** T
13650 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73  his routine gets
13660 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72   called when a r
13670 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a  ollback occurs..
13680 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 75  ** All cursors u
13690 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 61  sing the same ca
136a0 63 68 65 20 6d 75 73 74 20 62 65 20 74 72 69 70  che must be trip
136b0 70 65 64 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e  ped.** to preven
136c0 74 20 74 68 65 6d 20 66 72 6f 6d 20 74 72 79 69  t them from tryi
136d0 6e 67 20 74 6f 20 75 73 65 20 74 68 65 20 62 74  ng to use the bt
136e0 72 65 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65  ree after.** the
136f0 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20   rollback.  The 
13700 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76  rollback may hav
13710 65 20 64 65 6c 65 74 65 64 20 74 61 62 6c 65 73  e deleted tables
13720 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64 20 72 6f 6f  .** or moved roo
13730 74 20 70 61 67 65 73 2c 20 73 6f 20 69 74 20 69  t pages, so it i
13740 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74  s not sufficient
13750 20 74 6f 0a 2a 2a 20 73 61 76 65 20 74 68 65 20   to.** save the 
13760 73 74 61 74 65 20 6f 66 20 74 68 65 20 63 75 72  state of the cur
13770 73 6f 72 2e 20 20 54 68 65 20 63 75 72 73 6f 72  sor.  The cursor
13780 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61   must be.** inva
13790 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64  lidated..*/.void
137a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
137b0 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65  pAllCursors(Btre
137c0 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65  e *pBtree, int e
137d0 72 72 43 6f 64 65 29 7b 0a 20 20 42 74 43 75 72  rrCode){.  BtCur
137e0 73 6f 72 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65  sor *p;.  sqlite
137f0 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
13800 65 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  ee);.  for(p=pBt
13810 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f  ree->pBt->pCurso
13820 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
13830 29 7b 0a 20 20 20 20 63 6c 65 61 72 43 75 72 73  ){.    clearCurs
13840 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20  orPosition(p);. 
13850 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43     p->eState = C
13860 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20  URSOR_FAULT;.   
13870 20 70 2d 3e 73 6b 69 70 20 3d 20 65 72 72 43 6f   p->skip = errCo
13880 64 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  de;.  }.  sqlite
13890 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
138a0 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  ee);.}../*.** Ro
138b0 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73  llback the trans
138c0 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65  action in progre
138d0 73 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72 73  ss.  All cursors
138e0 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61   will be.** inva
138f0 6c 69 64 65 64 20 62 79 20 74 68 69 73 20 6f 70  lided by this op
13900 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74  eration.  Any at
13910 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 63  tempt to use a c
13920 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61  ursor.** that wa
13930 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65  s open at the be
13940 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20  ginning of this 
13950 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72  operation will r
13960 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65  esult.** in an e
13970 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rror..**.** This
13980 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68   will release th
13990 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20  e write lock on 
139a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
139b0 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20  e.  If there.** 
139c0 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75  are no active cu
139d0 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72  rsors, it also r
139e0 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64  eleases the read
139f0 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   lock..*/.int sq
13a00 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61  lite3BtreeRollba
13a10 63 6b 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ck(Btree *p){.  
13a20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
13a30 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
13a40 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
13a50 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  ge1;..  sqlite3B
13a60 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
13a70 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
13a80 0a 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c 43  .  rc = saveAllC
13a90 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20 30  ursors(pBt, 0, 0
13aa0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
13ab0 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
13ac0 43 48 45 0a 20 20 69 66 28 20 72 63 21 3d 53 51  CHE.  if( rc!=SQ
13ad0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
13ae0 2a 20 54 68 69 73 20 69 73 20 61 20 68 6f 72 72  * This is a horr
13af0 69 62 6c 65 20 73 69 74 75 61 74 69 6f 6e 2e 20  ible situation. 
13b00 41 6e 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28  An IO or malloc(
13b10 29 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20  ) error occured 
13b20 77 68 69 6c 73 74 0a 20 20 20 20 2a 2a 20 74 72  whilst.    ** tr
13b30 79 69 6e 67 20 74 6f 20 73 61 76 65 20 63 75 72  ying to save cur
13b40 73 6f 72 20 70 6f 73 69 74 69 6f 6e 73 2e 20 49  sor positions. I
13b50 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74  f this is an aut
13b60 6f 6d 61 74 69 63 20 72 6f 6c 6c 62 61 63 6b 20  omatic rollback 
13b70 28 61 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 72  (as.    ** the r
13b80 65 73 75 6c 74 20 6f 66 20 61 20 63 6f 6e 73 74  esult of a const
13b90 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29 20  raint, malloc() 
13ba0 66 61 69 6c 75 72 65 20 6f 72 20 49 4f 20 65 72  failure or IO er
13bb0 72 6f 72 29 20 74 68 65 6e 20 0a 20 20 20 20 2a  ror) then .    *
13bc0 2a 20 74 68 65 20 63 61 63 68 65 20 6d 61 79 20  * the cache may 
13bd0 62 65 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69 6e  be internally in
13be0 63 6f 6e 73 69 73 74 65 6e 74 20 28 6e 6f 74 20  consistent (not 
13bf0 63 6f 6e 74 61 69 6e 20 76 61 6c 69 64 20 74 72  contain valid tr
13c00 65 65 73 29 20 73 6f 0a 20 20 20 20 2a 2a 20 77  ees) so.    ** w
13c10 65 20 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79 20  e cannot simply 
13c20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
13c30 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   to the caller. 
13c40 49 6e 73 74 65 61 64 2c 20 61 62 6f 72 74 20 0a  Instead, abort .
13c50 20 20 20 20 2a 2a 20 61 6c 6c 20 71 75 65 72 69      ** all queri
13c60 65 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 75  es that may be u
13c70 73 69 6e 67 20 61 6e 79 20 6f 66 20 74 68 65 20  sing any of the 
13c80 63 75 72 73 6f 72 73 20 74 68 61 74 20 66 61 69  cursors that fai
13c90 6c 65 64 20 74 6f 20 73 61 76 65 2e 0a 20 20 20  led to save..   
13ca0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42   */.    sqlite3B
13cb0 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f  treeTripAllCurso
13cc0 72 73 28 70 2c 20 72 63 29 3b 0a 20 20 7d 0a 23  rs(p, rc);.  }.#
13cd0 65 6e 64 69 66 0a 20 20 62 74 72 65 65 49 6e 74  endif.  btreeInt
13ce0 65 67 72 69 74 79 28 70 29 3b 0a 20 20 75 6e 6c  egrity(p);.  unl
13cf0 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 70 29 3b  ockAllTables(p);
13d00 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
13d10 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
13d20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a  ){.    int rc2;.
13d30 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
13d40 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
13d50 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20      pBt->nTrunc 
13d60 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20  = 0;.#endif..   
13d70 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57   assert( TRANS_W
13d80 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61  RITE==pBt->inTra
13d90 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20  nsaction );.    
13da0 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67  rc2 = sqlite3Pag
13db0 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e  erRollback(pBt->
13dc0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
13dd0 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2!=SQLITE_OK 
13de0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63  ){.      rc = rc
13df0 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  2;.    }..    /*
13e00 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   The rollback ma
13e10 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64  y have destroyed
13e20 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61   the pPage1->aDa
13e30 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20  ta value.  So.  
13e40 20 20 2a 2a 20 63 61 6c 6c 20 73 71 6c 69 74 65    ** call sqlite
13e50 33 42 74 72 65 65 47 65 74 50 61 67 65 28 29 20  3BtreeGetPage() 
13e60 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e 20  on page 1 again 
13e70 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73  to make.    ** s
13e80 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74  ure pPage1->aDat
13e90 61 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74  a is set correct
13ea0 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  ly. */.    if( s
13eb0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
13ec0 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67  ge(pBt, 1, &pPag
13ed0 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f  e1, 0)==SQLITE_O
13ee0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
13ef0 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
13f00 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
13f10 28 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73  ( countWriteCurs
13f20 6f 72 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20  ors(pBt)==0 );. 
13f30 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
13f40 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
13f50 41 44 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  AD;.  }..  if( p
13f60 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
13f70 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 61 73 73  _NONE ){.    ass
13f80 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73  ert( pBt->nTrans
13f90 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20  action>0 );.    
13fa0 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
13fb0 6e 2d 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  n--;.    if( 0==
13fc0 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
13fd0 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  n ){.      pBt->
13fe0 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
13ff0 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
14000 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 6e 54 72  }.  }..  p->inTr
14010 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
14020 3b 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20  ;.  pBt->inStmt 
14030 3d 20 30 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72  = 0;.  unlockBtr
14040 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b  eeIfUnused(pBt);
14050 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  ..  btreeIntegri
14060 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ty(p);.  sqlite3
14070 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
14080 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
14090 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74 61  *.** Start a sta
140a0 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
140b0 63 74 69 6f 6e 2e 20 20 54 68 65 20 73 75 62 74  ction.  The subt
140c0 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 0a 2a  ransaction can.*
140d0 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20  * can be rolled 
140e0 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74  back independent
140f0 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 74  ly of the main t
14100 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 59  ransaction..** Y
14110 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61 20  ou must start a 
14120 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f  transaction befo
14130 72 65 20 73 74 61 72 74 69 6e 67 20 61 20 73 75  re starting a su
14140 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a  btransaction..**
14150 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
14160 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75 74  ion is ended aut
14170 6f 6d 61 74 69 63 61 6c 6c 79 20 69 66 20 74 68  omatically if th
14180 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74 69  e main transacti
14190 6f 6e 0a 2a 2a 20 63 6f 6d 6d 69 74 73 20 6f 72  on.** commits or
141a0 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a   rolls back..**.
141b0 2a 2a 20 4f 6e 6c 79 20 6f 6e 65 20 73 75 62 74  ** Only one subt
141c0 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 62  ransaction may b
141d0 65 20 61 63 74 69 76 65 20 61 74 20 61 20 74 69  e active at a ti
141e0 6d 65 2e 20 20 49 74 20 69 73 20 61 6e 20 65 72  me.  It is an er
141f0 72 6f 72 20 74 6f 20 74 72 79 0a 2a 2a 20 74 6f  ror to try.** to
14200 20 73 74 61 72 74 20 61 20 6e 65 77 20 73 75 62   start a new sub
14210 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 61  transaction if a
14220 6e 6f 74 68 65 72 20 73 75 62 74 72 61 6e 73 61  nother subtransa
14230 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79  ction is already
14240 20 61 63 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 53   active..**.** S
14250 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
14260 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73 65  sactions are use
14270 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69 64  d around individ
14280 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ual SQL statemen
14290 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20 63  ts.** that are c
142a0 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20  ontained within 
142b0 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54  a BEGIN...COMMIT
142c0 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f   block.  If a co
142d0 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f  nstraint.** erro
142e0 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  r occurs within 
142f0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20 74  the statement, t
14300 68 65 20 65 66 66 65 63 74 20 6f 66 20 74 68 61  he effect of tha
14310 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a  t one statement.
14320 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  ** can be rolled
14330 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61   back without ha
14340 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  ving to rollback
14350 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61 6e   the entire tran
14360 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  saction..*/.int 
14370 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69  sqlite3BtreeBegi
14380 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b  nStmt(Btree *p){
14390 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
143a0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
143b0 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  pBt;.  sqlite3Bt
143c0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
143d0 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
143e0 20 20 69 66 28 20 28 70 2d 3e 69 6e 54 72 61 6e    if( (p->inTran
143f0 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 20  s!=TRANS_WRITE) 
14400 7c 7c 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 29  || pBt->inStmt )
14410 7b 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e  {.    rc = pBt->
14420 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54  readOnly ? SQLIT
14430 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c  E_READONLY : SQL
14440 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c  ITE_ERROR;.  }el
14450 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
14460 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
14470 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
14480 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d  );.    rc = pBt-
14490 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49  >readOnly ? SQLI
144a0 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33 50  TE_OK : sqlite3P
144b0 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28 70 42  agerStmtBegin(pB
144c0 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
144d0 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b  pBt->inStmt = 1;
144e0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
144f0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
14500 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
14510 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20 73  .** Commit the s
14520 74 61 74 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  tatment subtrans
14530 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79  action currently
14540 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 49   in progress.  I
14550 66 20 6e 6f 0a 2a 2a 20 73 75 62 74 72 61 6e 73  f no.** subtrans
14560 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
14570 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  , this is a no-o
14580 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  p..*/.int sqlite
14590 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74  3BtreeCommitStmt
145a0 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e  (Btree *p){.  in
145b0 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
145c0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
145d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
145e0 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64  ter(p);.  pBt->d
145f0 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28  b = p->db;.  if(
14600 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 26 26 20   pBt->inStmt && 
14610 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
14620 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
14630 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69  e3PagerStmtCommi
14640 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  t(pBt->pPager);.
14650 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
14660 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
14670 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d  .  pBt->inStmt =
14680 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   0;.  sqlite3Btr
14690 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
146a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
146b0 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 61  * Rollback the a
146c0 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 20  ctive statement 
146d0 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
146e0 20 49 66 20 6e 6f 20 73 75 62 74 72 61 6e 73 61   If no subtransa
146f0 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 63 74 69  ction.** is acti
14700 76 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ve this routine 
14710 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
14720 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69  * All cursors wi
14730 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65  ll be invalidate
14740 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74  d by this operat
14750 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  ion.  Any attemp
14760 74 0a 2a 2a 20 74 6f 20 75 73 65 20 61 20 63 75  t.** to use a cu
14770 72 73 6f 72 20 74 68 61 74 20 77 61 73 20 6f 70  rsor that was op
14780 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  en at the beginn
14790 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65 72  ing of this oper
147a0 61 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 72 65  ation.** will re
147b0 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f 72  sult in an error
147c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
147d0 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d  BtreeRollbackStm
147e0 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  t(Btree *p){.  i
147f0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
14800 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  K;.  BtShared *p
14810 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
14820 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
14830 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d  (p);.  pBt->db =
14840 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 42   p->db;.  if( pB
14850 74 2d 3e 69 6e 53 74 6d 74 20 26 26 20 21 70 42  t->inStmt && !pB
14860 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  t->readOnly ){. 
14870 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
14880 61 67 65 72 53 74 6d 74 52 6f 6c 6c 62 61 63 6b  agerStmtRollback
14890 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
148a0 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d     pBt->inStmt =
148b0 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
148c0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
148d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
148e0 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
148f0 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20 74 68  ew cursor for th
14900 65 20 42 54 72 65 65 20 77 68 6f 73 65 20 72 6f  e BTree whose ro
14910 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70 61 67  ot is on the pag
14920 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 20 54 68  e.** iTable.  Th
14930 65 20 61 63 74 20 6f 66 20 61 63 71 75 69 72 69  e act of acquiri
14940 6e 67 20 61 20 63 75 72 73 6f 72 20 67 65 74 73  ng a cursor gets
14950 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20   a read lock on 
14960 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
14970 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   file..**.** If 
14980 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65 6e 20  wrFlag==0, then 
14990 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 6f  the cursor can o
149a0 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f 72 20  nly be used for 
149b0 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66 20 77  reading..** If w
149c0 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e 20 74  rFlag==1, then t
149d0 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65  he cursor can be
149e0 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e   used for readin
149f0 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72 69 74  g or for.** writ
14a00 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63 6f 6e  ing if other con
14a10 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72 69 74  ditions for writ
14a20 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d 65 74  ing are also met
14a30 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72 65 20  .  These.** are 
14a40 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74  the conditions t
14a50 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65 74 20  hat must be met 
14a60 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77 72 69  in order for wri
14a70 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20 61 6c  ting to.** be al
14a80 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20  lowed:.**.** 1: 
14a90 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74   The cursor must
14aa0 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e 65   have been opene
14ab0 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31  d with wrFlag==1
14ac0 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68 65 72  .**.** 2:  Other
14ad0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
14ae0 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61 72 65  tions that share
14af0 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20   the same pager 
14b00 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62 75 74  cache.**     but
14b10 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 69   which are not i
14b20 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43 4f 4d  n the READ_UNCOM
14b30 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d 61 79  MITTED state may
14b40 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20 20 20   not have.**    
14b50 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 77 69   cursors open wi
14b60 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f 6e 20  th wrFlag==0 on 
14b70 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e 20  the same table. 
14b80 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20 20 20   Otherwise.**   
14b90 20 20 74 68 65 20 63 68 61 6e 67 65 73 20 6d 61    the changes ma
14ba0 64 65 20 62 79 20 74 68 69 73 20 77 72 69 74 65  de by this write
14bb0 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20 62 65   cursor would be
14bc0 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a 20 20   visible to.**  
14bd0 20 20 20 74 68 65 20 72 65 61 64 20 63 75 72 73     the read curs
14be0 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68 65 72  ors in the other
14bf0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
14c00 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a 20 20  tion..**.** 3:  
14c10 54 68 65 20 64 61 74 61 62 61 73 65 20 6d 75 73  The database mus
14c20 74 20 62 65 20 77 72 69 74 61 62 6c 65 20 28 6e  t be writable (n
14c30 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c 79 20  ot on read-only 
14c40 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34 3a 20  media).**.** 4: 
14c50 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   There must be a
14c60 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  n active transac
14c70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63  tion..**.** No c
14c80 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 20  hecking is done 
14c90 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
14ca0 74 20 70 61 67 65 20 69 54 61 62 6c 65 20 72 65  t page iTable re
14cb0 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a 20 72  ally is the.** r
14cc0 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20 62 2d  oot page of a b-
14cd0 74 72 65 65 2e 20 20 49 66 20 69 74 20 69 73 20  tree.  If it is 
14ce0 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20 63 75  not, then the cu
14cf0 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a 2a 2a  rsor acquired.**
14d00 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 63   will not work c
14d10 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73 74 61  orrectly..*/.sta
14d20 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 75 72  tic int btreeCur
14d30 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  sor(.  Btree *p,
14d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14d60 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
14d70 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20 20  int iTable,     
14d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d90 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
14da0 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20  age of table to 
14db0 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72  open */.  int wr
14dc0 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20  Flag,           
14dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14de0 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20   /* 1 to write. 
14df0 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20  0 read-only */. 
14e00 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20   struct KeyInfo 
14e10 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
14e20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
14e30 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72 69 73   arg to comparis
14e40 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  on function */. 
14e50 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20   BtCursor *pCur 
14e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e70 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
14e80 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f 72 20   for new cursor 
14e90 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
14ea0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
14eb0 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73  = p->pBt;..  ass
14ec0 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
14ed0 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
14ee0 3b 0a 20 20 69 66 28 20 77 72 46 6c 61 67 20 29  ;.  if( wrFlag )
14ef0 7b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 72  {.    if( pBt->r
14f00 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20  eadOnly ){.     
14f10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52   return SQLITE_R
14f20 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20  EADONLY;.    }. 
14f30 20 20 20 69 66 28 20 63 68 65 63 6b 52 65 61 64     if( checkRead
14f40 4c 6f 63 6b 73 28 70 2c 20 69 54 61 62 6c 65 2c  Locks(p, iTable,
14f50 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20   0, 0) ){.      
14f60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
14f70 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  CKED;.    }.  }.
14f80 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67  .  if( pBt->pPag
14f90 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  e1==0 ){.    rc 
14fa0 3d 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52  = lockBtreeWithR
14fb0 65 74 72 79 28 70 29 3b 0a 20 20 20 20 69 66 28  etry(p);.    if(
14fc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14fd0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
14fe0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
14ff0 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 26   pBt->readOnly &
15000 26 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20  & wrFlag ){.    
15010 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
15020 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a  READONLY;.    }.
15030 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 67 6e 6f    }.  pCur->pgno
15040 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69 54 61  Root = (Pgno)iTa
15050 62 6c 65 3b 0a 20 20 69 66 28 20 69 54 61 62 6c  ble;.  if( iTabl
15060 65 3d 3d 31 20 26 26 20 70 61 67 65 72 50 61 67  e==1 && pagerPag
15070 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
15080 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  er)==0 ){.    rc
15090 20 3d 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 3b   = SQLITE_EMPTY;
150a0 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65  .    goto create
150b0 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f  _cursor_exceptio
150c0 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 67 65  n;.  }.  rc = ge
150d0 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
150e0 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
150f0 2c 20 26 70 43 75 72 2d 3e 70 50 61 67 65 2c 20  , &pCur->pPage, 
15100 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
15110 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
15120 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72 73 6f  oto create_curso
15130 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d  r_exception;.  }
15140 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61 74 20  ..  /* Now that 
15150 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72 73 20  no other errors 
15160 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e 69 73  can occur, finis
15170 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65  h filling in the
15180 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a 20 76   BtCursor.  ** v
15190 61 72 69 61 62 6c 65 73 2c 20 6c 69 6e 6b 20 74  ariables, link t
151a0 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f 20 74  he cursor into t
151b0 68 65 20 42 74 53 68 61 72 65 64 20 6c 69 73 74  he BtShared list
151c0 20 61 6e 64 20 73 65 74 20 2a 70 70 43 75 72 20   and set *ppCur 
151d0 28 74 68 65 0a 20 20 2a 2a 20 6f 75 74 70 75 74  (the.  ** output
151e0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
151f0 73 20 66 75 6e 63 74 69 6f 6e 29 2e 0a 20 20 2a  s function)..  *
15200 2f 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 49 6e  /.  pCur->pKeyIn
15210 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b 0a 20  fo = pKeyInfo;. 
15220 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20 3d 20   pCur->pBtree = 
15230 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74 20 3d  p;.  pCur->pBt =
15240 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e 77 72   pBt;.  pCur->wr
15250 46 6c 61 67 20 3d 20 77 72 46 6c 61 67 3b 0a 20  Flag = wrFlag;. 
15260 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70   pCur->pNext = p
15270 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69  Bt->pCursor;.  i
15280 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29  f( pCur->pNext )
15290 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78  {.    pCur->pNex
152a0 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b  t->pPrev = pCur;
152b0 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72  .  }.  pBt->pCur
152c0 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43  sor = pCur;.  pC
152d0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
152e0 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 0a 20 20  SOR_INVALID;..  
152f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15300 3b 0a 0a 63 72 65 61 74 65 5f 63 75 72 73 6f 72  ;..create_cursor
15310 5f 65 78 63 65 70 74 69 6f 6e 3a 0a 20 20 72 65  _exception:.  re
15320 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
15330 70 50 61 67 65 29 3b 0a 20 20 75 6e 6c 6f 63 6b  pPage);.  unlock
15340 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
15350 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  t);.  return rc;
15360 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
15370 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72  reeCursor(.  Btr
15380 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ee *p,          
15390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153a0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
153b0 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  btree */.  int i
153c0 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
153d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153e0 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
153f0 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20  age of table to 
15400 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72  open */.  int wr
15410 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20  Flag,           
15420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15430 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72        /* 1 to wr
15440 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79  ite. 0 read-only
15450 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79   */.  struct Key
15460 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
15470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15480 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74    /* First arg t
15490 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a  o xCompare() */.
154a0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
154b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
154d0 20 57 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f   Write new curso
154e0 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  r here */.){.  i
154f0 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
15500 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
15510 20 70 2d 3e 70 42 74 2d 3e 64 62 20 3d 20 70 2d   p->pBt->db = p-
15520 3e 64 62 3b 0a 20 20 72 63 20 3d 20 62 74 72 65  >db;.  rc = btre
15530 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c  eCursor(p, iTabl
15540 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49  e, wrFlag, pKeyI
15550 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73 71  nfo, pCur);.  sq
15560 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
15570 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
15580 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
15590 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 29 7b  reeCursorSize(){
155a0 0a 20 20 72 65 74 75 72 6e 20 73 69 7a 65 6f 66  .  return sizeof
155b0 28 42 74 43 75 72 73 6f 72 29 3b 0a 7d 0a 0a 0a  (BtCursor);.}...
155c0 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  ./*.** Close a c
155d0 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64  ursor.  The read
155e0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
155f0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65  abase file is re
15600 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74  leased.** when t
15610 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69  he last cursor i
15620 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74  s closed..*/.int
15630 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
15640 73 65 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  seCursor(BtCurso
15650 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65  r *pCur){.  Btre
15660 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72  e *pBtree = pCur
15670 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20  ->pBtree;.  if( 
15680 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 42 74  pBtree ){.    Bt
15690 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
156a0 75 72 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c  ur->pBt;.    sql
156b0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
156c0 42 74 72 65 65 29 3b 0a 20 20 20 20 70 42 74 2d  Btree);.    pBt-
156d0 3e 64 62 20 3d 20 70 42 74 72 65 65 2d 3e 64 62  >db = pBtree->db
156e0 3b 0a 20 20 20 20 63 6c 65 61 72 43 75 72 73 6f  ;.    clearCurso
156f0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
15700 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70  .    if( pCur->p
15710 50 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70 43  Prev ){.      pC
15720 75 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74  ur->pPrev->pNext
15730 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a   = pCur->pNext;.
15740 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15750 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
15760 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  pCur->pNext;.   
15770 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d   }.    if( pCur-
15780 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
15790 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  pCur->pNext->pPr
157a0 65 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76  ev = pCur->pPrev
157b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65  ;.    }.    rele
157c0 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 70 50  asePage(pCur->pP
157d0 61 67 65 29 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b  age);.    unlock
157e0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
157f0 74 29 3b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61  t);.    invalida
15800 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  teOverflowCache(
15810 70 43 75 72 29 3b 0a 20 20 20 20 2f 2a 20 73 71  pCur);.    /* sq
15820 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 29  lite3_free(pCur)
15830 3b 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  ; */.    sqlite3
15840 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
15850 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
15860 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
15870 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20 74 65 6d 70  *.** Make a temp
15880 6f 72 61 72 79 20 63 75 72 73 6f 72 20 62 79 20  orary cursor by 
15890 66 69 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 66  filling in the f
158a0 69 65 6c 64 73 20 6f 66 20 70 54 65 6d 70 43 75  ields of pTempCu
158b0 72 2e 0a 2a 2a 20 54 68 65 20 74 65 6d 70 6f 72  r..** The tempor
158c0 61 72 79 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  ary cursor is no
158d0 74 20 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20  t on the cursor 
158e0 6c 69 73 74 20 66 6f 72 20 74 68 65 20 42 74 72  list for the Btr
158f0 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ee..*/.void sqli
15900 74 65 33 42 74 72 65 65 47 65 74 54 65 6d 70 43  te3BtreeGetTempC
15910 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a  ursor(BtCursor *
15920 70 43 75 72 2c 20 42 74 43 75 72 73 6f 72 20 2a  pCur, BtCursor *
15930 70 54 65 6d 70 43 75 72 29 7b 0a 20 20 61 73 73  pTempCur){.  ass
15940 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
15950 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
15960 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 43 75 72   memcpy(pTempCur
15970 2c 20 70 43 75 72 2c 20 73 69 7a 65 6f 66 28 2a  , pCur, sizeof(*
15980 70 43 75 72 29 29 3b 0a 20 20 70 54 65 6d 70 43  pCur));.  pTempC
15990 75 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  ur->pNext = 0;. 
159a0 20 70 54 65 6d 70 43 75 72 2d 3e 70 50 72 65 76   pTempCur->pPrev
159b0 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 54 65 6d   = 0;.  if( pTem
159c0 70 43 75 72 2d 3e 70 50 61 67 65 20 29 7b 0a 20  pCur->pPage ){. 
159d0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
159e0 65 66 28 70 54 65 6d 70 43 75 72 2d 3e 70 50 61  ef(pTempCur->pPa
159f0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
15a00 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  }.}../*.** Delet
15a10 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75  e a temporary cu
15a20 72 73 6f 72 20 73 75 63 68 20 61 73 20 77 61 73  rsor such as was
15a30 20 6d 61 64 65 20 62 79 20 74 68 65 20 43 72 65   made by the Cre
15a40 61 74 65 54 65 6d 70 6f 72 61 72 79 43 75 72 73  ateTemporaryCurs
15a50 6f 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  or().** function
15a60 20 61 62 6f 76 65 2e 0a 2a 2f 0a 76 6f 69 64 20   above..*/.void 
15a70 73 71 6c 69 74 65 33 42 74 72 65 65 52 65 6c 65  sqlite3BtreeRele
15a80 61 73 65 54 65 6d 70 43 75 72 73 6f 72 28 42 74  aseTempCursor(Bt
15a90 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
15aa0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
15ab0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
15ac0 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70  );.  if( pCur->p
15ad0 50 61 67 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Page ){.    sqli
15ae0 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 43  te3PagerUnref(pC
15af0 75 72 2d 3e 70 50 61 67 65 2d 3e 70 44 62 50 61  ur->pPage->pDbPa
15b00 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ge);.  }.}../*.*
15b10 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
15b20 42 74 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20  BtCursor* given 
15b30 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
15b40 68 61 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42  has a valid.** B
15b50 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72  tCursor.info str
15b60 75 63 74 75 72 65 2e 20 20 49 66 20 69 74 20 69  ucture.  If it i
15b70 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61  s not already va
15b80 6c 69 64 2c 20 63 61 6c 6c 0a 2a 2a 20 73 71 6c  lid, call.** sql
15b90 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
15ba0 6c 6c 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20  ll() to fill it 
15bb0 69 6e 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73  in..**.** BtCurs
15bc0 6f 72 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63  or.info is a cac
15bd0 68 65 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d  he of the inform
15be0 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72  ation in the cur
15bf0 72 65 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73  rent cell..** Us
15c00 69 6e 67 20 74 68 69 73 20 63 61 63 68 65 20 72  ing this cache r
15c10 65 64 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65  educes the numbe
15c20 72 20 6f 66 20 63 61 6c 6c 73 20 74 6f 20 73 71  r of calls to sq
15c30 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
15c40 65 6c 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30  ell()..**.** 200
15c50 37 2d 30 36 2d 32 35 3a 20 20 54 68 65 72 65 20  7-06-25:  There 
15c60 69 73 20 61 20 62 75 67 20 69 6e 20 73 6f 6d 65  is a bug in some
15c70 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56   versions of MSV
15c80 43 20 74 68 61 74 20 63 61 75 73 65 20 74 68 65  C that cause the
15c90 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20  .** compiler to 
15ca0 63 72 61 73 68 20 77 68 65 6e 20 67 65 74 43 65  crash when getCe
15cb0 6c 6c 49 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c  llInfo() is impl
15cc0 65 6d 65 6e 74 65 64 20 61 73 20 61 20 6d 61 63  emented as a mac
15cd0 72 6f 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72 65  ro..** But there
15ce0 20 69 73 20 61 20 6d 65 61 73 75 72 65 61 62 6c   is a measureabl
15cf0 65 20 73 70 65 65 64 20 61 64 76 61 6e 74 61 67  e speed advantag
15d00 65 20 74 6f 20 75 73 69 6e 67 20 74 68 65 20 6d  e to using the m
15d10 61 63 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28  acro on gcc.** (
15d20 77 68 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c  when less compil
15d30 65 72 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  er optimizations
15d40 20 6c 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30   like -Os or -O0
15d50 20 61 72 65 20 75 73 65 64 20 61 6e 64 20 74 68   are used and th
15d60 65 0a 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73  e.** compiler is
15d70 20 6e 6f 74 20 64 6f 69 6e 67 20 61 67 72 65 73   not doing agres
15d80 73 69 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20  sive inlining.) 
15d90 20 53 6f 20 77 65 20 75 73 65 20 61 20 72 65 61   So we use a rea
15da0 6c 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f  l function.** fo
15db0 72 20 4d 53 56 43 20 61 6e 64 20 61 20 6d 61 63  r MSVC and a mac
15dc0 72 6f 20 66 6f 72 20 65 76 65 72 79 74 68 69 6e  ro for everythin
15dd0 67 20 65 6c 73 65 2e 20 20 54 69 63 6b 65 74 20  g else.  Ticket 
15de0 23 32 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65  #2457..*/.#ifnde
15df0 66 20 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69  f NDEBUG.  stati
15e00 63 20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c  c void assertCel
15e10 6c 49 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a  lInfo(BtCursor *
15e20 70 43 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49  pCur){.    CellI
15e30 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 6d 65  nfo info;.    me
15e40 6d 73 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73  mset(&info, 0, s
15e50 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20  izeof(info));.  
15e60 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
15e70 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50  rseCell(pCur->pP
15e80 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
15e90 26 69 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65  &info);.    asse
15ea0 72 74 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f  rt( memcmp(&info
15eb0 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73  , &pCur->info, s
15ec0 69 7a 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20  izeof(info))==0 
15ed0 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23  );.  }.#else.  #
15ee0 64 65 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c  define assertCel
15ef0 6c 49 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a  lInfo(x).#endif.
15f00 23 69 66 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a  #ifdef _MSC_VER.
15f10 20 20 2f 2a 20 55 73 65 20 61 20 72 65 61 6c 20    /* Use a real 
15f20 66 75 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43  function in MSVC
15f30 20 74 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   to work around 
15f40 62 75 67 73 20 69 6e 20 74 68 61 74 20 63 6f 6d  bugs in that com
15f50 70 69 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74  piler. */.  stat
15f60 69 63 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49  ic void getCellI
15f70 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nfo(BtCursor *pC
15f80 75 72 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75  ur){.    if( pCu
15f90 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30  r->info.nSize==0
15fa0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
15fb0 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
15fc0 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75  pCur->pPage, pCu
15fd0 72 2d 3e 69 64 78 2c 20 26 70 43 75 72 2d 3e 69  r->idx, &pCur->i
15fe0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 70 43 75 72  nfo);.      pCur
15ff0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b  ->validNKey = 1;
16000 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
16010 20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f    assertCellInfo
16020 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20  (pCur);.    }.  
16030 7d 0a 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f  }.#else /* if no
16040 74 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20  t _MSC_VER */.  
16050 2f 2a 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69  /* Use a macro i
16060 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70  n all other comp
16070 69 6c 65 72 73 20 73 6f 20 74 68 61 74 20 74 68  ilers so that th
16080 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  e function is in
16090 6c 69 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65  lined */.#define
160a0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
160b0 72 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r)              
160c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160e0 20 5c 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69   \.  if( pCur->i
160f0 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20  nfo.nSize==0 ){ 
16100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16120 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20             \.   
16130 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
16140 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61  seCell(pCur->pPa
16150 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 26  ge, pCur->idx, &
16160 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 20 20 20 20  pCur->info);    
16170 20 20 20 20 20 5c 0a 20 20 20 20 70 43 75 72 2d       \.    pCur-
16180 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 20  >validNKey = 1; 
16190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161a0 20 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 5c                 \
161c0 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20  .  }else{       
161d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16200 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 61           \.    a
16210 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43  ssertCellInfo(pC
16220 75 72 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  ur);            
16230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16250 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69 66 20     \.  }.#endif 
16260 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a  /* _MSC_VER */..
16270 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65  /*.** Set *pSize
16280 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20   to the size of 
16290 74 68 65 20 62 75 66 66 65 72 20 6e 65 65 64 65  the buffer neede
162a0 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61  d to hold the va
162b0 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65  lue of.** the ke
162c0 79 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e  y for the curren
162d0 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65  t entry.  If the
162e0 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70   cursor is not p
162f0 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20  ointing.** to a 
16300 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53  valid entry, *pS
16310 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e  ize is set to 0.
16320 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61   .**.** For a ta
16330 62 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e 54  ble with the INT
16340 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74 68  KEY flag set, th
16350 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
16360 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74  ns the key.** it
16370 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75  self, not the nu
16380 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
16390 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74   the key..*/.int
163a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
163b0 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70  Size(BtCursor *p
163c0 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29  Cur, i64 *pSize)
163d0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
163e0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
163f0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
16400 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
16410 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
16420 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
16430 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16440 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
16450 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
16460 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53  ALID || pCur->eS
16470 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
16480 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43  ID );.    if( pC
16490 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
164a0 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
164b0 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a      *pSize = 0;.
164c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
164d0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
164e0 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65  r);.      *pSize
164f0 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b   = pCur->info.nK
16500 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ey;.    }.  }.  
16510 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
16520 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74  .** Set *pSize t
16530 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
16540 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 69 6e  bytes of data in
16550 20 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a 2a   the entry the.*
16560 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e 74  * cursor current
16570 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41  ly points to.  A
16580 6c 77 61 79 73 20 72 65 74 75 72 6e 20 53 51 4c  lways return SQL
16590 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61 69 6c 75  ITE_OK..** Failu
165a0 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  re is not possib
165b0 6c 65 2e 20 20 49 66 20 74 68 65 20 63 75 72 73  le.  If the curs
165c0 6f 72 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  or is not curren
165d0 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20  tly.** pointing 
165e0 74 6f 20 61 6e 20 65 6e 74 72 79 20 28 77 68 69  to an entry (whi
165f0 63 68 20 63 61 6e 20 68 61 70 70 65 6e 2c 20 66  ch can happen, f
16600 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a  or example, if.*
16610 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
16620 73 20 65 6d 70 74 79 29 20 74 68 65 6e 20 2a 70  s empty) then *p
16630 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30  Size is set to 0
16640 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16650 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 42 74  BtreeDataSize(Bt
16660 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
16670 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74  2 *pSize){.  int
16680 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
16690 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
166a0 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
166b0 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
166c0 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
166d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
166e0 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
166f0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
16700 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c  URSOR_INVALID ||
16710 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
16720 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
16730 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74     if( pCur->eSt
16740 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41  ate==CURSOR_INVA
16750 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  LID ){.      /* 
16760 4e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  Not pointing at 
16770 61 20 76 61 6c 69 64 20 65 6e 74 72 79 20 2d 20  a valid entry - 
16780 73 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 30 2e  set *pSize to 0.
16790 20 2a 2f 0a 20 20 20 20 20 20 2a 70 53 69 7a 65   */.      *pSize
167a0 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
167b0 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e  .      getCellIn
167c0 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  fo(pCur);.      
167d0 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69  *pSize = pCur->i
167e0 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20 7d  nfo.nData;.    }
167f0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
16800 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
16810 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
16820 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   of an overflow 
16830 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
16840 62 61 73 65 20 28 70 61 72 61 6d 65 74 65 72 0a  base (parameter.
16850 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20 66  ** ovfl), this f
16860 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74 68  unction finds th
16870 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
16880 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
16890 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64  n the .** linked
168a0 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c 6f   list of overflo
168b0 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73 73  w pages. If poss
168c0 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74 68  ible, it uses th
168d0 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a  e auto-vacuum.**
168e0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61 74   pointer-map dat
168f0 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 61  a instead of rea
16900 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74  ding the content
16910 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74 6f   of page ovfl to
16920 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49   do so. .**.** I
16930 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
16940 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  s an SQLite erro
16950 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
16960 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a 2a  ed. Otherwise:.*
16970 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 70 50 67 6e  *.** Unless pPgn
16980 6f 4e 65 78 74 20 69 73 20 4e 55 4c 4c 2c 20 74  oNext is NULL, t
16990 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
169a0 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72 66  f the next overf
169b0 6c 6f 77 20 0a 2a 2a 20 70 61 67 65 20 69 6e 20  low .** page in 
169c0 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
169d0 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70  is written to *p
169e0 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61 67  PgnoNext. If pag
169f0 65 20 6f 76 66 6c 0a 2a 2a 20 69 73 20 74 68 65  e ovfl.** is the
16a00 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69 74   last page in it
16a10 73 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2c 20 2a  s linked list, *
16a20 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65 74  pPgnoNext is set
16a30 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a   to zero. .**.**
16a40 20 49 66 20 70 70 50 61 67 65 20 69 73 20 6e 6f   If ppPage is no
16a50 74 20 4e 55 4c 4c 2c 20 2a 70 70 50 61 67 65 20  t NULL, *ppPage 
16a60 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 4d 65  is set to the Me
16a70 6d 50 61 67 65 2a 20 68 61 6e 64 6c 65 0a 2a 2a  mPage* handle.**
16a80 20 66 6f 72 20 70 61 67 65 20 6f 76 66 6c 2e 20   for page ovfl. 
16a90 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 70  The underlying p
16aa0 61 67 65 72 20 70 61 67 65 20 6d 61 79 20 68 61  ager page may ha
16ab0 76 65 20 62 65 65 6e 20 72 65 71 75 65 73 74 65  ve been requeste
16ac0 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6e 6f  d.** with the no
16ad0 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 73 65 74  Content flag set
16ae0 2c 20 73 6f 20 74 68 65 20 70 61 67 65 20 64 61  , so the page da
16af0 74 61 20 61 63 63 65 73 73 61 62 6c 65 20 76 69  ta accessable vi
16b00 61 0a 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65  a.** this handle
16b10 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75 73   may not be trus
16b20 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
16b30 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61  nt getOverflowPa
16b40 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
16b50 70 42 74 2c 20 0a 20 20 50 67 6e 6f 20 6f 76 66  pBt, .  Pgno ovf
16b60 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
16b70 20 20 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f 77       /* Overflow
16b80 20 70 61 67 65 20 2a 2f 0a 20 20 4d 65 6d 50 61   page */.  MemPa
16b90 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
16ba0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
16bb0 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20 2a  MemPage handle *
16bc0 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e  /.  Pgno *pPgnoN
16bd0 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ext             
16be0 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f 76   /* OUT: Next ov
16bf0 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d 62  erflow page numb
16c00 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20  er */.){.  Pgno 
16c10 6e 65 78 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  next = 0;.  int 
16c20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
16c30 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
16c40 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
16c50 0a 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65  .  /* One of the
16c60 73 65 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 4e  se must not be N
16c70 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ULL. Otherwise, 
16c80 77 68 79 20 63 61 6c 6c 20 74 68 69 73 20 66 75  why call this fu
16c90 6e 63 74 69 6f 6e 3f 20 2a 2f 0a 20 20 61 73 73  nction? */.  ass
16ca0 65 72 74 28 70 70 50 61 67 65 20 7c 7c 20 70 50  ert(ppPage || pP
16cb0 67 6e 6f 4e 65 78 74 29 3b 0a 0a 20 20 2f 2a 20  gnoNext);..  /* 
16cc0 49 66 20 70 50 67 6e 6f 4e 65 78 74 20 69 73 20  If pPgnoNext is 
16cd0 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73 20  NULL, then this 
16ce0 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e  function is bein
16cf0 67 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61  g called to obta
16d00 69 6e 0a 20 20 2a 2a 20 61 20 4d 65 6d 50 61 67  in.  ** a MemPag
16d10 65 2a 20 72 65 66 65 72 65 6e 63 65 20 6f 6e 6c  e* reference onl
16d20 79 2e 20 4e 6f 20 70 61 67 65 2d 64 61 74 61 20  y. No page-data 
16d30 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20 74  is required in t
16d40 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20  his case..  */. 
16d50 20 69 66 28 20 21 70 50 67 6e 6f 4e 65 78 74 20   if( !pPgnoNext 
16d60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
16d70 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
16d80 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 70 70 50  e(pBt, ovfl, ppP
16d90 61 67 65 2c 20 31 29 3b 0a 20 20 7d 0a 0a 23 69  age, 1);.  }..#i
16da0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16db0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f  T_AUTOVACUUM.  /
16dc0 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68  * Try to find th
16dd0 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74  e next page in t
16de0 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  he overflow list
16df0 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20   using the.  ** 
16e00 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74  autovacuum point
16e10 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75  er-map pages. Gu
16e20 65 73 73 20 74 68 61 74 20 74 68 65 20 6e 65 78  ess that the nex
16e30 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20  t page in .  ** 
16e40 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  the overflow lis
16e50 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72  t is page number
16e60 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68   (ovfl+1). If th
16e70 61 74 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a  at guess turns .
16e80 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77    ** out to be w
16e90 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20  rong, fall back 
16ea0 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64  to loading the d
16eb0 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a  ata of page .  *
16ec0 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f  * number ovfl to
16ed0 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e   determine the n
16ee0 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  ext page number.
16ef0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
16f00 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
16f10 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20     Pgno pgno;.  
16f20 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20    Pgno iGuess = 
16f30 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65  ovfl+1;.    u8 e
16f40 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65  Type;..    while
16f50 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
16f60 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20  pBt, iGuess) || 
16f70 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f  iGuess==PENDING_
16f80 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
16f90 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b  {.      iGuess++
16fa0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
16fb0 20 69 47 75 65 73 73 3c 3d 70 61 67 65 72 50 61   iGuess<=pagerPa
16fc0 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
16fd0 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72 63  ger) ){.      rc
16fe0 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
16ff0 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79 70 65  , iGuess, &eType
17000 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  , &pgno);.      
17010 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
17020 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
17030 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
17040 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
17050 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
17060 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20  2 && pgno==ovfl 
17070 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20  ){.        next 
17080 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20  = iGuess;.      
17090 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
170a0 69 66 0a 0a 20 20 69 66 28 20 6e 65 78 74 3d 3d  if..  if( next==
170b0 30 20 7c 7c 20 70 70 50 61 67 65 20 29 7b 0a 20  0 || ppPage ){. 
170c0 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
170d0 65 20 3d 20 30 3b 0a 0a 20 20 20 20 72 63 20 3d  e = 0;..    rc =
170e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
170f0 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20  Page(pBt, ovfl, 
17100 26 70 50 61 67 65 2c 20 6e 65 78 74 21 3d 30 29  &pPage, next!=0)
17110 3b 0a 20 20 20 20 61 73 73 65 72 74 28 72 63 3d  ;.    assert(rc=
17120 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50  =SQLITE_OK || pP
17130 61 67 65 3d 3d 30 29 3b 0a 20 20 20 20 69 66 28  age==0);.    if(
17140 20 6e 65 78 74 3d 3d 30 20 26 26 20 72 63 3d 3d   next==0 && rc==
17150 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17160 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62 79     next = get4by
17170 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
17180 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
17190 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20   ppPage ){.     
171a0 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65   *ppPage = pPage
171b0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
171c0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
171d0 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
171e0 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d 20  .  *pPgnoNext = 
171f0 6e 65 78 74 3b 0a 0a 20 20 72 65 74 75 72 6e 20  next;..  return 
17200 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70  rc;.}../*.** Cop
17210 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62 75  y data from a bu
17220 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c 20  ffer to a page, 
17230 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20 74  or from a page t
17240 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  o a buffer..**.*
17250 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61 20  * pPayload is a 
17260 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61 20  pointer to data 
17270 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62 61  stored on databa
17280 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65 2e  se page pDbPage.
17290 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 20  .** If argument 
172a0 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74 68  eOp is false, th
172b0 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20 6f  en nByte bytes o
172c0 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69 65  f data are copie
172d0 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f  d.** from pPaylo
172e0 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65 72  ad to the buffer
172f0 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20 70   pointed at by p
17300 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20 74  Buf. If eOp is t
17310 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c  rue,.** then sql
17320 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
17330 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44   is called on pD
17340 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65 20  bPage and nByte 
17350 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
17360 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f 6d   are copied from
17370 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66   the buffer pBuf
17380 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a   to pPayload..**
17390 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
173a0 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63   returned on suc
173b0 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65 20  cess, otherwise 
173c0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a  an error code..*
173d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 70  /.static int cop
173e0 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64  yPayload(.  void
173f0 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20 20   *pPayload,     
17400 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
17410 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a 2f   to page data */
17420 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20 20  .  void *pBuf,  
17430 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17440 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66 65  Pointer to buffe
17450 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65  r */.  int nByte
17460 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
17470 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
17480 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20  tes to copy */. 
17490 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20 20   int eOp,       
174a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30 20             /* 0 
174b0 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61 67  -> copy from pag
174c0 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20  e, 1 -> copy to 
174d0 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67 65  page */.  DbPage
174e0 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20 20   *pDbPage       
174f0 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74      /* Page cont
17500 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64 20  aining pPayload 
17510 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70 20  */.){.  if( eOp 
17520 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64  ){.    /* Copy d
17530 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72 20  ata from buffer 
17540 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74 65  to page (a write
17550 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
17560 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69     int rc = sqli
17570 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
17580 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
17590 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
175a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
175b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63  ;.    }.    memc
175c0 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42 75  py(pPayload, pBu
175d0 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c  f, nByte);.  }el
175e0 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  se{.    /* Copy 
175f0 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20 74  data from page t
17600 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61 64  o buffer (a read
17610 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20   operation) */. 
17620 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c 20     memcpy(pBuf, 
17630 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29  pPayload, nByte)
17640 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
17650 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
17660 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
17670 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61 64   is used to read
17680 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70 61   or overwrite pa
17690 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f  yload informatio
176a0 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e 74  n.** for the ent
176b0 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75 72  ry that the pCur
176c0 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
176d0 69 6e 67 20 74 6f 2e 20 49 66 20 74 68 65 20 65  ing to. If the e
176e0 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  Op.** parameter 
176f0 69 73 20 30 2c 20 74 68 69 73 20 69 73 20 61 20  is 0, this is a 
17700 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 20 28  read operation (
17710 64 61 74 61 20 63 6f 70 69 65 64 20 69 6e 74 6f  data copied into
17720 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29  .** buffer pBuf)
17730 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a  . If it is non-z
17740 65 72 6f 2c 20 61 20 77 72 69 74 65 20 28 64 61  ero, a write (da
17750 74 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a 2a  ta copied from.*
17760 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e 0a  * buffer pBuf)..
17770 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66  **.** A total of
17780 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72 65   "amt" bytes are
17790 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e   read or written
177a0 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f   beginning at "o
177b0 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20  ffset"..** Data 
177c0 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66 72  is read to or fr
177d0 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42  om the buffer pB
177e0 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  uf..**.** This r
177f0 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20  outine does not 
17800 6d 61 6b 65 20 61 20 64 69 73 74 69 6e 63 74 69  make a distincti
17810 6f 6e 20 62 65 74 77 65 65 6e 20 6b 65 79 20 61  on between key a
17820 6e 64 20 64 61 74 61 2e 0a 2a 2a 20 49 74 20 6a  nd data..** It j
17830 75 73 74 20 72 65 61 64 73 20 6f 72 20 77 72 69  ust reads or wri
17840 74 65 73 20 62 79 74 65 73 20 66 72 6f 6d 20 74  tes bytes from t
17850 68 65 20 70 61 79 6c 6f 61 64 20 61 72 65 61 2e  he payload area.
17860 20 20 44 61 74 61 20 6d 69 67 68 74 20 0a 2a 2a    Data might .**
17870 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20 6d   appear on the m
17880 61 69 6e 20 70 61 67 65 20 6f 72 20 62 65 20 73  ain page or be s
17890 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e 20  cattered out on 
178a0 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f  multiple overflo
178b0 77 20 0a 2a 2a 20 70 61 67 65 73 2e 0a 2a 2a 0a  w .** pages..**.
178c0 2a 2a 20 49 66 20 74 68 65 20 42 74 43 75 72 73  ** If the BtCurs
178d0 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  or.isIncrblobHan
178e0 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 2c  dle flag is set,
178f0 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74   and the current
17900 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74 72 79  .** cursor entry
17910 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72   uses one or mor
17920 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  e overflow pages
17930 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  , this function.
17940 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73 70 61  ** allocates spa
17950 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c  ce for and lazil
17960 79 20 70 6f 70 6c 75 61 74 65 73 20 74 68 65 20  y popluates the 
17970 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
17980 73 74 20 0a 2a 2a 20 63 61 63 68 65 20 61 72 72  st .** cache arr
17990 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f 76  ay (BtCursor.aOv
179a0 65 72 66 6c 6f 77 29 2e 20 53 75 62 73 65 71 75  erflow). Subsequ
179b0 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74 68  ent calls use th
179c0 69 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20 6d  is.** cache to m
179d0 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20 74  ake seeking to t
179e0 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66 73  he supplied offs
179f0 65 74 20 6d 6f 72 65 20 65 66 66 69 63 69 65 6e  et more efficien
17a00 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e  t..**.** Once an
17a10 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
17a20 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65  ist cache has be
17a30 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74  en allocated, it
17a40 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c   may be.** inval
17a50 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20 6f  idated if some o
17a60 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69 74  ther cursor writ
17a70 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20 74  es to the same t
17a80 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74  able, or if.** t
17a90 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f 76  he cursor is mov
17aa0 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65 6e  ed to a differen
17ab0 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61  t row. Additiona
17ac0 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63  lly, in auto-vac
17ad0 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65  uum.** mode, the
17ae0 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74   following event
17af0 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74 65  s may invalidate
17b00 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
17b10 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a  e-list cache..**
17b20 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72 65  .**   * An incre
17b30 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a  mental vacuum,.*
17b40 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69  *   * A commit i
17b50 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66  n auto_vacuum="f
17b60 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20  ull" mode,.**   
17b70 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61 62  * Creating a tab
17b80 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65 20  le (may require 
17b90 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c  moving an overfl
17ba0 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61  ow page)..*/.sta
17bb0 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50 61  tic int accessPa
17bc0 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
17bd0 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
17be0 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
17bf0 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
17c00 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  d from */.  int 
17c10 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20 20  offset,         
17c20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69 6e   /* Begin readin
17c30 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f 20  g this far into 
17c40 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 69 6e 74  payload */.  int
17c50 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20   amt,           
17c60 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20 6d    /* Read this m
17c70 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20 75  any bytes */.  u
17c80 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 42  nsigned char *pB
17c90 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68 65  uf, /* Write the
17ca0 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69 73   bytes into this
17cb0 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e   buffer */ .  in
17cc0 74 20 73 6b 69 70 4b 65 79 2c 20 20 20 20 20 20  t skipKey,      
17cd0 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 62 65 67     /* offset beg
17ce0 69 6e 73 20 61 74 20 64 61 74 61 20 69 66 20 74  ins at data if t
17cf0 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 20  his is true */. 
17d00 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20 20   int eOp        
17d10 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f        /* zero to
17d20 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20   read. non-zero 
17d30 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a  to write. */.){.
17d40 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
17d50 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74  *aPayload;.  int
17d60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
17d70 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69  .  u32 nKey;.  i
17d80 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d  nt iIdx = 0;.  M
17d90 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
17da0 70 43 75 72 2d 3e 70 50 61 67 65 3b 20 20 20 20  pCur->pPage;    
17db0 20 2f 2a 20 42 74 72 65 65 20 70 61 67 65 20 6f   /* Btree page o
17dc0 66 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72  f current cursor
17dd0 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68   entry */.  BtSh
17de0 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
17df0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
17e00 42 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f  Btree this curso
17e10 72 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a  r belongs to */.
17e20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
17e30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
17e40 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
17e50 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
17e60 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e  sert( pCur->idx>
17e70 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c  =0 && pCur->idx<
17e80 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  pPage->nCell );.
17e90 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
17ea0 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
17eb0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
17ec0 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 67 65  x(pCur) );..  ge
17ed0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
17ee0 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43  .  aPayload = pC
17ef0 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b  ur->info.pCell +
17f00 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61   pCur->info.nHea
17f10 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20 28 70  der;.  nKey = (p
17f20 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f 20 30  Page->intKey ? 0
17f30 20 3a 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b   : pCur->info.nK
17f40 65 79 29 3b 0a 0a 20 20 69 66 28 20 73 6b 69 70  ey);..  if( skip
17f50 4b 65 79 20 29 7b 0a 20 20 20 20 6f 66 66 73 65  Key ){.    offse
17f60 74 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20  t += nKey;.  }. 
17f70 20 69 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20   if( offset+amt 
17f80 3e 20 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66  > nKey+pCur->inf
17f90 6f 2e 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 2f  o.nData ){.    /
17fa0 2a 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64  * Trying to read
17fb0 20 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74   or write past t
17fc0 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61  he end of the da
17fd0 74 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a  ta is an error *
17fe0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  /.    return SQL
17ff0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
18000 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 64 61    /* Check if da
18010 74 61 20 6d 75 73 74 20 62 65 20 72 65 61 64 2f  ta must be read/
18020 77 72 69 74 74 65 6e 20 74 6f 2f 66 72 6f 6d 20  written to/from 
18030 74 68 65 20 62 74 72 65 65 20 70 61 67 65 20 69  the btree page i
18040 74 73 65 6c 66 2e 20 2a 2f 0a 20 20 69 66 28 20  tself. */.  if( 
18050 6f 66 66 73 65 74 3c 70 43 75 72 2d 3e 69 6e 66  offset<pCur->inf
18060 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
18070 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
18080 20 69 66 28 20 61 2b 6f 66 66 73 65 74 3e 70 43   if( a+offset>pC
18090 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  ur->info.nLocal 
180a0 29 7b 0a 20 20 20 20 20 20 61 20 3d 20 70 43 75  ){.      a = pCu
180b0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d  r->info.nLocal -
180c0 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 7d 0a 20   offset;.    }. 
180d0 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79 6c     rc = copyPayl
180e0 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66  oad(&aPayload[of
180f0 66 73 65 74 5d 2c 20 70 42 75 66 2c 20 61 2c 20  fset], pBuf, a, 
18100 65 4f 70 2c 20 70 50 61 67 65 2d 3e 70 44 62 50  eOp, pPage->pDbP
18110 61 67 65 29 3b 0a 20 20 20 20 6f 66 66 73 65 74  age);.    offset
18120 20 3d 20 30 3b 0a 20 20 20 20 70 42 75 66 20 2b   = 0;.    pBuf +
18130 3d 20 61 3b 0a 20 20 20 20 61 6d 74 20 2d 3d 20  = a;.    amt -= 
18140 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  a;.  }else{.    
18150 6f 66 66 73 65 74 20 2d 3d 20 70 43 75 72 2d 3e  offset -= pCur->
18160 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  info.nLocal;.  }
18170 0a 0a 20 20 70 42 74 20 3d 20 70 43 75 72 2d 3e  ..  pBt = pCur->
18180 70 42 74 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  pBt;.  if( rc==S
18190 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
181a0 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69  0 ){.    const i
181b0 6e 74 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70 42  nt ovflSize = pB
181c0 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
181d0 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f 6e  4;  /* Bytes con
181e0 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70 61  tent per ovfl pa
181f0 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 6e  ge */.    Pgno n
18200 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e 65  extPage;..    ne
18210 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74  xtPage = get4byt
18220 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75 72  e(&aPayload[pCur
18230 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b  ->info.nLocal]);
18240 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
18250 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
18260 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 73 49     /* If the isI
18270 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c  ncrblobHandle fl
18280 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74 68  ag is set and th
18290 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72  e BtCursor.aOver
182a0 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20 68 61  flow[].    ** ha
182b0 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f 63  s not been alloc
182c0 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20 69  ated, allocate i
182d0 74 20 6e 6f 77 2e 20 54 68 65 20 61 72 72 61 79  t now. The array
182e0 20 69 73 20 73 69 7a 65 64 20 61 74 0a 20 20 20   is sized at.   
182f0 20 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20 66 6f   ** one entry fo
18300 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77 20  r each overflow 
18310 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
18320 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 0a  flow chain. The.
18330 20 20 20 20 2a 2a 20 70 61 67 65 20 6e 75 6d 62      ** page numb
18340 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  er of the first 
18350 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73  overflow page is
18360 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65 72   stored in aOver
18370 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20  flow[0],.    ** 
18380 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66 20  etc. A value of 
18390 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66 6c  0 in the aOverfl
183a0 6f 77 5b 5d 20 61 72 72 61 79 20 6d 65 61 6e 73  ow[] array means
183b0 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 22   "not yet known"
183c0 0a 20 20 20 20 2a 2a 20 28 74 68 65 20 63 61 63  .    ** (the cac
183d0 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f 70  he is lazily pop
183e0 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f 0a  ulated)..    */.
183f0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 73      if( pCur->is
18400 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26  IncrblobHandle &
18410 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  & !pCur->aOverfl
18420 6f 77 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ow ){.      int 
18430 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e 69  nOvfl = (pCur->i
18440 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43 75  nfo.nPayload-pCu
18450 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f  r->info.nLocal+o
18460 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c 53  vflSize-1)/ovflS
18470 69 7a 65 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  ize;.      pCur-
18480 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28 50 67  >aOverflow = (Pg
18490 6e 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c  no *)sqlite3Mall
184a0 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50 67  ocZero(sizeof(Pg
184b0 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20 20  no)*nOvfl);.    
184c0 20 20 69 66 28 20 6e 4f 76 66 6c 20 26 26 20 21    if( nOvfl && !
184d0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
184e0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
184f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
18500 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
18510 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72 66   /* If the overf
18520 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61  low page-list ca
18530 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  che has been all
18540 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a 20  ocated and the. 
18550 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72 20     ** entry for 
18560 74 68 65 20 66 69 72 73 74 20 72 65 71 75 69 72  the first requir
18570 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ed overflow page
18580 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70 0a   is valid, skip.
18590 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20      ** directly 
185a0 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  to it..    */.  
185b0 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
185c0 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61  rflow && pCur->a
185d0 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74 2f  Overflow[offset/
185e0 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20 20  ovflSize] ){.   
185f0 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73 65     iIdx = (offse
18600 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20  t/ovflSize);.   
18610 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70 43     nextPage = pC
18620 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
18630 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73 65  dx];.      offse
18640 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66 6c  t = (offset%ovfl
18650 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  Size);.    }.#en
18660 64 69 66 0a 0a 20 20 20 20 66 6f 72 28 20 3b 20  dif..    for( ; 
18670 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
18680 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50 61   amt>0 && nextPa
18690 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 23 69  ge; iIdx++){..#i
186a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
186b0 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20  T_INCRBLOB.     
186c0 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64 2c   /* If required,
186d0 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f 76   populate the ov
186e0 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
186f0 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 20   cache. */.     
18700 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72   if( pCur->aOver
18710 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
18720 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f  assert(!pCur->aO
18730 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c  verflow[iIdx] ||
18740 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
18750 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67 65  [iIdx]==nextPage
18760 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  );.        pCur-
18770 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
18780 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20 20   = nextPage;.   
18790 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
187a0 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d 6f     if( offset>=o
187b0 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  vflSize ){.     
187c0 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 72     /* The only r
187d0 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74 68  eason to read th
187e0 69 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f 62  is page is to ob
187f0 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20 20  tain the page.  
18800 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
18810 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61 67  for the next pag
18820 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f  e in the overflo
18830 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61 67  w chain. The pag
18840 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  e.        ** dat
18850 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72 65  a is not require
18860 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79 20  d. So first try 
18870 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f 76  to lookup the ov
18880 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20 2a  erflow.        *
18890 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  * page-list cach
188a0 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e 20  e, if any, then 
188b0 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68 65  fall back to the
188c0 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
188d0 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75  ().        ** fu
188e0 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20  nction..        
188f0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
18900 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
18910 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75 72          if( pCur
18920 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70  ->aOverflow && p
18930 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
18940 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20 20  Idx+1] ){.      
18950 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70      nextPage = p
18960 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
18970 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20  Idx+1];.        
18980 7d 20 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a 20  } else .#endif. 
18990 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67 65           rc = ge
189a0 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
189b0 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c 20  t, nextPage, 0, 
189c0 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20  &nextPage);.    
189d0 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f 76      offset -= ov
189e0 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 65  flSize;.      }e
189f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
18a00 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 69  Need to read thi
18a10 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79 2e  s page properly.
18a20 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d   It contains som
18a30 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20  e of the.       
18a40 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61 74   ** range of dat
18a50 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67 20  a that is being 
18a60 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f 72  read (eOp==0) or
18a70 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d 30   written (eOp!=0
18a80 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  )..        */.  
18a90 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70 44        DbPage *pD
18aa0 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 69  bPage;.        i
18ab0 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20  nt a = amt;.    
18ac0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18ad0 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
18ae0 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c 20  ager, nextPage, 
18af0 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  &pDbPage);.     
18b00 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18b10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
18b20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71 6c    aPayload = sql
18b30 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
18b40 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  (pDbPage);.     
18b50 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
18b60 67 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f 61  get4byte(aPayloa
18b70 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  d);.          if
18b80 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20 6f  ( a + offset > o
18b90 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  vflSize ){.     
18ba0 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c 53         a = ovflS
18bb0 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  ize - offset;.  
18bc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18bd0 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61 79      rc = copyPay
18be0 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b 6f  load(&aPayload[o
18bf0 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c 20  ffset+4], pBuf, 
18c00 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65 29  a, eOp, pDbPage)
18c10 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
18c20 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
18c30 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
18c40 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20    offset = 0;.  
18c50 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20 61          amt -= a
18c60 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 75 66  ;.          pBuf
18c70 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 7d   += a;.        }
18c80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18c90 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
18ca0 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30  LITE_OK && amt>0
18cb0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
18cc0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
18cd0 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
18ce0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
18cf0 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6b  ad part of the k
18d00 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ey associated wi
18d10 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20  th cursor pCur. 
18d20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74   Exactly.** "amt
18d30 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20  " bytes will be 
18d40 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20  transfered into 
18d50 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61  pBuf[].  The tra
18d60 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20  nsfer.** begins 
18d70 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a  at "offset"..**.
18d80 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
18d90 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f  _OK on success o
18da0 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  r an error code 
18db0 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
18dc0 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65  .** wrong.  An e
18dd0 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
18de0 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22   if "offset+amt"
18df0 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a   is larger than.
18e00 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65  ** the available
18e10 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74   payload..*/.int
18e20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79   sqlite3BtreeKey
18e30 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
18e40 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32   u32 offset, u32
18e50 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66   amt, void *pBuf
18e60 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
18e70 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
18e80 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
18e90 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
18ea0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
18eb0 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
18ec0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18ed0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
18ee0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
18ef0 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72  LID );.    asser
18f00 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 21 3d  t( pCur->pPage!=
18f10 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75  0 );.    if( pCu
18f20 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  r->pPage->intKey
18f30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
18f40 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
18f50 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
18f60 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
18f70 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29  age->intKey==0 )
18f80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
18f90 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43  ur->idx>=0 && pC
18fa0 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50  ur->idx<pCur->pP
18fb0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
18fc0 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79    rc = accessPay
18fd0 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65  load(pCur, offse
18fe0 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65  t, amt, (unsigne
18ff0 64 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30 2c  d char*)pBuf, 0,
19000 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
19010 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
19020 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
19030 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20  data associated 
19040 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72  with cursor pCur
19050 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61  .  Exactly.** "a
19060 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62  mt" bytes will b
19070 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74  e transfered int
19080 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74  o pBuf[].  The t
19090 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e  ransfer.** begin
190a0 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a  s at "offset"..*
190b0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49  *.** Return SQLI
190c0 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73  TE_OK on success
190d0 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
190e0 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  e if anything go
190f0 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e  es.** wrong.  An
19100 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
19110 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d  ed if "offset+am
19120 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61  t" is larger tha
19130 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62  n.** the availab
19140 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69  le payload..*/.i
19150 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
19160 61 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ata(BtCursor *pC
19170 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
19180 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
19190 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Buf){.  int rc;.
191a0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
191b0 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
191c0 69 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74  if ( pCur->eStat
191d0 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
191e0 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
191f0 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20  SQLITE_ABORT;.  
19200 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  }.#endif..  asse
19210 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
19220 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
19230 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
19240 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
19250 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
19260 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
19270 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
19280 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
19290 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
192a0 43 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b  Cur->pPage!=0 );
192b0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
192c0 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75  r->idx>=0 && pCu
192d0 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50 61  r->idx<pCur->pPa
192e0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
192f0 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c   rc = accessPayl
19300 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
19310 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 31 2c 20  , amt, pBuf, 1, 
19320 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
19330 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
19340 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
19350 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  o payload inform
19360 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 65  ation from the e
19370 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 0a 2a  ntry that the .*
19380 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20 69 73  * pCur cursor is
19390 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54   pointing to.  T
193a0 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 74 6f  he pointer is to
193b0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
193c0 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69 66 20  f.** the key if 
193d0 73 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64 20 69  skipKey==0 and i
193e0 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  t points to the 
193f0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74  beginning of dat
19400 61 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65 79 3d  a if.** skipKey=
19410 3d 31 2e 20 20 54 68 65 20 6e 75 6d 62 65 72 20  =1.  The number 
19420 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76 61 69  of bytes of avai
19430 6c 61 62 6c 65 20 6b 65 79 2f 64 61 74 61 20 69  lable key/data i
19440 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74  s written.** int
19450 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a 70 41  o *pAmt.  If *pA
19460 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20  mt==0, then the 
19470 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 77  value returned w
19480 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 20  ill not be.** a 
19490 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e 0a 2a  valid pointer..*
194a0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
194b0 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  e is an optimiza
194c0 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63 6f 6d  tion.  It is com
194d0 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e 74 69  mon for the enti
194e0 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20 64 61  re key.** and da
194f0 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65  ta to fit on the
19500 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e 64 20   local page and 
19510 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20  for there to be 
19520 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70  no overflow.** p
19530 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68 61 74  ages.  When that
19540 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72 6f 75   is so, this rou
19550 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73 65 64  tine can be used
19560 20 74 6f 20 61 63 63 65 73 73 20 74 68 65 0a 2a   to access the.*
19570 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61 20 77  * key and data w
19580 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20 61 20  ithout making a 
19590 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20 6b 65  copy.  If the ke
195a0 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20 73 70  y and/or data sp
195b0 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f 76 65  ills.** onto ove
195c0 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 65  rflow pages, the
195d0 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  n accessPayload(
195e0 29 20 6d 75 73 74 20 62 65 20 75 73 65 64 20 74  ) must be used t
195f0 6f 20 72 65 61 73 73 65 6d 62 6c 79 0a 2a 2a 20  o reassembly.** 
19600 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61 6e 64  the key/data and
19610 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20 61 20   copy it into a 
19620 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62 75 66  preallocated buf
19630 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  fer..**.** The p
19640 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20  ointer returned 
19650 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  by this routine 
19660 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79 20 69  looks directly i
19670 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64 0a 2a  nto the cached.*
19680 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  * page of the da
19690 74 61 62 61 73 65 2e 20 20 54 68 65 20 64 61 74  tabase.  The dat
196a0 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f  a might change o
196b0 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78 74 20  r move the next 
196c0 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74 72 65  time.** any btre
196d0 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  e routine is cal
196e0 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  led..*/.static c
196f0 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
19700 61 72 20 2a 66 65 74 63 68 50 61 79 6c 6f 61 64  ar *fetchPayload
19710 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
19720 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
19730 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  or pointing to e
19740 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f  ntry to read fro
19750 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 6d 74  m */.  int *pAmt
19760 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  ,           /* W
19770 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
19780 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74  of available byt
19790 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  es here */.  int
197a0 20 73 6b 69 70 4b 65 79 20 20 20 20 20 20 20 20   skipKey        
197b0 20 20 2f 2a 20 72 65 61 64 20 62 65 67 69 6e 6e    /* read beginn
197c0 69 6e 67 20 61 74 20 64 61 74 61 20 69 66 20 74  ing at data if t
197d0 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a 29  his is true */.)
197e0 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
197f0 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 4d  r *aPayload;.  M
19800 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
19810 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74   u32 nKey;.  int
19820 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73 73 65   nLocal;..  asse
19830 72 74 28 20 70 43 75 72 21 3d 30 20 26 26 20 70  rt( pCur!=0 && p
19840 43 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b  Cur->pPage!=0 );
19850 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
19860 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
19870 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
19880 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
19890 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 70  tex(pCur) );.  p
198a0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
198b0 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  ge;.  assert( pC
198c0 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43  ur->idx>=0 && pC
198d0 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e  ur->idx<pPage->n
198e0 43 65 6c 6c 20 29 3b 0a 20 20 67 65 74 43 65 6c  Cell );.  getCel
198f0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61  lInfo(pCur);.  a
19900 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e  Payload = pCur->
19910 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50  info.pCell;.  aP
19920 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e  ayload += pCur->
19930 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20  info.nHeader;.  
19940 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
19950 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20  y ){.    nKey = 
19960 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
19970 6e 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66  nKey = pCur->inf
19980 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66  o.nKey;.  }.  if
19990 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20  ( skipKey ){.   
199a0 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65   aPayload += nKe
199b0 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20  y;.    nLocal = 
199c0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
199d0 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73  l - nKey;.  }els
199e0 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20  e{.    nLocal = 
199f0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
19a00 6c 3b 0a 20 20 20 20 69 66 28 20 6e 4c 6f 63 61  l;.    if( nLoca
19a10 6c 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  l>nKey ){.      
19a20 6e 4c 6f 63 61 6c 20 3d 20 6e 4b 65 79 3b 0a 20  nLocal = nKey;. 
19a30 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 41 6d 74     }.  }.  *pAmt
19a40 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74   = nLocal;.  ret
19a50 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a  urn aPayload;.}.
19a60 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ../*.** For the 
19a70 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f  entry that curso
19a80 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20  r pCur is point 
19a90 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a  to, return as.**
19aa0 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74   many bytes of t
19ab0 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61  he key or data a
19ac0 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  s are available 
19ad0 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20  on the local.** 
19ae0 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57 72  b-tree page.  Wr
19af0 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
19b00 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
19b10 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a  s into *pAmt..**
19b20 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20  .** The pointer 
19b30 72 65 74 75 72 6e 65 64 20 69 73 20 65 70 68 65  returned is ephe
19b40 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f  meral.  The key/
19b50 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a  data may move.**
19b60 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65 64   or be destroyed
19b70 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c   on the next cal
19b80 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72  l to any Btree r
19b90 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75  outine,.** inclu
19ba0 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20  ding calls from 
19bb0 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61 67  other threads ag
19bc0 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63  ainst the same c
19bd0 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20  ache..** Hence, 
19be0 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42  a mutex on the B
19bf0 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62  tShared should b
19c00 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20  e held prior to 
19c10 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20  calling.** this 
19c20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
19c30 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73  hese routines is
19c40 20 75 73 65 64 20 74 6f 20 67 65 74 20 71 75 69   used to get qui
19c50 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79  ck access to key
19c60 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20   and data.** in 
19c70 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
19c80 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f  where no overflo
19c90 77 20 70 61 67 65 73 20 61 72 65 20 75 73 65 64  w pages are used
19ca0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20  ..*/.const void 
19cb0 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79  *sqlite3BtreeKey
19cc0 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a  Fetch(BtCursor *
19cd0 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29  pCur, int *pAmt)
19ce0 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
19cf0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
19d00 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  r) );.  if( pCur
19d10 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
19d20 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65  _VALID ){.    re
19d30 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64  turn (const void
19d40 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70  *)fetchPayload(p
19d50 43 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20  Cur, pAmt, 0);. 
19d60 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
19d70 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
19d80 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74  ite3BtreeDataFet
19d90 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ch(BtCursor *pCu
19da0 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20  r, int *pAmt){. 
19db0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
19dc0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
19dd0 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
19de0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
19df0 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LID ){.    retur
19e00 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66  n (const void*)f
19e10 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
19e20 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a  , pAmt, 1);.  }.
19e30 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a    return 0;.}...
19e40 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
19e50 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20  ursor down to a 
19e60 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20  new child page. 
19e70 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67   The newPgno arg
19e80 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20  ument is the.** 
19e90 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
19ea0 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f  he child page to
19eb0 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f 0a 73 74 61   move to..*/.sta
19ec0 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68  tic int moveToCh
19ed0 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ild(BtCursor *pC
19ee0 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29  ur, u32 newPgno)
19ef0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
19f00 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67 65 3b  mPage *pNewPage;
19f10 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64  .  MemPage *pOld
19f20 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64  Page;.  BtShared
19f30 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
19f40 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  t;..  assert( cu
19f50 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
19f60 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
19f70 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
19f80 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
19f90 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
19fa0 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67  tPage(pBt, newPg
19fb0 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65 2c 20 70  no, &pNewPage, p
19fc0 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 69  Cur->pPage);.  i
19fd0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
19fe0 63 3b 0a 20 20 70 4e 65 77 50 61 67 65 2d 3e 69  c;.  pNewPage->i
19ff0 64 78 50 61 72 65 6e 74 20 3d 20 70 43 75 72 2d  dxParent = pCur-
1a000 3e 69 64 78 3b 0a 20 20 70 4f 6c 64 50 61 67 65  >idx;.  pOldPage
1a010 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
1a020 20 20 70 4f 6c 64 50 61 67 65 2d 3e 69 64 78 53    pOldPage->idxS
1a030 68 69 66 74 20 3d 20 30 3b 0a 20 20 72 65 6c 65  hift = 0;.  rele
1a040 61 73 65 50 61 67 65 28 70 4f 6c 64 50 61 67 65  asePage(pOldPage
1a050 29 3b 0a 20 20 70 43 75 72 2d 3e 70 50 61 67 65  );.  pCur->pPage
1a060 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20 20 70   = pNewPage;.  p
1a070 43 75 72 2d 3e 69 64 78 20 3d 20 30 3b 0a 20 20  Cur->idx = 0;.  
1a080 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1a090 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61   = 0;.  pCur->va
1a0a0 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69  lidNKey = 0;.  i
1a0b0 66 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43 65  f( pNewPage->nCe
1a0c0 6c 6c 3c 31 20 29 7b 0a 20 20 20 20 72 65 74 75  ll<1 ){.    retu
1a0d0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1a0e0 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  T_BKPT;.  }.  re
1a0f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1a100 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1a110 74 72 75 65 20 69 66 20 74 68 65 20 70 61 67 65  true if the page
1a120 20 69 73 20 74 68 65 20 76 69 72 74 75 61 6c 20   is the virtual 
1a130 72 6f 6f 74 20 6f 66 20 69 74 73 20 74 61 62 6c  root of its tabl
1a140 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 69 72  e..**.** The vir
1a150 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
1a160 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  s the root page 
1a170 66 6f 72 20 6d 6f 73 74 20 74 61 62 6c 65 73 2e  for most tables.
1a180 20 20 42 75 74 0a 2a 2a 20 66 6f 72 20 74 68 65    But.** for the
1a190 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 6f 6e   table rooted on
1a1a0 20 70 61 67 65 20 31 2c 20 73 6f 6d 65 74 69 6d   page 1, sometim
1a1b0 65 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 20  e the real root 
1a1c0 70 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70 74 79  page.** is empty
1a1d0 20 65 78 63 65 70 74 20 66 6f 72 20 74 68 65 20   except for the 
1a1e0 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 2e 20 20  right-pointer.  
1a1f0 49 6e 20 73 75 63 68 20 63 61 73 65 73 20 74 68  In such cases th
1a200 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72 6f 6f  e.** virtual roo
1a210 74 20 70 61 67 65 20 69 73 20 74 68 65 20 70 61  t page is the pa
1a220 67 65 20 74 68 61 74 20 74 68 65 20 72 69 67 68  ge that the righ
1a230 74 2d 70 6f 69 6e 74 65 72 20 6f 66 20 70 61 67  t-pointer of pag
1a240 65 0a 2a 2a 20 31 20 69 73 20 70 6f 69 6e 74 69  e.** 1 is pointi
1a250 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ng to..*/.int sq
1a260 6c 69 74 65 33 42 74 72 65 65 49 73 52 6f 6f 74  lite3BtreeIsRoot
1a270 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
1a280 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  age){.  MemPage 
1a290 2a 70 50 61 72 65 6e 74 3b 0a 0a 20 20 61 73 73  *pParent;..  ass
1a2a0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1a2b0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
1a2c0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1a2d0 70 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d  pParent = pPage-
1a2e0 3e 70 50 61 72 65 6e 74 3b 0a 20 20 69 66 28 20  >pParent;.  if( 
1a2f0 70 50 61 72 65 6e 74 3d 3d 30 20 29 20 72 65 74  pParent==0 ) ret
1a300 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70 50 61  urn 1;.  if( pPa
1a310 72 65 6e 74 2d 3e 70 67 6e 6f 3e 31 20 29 20 72  rent->pgno>1 ) r
1a320 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 67  eturn 0;.  if( g
1a330 65 74 32 62 79 74 65 28 26 70 50 61 72 65 6e 74  et2byte(&pParent
1a340 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d  ->aData[pParent-
1a350 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29 3d 3d  >hdrOffset+3])==
1a360 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
1a370 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
1a380 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
1a390 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70 61 72  or up to the par
1a3a0 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ent page..**.** 
1a3b0 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74  pCur->idx is set
1a3c0 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69 6e 64   to the cell ind
1a3d0 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ex that contains
1a3e0 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a 2a 20   the pointer.** 
1a3f0 74 6f 20 74 68 65 20 70 61 67 65 20 77 65 20 61  to the page we a
1a400 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 2e 20  re coming from. 
1a410 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d 69 6e   If we are comin
1a420 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 72 69  g from the.** ri
1a430 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 70  ght-most child p
1a440 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d 3e 69  age then pCur->i
1a450 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f 6e 65  dx is set to one
1a460 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20 74 68   more than.** th
1a470 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c 20 69  e largest cell i
1a480 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ndex..*/.void sq
1a490 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f  lite3BtreeMoveTo
1a4a0 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f 72 20  Parent(BtCursor 
1a4b0 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
1a4c0 65 20 2a 70 50 61 72 65 6e 74 3b 0a 20 20 4d 65  e *pParent;.  Me
1a4d0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
1a4e0 69 6e 74 20 69 64 78 50 61 72 65 6e 74 3b 0a 0a  int idxParent;..
1a4f0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1a500 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1a510 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1a520 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1a530 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 70 50  OR_VALID );.  pP
1a540 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
1a550 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  e;.  assert( pPa
1a560 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ge!=0 );.  asser
1a570 74 28 20 21 73 71 6c 69 74 65 33 42 74 72 65 65  t( !sqlite3Btree
1a580 49 73 52 6f 6f 74 50 61 67 65 28 70 50 61 67 65  IsRootPage(pPage
1a590 29 20 29 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d  ) );.  pParent =
1a5a0 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b   pPage->pParent;
1a5b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65  .  assert( pPare
1a5c0 6e 74 21 3d 30 20 29 3b 0a 20 20 69 64 78 50 61  nt!=0 );.  idxPa
1a5d0 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 69 64  rent = pPage->id
1a5e0 78 50 61 72 65 6e 74 3b 0a 20 20 73 71 6c 69 74  xParent;.  sqlit
1a5f0 65 33 50 61 67 65 72 52 65 66 28 70 50 61 72 65  e3PagerRef(pPare
1a600 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nt->pDbPage);.  
1a610 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
1a620 65 29 3b 0a 20 20 70 43 75 72 2d 3e 70 50 61 67  e);.  pCur->pPag
1a630 65 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20 70  e = pParent;.  p
1a640 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1a650 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c  = 0;.  pCur->val
1a660 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 61 73  idNKey = 0;.  as
1a670 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69  sert( pParent->i
1a680 64 78 53 68 69 66 74 3d 3d 30 20 29 3b 0a 20 20  dxShift==0 );.  
1a690 70 43 75 72 2d 3e 69 64 78 20 3d 20 69 64 78 50  pCur->idx = idxP
1a6a0 61 72 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  arent;.}../*.** 
1a6b0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1a6c0 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  to the root page
1a6d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d  .*/.static int m
1a6e0 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73  oveToRoot(BtCurs
1a6f0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
1a700 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69  Page *pRoot;.  i
1a710 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
1a720 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20  K;.  Btree *p = 
1a730 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20  pCur->pBtree;.  
1a740 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1a750 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  p->pBt;..  asser
1a760 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1a770 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
1a780 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e  ssert( CURSOR_IN
1a790 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52  VALID < CURSOR_R
1a7a0 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
1a7b0 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56  assert( CURSOR_V
1a7c0 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f  ALID   < CURSOR_
1a7d0 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
1a7e0 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
1a7f0 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52  FAULT   > CURSOR
1a800 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
1a810 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1a820 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49  te>=CURSOR_REQUI
1a830 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66  RESEEK ){.    if
1a840 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1a850 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a  CURSOR_FAULT ){.
1a860 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75        return pCu
1a870 72 2d 3e 73 6b 69 70 3b 0a 20 20 20 20 7d 0a 20  r->skip;.    }. 
1a880 20 20 20 63 6c 65 61 72 43 75 72 73 6f 72 50 6f     clearCursorPo
1a890 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
1a8a0 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43 75 72  }.  pRoot = pCur
1a8b0 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20 70  ->pPage;.  if( p
1a8c0 52 6f 6f 74 20 26 26 20 70 52 6f 6f 74 2d 3e 70  Root && pRoot->p
1a8d0 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52  gno==pCur->pgnoR
1a8e0 6f 6f 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  oot ){.    asser
1a8f0 74 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e 69 74  t( pRoot->isInit
1a900 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
1a910 20 69 66 28 20 0a 20 20 20 20 20 20 53 51 4c 49   if( .      SQLI
1a920 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 67 65 74  TE_OK!=(rc = get
1a930 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
1a940 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
1a950 20 26 70 52 6f 6f 74 2c 20 30 29 29 0a 20 20 20   &pRoot, 0)).   
1a960 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
1a970 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
1a980 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 72  INVALID;.      r
1a990 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1a9a0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1a9b0 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20  pCur->pPage);.  
1a9c0 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20    pCur->pPage = 
1a9d0 70 52 6f 6f 74 3b 0a 20 20 7d 0a 20 20 70 43 75  pRoot;.  }.  pCu
1a9e0 72 2d 3e 69 64 78 20 3d 20 30 3b 0a 20 20 70 43  r->idx = 0;.  pC
1a9f0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
1aa00 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61   0;.  pCur->atLa
1aa10 73 74 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  st = 0;.  pCur->
1aa20 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
1aa30 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c   if( pRoot->nCel
1aa40 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d 3e  l==0 && !pRoot->
1aa50 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
1aa60 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 61 73   subpage;.    as
1aa70 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e  sert( pRoot->pgn
1aa80 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 73 75 62 70  o==1 );.    subp
1aa90 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
1aaa0 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f  pRoot->aData[pRo
1aab0 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ot->hdrOffset+8]
1aac0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
1aad0 75 62 70 61 67 65 3e 30 20 29 3b 0a 20 20 20 20  ubpage>0 );.    
1aae0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
1aaf0 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20  URSOR_VALID;.   
1ab00 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
1ab10 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29  d(pCur, subpage)
1ab20 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 65 53  ;.  }.  pCur->eS
1ab30 74 61 74 65 20 3d 20 28 28 70 43 75 72 2d 3e 70  tate = ((pCur->p
1ab40 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43  Page->nCell>0)?C
1ab50 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52 53  URSOR_VALID:CURS
1ab60 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20 72  OR_INVALID);.  r
1ab70 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1ab80 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73  ** Move the curs
1ab90 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c  or down to the l
1aba0 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e  eft-most leaf en
1abb0 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a  try beneath the.
1abc0 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63  ** entry to whic
1abd0 68 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  h it is currentl
1abe0 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a  y pointing..**.*
1abf0 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  * The left-most 
1ac00 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20  leaf is the one 
1ac10 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73  with the smalles
1ac20 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73  t key - the firs
1ac30 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e  t.** in ascendin
1ac40 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
1ac50 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66  ic int moveToLef
1ac60 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
1ac70 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
1ac80 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  no;.  int rc = S
1ac90 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50  QLITE_OK;.  MemP
1aca0 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61  age *pPage;..  a
1acb0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1acc0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1acd0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1ace0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1acf0 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65  VALID );.  while
1ad00 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1ad10 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43 75  && !(pPage = pCu
1ad20 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66 20  r->pPage)->leaf 
1ad30 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1ad40 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70  Cur->idx>=0 && p
1ad50 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e  Cur->idx<pPage->
1ad60 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e  nCell );.    pgn
1ad70 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  o = get4byte(fin
1ad80 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  dCell(pPage, pCu
1ad90 72 2d 3e 69 64 78 29 29 3b 0a 20 20 20 20 72 63  r->idx));.    rc
1ada0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
1adb0 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  Cur, pgno);.  }.
1adc0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1add0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
1ade0 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68  ursor down to th
1adf0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61  e right-most lea
1ae00 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  f entry beneath 
1ae10 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77  the.** page to w
1ae20 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65  hich it is curre
1ae30 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20  ntly pointing.  
1ae40 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65  Notice the diffe
1ae50 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e  rence.** between
1ae60 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
1ae70 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68  ) and moveToRigh
1ae80 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f  tmost().  moveTo
1ae90 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69  Leftmost().** fi
1aea0 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  nds the left-mos
1aeb0 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20  t entry beneath 
1aec0 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72  the *entry* wher
1aed0 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  eas moveToRightm
1aee0 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74  ost().** finds t
1aef0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
1af00 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20  try beneath the 
1af10 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68  *page*..**.** Th
1af20 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
1af30 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  ry is the one wi
1af40 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b  th the largest k
1af50 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a  ey - the last.**
1af60 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e   key in ascendin
1af70 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74  g order..*/.stat
1af80 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67  ic int moveToRig
1af90 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20  htmost(BtCursor 
1afa0 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70  *pCur){.  Pgno p
1afb0 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  gno;.  int rc = 
1afc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d  SQLITE_OK;.  Mem
1afd0 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20  Page *pPage;..  
1afe0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1aff0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1b000 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1b010 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1b020 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c  _VALID );.  whil
1b030 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
1b040 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70 43   && !(pPage = pC
1b050 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61 66  ur->pPage)->leaf
1b060 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   ){.    pgno = g
1b070 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
1b080 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1b090 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
1b0a0 70 43 75 72 2d 3e 69 64 78 20 3d 20 70 50 61 67  pCur->idx = pPag
1b0b0 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63  e->nCell;.    rc
1b0c0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
1b0d0 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  Cur, pgno);.  }.
1b0e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1b0f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  _OK ){.    pCur-
1b100 3e 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43  >idx = pPage->nC
1b110 65 6c 6c 20 2d 20 31 3b 0a 20 20 20 20 70 43 75  ell - 1;.    pCu
1b120 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
1b130 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c  0;.    pCur->val
1b140 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a  idNKey = 0;.  }.
1b150 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b160 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  OK;.}../* Move t
1b170 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
1b180 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
1b190 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75  the table.  Retu
1b1a0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
1b1b0 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74  on success.  Set
1b1c0 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74   *pRes to 0 if t
1b1d0 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c  he cursor actual
1b1e0 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d  ly points to som
1b1f0 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74  ething.** or set
1b200 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74   *pRes to 1 if t
1b210 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
1b220 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
1b230 33 42 74 72 65 65 46 69 72 73 74 28 42 74 43 75  3BtreeFirst(BtCu
1b240 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
1b250 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
1b260 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
1b270 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1b280 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
1b290 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1b2a0 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65  eld(pCur->pBtree
1b2b0 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
1b2c0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f    rc = moveToRoo
1b2d0 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  t(pCur);.  if( r
1b2e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1b2f0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
1b300 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
1b310 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 61 73  ALID ){.      as
1b320 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
1b330 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
1b340 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a       *pRes = 1;.
1b350 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1b360 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  E_OK;.    }else{
1b370 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1b380 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
1b390 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52  l>0 );.      *pR
1b3a0 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  es = 0;.      rc
1b3b0 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73   = moveToLeftmos
1b3c0 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20  t(pCur);.    }. 
1b3d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1b3e0 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
1b3f0 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c 61 73  ursor to the las
1b400 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
1b410 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51  able.  Return SQ
1b420 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75  LITE_OK.** on su
1b430 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65  ccess.  Set *pRe
1b440 73 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75  s to 0 if the cu
1b450 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f  rsor actually po
1b460 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e  ints to somethin
1b470 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65  g.** or set *pRe
1b480 73 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61  s to 1 if the ta
1b490 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f  ble is empty..*/
1b4a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
1b4b0 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72 20 2a  eLast(BtCursor *
1b4c0 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
1b4d0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a 20 20  {.  int rc;. .  
1b4e0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
1b4f0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
1b500 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
1b510 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1b520 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
1b530 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
1b540 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75  = moveToRoot(pCu
1b550 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
1b560 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
1b570 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
1b580 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
1b590 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1b5a0 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43   pCur->pPage->nC
1b5b0 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ell==0 );.      
1b5c0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d  *pRes = 1;.    }
1b5d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
1b5e0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1b5f0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1b600 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
1b610 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  0;.      rc = mo
1b620 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43  veToRightmost(pC
1b630 75 72 29 3b 0a 20 20 20 20 20 20 67 65 74 43 65  ur);.      getCe
1b640 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
1b650 20 20 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74      pCur->atLast
1b660 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   = rc==SQLITE_OK
1b670 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1b680 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
1b690 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 73  ove the cursor s
1b6a0 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
1b6b0 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e 65 61   to an entry nea
1b6c0 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20 73 70  r the key .** sp
1b6d0 65 63 69 66 69 65 64 20 62 79 20 70 4b 65 79 2f  ecified by pKey/
1b6e0 6e 4b 65 79 2f 70 55 6e 4b 65 79 2e 20 52 65 74  nKey/pUnKey. Ret
1b6f0 75 72 6e 20 61 20 73 75 63 63 65 73 73 20 63 6f  urn a success co
1b700 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 49 4e  de..**.** For IN
1b710 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 6f 6e 6c  TKEY tables, onl
1b720 79 20 74 68 65 20 6e 4b 65 79 20 70 61 72 61 6d  y the nKey param
1b730 65 74 65 72 20 69 73 20 75 73 65 64 2e 20 20 70  eter is used.  p
1b740 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 70 55 6e 4b  Key .** and pUnK
1b750 65 79 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e  ey must be NULL.
1b760 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c    For index tabl
1b770 65 73 2c 20 65 69 74 68 65 72 20 70 55 6e 4b 65  es, either pUnKe
1b780 79 0a 2a 2a 20 6d 75 73 74 20 70 6f 69 6e 74 20  y.** must point 
1b790 74 6f 20 61 20 6b 65 79 20 74 68 61 74 20 68 61  to a key that ha
1b7a0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 75  s already been u
1b7b0 6e 70 61 63 6b 65 64 2c 20 6f 72 20 65 6c 73 65  npacked, or else
1b7c0 0a 2a 2a 20 70 4b 65 79 2f 6e 4b 65 79 20 64 65  .** pKey/nKey de
1b7d0 73 63 72 69 62 65 73 20 61 20 62 6c 6f 62 20 63  scribes a blob c
1b7e0 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6b 65  ontaining the ke
1b7f0 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  y..**.** If an e
1b800 78 61 63 74 20 6d 61 74 63 68 20 69 73 20 6e 6f  xact match is no
1b810 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20 74 68  t found, then th
1b820 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c 77 61  e cursor is alwa
1b830 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69 6e 74  ys.** left point
1b840 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20 70 61  ing at a leaf pa
1b850 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20 68  ge which would h
1b860 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20 69 66  old the entry if
1b870 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72 65 73   it.** were pres
1b880 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73 6f 72  ent.  The cursor
1b890 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
1b8a0 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20 63 6f  an entry that co
1b8b0 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20 6f 72  mes.** before or
1b8c0 20 61 66 74 65 72 20 74 68 65 20 6b 65 79 2e 0a   after the key..
1b8d0 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  **.** The result
1b8e0 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20 74 68   of comparing th
1b8f0 65 20 6b 65 79 20 77 69 74 68 20 74 68 65 20 65  e key with the e
1b900 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20 74 68  ntry to which th
1b910 65 0a 2a 2a 20 63 75 72 73 6f 72 20 69 73 20 77  e.** cursor is w
1b920 72 69 74 74 65 6e 20 74 6f 20 2a 70 52 65 73 20  ritten to *pRes 
1b930 69 66 20 70 52 65 73 21 3d 4e 55 4c 4c 2e 20 20  if pRes!=NULL.  
1b940 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 0a 2a  The meaning of.*
1b950 2a 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20  * this value is 
1b960 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
1b970 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20 20 20  *     *pRes<0   
1b980 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73     The cursor is
1b990 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
1b9a0 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a  t an entry that.
1b9b0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1b9c0 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72 20 74      is smaller t
1b9d0 68 61 6e 20 70 4b 65 79 20 6f 72 20 69 66 20 74  han pKey or if t
1b9e0 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
1b9f0 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  y.**            
1ba00 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75        and the cu
1ba10 72 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72  rsor is therefor
1ba20 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20  e left point to 
1ba30 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  nothing..**.**  
1ba40 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20     *pRes==0     
1ba50 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
1ba60 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
1ba70 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
1ba80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba90 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73   exactly matches
1baa0 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   pKey..**.**    
1bab0 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20 54 68   *pRes>0      Th
1bac0 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
1bad0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
1bae0 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
1baf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
1bb00 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 4b  s larger than pK
1bb10 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71  ey..**.*/.int sq
1bb20 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
1bb30 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
1bb40 75 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ur,        /* Th
1bb50 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d  e cursor to be m
1bb60 6f 76 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  oved */.  const 
1bb70 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 20 20  void *pKey,     
1bb80 20 2f 2a 20 54 68 65 20 6b 65 79 20 63 6f 6e 74   /* The key cont
1bb90 65 6e 74 20 66 6f 72 20 69 6e 64 69 63 65 73 2e  ent for indices.
1bba0 20 20 4e 6f 74 20 75 73 65 64 20 62 79 20 74 61    Not used by ta
1bbb0 62 6c 65 73 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  bles */.  Unpack
1bbc0 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 4b 65 79  edRecord *pUnKey
1bbd0 2c 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76 65 72  ,/* Unpacked ver
1bbe0 73 69 6f 6e 20 6f 66 20 70 4b 65 79 20 2a 2f 0a  sion of pKey */.
1bbf0 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 20    i64 nKey,     
1bc00 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
1bc10 20 6f 66 20 70 4b 65 79 2e 20 20 4f 72 20 74 68   of pKey.  Or th
1bc20 65 20 6b 65 79 20 66 6f 72 20 74 61 62 6c 65 73  e key for tables
1bc30 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73 52 69   */.  int biasRi
1bc40 67 68 74 2c 20 20 20 20 20 20 20 20 20 2f 2a 20  ght,         /* 
1bc50 49 66 20 74 72 75 65 2c 20 62 69 61 73 20 74 68  If true, bias th
1bc60 65 20 73 65 61 72 63 68 20 74 6f 20 74 68 65 20  e search to the 
1bc70 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e  high end */.  in
1bc80 74 20 2a 70 52 65 73 20 20 20 20 20 20 20 20 20  t *pRes         
1bc90 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 72       /* Search r
1bca0 65 73 75 6c 74 20 66 6c 61 67 20 2a 2f 0a 29 7b  esult flag */.){
1bcb0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
1bcc0 72 20 61 53 70 61 63 65 5b 32 30 30 5d 3b 0a 0a  r aSpace[200];..
1bcd0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1bce0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1bcf0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
1bd00 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1bd10 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
1bd20 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  b->mutex) );..  
1bd30 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  /* If the cursor
1bd40 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f 73 69   is already posi
1bd50 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20 70 6f  tioned at the po
1bd60 69 6e 74 20 77 65 20 61 72 65 20 74 72 79 69 6e  int we are tryin
1bd70 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65 20 74  g.  ** to move t
1bd80 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74  o, then just ret
1bd90 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e  urn without doin
1bda0 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a 20 20  g any work */.  
1bdb0 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1bdc0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 26  ==CURSOR_VALID &
1bdd0 26 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65  & pCur->validNKe
1bde0 79 20 26 26 20 70 43 75 72 2d 3e 70 50 61 67 65  y && pCur->pPage
1bdf0 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
1be00 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  if( pCur->info.n
1be10 4b 65 79 3d 3d 6e 4b 65 79 20 29 7b 0a 20 20 20  Key==nKey ){.   
1be20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
1be30 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1be40 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1be50 69 66 28 20 70 43 75 72 2d 3e 61 74 4c 61 73 74  if( pCur->atLast
1be60 20 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   && pCur->info.n
1be70 4b 65 79 3c 6e 4b 65 79 20 29 7b 0a 20 20 20 20  Key<nKey ){.    
1be80 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20    *pRes = -1;.  
1be90 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1bea0 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  E_OK;.    }.  }.
1beb0 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ..  rc = moveToR
1bec0 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
1bed0 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
1bee0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
1bef0 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20  rt( pCur->pPage 
1bf00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1bf10 72 2d 3e 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  r->pPage->isInit
1bf20 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
1bf30 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
1bf40 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 2a 70  NVALID ){.    *p
1bf50 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 61 73  Res = -1;.    as
1bf60 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
1bf70 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
1bf80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1bf90 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _OK;.  }.  if( p
1bfa0 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b  Cur->pPage->intK
1bfb0 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20  ey ){.    /* We 
1bfc0 61 72 65 20 67 69 76 65 6e 20 61 6e 20 53 51 4c  are given an SQL
1bfd0 20 74 61 62 6c 65 20 74 6f 20 73 65 61 72 63 68   table to search
1bfe0 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20 74 68  .  The key is th
1bff0 65 20 69 6e 74 65 67 65 72 0a 20 20 20 20 2a 2a  e integer.    **
1c000 20 72 6f 77 69 64 20 63 6f 6e 74 61 69 6e 65 64   rowid contained
1c010 20 69 6e 20 6e 4b 65 79 2e 20 20 70 4b 65 79 20   in nKey.  pKey 
1c020 61 6e 64 20 70 55 6e 4b 65 79 20 73 68 6f 75 6c  and pUnKey shoul
1c030 64 20 62 6f 74 68 20 62 65 20 4e 55 4c 4c 20 2a  d both be NULL *
1c040 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 55  /.    assert( pU
1c050 6e 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 20 20 61  nKey==0 );.    a
1c060 73 73 65 72 74 28 20 70 4b 65 79 3d 3d 30 20 29  ssert( pKey==0 )
1c070 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 55  ;.  }else if( pU
1c080 6e 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  nKey==0 ){.    /
1c090 2a 20 57 65 20 61 72 65 20 74 6f 20 73 65 61 72  * We are to sear
1c0a0 63 68 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20  ch an SQL index 
1c0b0 75 73 69 6e 67 20 61 20 6b 65 79 20 65 6e 63 6f  using a key enco
1c0c0 64 65 64 20 61 73 20 61 20 62 6c 6f 62 2e 0a 20  ded as a blob.. 
1c0d0 20 20 20 2a 2a 20 54 68 65 20 62 6c 6f 62 20 69     ** The blob i
1c0e0 73 20 66 6f 75 6e 64 20 61 74 20 70 4b 65 79 20  s found at pKey 
1c0f0 61 6e 64 20 69 73 20 6e 4b 65 79 20 62 79 74 65  and is nKey byte
1c100 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 20 55 6e  s in length.  Un
1c110 70 61 63 6b 0a 20 20 20 20 2a 2a 20 74 68 69 73  pack.    ** this
1c120 20 6b 65 79 20 73 6f 20 74 68 61 74 20 77 65 20   key so that we 
1c130 63 61 6e 20 75 73 65 20 69 74 2e 20 2a 2f 0a 20  can use it. */. 
1c140 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 21     assert( pKey!
1c150 3d 30 20 29 3b 0a 20 20 20 20 70 55 6e 4b 65 79  =0 );.    pUnKey
1c160 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
1c170 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d  cordUnpack(pCur-
1c180 3e 70 4b 65 79 49 6e 66 6f 2c 20 6e 4b 65 79 2c  >pKeyInfo, nKey,
1c190 20 70 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20   pKey,.         
1c1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c1b0 20 20 20 20 20 20 20 20 20 20 61 53 70 61 63 65            aSpace
1c1c0 2c 20 73 69 7a 65 6f 66 28 61 53 70 61 63 65 29  , sizeof(aSpace)
1c1d0 29 3b 0a 20 20 20 20 69 66 28 20 70 55 6e 4b 65  );.    if( pUnKe
1c1e0 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  y==0 ) return SQ
1c1f0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  LITE_NOMEM;.  }e
1c200 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61  lse{.    /* We a
1c210 72 65 20 74 6f 20 73 65 61 72 63 68 20 61 6e 20  re to search an 
1c220 53 51 4c 20 69 6e 64 65 78 20 75 73 69 6e 67 20  SQL index using 
1c230 61 20 6b 65 79 20 74 68 61 74 20 69 73 20 61 6c  a key that is al
1c240 72 65 61 64 79 20 75 6e 70 61 63 6b 65 64 0a 20  ready unpacked. 
1c250 20 20 20 2a 2a 20 61 6e 64 20 68 61 6e 64 65 64     ** and handed
1c260 20 74 6f 20 75 73 20 69 6e 20 70 55 6e 4b 65 79   to us in pUnKey
1c270 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
1c280 20 70 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 7d 0a   pKey==0 );.  }.
1c290 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69    for(;;){.    i
1c2a0 6e 74 20 6c 77 72 2c 20 75 70 72 3b 0a 20 20 20  nt lwr, upr;.   
1c2b0 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20   Pgno chldPg;.  
1c2c0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1c2d0 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
1c2e0 20 20 20 20 69 6e 74 20 63 20 3d 20 2d 31 3b 20      int c = -1; 
1c2f0 20 2f 2a 20 70 52 65 73 20 72 65 74 75 72 6e 20   /* pRes return 
1c300 69 66 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  if table is empt
1c310 79 20 6d 75 73 74 20 62 65 20 2d 31 20 2a 2f 0a  y must be -1 */.
1c320 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 20      lwr = 0;.   
1c330 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e 43   upr = pPage->nC
1c340 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20 21  ell-1;.    if( !
1c350 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
1c360 20 70 55 6e 4b 65 79 3d 3d 30 20 29 7b 0a 20 20   pUnKey==0 ){.  
1c370 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1c380 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1c390 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f      goto moveto_
1c3a0 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20  finish;.    }.  
1c3b0 20 20 69 66 28 20 62 69 61 73 52 69 67 68 74 20    if( biasRight 
1c3c0 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69  ){.      pCur->i
1c3d0 64 78 20 3d 20 75 70 72 3b 0a 20 20 20 20 7d 65  dx = upr;.    }e
1c3e0 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  lse{.      pCur-
1c3f0 3e 69 64 78 20 3d 20 28 75 70 72 2b 6c 77 72 29  >idx = (upr+lwr)
1c400 2f 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  /2;.    }.    if
1c410 28 20 6c 77 72 3c 3d 75 70 72 20 29 20 66 6f 72  ( lwr<=upr ) for
1c420 28 3b 3b 29 7b 0a 20 20 20 20 20 20 76 6f 69 64  (;;){.      void
1c430 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20   *pCellKey;.    
1c440 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a    i64 nCellKey;.
1c450 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f        pCur->info
1c460 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
1c470 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
1c480 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 69 66 28  y = 1;.      if(
1c490 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
1c4a0 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 43  {.        u8 *pC
1c4b0 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 43 65  ell;.        pCe
1c4c0 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
1c4d0 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 20  age, pCur->idx) 
1c4e0 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74  + pPage->childPt
1c4f0 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69  rSize;.        i
1c500 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
1c510 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  a ){.          u
1c520 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 20 20  32 dummy;.      
1c530 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67 65 74      pCell += get
1c540 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c 2c 20  Varint32(pCell, 
1c550 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20 20 20  dummy);.        
1c560 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56 61 72  }.        getVar
1c570 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36 34 2a  int(pCell, (u64*
1c580 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  )&nCellKey);.   
1c590 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c 4b 65       if( nCellKe
1c5a0 79 3d 3d 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20  y==nKey ){.     
1c5b0 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20       c = 0;.    
1c5c0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 43      }else if( nC
1c5d0 65 6c 6c 4b 65 79 3c 6e 4b 65 79 20 29 7b 0a 20  ellKey<nKey ){. 
1c5e0 20 20 20 20 20 20 20 20 20 63 20 3d 20 2d 31 3b           c = -1;
1c5f0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1c600 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1c610 28 20 6e 43 65 6c 6c 4b 65 79 3e 6e 4b 65 79 20  ( nCellKey>nKey 
1c620 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  );.          c =
1c630 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   +1;.        }. 
1c640 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c650 20 20 20 20 69 6e 74 20 61 76 61 69 6c 61 62 6c      int availabl
1c660 65 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  e;.        pCell
1c670 4b 65 79 20 3d 20 28 76 6f 69 64 20 2a 29 66 65  Key = (void *)fe
1c680 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  tchPayload(pCur,
1c690 20 26 61 76 61 69 6c 61 62 6c 65 2c 20 30 29 3b   &available, 0);
1c6a0 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 4b 65  .        nCellKe
1c6b0 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  y = pCur->info.n
1c6c0 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Key;.        if(
1c6d0 20 61 76 61 69 6c 61 62 6c 65 3e 3d 6e 43 65 6c   available>=nCel
1c6e0 6c 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  lKey ){.        
1c6f0 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62    c = sqlite3Vdb
1c700 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
1c710 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65  CellKey, pCellKe
1c720 79 2c 20 70 55 6e 4b 65 79 29 3b 0a 20 20 20 20  y, pUnKey);.    
1c730 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c740 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20       pCellKey = 
1c750 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 6e  sqlite3Malloc( n
1c760 43 65 6c 6c 4b 65 79 20 29 3b 0a 20 20 20 20 20  CellKey );.     
1c770 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c 4b 65       if( pCellKe
1c780 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  y==0 ){.        
1c790 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1c7a0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
1c7b0 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
1c7c0 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 20  inish;.         
1c7d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
1c7e0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  = sqlite3BtreeKe
1c7f0 79 28 70 43 75 72 2c 20 30 2c 20 6e 43 65 6c 6c  y(pCur, 0, nCell
1c800 4b 65 79 2c 20 28 76 6f 69 64 20 2a 29 70 43 65  Key, (void *)pCe
1c810 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
1c820 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56 64 62    c = sqlite3Vdb
1c830 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65 28 6e  eRecordCompare(n
1c840 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65  CellKey, pCellKe
1c850 79 2c 20 70 55 6e 4b 65 79 29 3b 0a 20 20 20 20  y, pUnKey);.    
1c860 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
1c870 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20  ee(pCellKey);.  
1c880 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
1c890 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
1c8a0 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ish;.        }. 
1c8b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1c8c0 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   c==0 ){.       
1c8d0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
1c8e0 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20   = nCellKey;.   
1c8f0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
1c900 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65  intKey && !pPage
1c910 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
1c920 20 20 20 20 6c 77 72 20 3d 20 70 43 75 72 2d 3e      lwr = pCur->
1c930 69 64 78 3b 0a 20 20 20 20 20 20 20 20 20 20 75  idx;.          u
1c940 70 72 20 3d 20 6c 77 72 20 2d 20 31 3b 0a 20 20  pr = lwr - 1;.  
1c950 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1c960 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1c970 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65 73          if( pRes
1c980 20 29 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20   ) *pRes = 0;.  
1c990 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1c9a0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
1c9b0 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
1c9c0 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nish;.        }.
1c9d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1c9e0 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ( c<0 ){.       
1c9f0 20 6c 77 72 20 3d 20 70 43 75 72 2d 3e 69 64 78   lwr = pCur->idx
1ca00 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  +1;.      }else{
1ca10 0a 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 70  .        upr = p
1ca20 43 75 72 2d 3e 69 64 78 2d 31 3b 0a 20 20 20 20  Cur->idx-1;.    
1ca30 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6c 77    }.      if( lw
1ca40 72 3e 75 70 72 20 29 7b 0a 20 20 20 20 20 20 20  r>upr ){.       
1ca50 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
1ca60 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20   = nCellKey;.   
1ca70 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1ca80 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72 2d 3e    }.      pCur->
1ca90 69 64 78 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f  idx = (lwr+upr)/
1caa0 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  2;.    }.    ass
1cab0 65 72 74 28 20 6c 77 72 3d 3d 75 70 72 2b 31 20  ert( lwr==upr+1 
1cac0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1cad0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
1cae0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
1caf0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 63 68 6c  eaf ){.      chl
1cb00 64 50 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  dPg = 0;.    }el
1cb10 73 65 20 69 66 28 20 6c 77 72 3e 3d 70 50 61 67  se if( lwr>=pPag
1cb20 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  e->nCell ){.    
1cb30 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
1cb40 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
1cb50 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
1cb60 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  et+8]);.    }els
1cb70 65 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  e{.      chldPg 
1cb80 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e 64 43  = get4byte(findC
1cb90 65 6c 6c 28 70 50 61 67 65 2c 20 6c 77 72 29 29  ell(pPage, lwr))
1cba0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1cbb0 63 68 6c 64 50 67 3d 3d 30 20 29 7b 0a 20 20 20  chldPg==0 ){.   
1cbc0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1cbd0 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d  >idx>=0 && pCur-
1cbe0 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50 61 67 65  >idx<pCur->pPage
1cbf0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 20  ->nCell );.     
1cc00 20 69 66 28 20 70 52 65 73 20 29 20 2a 70 52 65   if( pRes ) *pRe
1cc10 73 20 3d 20 63 3b 0a 20 20 20 20 20 20 72 63 20  s = c;.      rc 
1cc20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1cc30 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66     goto moveto_f
1cc40 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a 20 20 20  inish;.    }.   
1cc50 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 6c 77 72   pCur->idx = lwr
1cc60 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f  ;.    pCur->info
1cc70 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
1cc80 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1cc90 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f  = 0;.    rc = mo
1cca0 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20  veToChild(pCur, 
1ccb0 63 68 6c 64 50 67 29 3b 0a 20 20 20 20 69 66 28  chldPg);.    if(
1ccc0 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74   rc ) goto movet
1ccd0 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 7d 0a 6d 6f  o_finish;.  }.mo
1cce0 76 65 74 6f 5f 66 69 6e 69 73 68 3a 0a 20 20 69  veto_finish:.  i
1ccf0 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 2f  f( pKey ){.    /
1cd00 2a 20 49 66 20 77 65 20 63 72 65 61 74 65 64 20  * If we created 
1cd10 6f 75 72 20 6f 77 6e 20 75 6e 70 61 63 6b 65 64  our own unpacked
1cd20 20 6b 65 79 20 61 74 20 74 68 65 20 74 6f 70 20   key at the top 
1cd30 6f 66 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70  of this.    ** p
1cd40 72 6f 63 65 64 75 72 65 2c 20 74 68 65 6e 20 64  rocedure, then d
1cd50 65 73 74 72 6f 79 20 74 68 61 74 20 6b 65 79 20  estroy that key 
1cd60 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
1cd70 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
1cd80 56 64 62 65 44 65 6c 65 74 65 55 6e 70 61 63 6b  VdbeDeleteUnpack
1cd90 65 64 52 65 63 6f 72 64 28 70 55 6e 4b 65 79 29  edRecord(pUnKey)
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 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
20af0 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
20b00 50 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Page);.#endif.  
20b10 20 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43      }.      TRAC
20b20 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
20b30 64 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20  d leaf on trunk 
20b40 70 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65  page %d\n",pPage
20b50 2d 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70  ->pgno,pTrunk->p
20b60 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  gno));.    }.   
20b70 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72   releasePage(pTr
20b80 75 6e 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  unk);.  }.  retu
20b90 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
20ba0 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f  Free any overflo
20bb0 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61 74  w pages associat
20bc0 65 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65  ed with the give
20bd0 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  n Cell..*/.stati
20be0 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28  c int clearCell(
20bf0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
20c00 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
20c10 43 65 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72 65  Cell){.  BtShare
20c20 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
20c30 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20  pBt;.  CellInfo 
20c40 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66  info;.  Pgno ovf
20c50 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b  lPgno;.  int rc;
20c60 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20  .  int nOvfl;.  
20c70 69 6e 74 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  int ovflPageSize
20c80 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
20c90 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
20ca0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
20cb0 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  x) );.  sqlite3B
20cc0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
20cd0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
20ce0 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66  info);.  if( inf
20cf0 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  o.iOverflow==0 )
20d00 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
20d10 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f  ITE_OK;  /* No o
20d20 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52  verflow pages. R
20d30 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
20d40 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a  ing anything */.
20d50 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d    }.  ovflPgno =
20d60 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
20d70 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
20d80 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a  );.  ovflPageSiz
20d90 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e = pBt->usableS
20da0 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c  ize - 4;.  nOvfl
20db0 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61   = (info.nPayloa
20dc0 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  d - info.nLocal 
20dd0 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d  + ovflPageSize -
20de0 20 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65   1)/ovflPageSize
20df0 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 76 66 6c  ;.  assert( ovfl
20e00 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c  Pgno==0 || nOvfl
20e10 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e  >0 );.  while( n
20e20 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 4d 65  Ovfl-- ){.    Me
20e30 6d 50 61 67 65 20 2a 70 4f 76 66 6c 3b 0a 20 20  mPage *pOvfl;.  
20e40 20 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d    if( ovflPgno==
20e50 30 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 70 61  0 || ovflPgno>pa
20e60 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
20e70 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  ->pPager) ){.   
20e80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
20e90 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
20ea0 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 67     }..    rc = g
20eb0 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70  etOverflowPage(p
20ec0 42 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70  Bt, ovflPgno, &p
20ed0 4f 76 66 6c 2c 20 28 6e 4f 76 66 6c 3d 3d 30 29  Ovfl, (nOvfl==0)
20ee0 3f 30 3a 26 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20  ?0:&ovflPgno);. 
20ef0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
20f00 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20  rn rc;.    rc = 
20f10 66 72 65 65 50 61 67 65 28 70 4f 76 66 6c 29 3b  freePage(pOvfl);
20f20 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
20f30 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44  rUnref(pOvfl->pD
20f40 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
20f50 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
20f60 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
20f70 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
20f80 20 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65   Create the byte
20f90 20 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74   sequence used t
20fa0 6f 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65  o represent a ce
20fb0 6c 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65  ll on page pPage
20fc0 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68  .** and write th
20fd0 61 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65  at byte sequence
20fe0 20 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20   into pCell[].  
20ff0 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61  Overflow pages a
21000 72 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  re.** allocated 
21010 61 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73  and filled in as
21020 20 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65   necessary.  The
21030 20 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75   calling procedu
21040 72 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  re.** is respons
21050 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20  ible for making 
21060 73 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20  sure sufficient 
21070 73 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61  space has been a
21080 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20  llocated.** for 
21090 70 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e  pCell[]..**.** N
210a0 6f 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64  ote that pCell d
210b0 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72  oes not necessar
210c0 79 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20  y need to point 
210d0 74 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44  to the pPage->aD
210e0 61 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43  ata.** area.  pC
210f0 65 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20  ell might point 
21100 74 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72  to some temporar
21110 79 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20  y storage.  The 
21120 63 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  cell will.** be 
21130 63 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74  constructed in t
21140 68 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72  his temporary ar
21150 65 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69  ea then copied i
21160 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61  nto pPage->aData
21170 0a 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74  .** later..*/.st
21180 61 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43  atic int fillInC
21190 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
211a0 70 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  pPage,          
211b0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
211c0 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  e that contains 
211d0 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e  the cell */.  un
211e0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
211f0 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ll,          /* 
21200 43 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66  Complete text of
21210 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63   the cell */.  c
21220 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c  onst void *pKey,
21230 20 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a   i64 nKey,    /*
21240 20 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f   The key */.  co
21250 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  nst void *pData,
21260 69 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20  int nData,   /* 
21270 54 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e  The data */.  in
21280 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20  t nZero,        
21290 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
212a0 45 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65 73  Extra zero bytes
212b0 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70 44   to append to pD
212c0 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e  ata */.  int *pn
212d0 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20  Size            
212e0 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
212f0 20 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20   cell size here 
21300 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79  */.){.  int nPay
21310 6c 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38  load;.  const u8
21320 20 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53   *pSrc;.  int nS
21330 72 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74  rc, n, rc;.  int
21340 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65   spaceLeft;.  Me
21350 6d 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30  mPage *pOvfl = 0
21360 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f  ;.  MemPage *pTo
21370 52 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75  Release = 0;.  u
21380 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50  nsigned char *pP
21390 72 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64  rior;.  unsigned
213a0 20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b   char *pPayload;
213b0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
213c0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
213d0 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d   Pgno pgnoOvfl =
213e0 20 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65   0;.  int nHeade
213f0 72 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  r;.  CellInfo in
21400 66 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  fo;..  assert( s
21410 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
21420 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
21430 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69  tex) );..  /* Fi
21440 6c 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ll in the header
21450 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d  . */.  nHeader =
21460 20 30 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   0;.  if( !pPage
21470 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48  ->leaf ){.    nH
21480 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a  eader += 4;.  }.
21490 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73    if( pPage->has
214a0 44 61 74 61 20 29 7b 0a 20 20 20 20 6e 48 65 61  Data ){.    nHea
214b0 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74  der += putVarint
214c0 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d  (&pCell[nHeader]
214d0 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a  , nData+nZero);.
214e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61    }else{.    nDa
214f0 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a  ta = nZero = 0;.
21500 20 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d    }.  nHeader +=
21510 20 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c   putVarint(&pCel
21520 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36  l[nHeader], *(u6
21530 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 73 71 6c  4*)&nKey);.  sql
21540 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
21550 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  llPtr(pPage, pCe
21560 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73  ll, &info);.  as
21570 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64  sert( info.nHead
21580 65 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20  er==nHeader );. 
21590 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b   assert( info.nK
215a0 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73  ey==nKey );.  as
215b0 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61  sert( info.nData
215c0 3d 3d 6e 44 61 74 61 2b 6e 5a 65 72 6f 20 29 3b  ==nData+nZero );
215d0 0a 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  .  .  /* Fill in
215e0 20 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a   the payload */.
215f0 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61    nPayload = nDa
21600 74 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66  ta + nZero;.  if
21610 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
21620 29 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44  ){.    pSrc = pD
21630 61 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20  ata;.    nSrc = 
21640 6e 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61  nData;.    nData
21650 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
21660 20 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     nPayload += n
21670 4b 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20  Key;.    pSrc = 
21680 70 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d  pKey;.    nSrc =
21690 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e   nKey;.  }.  *pn
216a0 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a  Size = info.nSiz
216b0 65 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d  e;.  spaceLeft =
216c0 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20   info.nLocal;.  
216d0 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c  pPayload = &pCel
216e0 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70 50  l[nHeader];.  pP
216f0 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e  rior = &pCell[in
21700 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a  fo.iOverflow];..
21710 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61    while( nPayloa
21720 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73  d>0 ){.    if( s
21730 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 20  paceLeft==0 ){. 
21740 20 20 20 20 20 69 6e 74 20 69 73 45 78 61 63 74       int isExact
21750 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
21760 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
21770 43 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20  CUUM.      Pgno 
21780 70 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e  pgnoPtrmap = pgn
21790 6f 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c  oOvfl; /* Overfl
217a0 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d  ow page pointer-
217b0 6d 61 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a  map entry page *
217c0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
217d0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
217e0 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20         do{.     
217f0 20 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b       pgnoOvfl++;
21800 0a 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65  .        } while
21810 28 20 0a 20 20 20 20 20 20 20 20 20 20 50 54 52  ( .          PTR
21820 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
21830 70 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e  pgnoOvfl) || pgn
21840 6f 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42  oOvfl==PENDING_B
21850 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20  YTE_PAGE(pBt) . 
21860 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
21870 20 20 69 66 28 20 70 67 6e 6f 4f 76 66 6c 3e 31    if( pgnoOvfl>1
21880 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
21890 20 69 73 45 78 61 63 74 20 3d 20 31 3b 20 2a 2f   isExact = 1; */
218a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
218b0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
218c0 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
218d0 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76  eePage(pBt, &pOv
218e0 66 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70  fl, &pgnoOvfl, p
218f0 67 6e 6f 4f 76 66 6c 2c 20 69 73 45 78 61 63 74  gnoOvfl, isExact
21900 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
21910 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
21920 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
21930 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
21940 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
21950 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
21960 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20  or subsequent.  
21970 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
21980 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c  page is being al
21990 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20  located, add an 
219a0 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69  entry to the poi
219b0 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a  nter-map.      *
219c0 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20  * for that page 
219d0 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  now. .      **. 
219e0 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20       ** If this 
219f0 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  is the first ove
21a00 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e  rflow page, then
21a10 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c   write a partial
21a20 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a   entry .      **
21a30 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
21a40 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65  map. If we write
21a50 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73   nothing to this
21a60 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f   pointer-map slo
21a70 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  t,.      ** then
21a80 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20   the optimistic 
21a90 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70  overflow chain p
21aa0 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65  rocessing in cle
21ab0 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a  arCell().      *
21ac0 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72  * may misinterpr
21ad0 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c  et the uninitial
21ae0 69 73 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20  ised values and 
21af0 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20  delete the.     
21b00 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20   ** wrong pages 
21b10 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
21b20 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
21b30 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
21b40 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c  acuum && rc==SQL
21b50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21b60 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67    u8 eType = (pg
21b70 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f  noPtrmap?PTRMAP_
21b80 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50  OVERFLOW2:PTRMAP
21b90 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20  _OVERFLOW1);.   
21ba0 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
21bb0 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66  Put(pBt, pgnoOvf
21bc0 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74  l, eType, pgnoPt
21bd0 72 6d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 69  rmap);.        i
21be0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
21bf0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
21c00 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Ovfl);.        }
21c10 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
21c20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
21c30 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
21c40 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
21c50 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
21c60 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
21c70 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f    put4byte(pPrio
21c80 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20  r, pgnoOvfl);.  
21c90 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
21ca0 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
21cb0 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20     pToRelease = 
21cc0 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72  pOvfl;.      pPr
21cd0 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61  ior = pOvfl->aDa
21ce0 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  ta;.      put4by
21cf0 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20  te(pPrior, 0);. 
21d00 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20       pPayload = 
21d10 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d  &pOvfl->aData[4]
21d20 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66  ;.      spaceLef
21d30 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  t = pBt->usableS
21d40 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20  ize - 4;.    }. 
21d50 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b     n = nPayload;
21d60 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65  .    if( n>space
21d70 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65  Left ) n = space
21d80 4c 65 66 74 3b 0a 20 20 20 20 69 66 28 20 6e 53  Left;.    if( nS
21d90 72 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66  rc>0 ){.      if
21da0 28 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e  ( n>nSrc ) n = n
21db0 53 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Src;.      asser
21dc0 74 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20  t( pSrc );.     
21dd0 20 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64   memcpy(pPayload
21de0 2c 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20  , pSrc, n);.    
21df0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d  }else{.      mem
21e00 73 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c  set(pPayload, 0,
21e10 20 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e   n);.    }.    n
21e20 50 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20  Payload -= n;.  
21e30 20 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b    pPayload += n;
21e40 0a 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a  .    pSrc += n;.
21e50 20 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20      nSrc -= n;. 
21e60 20 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20     spaceLeft -= 
21e70 6e 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d  n;.    if( nSrc=
21e80 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63  =0 ){.      nSrc
21e90 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20   = nData;.      
21ea0 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20  pSrc = pData;.  
21eb0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73    }.  }.  releas
21ec0 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
21ed0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
21ee0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
21ef0 43 68 61 6e 67 65 20 74 68 65 20 4d 65 6d 50 61  Change the MemPa
21f00 67 65 2e 70 50 61 72 65 6e 74 20 70 6f 69 6e 74  ge.pParent point
21f10 65 72 20 6f 6e 20 74 68 65 20 70 61 67 65 20 77  er on the page w
21f20 68 6f 73 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a  hose number is.*
21f30 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73  * given in the s
21f40 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 73  econd argument s
21f50 6f 20 74 68 61 74 20 4d 65 6d 50 61 67 65 2e 70  o that MemPage.p
21f60 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 74 68 65  Parent holds the
21f70 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74  .** pointer in t
21f80 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e  he third argumen
21f90 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
21fa0 66 69 6e 61 6c 20 61 72 67 75 6d 65 6e 74 2c 20  final argument, 
21fb0 75 70 64 61 74 65 50 74 72 6d 61 70 2c 20 69 73  updatePtrmap, is
21fc0 20 6e 6f 6e 2d 7a 65 72 6f 20 61 6e 64 20 74 68   non-zero and th
21fd0 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 73  e database.** is
21fe0 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
21ff0 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 74  database, then t
22000 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
22010 6e 74 72 79 20 66 6f 72 20 70 67 6e 6f 0a 2a 2a  ntry for pgno.**
22020 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a 2f 0a   is updated..*/.
22030 73 74 61 74 69 63 20 69 6e 74 20 72 65 70 61 72  static int repar
22040 65 6e 74 50 61 67 65 28 0a 20 20 42 74 53 68 61  entPage(.  BtSha
22050 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20  red *pBt,       
22060 20 20 20 20 20 20 20 20 20 2f 2a 20 42 2d 54 72           /* B-Tr
22070 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a  ee structure */.
22080 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20    Pgno pgno,    
22090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
220a0 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 6f  /* Page number o
220b0 66 20 63 68 69 6c 64 20 62 65 69 6e 67 20 61 64  f child being ad
220c0 6f 70 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61  opted */.  MemPa
220d0 67 65 20 2a 70 4e 65 77 50 61 72 65 6e 74 2c 20  ge *pNewParent, 
220e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20           /* New 
220f0 70 61 72 65 6e 74 20 6f 66 20 70 67 6e 6f 20 2a  parent of pgno *
22100 2f 0a 20 20 69 6e 74 20 69 64 78 2c 20 20 20 20  /.  int idx,    
22110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22120 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 68    /* Index of ch
22130 69 6c 64 20 70 61 67 65 20 70 67 6e 6f 20 69 6e  ild page pgno in
22140 20 70 4e 65 77 50 61 72 65 6e 74 20 2a 2f 0a 20   pNewParent */. 
22150 20 69 6e 74 20 75 70 64 61 74 65 50 74 72 6d 61   int updatePtrma
22160 70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  p              /
22170 2a 20 49 66 20 74 72 75 65 2c 20 75 70 64 61 74  * If true, updat
22180 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 66 6f  e pointer-map fo
22190 72 20 70 67 6e 6f 20 2a 2f 0a 29 7b 0a 20 20 4d  r pgno */.){.  M
221a0 65 6d 50 61 67 65 20 2a 70 54 68 69 73 3b 0a 20  emPage *pThis;. 
221b0 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67 65   DbPage *pDbPage
221c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
221d0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
221e0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
221f0 20 61 73 73 65 72 74 28 20 70 4e 65 77 50 61 72   assert( pNewPar
22200 65 6e 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ent!=0 );.  if( 
22210 70 67 6e 6f 3d 3d 30 20 29 20 72 65 74 75 72 6e  pgno==0 ) return
22220 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
22230 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
22240 72 21 3d 30 20 29 3b 0a 20 20 70 44 62 50 61 67  r!=0 );.  pDbPag
22250 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  e = sqlite3Pager
22260 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67  Lookup(pBt->pPag
22270 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
22280 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20   pDbPage ){.    
22290 70 54 68 69 73 20 3d 20 28 4d 65 6d 50 61 67 65  pThis = (MemPage
222a0 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
222b0 65 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29  etExtra(pDbPage)
222c0 3b 0a 20 20 20 20 69 66 28 20 70 54 68 69 73 2d  ;.    if( pThis-
222d0 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 20  >isInit ){.     
222e0 20 61 73 73 65 72 74 28 20 70 54 68 69 73 2d 3e   assert( pThis->
222f0 61 44 61 74 61 3d 3d 73 71 6c 69 74 65 33 50 61  aData==sqlite3Pa
22300 67 65 72 47 65 74 44 61 74 61 28 70 44 62 50 61  gerGetData(pDbPa
22310 67 65 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ge) );.      if(
22320 20 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 21   pThis->pParent!
22330 3d 70 4e 65 77 50 61 72 65 6e 74 20 29 7b 0a 20  =pNewParent ){. 
22340 20 20 20 20 20 20 20 69 66 28 20 70 54 68 69 73         if( pThis
22350 2d 3e 70 50 61 72 65 6e 74 20 29 20 73 71 6c 69  ->pParent ) sqli
22360 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 54  te3PagerUnref(pT
22370 68 69 73 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 44  his->pParent->pD
22380 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
22390 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 20 3d  pThis->pParent =
223a0 20 70 4e 65 77 50 61 72 65 6e 74 3b 0a 20 20 20   pNewParent;.   
223b0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
223c0 72 52 65 66 28 70 4e 65 77 50 61 72 65 6e 74 2d  rRef(pNewParent-
223d0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
223e0 20 7d 0a 20 20 20 20 20 20 70 54 68 69 73 2d 3e   }.      pThis->
223f0 69 64 78 50 61 72 65 6e 74 20 3d 20 69 64 78 3b  idxParent = idx;
22400 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
22410 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62  e3PagerUnref(pDb
22420 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  Page);.  }..  if
22430 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 26  ( ISAUTOVACUUM &
22440 26 20 75 70 64 61 74 65 50 74 72 6d 61 70 20 29  & updatePtrmap )
22450 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 74 72  {.    return ptr
22460 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
22470 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
22480 70 4e 65 77 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  pNewParent->pgno
22490 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
224a0 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20 74  NDEBUG.  /* If t
224b0 68 65 20 75 70 64 61 74 65 50 74 72 6d 61 70 20  he updatePtrmap 
224c0 66 6c 61 67 20 77 61 73 20 63 6c 65 61 72 2c 20  flag was clear, 
224d0 61 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20  assert that the 
224e0 65 6e 74 72 79 20 69 6e 20 74 68 65 0a 20 20 2a  entry in the.  *
224f0 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 69 73  * pointer-map is
22500 20 61 6c 72 65 61 64 79 20 63 6f 72 72 65 63 74   already correct
22510 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41  ..  */.  if( ISA
22520 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
22530 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50   u8 eType;.    P
22540 67 6e 6f 20 69 69 3b 0a 20 20 20 20 70 74 72 6d  gno ii;.    ptrm
22550 61 70 47 65 74 28 70 42 74 2c 20 70 67 6e 6f 2c  apGet(pBt, pgno,
22560 20 26 65 54 79 70 65 2c 20 26 69 69 29 3b 0a 20   &eType, &ii);. 
22570 20 20 20 61 73 73 65 72 74 28 20 69 69 3d 3d 70     assert( ii==p
22580 4e 65 77 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 20  NewParent->pgno 
22590 26 26 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  && eType==PTRMAP
225a0 5f 42 54 52 45 45 20 29 3b 0a 20 20 7d 0a 23 65  _BTREE );.  }.#e
225b0 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 53  ndif..  return S
225c0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f  QLITE_OK;.}..../
225d0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
225e0 70 50 61 72 65 6e 74 20 70 6f 69 6e 74 65 72 20  pParent pointer 
225f0 6f 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  of all children 
22600 6f 66 20 70 50 61 67 65 20 74 6f 20 70 6f 69 6e  of pPage to poin
22610 74 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 70 50 61  t back.** to pPa
22620 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68  ge..**.** In oth
22630 65 72 20 77 6f 72 64 73 2c 20 66 6f 72 20 65 76  er words, for ev
22640 65 72 79 20 63 68 69 6c 64 20 6f 66 20 70 50 61  ery child of pPa
22650 67 65 2c 20 69 6e 76 6f 6b 65 20 72 65 70 61 72  ge, invoke repar
22660 65 6e 74 50 61 67 65 28 29 0a 2a 2a 20 74 6f 20  entPage().** to 
22670 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 65  make sure that e
22680 61 63 68 20 63 68 69 6c 64 20 6b 6e 6f 77 73 20  ach child knows 
22690 74 68 61 74 20 70 50 61 67 65 20 69 73 20 69 74  that pPage is it
226a0 73 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  s parent..**.** 
226b0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74  This routine get
226c0 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 79  s called after y
226d0 6f 75 20 6d 65 6d 63 70 79 28 29 20 6f 6e 65 20  ou memcpy() one 
226e0 70 61 67 65 20 69 6e 74 6f 0a 2a 2a 20 61 6e 6f  page into.** ano
226f0 74 68 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75  ther..**.** If u
22700 70 64 61 74 65 50 74 72 6d 61 70 20 69 73 20 74  pdatePtrmap is t
22710 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 70 6f  rue, then the po
22720 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65  inter-map entrie
22730 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 0a  s for all child.
22740 2a 2a 20 70 61 67 65 73 20 6f 66 20 70 50 61 67  ** pages of pPag
22750 65 20 61 72 65 20 75 70 64 61 74 65 64 2e 0a 2a  e are updated..*
22760 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 70  /.static int rep
22770 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28  arentChildPages(
22780 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
22790 69 6e 74 20 75 70 64 61 74 65 50 74 72 6d 61 70  int updatePtrmap
227a0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
227b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
227c0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
227d0 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
227e0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
227f0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
22800 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
22810 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
22820 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 20   pPage->pBt;.   
22830 20 50 67 6e 6f 20 69 52 69 67 68 74 20 3d 20 67   Pgno iRight = g
22840 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
22850 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
22860 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 0a 20 20 20  Offset+8]);..   
22870 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67   for(i=0; i<pPag
22880 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a  e->nCell; i++){.
22890 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20        u8 *pCell 
228a0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
228b0 2c 20 69 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  , i);.      rc =
228c0 20 72 65 70 61 72 65 6e 74 50 61 67 65 28 70 42   reparentPage(pB
228d0 74 2c 20 67 65 74 34 62 79 74 65 28 70 43 65 6c  t, get4byte(pCel
228e0 6c 29 2c 20 70 50 61 67 65 2c 20 69 2c 20 75 70  l), pPage, i, up
228f0 64 61 74 65 50 74 72 6d 61 70 29 3b 0a 20 20 20  datePtrmap);.   
22900 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
22910 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
22920 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
22930 20 72 65 70 61 72 65 6e 74 50 61 67 65 28 70 42   reparentPage(pB
22940 74 2c 20 69 52 69 67 68 74 2c 20 70 50 61 67 65  t, iRight, pPage
22950 2c 20 69 2c 20 75 70 64 61 74 65 50 74 72 6d 61  , i, updatePtrma
22960 70 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69  p);.    pPage->i
22970 64 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 7d  dxShift = 0;.  }
22980 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
22990 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68  ./*.** Remove th
229a0 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d  e i-th cell from
229b0 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f   pPage.  This ro
229c0 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50  utine effects pP
229d0 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65  age only..** The
229e0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73   cell content is
229f0 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65   not freed or de
22a00 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69  allocated.  It i
22a10 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a  s assumed that.*
22a20 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  * the cell conte
22a30 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69  nt has been copi
22a40 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73  ed someplace els
22a50 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
22a60 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73   just.** removes
22a70 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74   the reference t
22a80 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20  o the cell from 
22a90 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a  pPage..**.** "sz
22aa0 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75  " must be the nu
22ab0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
22ac0 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74   the cell..*/.st
22ad0 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65  atic void dropCe
22ae0 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
22af0 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20  e, int idx, int 
22b00 73 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  sz){.  int i;   
22b10 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
22b20 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
22b30 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  pc;         /* O
22b40 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f  ffset to cell co
22b50 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65  ntent of cell be
22b60 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20  ing deleted */. 
22b70 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
22b80 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61   /* pPage->aData
22b90 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20   */.  u8 *ptr;  
22ba0 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
22bb0 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75   move bytes arou
22bc0 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d  nd within data[]
22bd0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69   */..  assert( i
22be0 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61  dx>=0 && idx<pPa
22bf0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61  ge->nCell );.  a
22c00 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53  ssert( sz==cellS
22c10 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20  ize(pPage, idx) 
22c20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
22c30 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
22c40 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
22c50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
22c60 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
22c70 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
22c80 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74  >mutex) );.  dat
22c90 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
22ca0 3b 0a 20 20 70 74 72 20 3d 20 26 64 61 74 61 5b  ;.  ptr = &data[
22cb0 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65  pPage->cellOffse
22cc0 74 20 2b 20 32 2a 69 64 78 5d 3b 0a 20 20 70 63  t + 2*idx];.  pc
22cd0 20 3d 20 67 65 74 32 62 79 74 65 28 70 74 72 29   = get2byte(ptr)
22ce0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 63 3e 31  ;.  assert( pc>1
22cf0 30 20 26 26 20 70 63 2b 73 7a 3c 3d 70 50 61 67  0 && pc+sz<=pPag
22d00 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
22d10 7a 65 20 29 3b 0a 20 20 66 72 65 65 53 70 61 63  ze );.  freeSpac
22d20 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29  e(pPage, pc, sz)
22d30 3b 0a 20 20 66 6f 72 28 69 3d 69 64 78 2b 31 3b  ;.  for(i=idx+1;
22d40 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   i<pPage->nCell;
22d50 20 69 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b 0a 20   i++, ptr+=2){. 
22d60 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b     ptr[0] = ptr[
22d70 32 5d 3b 0a 20 20 20 20 70 74 72 5b 31 5d 20 3d  2];.    ptr[1] =
22d80 20 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20 20 70   ptr[3];.  }.  p
22d90 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20  Page->nCell--;. 
22da0 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
22db0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
22dc0 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  +3], pPage->nCel
22dd0 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72  l);.  pPage->nFr
22de0 65 65 20 2b 3d 20 32 3b 0a 20 20 70 50 61 67 65  ee += 2;.  pPage
22df0 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 31 3b 0a  ->idxShift = 1;.
22e00 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
22e10 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50  a new cell on pP
22e20 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65  age at cell inde
22e30 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f  x "i".  pCell po
22e40 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63  ints to the.** c
22e50 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65  ontent of the ce
22e60 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ll..**.** If the
22e70 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69   cell content wi
22e80 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61  ll fit on the pa
22e90 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20  ge, then put it 
22ea0 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a  there.  If it.**
22eb0 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74   will not fit, t
22ec0 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  hen make a copy 
22ed0 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
22ee0 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69  ent into pTemp i
22ef0 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f  f.** pTemp is no
22f00 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c  t null.  Regardl
22f10 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c  ess of pTemp, al
22f20 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74  locate a new ent
22f30 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e  ry.** in pPage->
22f40 61 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65  aOvfl[] and make
22f50 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   it point to the
22f60 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65   cell content (e
22f70 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d  ither.** in pTem
22f80 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61  p or the origina
22f90 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73  l pCell) and als
22fa0 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64  o record its ind
22fb0 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69  ex. .** Allocati
22fc0 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69  ng a new entry i
22fd0 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d  n pPage->aCell[]
22fe0 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a   implies that .*
22ff0 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  * pPage->nOverfl
23000 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  ow is incremente
23010 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69  d..**.** If nSki
23020 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  p is non-zero, t
23030 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20  hen do not copy 
23040 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20  the first nSkip 
23050 62 79 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20  bytes of the.** 
23060 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72  cell. The caller
23070 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20   will overwrite 
23080 74 68 65 6d 20 61 66 74 65 72 20 74 68 69 73 20  them after this 
23090 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
230a0 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73  . If.** nSkip is
230b0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
230c0 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f  pCell may not po
230d0 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69  int to an invali
230e0 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  d memory locatio
230f0 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c  n .** (but pCell
23100 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77 61 79 73  +nSkip is always
23110 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74   valid)..*/.stat
23120 69 63 20 69 6e 74 20 69 6e 73 65 72 74 43 65 6c  ic int insertCel
23130 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
23140 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69  age,   /* Page i
23150 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65  nto which we are
23160 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e   copying */.  in
23170 74 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20  t i,            
23180 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f  /* New cell beco
23190 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c  mes the i-th cel
231a0 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  l of the page */
231b0 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
231c0 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20       /* Content 
231d0 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20  of the new cell 
231e0 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20  */.  int sz,    
231f0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
23200 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43  of content in pC
23210 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65  ell */.  u8 *pTe
23220 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65  mp,        /* Te
23230 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61 63 65  mp storage space
23240 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e   for pCell, if n
23250 65 65 64 65 64 20 2a 2f 0a 20 20 75 38 20 6e 53  eeded */.  u8 nS
23260 6b 69 70 20 20 20 20 20 20 20 20 20 20 2f 2a 20  kip          /* 
23270 44 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65  Do not write the
23280 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74   first nSkip byt
23290 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a  es of the cell *
232a0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 3b 20  /.){.  int idx; 
232b0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72           /* Wher
232c0 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63  e to write new c
232d0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64  ell content in d
232e0 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a  ata[] */.  int j
232f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
23300 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
23310 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20    int top;      
23320 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
23330 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 66 6f 72  e of content for
23340 20 61 6e 79 20 63 65 6c 6c 20 69 6e 20 64 61 74   any cell in dat
23350 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64  a[] */.  int end
23360 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
23370 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
23380 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e  e last cell poin
23390 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ter in data[] */
233a0 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20  .  int ins;     
233b0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
233c0 20 64 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65   data[] where ne
233d0 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  w cell pointer i
233e0 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20  s inserted */.  
233f0 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
23400 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
23410 20 64 61 74 61 5b 5d 20 6f 66 20 74 68 65 20 70   data[] of the p
23420 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  age header */.  
23430 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  int cellOffset; 
23440 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
23450 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74  first cell point
23460 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  er in data[] */.
23470 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
23480 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65      /* The conte
23490 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20  nt of the whole 
234a0 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74  page */.  u8 *pt
234b0 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  r;          /* U
234c0 73 65 64 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69  sed for moving i
234d0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e  nformation aroun
234e0 64 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a  d in data[] */..
234f0 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
23500 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  & i<=pPage->nCel
23510 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  l+pPage->nOverfl
23520 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ow );.  assert( 
23530 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28  sz==cellSizePtr(
23540 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 29 3b  pPage, pCell) );
23550 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
23560 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
23570 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
23580 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
23590 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a  >nOverflow || sz
235a0 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  +2>pPage->nFree 
235b0 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70  ){.    if( pTemp
235c0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
235d0 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43  (pTemp+nSkip, pC
235e0 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53  ell+nSkip, sz-nS
235f0 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43 65 6c  kip);.      pCel
23600 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d  l = pTemp;.    }
23610 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e  .    j = pPage->
23620 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20  nOverflow++;.   
23630 20 61 73 73 65 72 74 28 20 6a 3c 73 69 7a 65 6f   assert( j<sizeo
23640 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 2f  f(pPage->aOvfl)/
23650 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f  sizeof(pPage->aO
23660 76 66 6c 5b 30 5d 29 20 29 3b 0a 20 20 20 20 70  vfl[0]) );.    p
23670 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70  Page->aOvfl[j].p
23680 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20  Cell = pCell;.  
23690 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a    pPage->aOvfl[j
236a0 5d 2e 69 64 78 20 3d 20 69 3b 0a 20 20 20 20 70  ].idx = i;.    p
236b0 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 30 3b  Page->nFree = 0;
236c0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
236d0 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  t rc = sqlite3Pa
236e0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
236f0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
23700 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23710 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
23720 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  rc;.    }.    as
23730 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
23740 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
23750 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  age->pDbPage) );
23760 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67  .    data = pPag
23770 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 68 64  e->aData;.    hd
23780 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
23790 66 73 65 74 3b 0a 20 20 20 20 74 6f 70 20 3d 20  fset;.    top = 
237a0 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
237b0 64 72 2b 35 5d 29 3b 0a 20 20 20 20 63 65 6c 6c  dr+5]);.    cell
237c0 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
237d0 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20  cellOffset;.    
237e0 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74  end = cellOffset
237f0 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c   + 2*pPage->nCel
23800 6c 20 2b 20 32 3b 0a 20 20 20 20 69 6e 73 20 3d  l + 2;.    ins =
23810 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
23820 69 3b 0a 20 20 20 20 69 66 28 20 65 6e 64 20 3e  i;.    if( end >
23830 20 74 6f 70 20 2d 20 73 7a 20 29 7b 0a 20 20 20   top - sz ){.   
23840 20 20 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67     defragmentPag
23850 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
23860 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28 26  top = get2byte(&
23870 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
23880 20 20 20 20 61 73 73 65 72 74 28 20 65 6e 64 20      assert( end 
23890 2b 20 73 7a 20 3c 3d 20 74 6f 70 20 29 3b 0a 20  + sz <= top );. 
238a0 20 20 20 7d 0a 20 20 20 20 69 64 78 20 3d 20 61     }.    idx = a
238b0 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61  llocateSpace(pPa
238c0 67 65 2c 20 73 7a 29 3b 0a 20 20 20 20 61 73 73  ge, sz);.    ass
238d0 65 72 74 28 20 69 64 78 3e 30 20 29 3b 0a 20 20  ert( idx>0 );.  
238e0 20 20 61 73 73 65 72 74 28 20 65 6e 64 20 3c 3d    assert( end <=
238f0 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
23900 68 64 72 2b 35 5d 29 20 29 3b 0a 20 20 20 20 70  hdr+5]) );.    p
23910 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20  Page->nCell++;. 
23920 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
23930 2d 3d 20 32 3b 0a 20 20 20 20 6d 65 6d 63 70 79  -= 2;.    memcpy
23940 28 26 64 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70  (&data[idx+nSkip
23950 5d 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20  ], pCell+nSkip, 
23960 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 66  sz-nSkip);.    f
23970 6f 72 28 6a 3d 65 6e 64 2d 32 2c 20 70 74 72 3d  or(j=end-2, ptr=
23980 26 64 61 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b  &data[j]; j>ins;
23990 20 6a 2d 3d 32 2c 20 70 74 72 2d 3d 32 29 7b 0a   j-=2, ptr-=2){.
239a0 20 20 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70        ptr[0] = p
239b0 74 72 5b 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74  tr[-2];.      pt
239c0 72 5b 31 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a  r[1] = ptr[-1];.
239d0 20 20 20 20 7d 0a 20 20 20 20 70 75 74 32 62 79      }.    put2by
239e0 74 65 28 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69  te(&data[ins], i
239f0 64 78 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74  dx);.    put2byt
23a00 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20  e(&data[hdr+3], 
23a10 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20  pPage->nCell);. 
23a20 20 20 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69     pPage->idxShi
23a30 66 74 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20  ft = 1;.#ifndef 
23a40 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
23a50 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
23a60 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56  Page->pBt->autoV
23a70 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f  acuum ){.      /
23a80 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63  * The cell may c
23a90 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72  ontain a pointer
23aa0 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
23ab0 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69  page. If so, wri
23ac0 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  te.      ** the 
23ad0 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76  entry for the ov
23ae0 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f  erflow page into
23af0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
23b00 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
23b10 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
23b20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
23b30 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
23b40 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
23b50 66 6f 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  fo);.      asser
23b60 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28  t( (info.nData+(
23b70 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a  pPage->intKey?0:
23b80 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66  info.nKey))==inf
23b90 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20  o.nPayload );.  
23ba0 20 20 20 20 69 66 28 20 28 69 6e 66 6f 2e 6e 44      if( (info.nD
23bb0 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ata+(pPage->intK
23bc0 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29  ey?0:info.nKey))
23bd0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
23be0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e          Pgno pgn
23bf0 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65  oOvfl = get4byte
23c00 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
23c10 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20  erflow]);.      
23c20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
23c30 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 67 6e  (pPage->pBt, pgn
23c40 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56  oOvfl, PTRMAP_OV
23c50 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e  ERFLOW1, pPage->
23c60 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  pgno);.        i
23c70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
23c80 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
23c90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
23ca0 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  if.  }..  return
23cb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
23cc0 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69 73 74 20  *.** Add a list 
23cd0 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 20 70 61  of cells to a pa
23ce0 67 65 2e 20 20 54 68 65 20 70 61 67 65 20 73 68  ge.  The page sh
23cf0 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 6c  ould be initiall
23d00 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54 68 65 20  y empty..** The 
23d10 63 65 6c 6c 73 20 61 72 65 20 67 75 61 72 61 6e  cells are guaran
23d20 74 65 65 64 20 74 6f 20 66 69 74 20 6f 6e 20 74  teed to fit on t
23d30 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
23d40 69 63 20 76 6f 69 64 20 61 73 73 65 6d 62 6c 65  ic void assemble
23d50 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20  Page(.  MemPage 
23d60 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 54 68 65  *pPage,   /* The
23d70 20 70 61 67 65 20 74 6f 20 62 65 20 61 73 73 65   page to be asse
23d80 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20  mblied */.  int 
23d90 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a  nCell,        /*
23da0 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   The number of c
23db0 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f 20 74  ells to add to t
23dc0 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  his page */.  u8
23dd0 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20   **apCell,      
23de0 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f 20 63  /* Pointers to c
23df0 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f 0a 20 20  ell bodies */.  
23e00 75 31 36 20 2a 61 53 69 7a 65 20 20 20 20 20 20  u16 *aSize      
23e10 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 74 68    /* Sizes of th
23e20 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20  e cells */.){.  
23e30 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
23e40 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
23e50 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 74 61 6c  r */.  int total
23e60 53 69 7a 65 3b 20 20 20 20 2f 2a 20 54 6f 74 61  Size;    /* Tota
23e70 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65  l size of all ce
23e80 6c 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72  lls */.  int hdr
23e90 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  ;          /* In
23ea0 64 65 78 20 6f 66 20 70 61 67 65 20 68 65 61 64  dex of page head
23eb0 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  er */.  int cell
23ec0 70 74 72 3b 20 20 20 20 20 20 2f 2a 20 41 64 64  ptr;      /* Add
23ed0 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c  ress of next cel
23ee0 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69  l pointer */.  i
23ef0 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20 20  nt cellbody;    
23f00 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e   /* Address of n
23f10 65 78 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a 2f  ext cell body */
23f20 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
23f30 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72       /* Data for
23f40 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 0a 20 20   the page */..  
23f50 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
23f60 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20  Overflow==0 );. 
23f70 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
23f80 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
23f90 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
23fa0 3b 0a 20 20 74 6f 74 61 6c 53 69 7a 65 20 3d 20  ;.  totalSize = 
23fb0 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
23fc0 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
23fd0 20 74 6f 74 61 6c 53 69 7a 65 20 2b 3d 20 61 53   totalSize += aS
23fe0 69 7a 65 5b 69 5d 3b 0a 20 20 7d 0a 20 20 61 73  ize[i];.  }.  as
23ff0 73 65 72 74 28 20 74 6f 74 61 6c 53 69 7a 65 2b  sert( totalSize+
24000 32 2a 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e  2*nCell<=pPage->
24010 6e 46 72 65 65 20 29 3b 0a 20 20 61 73 73 65 72  nFree );.  asser
24020 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  t( pPage->nCell=
24030 3d 30 20 29 3b 0a 20 20 63 65 6c 6c 70 74 72 20  =0 );.  cellptr 
24040 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  = pPage->cellOff
24050 73 65 74 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  set;.  data = pP
24060 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64  age->aData;.  hd
24070 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
24080 66 73 65 74 3b 0a 20 20 70 75 74 32 62 79 74 65  fset;.  put2byte
24090 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e  (&data[hdr+3], n
240a0 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20 6e 43 65  Cell);.  if( nCe
240b0 6c 6c 20 29 7b 0a 20 20 20 20 63 65 6c 6c 62 6f  ll ){.    cellbo
240c0 64 79 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61  dy = allocateSpa
240d0 63 65 28 70 50 61 67 65 2c 20 74 6f 74 61 6c 53  ce(pPage, totalS
240e0 69 7a 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ize);.    assert
240f0 28 20 63 65 6c 6c 62 6f 64 79 3e 30 20 29 3b 0a  ( cellbody>0 );.
24100 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
24110 65 2d 3e 6e 46 72 65 65 20 3e 3d 20 32 2a 6e 43  e->nFree >= 2*nC
24120 65 6c 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ell );.    pPage
24130 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 2a 6e 43 65  ->nFree -= 2*nCe
24140 6c 6c 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  ll;.    for(i=0;
24150 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
24160 20 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26        put2byte(&
24170 64 61 74 61 5b 63 65 6c 6c 70 74 72 5d 2c 20 63  data[cellptr], c
24180 65 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 20 20  ellbody);.      
24190 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 63 65 6c  memcpy(&data[cel
241a0 6c 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69  lbody], apCell[i
241b0 5d 2c 20 61 53 69 7a 65 5b 69 5d 29 3b 0a 20 20  ], aSize[i]);.  
241c0 20 20 20 20 63 65 6c 6c 70 74 72 20 2b 3d 20 32      cellptr += 2
241d0 3b 0a 20 20 20 20 20 20 63 65 6c 6c 62 6f 64 79  ;.      cellbody
241e0 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20   += aSize[i];.  
241f0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
24200 63 65 6c 6c 62 6f 64 79 3d 3d 70 50 61 67 65 2d  cellbody==pPage-
24210 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
24220 20 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d   );.  }.  pPage-
24230 3e 6e 43 65 6c 6c 20 3d 20 6e 43 65 6c 6c 3b 0a  >nCell = nCell;.
24240 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  }../*.** The fol
24250 6c 6f 77 69 6e 67 20 70 61 72 61 6d 65 74 65 72  lowing parameter
24260 73 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 20  s determine how 
24270 6d 61 6e 79 20 61 64 6a 61 63 65 6e 74 20 70 61  many adjacent pa
24280 67 65 73 20 67 65 74 20 69 6e 76 6f 6c 76 65 64  ges get involved
24290 0a 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63 69  .** in a balanci
242a0 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e  ng operation.  N
242b0 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
242c0 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20  of neighbors on 
242d0 65 69 74 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f  either side.** o
242e0 66 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  f the page that 
242f0 70 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74  participate in t
24300 68 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65  he balancing ope
24310 72 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74  ration.  NB is t
24320 68 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62  he.** total numb
24330 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  er of pages that
24340 20 70 61 72 74 69 63 69 70 61 74 65 2c 20 69 6e   participate, in
24350 63 6c 75 64 69 6e 67 20 74 68 65 20 74 61 72 67  cluding the targ
24360 65 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e  et page and.** N
24370 4e 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65  N neighbors on e
24380 69 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a  ither side..**.*
24390 2a 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61  * The minimum va
243a0 6c 75 65 20 6f 66 20 4e 4e 20 69 73 20 31 20 28  lue of NN is 1 (
243b0 6f 66 20 63 6f 75 72 73 65 29 2e 20 20 49 6e 63  of course).  Inc
243c0 72 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65  reasing NN above
243d0 20 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33   1.** (to 2 or 3
243e0 29 20 67 69 76 65 73 20 61 20 6d 6f 64 65 73 74  ) gives a modest
243f0 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20   improvement in 
24400 53 45 4c 45 43 54 20 61 6e 64 20 44 45 4c 45 54  SELECT and DELET
24410 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a  E performance.**
24420 20 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72   in exchange for
24430 20 61 20 6c 61 72 67 65 72 20 64 65 67 72 61 64   a larger degrad
24440 61 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20  ation in INSERT 
24450 61 6e 64 20 55 50 44 41 54 45 20 70 65 72 66 6f  and UPDATE perfo
24460 72 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76  rmance..** The v
24470 61 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70 65 61  alue of NN appea
24480 72 73 20 74 6f 20 67 69 76 65 20 74 68 65 20 62  rs to give the b
24490 65 73 74 20 72 65 73 75 6c 74 73 20 6f 76 65 72  est results over
244a0 61 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  all..*/.#define 
244b0 4e 4e 20 31 20 20 20 20 20 20 20 20 20 20 20 20  NN 1            
244c0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65   /* Number of ne
244d0 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65  ighbors on eithe
244e0 72 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 20  r side of pPage 
244f0 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20 28 4e  */.#define NB (N
24500 4e 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a 20 54  N*2+1)      /* T
24510 6f 74 61 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c  otal pages invol
24520 76 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  ved in the balan
24530 63 65 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72  ce */../* Forwar
24540 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
24550 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
24560 65 28 4d 65 6d 50 61 67 65 2a 2c 20 69 6e 74 29  e(MemPage*, int)
24570 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
24580 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
24590 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76  NCE./*.** This v
245a0 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63  ersion of balanc
245b0 65 28 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20  e() handles the 
245c0 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63  common special c
245d0 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e  ase where.** a n
245e0 65 77 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e  ew entry is bein
245f0 67 20 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68  g inserted on th
24600 65 20 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d  e extreme right-
24610 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72  end of the.** tr
24620 65 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72  ee, in other wor
24630 64 73 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77  ds, when the new
24640 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f   entry will beco
24650 6d 65 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a  me the largest.*
24660 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  * entry in the t
24670 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65  ree..**.** Inste
24680 61 64 20 6f 66 20 74 72 79 69 6e 67 20 62 61 6c  ad of trying bal
24690 61 6e 63 65 20 74 68 65 20 33 20 72 69 67 68 74  ance the 3 right
246a0 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73  -most leaf pages
246b0 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20  , just add.** a 
246c0 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 20  new page to the 
246d0 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
246e0 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20  and put the one 
246f0 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20  new entry in.** 
24700 74 68 61 74 20 70 61 67 65 2e 20 20 54 68 69 73  that page.  This
24710 20 6c 65 61 76 65 73 20 74 68 65 20 72 69 67 68   leaves the righ
24720 74 20 73 69 64 65 20 6f 66 20 74 68 65 20 74 72  t side of the tr
24730 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75  ee somewhat.** u
24740 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20  nbalanced.  But 
24750 6f 64 64 73 20 61 72 65 20 74 68 61 74 20 77 65  odds are that we
24760 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69   will be inserti
24770 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a  ng new entries.*
24780 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f  * at the end soo
24790 6e 20 61 66 74 65 72 77 61 72 64 73 20 73 6f 20  n afterwards so 
247a0 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79  the nearly empty
247b0 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b   page will quick
247c0 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20  ly.** fill up.  
247d0 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a  On average..**.*
247e0 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20 6c  * pPage is the l
247f0 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20 69  eaf page which i
24800 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
24810 20 70 61 67 65 20 69 6e 20 74 68 65 20 74 72 65   page in the tre
24820 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73  e..** pParent is
24830 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50   its parent.  pP
24840 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 20  age must have a 
24850 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20  single overflow 
24860 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69  entry.** which i
24870 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74  s also the right
24880 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74  -most entry on t
24890 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
248a0 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71  ic int balance_q
248b0 75 69 63 6b 28 4d 65 6d 50 61 67 65 20 2a 70 50  uick(MemPage *pP
248c0 61 67 65 2c 20 4d 65 6d 50 61 67 65 20 2a 70 50  age, MemPage *pP
248d0 61 72 65 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63  arent){.  int rc
248e0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65  ;.  MemPage *pNe
248f0 77 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65  w;.  Pgno pgnoNe
24900 77 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a  w;.  u8 *pCell;.
24910 20 20 75 31 36 20 73 7a 43 65 6c 6c 3b 0a 20 20    u16 szCell;.  
24920 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
24930 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
24940 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69   pPage->pBt;.  i
24950 6e 74 20 70 61 72 65 6e 74 49 64 78 20 3d 20 70  nt parentIdx = p
24960 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 20  Parent->nCell;  
24970 20 2f 2a 20 70 50 61 72 65 6e 74 20 6e 65 77 20   /* pParent new 
24980 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 64  divider cell ind
24990 65 78 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65  ex */.  int pare
249a0 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  ntSize;         
249b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
249c0 65 20 6f 66 20 6e 65 77 20 64 69 76 69 64 65 72  e of new divider
249d0 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 70 61   cell */.  u8 pa
249e0 72 65 6e 74 43 65 6c 6c 5b 36 34 5d 3b 20 20 20  rentCell[64];   
249f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24a00 53 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65  Space for the ne
24a10 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a  w divider cell *
24a20 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
24a30 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
24a40 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
24a50 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  x) );..  /* Allo
24a60 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 2e  cate a new page.
24a70 20 49 6e 73 65 72 74 20 74 68 65 20 6f 76 65 72   Insert the over
24a80 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70  flow cell from p
24a90 50 61 67 65 0a 20 20 2a 2a 20 69 6e 74 6f 20 69  Page.  ** into i
24aa0 74 2e 20 54 68 65 6e 20 72 65 6d 6f 76 65 20 74  t. Then remove t
24ab0 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  he overflow cell
24ac0 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 20 20 2a   from pPage..  *
24ad0 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74  /.  rc = allocat
24ae0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
24af0 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c  &pNew, &pgnoNew,
24b00 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63   0, 0);.  if( rc
24b10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
24b20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
24b30 7d 0a 20 20 70 43 65 6c 6c 20 3d 20 70 50 61 67  }.  pCell = pPag
24b40 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c  e->aOvfl[0].pCel
24b50 6c 3b 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 63 65  l;.  szCell = ce
24b60 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
24b70 20 70 43 65 6c 6c 29 3b 0a 20 20 7a 65 72 6f 50   pCell);.  zeroP
24b80 61 67 65 28 70 4e 65 77 2c 20 70 50 61 67 65 2d  age(pNew, pPage-
24b90 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 61 73  >aData[0]);.  as
24ba0 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c  semblePage(pNew,
24bb0 20 31 2c 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43   1, &pCell, &szC
24bc0 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ell);.  pPage->n
24bd0 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20  Overflow = 0;.. 
24be0 20 2f 2a 20 53 65 74 20 74 68 65 20 70 61 72 65   /* Set the pare
24bf0 6e 74 20 6f 66 20 74 68 65 20 6e 65 77 6c 79 20  nt of the newly 
24c00 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 74  allocated page t
24c10 6f 20 70 50 61 72 65 6e 74 2e 20 2a 2f 0a 20 20  o pParent. */.  
24c20 70 4e 65 77 2d 3e 70 50 61 72 65 6e 74 20 3d 20  pNew->pParent = 
24c30 70 50 61 72 65 6e 74 3b 0a 20 20 73 71 6c 69 74  pParent;.  sqlit
24c40 65 33 50 61 67 65 72 52 65 66 28 70 50 61 72 65  e3PagerRef(pPare
24c50 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 0a 20  nt->pDbPage);.. 
24c60 20 2f 2a 20 70 50 61 67 65 20 69 73 20 63 75 72   /* pPage is cur
24c70 72 65 6e 74 6c 79 20 74 68 65 20 72 69 67 68 74  rently the right
24c80 2d 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e  -child of pParen
24c90 74 2e 20 43 68 61 6e 67 65 20 74 68 69 73 0a 20  t. Change this. 
24ca0 20 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20   ** so that the 
24cb0 72 69 67 68 74 2d 63 68 69 6c 64 20 69 73 20 74  right-child is t
24cc0 68 65 20 6e 65 77 20 70 61 67 65 20 61 6c 6c 6f  he new page allo
24cd0 63 61 74 65 64 20 61 62 6f 76 65 20 61 6e 64 0a  cated above and.
24ce0 20 20 2a 2a 20 70 50 61 67 65 20 69 73 20 74 68    ** pPage is th
24cf0 65 20 6e 65 78 74 2d 74 6f 2d 72 69 67 68 74 20  e next-to-right 
24d00 63 68 69 6c 64 2e 20 0a 20 20 2a 2a 0a 20 20 2a  child. .  **.  *
24d10 2a 20 49 67 6e 6f 72 65 20 74 68 65 20 72 65 74  * Ignore the ret
24d20 75 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 65  urn value of the
24d30 20 63 61 6c 6c 20 74 6f 20 66 69 6c 6c 49 6e 43   call to fillInC
24d40 65 6c 6c 28 29 2e 20 66 69 6c 6c 49 6e 43 65 6c  ell(). fillInCel
24d50 6c 28 29 0a 20 20 2a 2a 20 6d 61 79 20 6f 6e 6c  l().  ** may onl
24d60 79 20 72 65 74 75 72 6e 20 6f 74 68 65 72 20 74  y return other t
24d70 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  han SQLITE_OK if
24d80 20 69 74 20 69 73 20 72 65 71 75 69 72 65 64 20   it is required 
24d90 74 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a  to allocate.  **
24da0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65   one or more ove
24db0 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 53 69 6e  rflow pages. Sin
24dc0 63 65 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74  ce an internal t
24dd0 61 62 6c 65 20 42 2d 54 72 65 65 20 63 65 6c 6c  able B-Tree cell
24de0 20 0a 20 20 2a 2a 20 6d 61 79 20 6e 65 76 65 72   .  ** may never
24df0 20 73 70 69 6c 6c 20 6f 76 65 72 20 6f 6e 74 6f   spill over onto
24e00 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
24e10 65 20 28 69 74 20 69 73 20 61 20 6d 61 78 69 6d  e (it is a maxim
24e20 75 6d 20 6f 66 20 0a 20 20 2a 2a 20 31 33 20 62  um of .  ** 13 b
24e30 79 74 65 73 20 69 6e 20 73 69 7a 65 29 2c 20 69  ytes in size), i
24e40 74 20 69 73 20 6e 6f 74 20 6e 65 63 63 65 73 73  t is not neccess
24e50 61 72 79 20 74 6f 20 63 68 65 63 6b 20 74 68 65  ary to check the
24e60 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 0a 20 20   return code..  
24e70 2a 2a 0a 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c  **.  ** Similarl
24e80 79 2c 20 74 68 65 20 69 6e 73 65 72 74 43 65 6c  y, the insertCel
24e90 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e  l() function can
24ea0 6e 6f 74 20 66 61 69 6c 20 69 66 20 74 68 65 20  not fail if the 
24eb0 70 61 67 65 0a 20 20 2a 2a 20 62 65 69 6e 67 20  page.  ** being 
24ec0 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 69 73  inserted into is
24ed0 20 61 6c 72 65 61 64 79 20 77 72 69 74 61 62 6c   already writabl
24ee0 65 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 20 64  e and the cell d
24ef0 6f 65 73 20 6e 6f 74 20 0a 20 20 2a 2a 20 63 6f  oes not .  ** co
24f00 6e 74 61 69 6e 20 61 6e 20 6f 76 65 72 66 6c 6f  ntain an overflo
24f10 77 20 70 6f 69 6e 74 65 72 2e 20 53 6f 20 69 67  w pointer. So ig
24f20 6e 6f 72 65 20 74 68 69 73 20 72 65 74 75 72 6e  nore this return
24f30 20 63 6f 64 65 20 74 6f 6f 2e 0a 20 20 2a 2f 0a   code too..  */.
24f40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
24f50 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 70 43  >nCell>0 );.  pC
24f60 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
24f70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65  Page, pPage->nCe
24f80 6c 6c 2d 31 29 3b 0a 20 20 73 71 6c 69 74 65 33  ll-1);.  sqlite3
24f90 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
24fa0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
24fb0 26 69 6e 66 6f 29 3b 0a 20 20 66 69 6c 6c 49 6e  &info);.  fillIn
24fc0 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 61  Cell(pParent, pa
24fd0 72 65 6e 74 43 65 6c 6c 2c 20 30 2c 20 69 6e 66  rentCell, 0, inf
24fe0 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 30 2c  o.nKey, 0, 0, 0,
24ff0 20 26 70 61 72 65 6e 74 53 69 7a 65 29 3b 0a 20   &parentSize);. 
25000 20 61 73 73 65 72 74 28 20 70 61 72 65 6e 74 53   assert( parentS
25010 69 7a 65 3c 36 34 20 29 3b 0a 20 20 61 73 73 65  ize<64 );.  asse
25020 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
25030 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 72  Iswriteable(pPar
25040 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ent->pDbPage) );
25050 0a 20 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50  .  insertCell(pP
25060 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 49 64 78  arent, parentIdx
25070 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20 70 61  , parentCell, pa
25080 72 65 6e 74 53 69 7a 65 2c 20 30 2c 20 34 29 3b  rentSize, 0, 4);
25090 0a 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64  .  put4byte(find
250a0 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61  OverflowCell(pPa
250b0 72 65 6e 74 2c 70 61 72 65 6e 74 49 64 78 29 2c  rent,parentIdx),
250c0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
250d0 20 70 75 74 34 62 79 74 65 28 26 70 50 61 72 65   put4byte(&pPare
250e0 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
250f0 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  t->hdrOffset+8],
25100 20 70 67 6e 6f 4e 65 77 29 3b 0a 0a 20 20 2f 2a   pgnoNew);..  /*
25110 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
25120 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
25130 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20  ase, update the 
25140 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 2a 2a  pointer map.  **
25150 20 77 69 74 68 20 65 6e 74 72 69 65 73 20 66 6f   with entries fo
25160 72 20 74 68 65 20 6e 65 77 20 70 61 67 65 2c 20  r the new page, 
25170 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65 72 20  and any pointer 
25180 66 72 6f 6d 20 74 68 65 20 0a 20 20 2a 2a 20 63  from the .  ** c
25190 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67 65 20  ell on the page 
251a0 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
251b0 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  age..  */.  if( 
251c0 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
251d0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
251e0 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c  ut(pBt, pgnoNew,
251f0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
25200 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20  Parent->pgno);. 
25210 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
25220 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
25230 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c   = ptrmapPutOvfl
25240 28 70 4e 65 77 2c 20 30 29 3b 0a 20 20 20 20 7d  (pNew, 0);.    }
25250 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
25260 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25270 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
25280 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
25290 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  rc;.    }.  }.. 
252a0 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
252b0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
252c0 20 6e 65 77 20 70 61 67 65 20 61 6e 64 20 62 61   new page and ba
252d0 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74  lance the parent
252e0 20 70 61 67 65 2c 0a 20 20 2a 2a 20 69 6e 20 63   page,.  ** in c
252f0 61 73 65 20 74 68 65 20 64 69 76 69 64 65 72 20  ase the divider 
25300 63 65 6c 6c 20 69 6e 73 65 72 74 65 64 20 63 61  cell inserted ca
25310 75 73 65 64 20 69 74 20 74 6f 20 62 65 63 6f 6d  used it to becom
25320 65 20 6f 76 65 72 66 75 6c 6c 2e 0a 20 20 2a 2f  e overfull..  */
25330 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
25340 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 62  New);.  return b
25350 61 6c 61 6e 63 65 28 70 50 61 72 65 6e 74 2c 20  alance(pParent, 
25360 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  0);.}.#endif /* 
25370 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43  SQLITE_OMIT_QUIC
25380 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 2f 2a 0a  KBALANCE */../*.
25390 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
253a0 72 65 64 69 73 74 72 69 62 75 74 65 73 20 43 65  redistributes Ce
253b0 6c 6c 73 20 6f 6e 20 70 50 61 67 65 20 61 6e 64  lls on pPage and
253c0 20 75 70 20 74 6f 20 4e 4e 2a 32 20 73 69 62 6c   up to NN*2 sibl
253d0 69 6e 67 73 0a 2a 2a 20 6f 66 20 70 50 61 67 65  ings.** of pPage
253e0 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61 67   so that all pag
253f0 65 73 20 68 61 76 65 20 61 62 6f 75 74 20 74 68  es have about th
25400 65 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f 66  e same amount of
25410 20 66 72 65 65 20 73 70 61 63 65 2e 0a 2a 2a 20   free space..** 
25420 55 73 75 61 6c 6c 79 20 4e 4e 20 73 69 62 6c 69  Usually NN sibli
25430 6e 67 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ngs on either si
25440 64 65 20 6f 66 20 70 50 61 67 65 20 69 73 20 75  de of pPage is u
25450 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  sed in the balan
25460 63 69 6e 67 2c 0a 2a 2a 20 74 68 6f 75 67 68 20  cing,.** though 
25470 6d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 6d 69  more siblings mi
25480 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f 6e  ght come from on
25490 65 20 73 69 64 65 20 69 66 20 70 50 61 67 65 20  e side if pPage 
254a0 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20  is the first.** 
254b0 6f 72 20 6c 61 73 74 20 63 68 69 6c 64 20 6f 66  or last child of
254c0 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 49 66   its parent.  If
254d0 20 70 50 61 67 65 20 68 61 73 20 66 65 77 65 72   pPage has fewer
254e0 20 74 68 61 6e 20 32 2a 4e 4e 20 73 69 62 6c 69   than 2*NN sibli
254f0 6e 67 73 0a 2a 2a 20 28 73 6f 6d 65 74 68 69 6e  ngs.** (somethin
25500 67 20 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c 79  g which can only
25510 20 68 61 70 70 65 6e 20 69 66 20 70 50 61 67 65   happen if pPage
25520 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67   is the root pag
25530 65 20 6f 72 20 61 20 0a 2a 2a 20 63 68 69 6c 64  e or a .** child
25540 20 6f 66 20 72 6f 6f 74 29 20 74 68 65 6e 20 61   of root) then a
25550 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 73 69 62  ll available sib
25560 6c 69 6e 67 73 20 70 61 72 74 69 63 69 70 61 74  lings participat
25570 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69  e in the balanci
25580 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 75  ng..**.** The nu
25590 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 73  mber of siblings
255a0 20 6f 66 20 70 50 61 67 65 20 6d 69 67 68 74 20   of pPage might 
255b0 62 65 20 69 6e 63 72 65 61 73 65 64 20 6f 72 20  be increased or 
255c0 64 65 63 72 65 61 73 65 64 20 62 79 20 6f 6e 65  decreased by one
255d0 20 6f 72 0a 2a 2a 20 74 77 6f 20 69 6e 20 61 6e   or.** two in an
255e0 20 65 66 66 6f 72 74 20 74 6f 20 6b 65 65 70 20   effort to keep 
255f0 70 61 67 65 73 20 6e 65 61 72 6c 79 20 66 75 6c  pages nearly ful
25600 6c 20 62 75 74 20 6e 6f 74 20 6f 76 65 72 20 66  l but not over f
25610 75 6c 6c 2e 20 54 68 65 20 72 6f 6f 74 20 70 61  ull. The root pa
25620 67 65 0a 2a 2a 20 69 73 20 73 70 65 63 69 61 6c  ge.** is special
25630 20 61 6e 64 20 69 73 20 61 6c 6c 6f 77 65 64 20   and is allowed 
25640 74 6f 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70  to be nearly emp
25650 74 79 2e 20 49 66 20 70 50 61 67 65 20 69 73 20  ty. If pPage is 
25660 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67  .** the root pag
25670 65 2c 20 74 68 65 6e 20 74 68 65 20 64 65 70 74  e, then the dept
25680 68 20 6f 66 20 74 68 65 20 74 72 65 65 20 6d 69  h of the tree mi
25690 67 68 74 20 62 65 20 69 6e 63 72 65 61 73 65 64  ght be increased
256a0 0a 2a 2a 20 6f 72 20 64 65 63 72 65 61 73 65 64  .** or decreased
256b0 20 62 79 20 6f 6e 65 2c 20 61 73 20 6e 65 63 65   by one, as nece
256c0 73 73 61 72 79 2c 20 74 6f 20 6b 65 65 70 20 74  ssary, to keep t
256d0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 66 72 6f  he root page fro
256e0 6d 20 62 65 69 6e 67 0a 2a 2a 20 6f 76 65 72 66  m being.** overf
256f0 75 6c 6c 20 6f 72 20 63 6f 6d 70 6c 65 74 65 6c  ull or completel
25700 79 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20 4e  y empty..**.** N
25710 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20 74 68  ote that when th
25720 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
25730 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74 68  lled, some of th
25740 65 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65  e Cells on pPage
25750 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61 63  .** might not ac
25760 74 75 61 6c 6c 79 20 62 65 20 73 74 6f 72 65 64  tually be stored
25770 20 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61   in pPage->aData
25780 5b 5d 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61  [].  This can ha
25790 70 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20 70  ppen.** if the p
257a0 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c 2e  age is overfull.
257b0 20 20 50 61 72 74 20 6f 66 20 74 68 65 20 6a 6f    Part of the jo
257c0 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e  b of this routin
257d0 65 20 69 73 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20  e is to.** make 
257e0 73 75 72 65 20 61 6c 6c 20 43 65 6c 6c 73 20 66  sure all Cells f
257f0 6f 72 20 70 50 61 67 65 20 6f 6e 63 65 20 61 67  or pPage once ag
25800 61 69 6e 20 66 69 74 20 69 6e 20 70 50 61 67 65  ain fit in pPage
25810 2d 3e 61 44 61 74 61 5b 5d 2e 0a 2a 2a 0a 2a 2a  ->aData[]..**.**
25820 20 49 6e 20 74 68 65 20 63 6f 75 72 73 65 20 6f   In the course o
25830 66 20 62 61 6c 61 6e 63 69 6e 67 20 74 68 65 20  f balancing the 
25840 73 69 62 6c 69 6e 67 73 20 6f 66 20 70 50 61 67  siblings of pPag
25850 65 2c 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66  e, the parent of
25860 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20   pPage.** might 
25870 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 20  become overfull 
25880 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 20 49  or underfull.  I
25890 66 20 74 68 61 74 20 68 61 70 70 65 6e 73 2c 20  f that happens, 
258a0 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
258b0 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 72  e.** is called r
258c0 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 74 68  ecursively on th
258d0 65 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  e parent..**.** 
258e0 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  If this routine 
258f0 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65  fails for any re
25900 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20 6c  ason, it might l
25910 65 61 76 65 20 74 68 65 20 64 61 74 61 62 61 73  eave the databas
25920 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75 70  e.** in a corrup
25930 74 65 64 20 73 74 61 74 65 2e 20 20 53 6f 20 69  ted state.  So i
25940 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66  f this routine f
25950 61 69 6c 73 2c 20 74 68 65 20 64 61 74 61 62 61  ails, the databa
25960 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  se should.** be 
25970 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a  rolled back..*/.
25980 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
25990 63 65 5f 6e 6f 6e 72 6f 6f 74 28 4d 65 6d 50 61  ce_nonroot(MemPa
259a0 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d 65  ge *pPage){.  Me
259b0 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 20  mPage *pParent; 
259c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
259d0 65 20 70 61 72 65 6e 74 20 6f 66 20 70 50 61 67  e parent of pPag
259e0 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  e */.  BtShared 
259f0 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20  *pBt;           
25a00 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c 65      /* The whole
25a10 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
25a20 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 20 20 20  nt nCell = 0;   
25a30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
25a40 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
25a50 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  n apCell[] */.  
25a60 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20  int nMaxCells = 
25a70 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
25a80 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f  Allocated size o
25a90 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c  f apCell, szCell
25aa0 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e  , aFrom. */.  in
25ab0 74 20 6e 4f 6c 64 3b 20 20 20 20 20 20 20 20 20  t nOld;         
25ac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
25ad0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
25ae0 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e   apOld[] */.  in
25af0 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20 20 20  t nNew;         
25b00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
25b10 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
25b20 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e   apNew[] */.  in
25b30 74 20 6e 44 69 76 3b 20 20 20 20 20 20 20 20 20  t nDiv;         
25b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
25b50 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e  mber of cells in
25b60 20 61 70 44 69 76 5b 5d 20 2a 2f 0a 20 20 69 6e   apDiv[] */.  in
25b70 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20  t i, j, k;      
25b80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
25b90 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
25ba0 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20   int idx;       
25bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25bc0 20 49 6e 64 65 78 20 6f 66 20 70 50 61 67 65 20   Index of pPage 
25bd0 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c  in pParent->aCel
25be0 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 78 44  l[] */.  int nxD
25bf0 69 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  iv;             
25c00 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 64 69        /* Next di
25c10 76 69 64 65 72 20 73 6c 6f 74 20 69 6e 20 70 50  vider slot in pP
25c20 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a  arent->aCell[] *
25c30 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
25c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c50 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20 63   /* The return c
25c60 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61  ode */.  int lea
25c70 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20 20  fCorrection;    
25c80 20 20 20 20 20 20 2f 2a 20 34 20 69 66 20 70 50        /* 4 if pP
25c90 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20  age is a leaf.  
25ca0 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e  0 if not */.  in
25cb0 74 20 6c 65 61 66 44 61 74 61 3b 20 20 20 20 20  t leafData;     
25cc0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
25cd0 75 65 20 69 66 20 70 50 61 67 65 20 69 73 20 61  ue if pPage is a
25ce0 20 6c 65 61 66 20 6f 66 20 61 20 4c 45 41 46 44   leaf of a LEAFD
25cf0 41 54 41 20 74 72 65 65 20 2a 2f 0a 20 20 69 6e  ATA tree */.  in
25d00 74 20 75 73 61 62 6c 65 53 70 61 63 65 3b 20 20  t usableSpace;  
25d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
25d20 74 65 73 20 69 6e 20 70 50 61 67 65 20 62 65 79  tes in pPage bey
25d30 6f 6e 64 20 74 68 65 20 68 65 61 64 65 72 20 2a  ond the header *
25d40 2f 0a 20 20 69 6e 74 20 70 61 67 65 46 6c 61 67  /.  int pageFlag
25d50 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
25d60 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 50 61   /* Value of pPa
25d70 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f 0a  ge->aData[0] */.
25d80 20 20 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b 20    int subtotal; 
25d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25da0 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66 20 62 79  * Subtotal of by
25db0 74 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e 20  tes in cells on 
25dc0 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  one page */.  in
25dd0 74 20 69 53 70 61 63 65 31 20 3d 20 30 3b 20 20  t iSpace1 = 0;  
25de0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
25df0 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65 20  rst unused byte 
25e00 6f 66 20 61 53 70 61 63 65 31 5b 5d 20 2a 2f 0a  of aSpace1[] */.
25e10 20 20 69 6e 74 20 69 53 70 61 63 65 32 20 3d 20    int iSpace2 = 
25e20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
25e30 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62  * First unused b
25e40 79 74 65 20 6f 66 20 61 53 70 61 63 65 32 5b 5d  yte of aSpace2[]
25e50 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 63 72 61   */.  int szScra
25e60 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20 20  tch;            
25e70 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 63     /* Size of sc
25e80 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 72 65 71  ratch memory req
25e90 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d 65 6d 50  uested */.  MemP
25ea0 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20  age *apOld[NB]; 
25eb0 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67           /* pPag
25ec0 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77 6f 20  e and up to two 
25ed0 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 50 67  siblings */.  Pg
25ee0 6e 6f 20 70 67 6e 6f 4f 6c 64 5b 4e 42 5d 3b 20  no pgnoOld[NB]; 
25ef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
25f00 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 65  ge numbers for e
25f10 61 63 68 20 70 61 67 65 20 69 6e 20 61 70 4f 6c  ach page in apOl
25f20 64 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  d[] */.  MemPage
25f30 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b 20 20 20   *apCopy[NB];   
25f40 20 20 20 20 20 20 2f 2a 20 50 72 69 76 61 74 65        /* Private
25f50 20 63 6f 70 69 65 73 20 6f 66 20 61 70 4f 6c 64   copies of apOld
25f60 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20 20 4d 65  [] pages */.  Me
25f70 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e 42 2b  mPage *apNew[NB+
25f80 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 70 50  2];        /* pP
25f90 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 42  age and up to NB
25fa0 20 73 69 62 6c 69 6e 67 73 20 61 66 74 65 72 20   siblings after 
25fb0 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20 20 50  balancing */.  P
25fc0 67 6e 6f 20 70 67 6e 6f 4e 65 77 5b 4e 42 2b 32  gno pgnoNew[NB+2
25fd0 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ];          /* P
25fe0 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72 20  age numbers for 
25ff0 65 61 63 68 20 70 61 67 65 20 69 6e 20 61 70 4e  each page in apN
26000 65 77 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 70  ew[] */.  u8 *ap
26010 44 69 76 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  Div[NB];        
26020 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69 64 65         /* Divide
26030 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65  r cells in pPare
26040 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 4e  nt */.  int cntN
26050 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
26060 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
26070 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c   aCell[] of cell
26080 20 61 66 74 65 72 20 69 2d 74 68 20 70 61 67 65   after i-th page
26090 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77 5b   */.  int szNew[
260a0 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20  NB+2];          
260b0 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20 73     /* Combined s
260c0 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c 61  ize of cells pla
260d0 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67 65 20  ce on i-th page 
260e0 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c  */.  u8 **apCell
260f0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
26100 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 62    /* All cells b
26110 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a 2f  egin balanced */
26120 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20  .  u16 *szCell; 
26130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26140 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66  /* Local size of
26150 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
26160 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  Cell[] */.  u8 *
26170 61 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20  aCopy[NB];      
26180 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20     /* Space for 
26190 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 6f 66 20  holding data of 
261a0 61 70 43 6f 70 79 5b 5d 20 2a 2f 0a 20 20 75 38  apCopy[] */.  u8
261b0 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20 20 20   *aSpace1;      
261c0 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
261d0 72 20 63 6f 70 69 65 73 20 6f 66 20 64 69 76 69  r copies of divi
261e0 64 65 72 73 20 63 65 6c 6c 73 20 62 65 66 6f 72  ders cells befor
261f0 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 20 20 75  e balance */.  u
26200 38 20 2a 61 53 70 61 63 65 32 20 3d 20 30 3b 20  8 *aSpace2 = 0; 
26210 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
26220 6f 72 20 6f 76 65 72 66 6c 6f 77 20 64 69 76 69  or overflow divi
26230 64 65 72 73 20 63 65 6c 6c 73 20 61 66 74 65 72  ders cells after
26240 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 20 20 75 38   balance */.  u8
26250 20 2a 61 46 72 6f 6d 20 3d 20 30 3b 0a 0a 20 20   *aFrom = 0;..  
26260 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
26270 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
26280 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
26290 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 46 69 6e  ..  /* .  ** Fin
262a0 64 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  d the parent pag
262b0 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
262c0 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
262d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
262e0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
262f0 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
26300 61 67 65 29 20 7c 7c 20 70 50 61 67 65 2d 3e 6e  age) || pPage->n
26310 4f 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20  Overflow==1 );. 
26320 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
26330 74 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70  t;.  pParent = p
26340 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20  Page->pParent;. 
26350 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74   assert( pParent
26360 20 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45   );.  if( SQLITE
26370 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
26380 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
26390 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 29 20  rent->pDbPage)) 
263a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
263b0 3b 0a 20 20 7d 0a 0a 20 20 54 52 41 43 45 28 28  ;.  }..  TRACE((
263c0 22 42 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20  "BALANCE: begin 
263d0 70 61 67 65 20 25 64 20 63 68 69 6c 64 20 6f 66  page %d child of
263e0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70   %d\n", pPage->p
263f0 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67  gno, pParent->pg
26400 6e 6f 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  no));..#ifndef S
26410 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b  QLITE_OMIT_QUICK
26420 42 41 4c 41 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a  BALANCE.  /*.  *
26430 2a 20 41 20 73 70 65 63 69 61 6c 20 63 61 73 65  * A special case
26440 3a 20 20 49 66 20 61 20 6e 65 77 20 65 6e 74 72  :  If a new entr
26450 79 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  y has just been 
26460 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 61 0a  inserted into a.
26470 20 20 2a 2a 20 74 61 62 6c 65 20 28 74 68 61 74    ** table (that
26480 20 69 73 2c 20 61 20 62 74 72 65 65 20 77 69 74   is, a btree wit
26490 68 20 69 6e 74 65 67 65 72 20 6b 65 79 73 20 61  h integer keys a
264a0 6e 64 20 61 6c 6c 20 64 61 74 61 20 61 74 20 74  nd all data at t
264b0 68 65 20 6c 65 61 76 65 73 29 0a 20 20 2a 2a 20  he leaves).  ** 
264c0 61 6e 64 20 74 68 65 20 6e 65 77 20 65 6e 74 72  and the new entr
264d0 79 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d  y is the right-m
264e0 6f 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ost entry in the
264f0 20 74 72 65 65 20 28 69 74 20 68 61 73 20 74 68   tree (it has th
26500 65 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b  e.  ** largest k
26510 65 79 29 20 74 68 65 6e 20 75 73 65 20 74 68 65  ey) then use the
26520 20 73 70 65 63 69 61 6c 20 62 61 6c 61 6e 63 65   special balance
26530 5f 71 75 69 63 6b 28 29 20 72 6f 75 74 69 6e 65  _quick() routine
26540 20 66 6f 72 0a 20 20 2a 2a 20 62 61 6c 61 6e 63   for.  ** balanc
26550 69 6e 67 2e 20 20 62 61 6c 61 6e 63 65 5f 71 75  ing.  balance_qu
26560 69 63 6b 28 29 20 69 73 20 6d 75 63 68 20 66 61  ick() is much fa
26570 73 74 65 72 20 61 6e 64 20 72 65 73 75 6c 74 73  ster and results
26580 20 69 6e 20 61 20 74 69 67 68 74 65 72 0a 20 20   in a tighter.  
26590 2a 2a 20 70 61 63 6b 69 6e 67 20 6f 66 20 64 61  ** packing of da
265a0 74 61 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  ta in the common
265b0 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   case..  */.  if
265c0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 26 26  ( pPage->leaf &&
265d0 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  .      pPage->in
265e0 74 4b 65 79 20 26 26 0a 20 20 20 20 20 20 70 50  tKey &&.      pP
265f0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
26600 31 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65  1 &&.      pPage
26610 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d  ->aOvfl[0].idx==
26620 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26 26 0a  pPage->nCell &&.
26630 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61        pPage->pPa
26640 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 26 26  rent->pgno!=1 &&
26650 0a 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28  .      get4byte(
26660 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
26670 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
26680 65 74 2b 38 5d 29 3d 3d 70 50 61 67 65 2d 3e 70  et+8])==pPage->p
26690 67 6e 6f 0a 20 20 29 7b 0a 20 20 20 20 61 73 73  gno.  ){.    ass
266a0 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
266b0 65 79 20 29 3b 0a 20 20 20 20 2f 2a 0a 20 20 20  ey );.    /*.   
266c0 20 2a 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20   ** TODO: Check 
266d0 74 68 65 20 73 69 62 6c 69 6e 67 73 20 74 6f 20  the siblings to 
266e0 74 68 65 20 6c 65 66 74 20 6f 66 20 70 50 61 67  the left of pPag
266f0 65 2e 20 49 74 20 6d 61 79 20 62 65 20 74 68 61  e. It may be tha
26700 74 0a 20 20 20 20 2a 2a 20 74 68 65 79 20 61 72  t.    ** they ar
26710 65 20 6e 6f 74 20 66 75 6c 6c 20 61 6e 64 20 6e  e not full and n
26720 6f 20 6e 65 77 20 70 61 67 65 20 69 73 20 72 65  o new page is re
26730 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
26740 20 20 20 72 65 74 75 72 6e 20 62 61 6c 61 6e 63     return balanc
26750 65 5f 71 75 69 63 6b 28 70 50 61 67 65 2c 20 70  e_quick(pPage, p
26760 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 23 65 6e  Parent);.  }.#en
26770 64 69 66 0a 0a 20 20 69 66 28 20 53 51 4c 49 54  dif..  if( SQLIT
26780 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69  E_OK!=(rc = sqli
26790 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
267a0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 20 29  age->pDbPage)) )
267b0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
267c0 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
267d0 46 69 6e 64 20 74 68 65 20 63 65 6c 6c 20 69 6e  Find the cell in
267e0 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
267f0 20 77 68 6f 73 65 20 6c 65 66 74 20 63 68 69 6c   whose left chil
26800 64 20 70 6f 69 6e 74 73 20 62 61 63 6b 0a 20 20  d points back.  
26810 2a 2a 20 74 6f 20 70 50 61 67 65 2e 20 20 54 68  ** to pPage.  Th
26820 65 20 22 69 64 78 22 20 76 61 72 69 61 62 6c 65  e "idx" variable
26830 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
26840 20 74 68 61 74 20 63 65 6c 6c 2e 20 20 49 66 20   that cell.  If 
26850 70 50 61 67 65 0a 20 20 2a 2a 20 69 73 20 74 68  pPage.  ** is th
26860 65 20 72 69 67 68 74 6d 6f 73 74 20 63 68 69 6c  e rightmost chil
26870 64 20 6f 66 20 70 50 61 72 65 6e 74 20 74 68 65  d of pParent the
26880 6e 20 73 65 74 20 69 64 78 20 74 6f 20 70 50 61  n set idx to pPa
26890 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 0a 20 20 2a  rent->nCell .  *
268a0 2f 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 2d  /.  if( pParent-
268b0 3e 69 64 78 53 68 69 66 74 20 29 7b 0a 20 20 20  >idxShift ){.   
268c0 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20   Pgno pgno;.    
268d0 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70 67  pgno = pPage->pg
268e0 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  no;.    assert( 
268f0 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67  pgno==sqlite3Pag
26900 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
26910 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
26920 20 20 20 20 66 6f 72 28 69 64 78 3d 30 3b 20 69      for(idx=0; i
26930 64 78 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  dx<pParent->nCel
26940 6c 3b 20 69 64 78 2b 2b 29 7b 0a 20 20 20 20 20  l; idx++){.     
26950 20 69 66 28 20 67 65 74 34 62 79 74 65 28 66 69   if( get4byte(fi
26960 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  ndCell(pParent, 
26970 69 64 78 29 29 3d 3d 70 67 6e 6f 20 29 7b 0a 20  idx))==pgno ){. 
26980 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
26990 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
269a0 61 73 73 65 72 74 28 20 69 64 78 3c 70 50 61 72  assert( idx<pPar
269b0 65 6e 74 2d 3e 6e 43 65 6c 6c 0a 20 20 20 20 20  ent->nCell.     
269c0 20 20 20 20 20 20 20 20 7c 7c 20 67 65 74 34 62          || get4b
269d0 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
269e0 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
269f0 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 70 67 6e 6f  Offset+8])==pgno
26a00 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   );.  }else{.   
26a10 20 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 69 64   idx = pPage->id
26a20 78 50 61 72 65 6e 74 3b 0a 20 20 7d 0a 0a 20 20  xParent;.  }..  
26a30 2f 2a 0a 20 20 2a 2a 20 49 6e 69 74 69 61 6c 69  /*.  ** Initiali
26a40 7a 65 20 76 61 72 69 61 62 6c 65 73 20 73 6f 20  ze variables so 
26a50 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20  that it will be 
26a60 73 61 66 65 20 74 6f 20 6a 75 6d 70 0a 20 20 2a  safe to jump.  *
26a70 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 62 61  * directly to ba
26a80 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 20 61 74  lance_cleanup at
26a90 20 61 6e 79 20 6d 6f 6d 65 6e 74 2e 0a 20 20 2a   any moment..  *
26aa0 2f 0a 20 20 6e 4f 6c 64 20 3d 20 6e 4e 65 77 20  /.  nOld = nNew 
26ab0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  = 0;.  sqlite3Pa
26ac0 67 65 72 52 65 66 28 70 50 61 72 65 6e 74 2d 3e  gerRef(pParent->
26ad0 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 0a  pDbPage);..  /*.
26ae0 20 20 2a 2a 20 46 69 6e 64 20 73 69 62 6c 69 6e    ** Find siblin
26af0 67 20 70 61 67 65 73 20 74 6f 20 70 50 61 67 65  g pages to pPage
26b00 20 61 6e 64 20 74 68 65 20 63 65 6c 6c 73 20 69   and the cells i
26b10 6e 20 70 50 61 72 65 6e 74 20 74 68 61 74 20 64  n pParent that d
26b20 69 76 69 64 65 0a 20 20 2a 2a 20 74 68 65 20 73  ivide.  ** the s
26b30 69 62 6c 69 6e 67 73 2e 20 20 41 6e 20 61 74 74  iblings.  An att
26b40 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
26b50 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69 6e 67 73  find NN siblings
26b60 20 6f 6e 20 65 69 74 68 65 72 0a 20 20 2a 2a 20   on either.  ** 
26b70 73 69 64 65 20 6f 66 20 70 50 61 67 65 2e 20 20  side of pPage.  
26b80 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 61 72  More siblings ar
26b90 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65  e taken from one
26ba0 20 73 69 64 65 2c 20 68 6f 77 65 76 65 72 2c 20   side, however, 
26bb0 69 66 0a 20 20 2a 2a 20 70 50 61 67 65 20 74 68  if.  ** pPage th
26bc0 65 72 65 20 61 72 65 20 66 65 77 65 72 20 74 68  ere are fewer th
26bd0 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f  an NN siblings o
26be0 6e 20 74 68 65 20 6f 74 68 65 72 20 73 69 64 65  n the other side
26bf0 2e 20 20 49 66 20 70 50 61 72 65 6e 74 0a 20 20  .  If pParent.  
26c00 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20 66 65 77  ** has NB or few
26c10 65 72 20 63 68 69 6c 64 72 65 6e 20 74 68 65 6e  er children then
26c20 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66   all children of
26c30 20 70 50 61 72 65 6e 74 20 61 72 65 20 74 61 6b   pParent are tak
26c40 65 6e 2e 0a 20 20 2a 2f 0a 20 20 6e 78 44 69 76  en..  */.  nxDiv
26c50 20 3d 20 69 64 78 20 2d 20 4e 4e 3b 0a 20 20 69   = idx - NN;.  i
26c60 66 28 20 6e 78 44 69 76 20 2b 20 4e 42 20 3e 20  f( nxDiv + NB > 
26c70 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
26c80 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 70 50  {.    nxDiv = pP
26c90 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 2d 20 4e  arent->nCell - N
26ca0 42 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28  B + 1;.  }.  if(
26cb0 20 6e 78 44 69 76 3c 30 20 29 7b 0a 20 20 20 20   nxDiv<0 ){.    
26cc0 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20 7d 0a 20  nxDiv = 0;.  }. 
26cd0 20 6e 44 69 76 20 3d 20 30 3b 0a 20 20 66 6f 72   nDiv = 0;.  for
26ce0 28 69 3d 30 2c 20 6b 3d 6e 78 44 69 76 3b 20 69  (i=0, k=nxDiv; i
26cf0 3c 4e 42 3b 20 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a  <NB; i++, k++){.
26d00 20 20 20 20 69 66 28 20 6b 3c 70 50 61 72 65 6e      if( k<pParen
26d10 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
26d20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20 66 69 6e    apDiv[i] = fin
26d30 64 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6b  dCell(pParent, k
26d40 29 3b 0a 20 20 20 20 20 20 6e 44 69 76 2b 2b 3b  );.      nDiv++;
26d50 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
26d60 70 50 61 72 65 6e 74 2d 3e 6c 65 61 66 20 29 3b  pParent->leaf );
26d70 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69  .      pgnoOld[i
26d80 5d 20 3d 20 67 65 74 34 62 79 74 65 28 61 70 44  ] = get4byte(apD
26d90 69 76 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  iv[i]);.    }els
26da0 65 20 69 66 28 20 6b 3d 3d 70 50 61 72 65 6e 74  e if( k==pParent
26db0 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ->nCell ){.     
26dc0 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65   pgnoOld[i] = ge
26dd0 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
26de0 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
26df0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
26e00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26e10 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
26e20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
26e30 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 4f 6c  Page(pBt, pgnoOl
26e40 64 5b 69 5d 2c 20 26 61 70 4f 6c 64 5b 69 5d 2c  d[i], &apOld[i],
26e50 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 69   pParent);.    i
26e60 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c  f( rc ) goto bal
26e70 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
26e80 20 20 61 70 4f 6c 64 5b 69 5d 2d 3e 69 64 78 50    apOld[i]->idxP
26e90 61 72 65 6e 74 20 3d 20 6b 3b 0a 20 20 20 20 61  arent = k;.    a
26ea0 70 43 6f 70 79 5b 69 5d 20 3d 20 30 3b 0a 20 20  pCopy[i] = 0;.  
26eb0 20 20 61 73 73 65 72 74 28 20 69 3d 3d 6e 4f 6c    assert( i==nOl
26ec0 64 20 29 3b 0a 20 20 20 20 6e 4f 6c 64 2b 2b 3b  d );.    nOld++;
26ed0 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 20 2b  .    nMaxCells +
26ee0 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 43  = 1+apOld[i]->nC
26ef0 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d 3e 6e 4f  ell+apOld[i]->nO
26f00 76 65 72 66 6c 6f 77 3b 0a 20 20 7d 0a 0a 20 20  verflow;.  }..  
26f10 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43 65 6c 6c  /* Make nMaxCell
26f20 73 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20  s a multiple of 
26f30 34 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 70 72  4 in order to pr
26f40 65 73 65 72 76 65 20 38 2d 62 79 74 65 0a 20 20  eserve 8-byte.  
26f50 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20 2a 2f 0a  ** alignment */.
26f60 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 28 6e    nMaxCells = (n
26f70 4d 61 78 43 65 6c 6c 73 20 2b 20 33 29 26 7e 33  MaxCells + 3)&~3
26f80 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c  ;..  /*.  ** All
26f90 6f 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20  ocate space for 
26fa0 6d 65 6d 6f 72 79 20 73 74 72 75 63 74 75 72 65  memory structure
26fb0 73 0a 20 20 2a 2f 0a 20 20 73 7a 53 63 72 61 74  s.  */.  szScrat
26fc0 63 68 20 3d 0a 20 20 20 20 20 20 20 6e 4d 61 78  ch =.       nMax
26fd0 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 38 2a  Cells*sizeof(u8*
26fe0 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
26ff0 20 20 20 20 20 20 20 20 2f 2a 20 61 70 43 65 6c          /* apCel
27000 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e 4d 61 78  l */.     + nMax
27010 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28 75 31 36  Cells*sizeof(u16
27020 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
27030 20 20 20 20 20 20 20 20 2f 2a 20 73 7a 43 65 6c          /* szCel
27040 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 28 52 4f 55  l */.     + (ROU
27050 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61  ND8(sizeof(MemPa
27060 67 65 29 29 2b 70 42 74 2d 3e 70 61 67 65 53 69  ge))+pBt->pageSi
27070 7a 65 29 2a 4e 42 20 20 2f 2a 20 61 43 6f 70 79  ze)*NB  /* aCopy
27080 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42 74 2d 3e   */.     + pBt->
27090 70 61 67 65 53 69 7a 65 20 20 20 20 20 20 20 20  pageSize        
270a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
270b0 20 20 20 20 20 20 20 2f 2a 20 61 53 70 61 63 65         /* aSpace
270c0 31 20 2a 2f 0a 20 20 20 20 20 2b 20 28 49 53 41  1 */.     + (ISA
270d0 55 54 4f 56 41 43 55 55 4d 20 3f 20 6e 4d 61 78  UTOVACUUM ? nMax
270e0 43 65 6c 6c 73 20 3a 20 30 29 3b 20 20 20 20 20  Cells : 0);     
270f0 20 20 20 20 20 20 20 20 2f 2a 20 61 46 72 6f 6d          /* aFrom
27100 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73   */.  apCell = s
27110 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61 6c  qlite3ScratchMal
27120 6c 6f 63 28 20 73 7a 53 63 72 61 74 63 68 20 29  loc( szScratch )
27130 3b 20 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d  ; .  if( apCell=
27140 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
27150 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
27160 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
27170 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 73 7a 43  eanup;.  }.  szC
27180 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70 43  ell = (u16*)&apC
27190 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a  ell[nMaxCells];.
271a0 20 20 61 43 6f 70 79 5b 30 5d 20 3d 20 28 75 38    aCopy[0] = (u8
271b0 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61 78 43 65  *)&szCell[nMaxCe
271c0 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  lls];.  assert( 
271d0 28 28 61 43 6f 70 79 5b 30 5d 20 2d 20 28 75 38  ((aCopy[0] - (u8
271e0 2a 29 61 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d  *)apCell) & 7)==
271f0 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61  0 ); /* 8-byte a
27200 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65  lignment require
27210 64 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20  d */.  for(i=1; 
27220 69 3c 4e 42 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i<NB; i++){.    
27230 61 43 6f 70 79 5b 69 5d 20 3d 20 26 61 43 6f 70  aCopy[i] = &aCop
27240 79 5b 69 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65  y[i-1][pBt->page
27250 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65  Size+ROUND8(size
27260 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20  of(MemPage))];. 
27270 20 20 20 61 73 73 65 72 74 28 20 28 28 61 43 6f     assert( ((aCo
27280 70 79 5b 69 5d 20 2d 20 28 75 38 2a 29 61 70 43  py[i] - (u8*)apC
27290 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b 20  ell) & 7)==0 ); 
272a0 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d  /* 8-byte alignm
272b0 65 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a  ent required */.
272c0 20 20 7d 0a 20 20 61 53 70 61 63 65 31 20 3d 20    }.  aSpace1 = 
272d0 26 61 43 6f 70 79 5b 4e 42 2d 31 5d 5b 70 42 74  &aCopy[NB-1][pBt
272e0 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44  ->pageSize+ROUND
272f0 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65  8(sizeof(MemPage
27300 29 29 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 28  ))];.  assert( (
27310 28 61 53 70 61 63 65 31 20 2d 20 28 75 38 2a 29  (aSpace1 - (u8*)
27320 61 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20  apCell) & 7)==0 
27330 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69  ); /* 8-byte ali
27340 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20  gnment required 
27350 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f 56  */.  if( ISAUTOV
27360 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 61 46 72  ACUUM ){.    aFr
27370 6f 6d 20 3d 20 26 61 53 70 61 63 65 31 5b 70 42  om = &aSpace1[pB
27380 74 2d 3e 70 61 67 65 53 69 7a 65 5d 3b 0a 20 20  t->pageSize];.  
27390 7d 0a 20 20 61 53 70 61 63 65 32 20 3d 20 73 71  }.  aSpace2 = sq
273a0 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
273b0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
273c0 20 20 69 66 28 20 61 53 70 61 63 65 32 3d 3d 30    if( aSpace2==0
273d0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
273e0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67  ITE_NOMEM;.    g
273f0 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
27400 6e 75 70 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  nup;.  }.  .  /*
27410 0a 20 20 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65  .  ** Make copie
27420 73 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  s of the content
27430 20 6f 66 20 70 50 61 67 65 20 61 6e 64 20 69 74   of pPage and it
27440 73 20 73 69 62 6c 69 6e 67 73 20 69 6e 74 6f 20  s siblings into 
27450 61 4f 6c 64 5b 5d 2e 0a 20 20 2a 2a 20 54 68 65  aOld[]..  ** The
27460 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 66 75   rest of this fu
27470 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20  nction will use 
27480 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 63 6f  data from the co
27490 70 69 65 73 20 72 61 74 68 65 72 0a 20 20 2a 2a  pies rather.  **
274a0 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
274b0 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65 20 74  al pages since t
274c0 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
274d0 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74 68 65  s will be in the
274e0 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66  .  ** process of
274f0 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74   being overwritt
27500 65 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  en..  */.  for(i
27510 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29  =0; i<nOld; i++)
27520 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
27530 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28   = apCopy[i] = (
27540 4d 65 6d 50 61 67 65 2a 29 61 43 6f 70 79 5b 69  MemPage*)aCopy[i
27550 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2c  ];.    memcpy(p,
27560 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f   apOld[i], sizeo
27570 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 20  f(MemPage));.   
27580 20 70 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f 69   p->aData = (voi
27590 64 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 6d 65  d*)&p[1];.    me
275a0 6d 63 70 79 28 70 2d 3e 61 44 61 74 61 2c 20 61  mcpy(p->aData, a
275b0 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20  pOld[i]->aData, 
275c0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
275d0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c    }..  /*.  ** L
275e0 6f 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  oad pointers to 
275f0 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62  all cells on sib
27600 6c 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20 74  ling pages and t
27610 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  he divider cells
27620 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c  .  ** into the l
27630 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72  ocal apCell[] ar
27640 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65  ray.  Make copie
27650 73 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72  s of the divider
27660 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f   cells.  ** into
27670 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
27680 66 6f 72 6d 20 61 53 70 61 63 65 31 5b 5d 20 61  form aSpace1[] a
27690 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20 74 68  nd remove the th
276a0 65 20 64 69 76 69 64 65 72 20 43 65 6c 6c 73 0a  e divider Cells.
276b0 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e    ** from pParen
276c0 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  t..  **.  ** If 
276d0 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  the siblings are
276e0 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73 2c 20   on leaf pages, 
276f0 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70  then the child p
27700 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65 0a 20  ointers of the. 
27710 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65 6c 6c   ** divider cell
27720 73 20 61 72 65 20 73 74 72 69 70 70 65 64 20 66  s are stripped f
27730 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20 62 65  rom the cells be
27740 66 6f 72 65 20 74 68 65 79 20 61 72 65 20 63 6f  fore they are co
27750 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61  pied.  ** into a
27760 53 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20 74 68  Space1[].  In th
27770 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c  is way, all cell
27780 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72  s in apCell[] ar
27790 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63  e without.  ** c
277a0 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20  hild pointers.  
277b0 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  If siblings are 
277c0 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e  not leaves, then
277d0 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a   all cell in.  *
277e0 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75  * apCell[] inclu
277f0 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  de child pointer
27800 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20  s.  Either way, 
27810 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43  all cells in apC
27820 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61  ell[].  ** are a
27830 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  like..  **.  ** 
27840 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20  leafCorrection: 
27850 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61   4 if pPage is a
27860 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50 61   leaf.  0 if pPa
27870 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66  ge is not a leaf
27880 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65 61  ..  **       lea
27890 66 44 61 74 61 3a 20 20 31 20 69 66 20 70 50 61  fData:  1 if pPa
278a0 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74  ge holds key+dat
278b0 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68 6f  a and pParent ho
278c0 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20  lds only keys.. 
278d0 20 2a 2f 0a 20 20 6e 43 65 6c 6c 20 3d 20 30 3b   */.  nCell = 0;
278e0 0a 20 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  .  leafCorrectio
278f0 6e 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66 2a  n = pPage->leaf*
27900 34 3b 0a 20 20 6c 65 61 66 44 61 74 61 20 3d 20  4;.  leafData = 
27910 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61 3b 0a  pPage->hasData;.
27920 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c    for(i=0; i<nOl
27930 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d  d; i++){.    Mem
27940 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43  Page *pOld = apC
27950 6f 70 79 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20  opy[i];.    int 
27960 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43  limit = pOld->nC
27970 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  ell+pOld->nOverf
27980 6c 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  low;.    for(j=0
27990 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b  ; j<limit; j++){
279a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
279b0 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  Cell<nMaxCells )
279c0 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e  ;.      apCell[n
279d0 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72  Cell] = findOver
279e0 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a  flowCell(pOld, j
279f0 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  );.      szCell[
27a00 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a  nCell] = cellSiz
27a10 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c  ePtr(pOld, apCel
27a20 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20 20 20 20 20  l[nCell]);.     
27a30 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
27a40 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  M ){.        int
27a50 20 61 3b 0a 20 20 20 20 20 20 20 20 61 46 72 6f   a;.        aFro
27a60 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 69 3b 0a 20 20  m[nCell] = i;.  
27a70 20 20 20 20 20 20 66 6f 72 28 61 3d 30 3b 20 61        for(a=0; a
27a80 3c 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77  <pOld->nOverflow
27a90 3b 20 61 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; a++){.        
27aa0 20 20 69 66 28 20 70 4f 6c 64 2d 3e 61 4f 76 66    if( pOld->aOvf
27ab0 6c 5b 61 5d 2e 70 43 65 6c 6c 3d 3d 61 70 43 65  l[a].pCell==apCe
27ac0 6c 6c 5b 6e 43 65 6c 6c 5d 20 29 7b 0a 20 20 20  ll[nCell] ){.   
27ad0 20 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e           aFrom[n
27ae0 43 65 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20  Cell] = 0xFF;.  
27af0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
27b00 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
27b10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
27b20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20       nCell++;.  
27b30 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f    }.    if( i<nO
27b40 6c 64 2d 31 20 29 7b 0a 20 20 20 20 20 20 75 31  ld-1 ){.      u1
27b50 36 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50  6 sz = cellSizeP
27b60 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44 69  tr(pParent, apDi
27b70 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  v[i]);.      if(
27b80 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20   leafData ){.   
27b90 20 20 20 20 20 2f 2a 20 57 69 74 68 20 74 68 65       /* With the
27ba0 20 4c 45 41 46 44 41 54 41 20 66 6c 61 67 2c 20   LEAFDATA flag, 
27bb0 70 50 61 72 65 6e 74 20 63 65 6c 6c 73 20 68 6f  pParent cells ho
27bc0 6c 64 20 6f 6e 6c 79 20 49 4e 54 4b 45 59 73 20  ld only INTKEYs 
27bd0 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
27be0 61 72 65 20 64 75 70 6c 69 63 61 74 65 73 20 6f  are duplicates o
27bf0 66 20 6b 65 79 73 20 6f 6e 20 74 68 65 20 63 68  f keys on the ch
27c00 69 6c 64 20 70 61 67 65 73 2e 20 20 57 65 20 6e  ild pages.  We n
27c10 65 65 64 20 74 6f 20 72 65 6d 6f 76 65 0a 20 20  eed to remove.  
27c20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 69 76        ** the div
27c30 69 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d 20  ider cells from 
27c40 70 50 61 72 65 6e 74 2c 20 62 75 74 20 74 68 65  pParent, but the
27c50 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20   dividers cells 
27c60 61 72 65 20 6e 6f 74 0a 20 20 20 20 20 20 20 20  are not.        
27c70 2a 2a 20 61 64 64 65 64 20 74 6f 20 61 70 43 65  ** added to apCe
27c80 6c 6c 5b 5d 20 62 65 63 61 75 73 65 20 74 68 65  ll[] because the
27c90 79 20 61 72 65 20 64 75 70 6c 69 63 61 74 65 73  y are duplicates
27ca0 20 6f 66 20 63 68 69 6c 64 20 63 65 6c 6c 73 2e   of child cells.
27cb0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
27cc0 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61      dropCell(pPa
27cd0 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29  rent, nxDiv, sz)
27ce0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
27cf0 20 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70         u8 *pTemp
27d00 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
27d10 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c  ( nCell<nMaxCell
27d20 73 20 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43  s );.        szC
27d30 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b  ell[nCell] = sz;
27d40 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d  .        pTemp =
27d50 20 26 61 53 70 61 63 65 31 5b 69 53 70 61 63 65   &aSpace1[iSpace
27d60 31 5d 3b 0a 20 20 20 20 20 20 20 20 69 53 70 61  1];.        iSpa
27d70 63 65 31 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20  ce1 += sz;.     
27d80 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70     assert( sz<=p
27d90 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20 29  Bt->pageSize/4 )
27da0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
27db0 28 20 69 53 70 61 63 65 31 3c 3d 70 42 74 2d 3e  ( iSpace1<=pBt->
27dc0 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  pageSize );.    
27dd0 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70      memcpy(pTemp
27de0 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29 3b  , apDiv[i], sz);
27df0 0a 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b  .        apCell[
27e00 6e 43 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c  nCell] = pTemp+l
27e10 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20  eafCorrection;. 
27e20 20 20 20 20 20 20 20 69 66 28 20 49 53 41 55 54         if( ISAUT
27e30 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
27e40 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c       aFrom[nCell
27e50 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20 20 20 20  ] = 0xFF;.      
27e60 20 20 7d 0a 20 20 20 20 20 20 20 20 64 72 6f 70    }.        drop
27e70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Cell(pParent, nx
27e80 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20  Div, sz);.      
27e90 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
27ea0 2d 3d 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  -= leafCorrectio
27eb0 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  n;.        asser
27ec0 74 28 20 67 65 74 34 62 79 74 65 28 70 54 65 6d  t( get4byte(pTem
27ed0 70 29 3d 3d 70 67 6e 6f 4f 6c 64 5b 69 5d 20 29  p)==pgnoOld[i] )
27ee0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
27ef0 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  Old->leaf ){.   
27f00 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
27f10 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30  eafCorrection==0
27f20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   );.          /*
27f30 20 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e 74   The right point
27f40 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  er of the child 
27f50 70 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65  page pOld become
27f60 73 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20 20  s the left.     
27f70 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20       ** pointer 
27f80 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63  of the divider c
27f90 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ell */.         
27fa0 20 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e   memcpy(apCell[n
27fb0 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44  Cell], &pOld->aD
27fc0 61 74 61 5b 70 4f 6c 64 2d 3e 68 64 72 4f 66 66  ata[pOld->hdrOff
27fd0 73 65 74 2b 38 5d 2c 20 34 29 3b 0a 20 20 20 20  set+8], 4);.    
27fe0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27ff0 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61       assert( lea
28000 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29  fCorrection==4 )
28010 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
28020 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20  szCell[nCell]<4 
28030 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
28040 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61  * Do not allow a
28050 6e 79 20 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72  ny cells smaller
28060 20 74 68 61 6e 20 34 20 62 79 74 65 73 2e 20 2a   than 4 bytes. *
28070 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a  /.            sz
28080 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b  Cell[nCell] = 4;
28090 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
280a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e       }.        n
280b0 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  Cell++;.      }.
280c0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a      }.  }..  /*.
280d0 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75 74 20    ** Figure out 
280e0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
280f0 67 65 73 20 6e 65 65 64 65 64 20 74 6f 20 68 6f  ges needed to ho
28100 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c  ld all nCell cel
28110 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74  ls..  ** Store t
28120 68 69 73 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b  his number in "k
28130 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65  ".  Also compute
28140 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63 68 20 69   szNew[] which i
28150 73 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a  s the total.  **
28160 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
28170 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 70  ls on the i-th p
28180 61 67 65 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d  age and cntNew[]
28190 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e   which is the in
281a0 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65  dex.  ** in apCe
281b0 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c  ll[] of the cell
281c0 20 74 68 61 74 20 64 69 76 69 64 65 73 20 70 61   that divides pa
281d0 67 65 20 69 20 66 72 6f 6d 20 70 61 67 65 20 69  ge i from page i
281e0 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65  +1.  .  ** cntNe
281f0 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65 71 75 61  w[k] should equa
28200 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20  l nCell..  **.  
28210 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d 70 75 74  ** Values comput
28220 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b  ed by this block
28230 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
28240 20 20 20 20 20 20 6b 3a 20 54 68 65 20 74 6f 74        k: The tot
28250 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62  al number of sib
28260 6c 69 6e 67 20 70 61 67 65 73 0a 20 20 2a 2a 20  ling pages.  ** 
28270 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61     szNew[i]: Spa
28280 63 65 64 20 75 73 65 64 20 6f 6e 20 74 68 65 20  ced used on the 
28290 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67  i-th sibling pag
282a0 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77  e..  **   cntNew
282b0 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e 20 61 70  [i]: Index in ap
282c0 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c  Cell[] and szCel
282d0 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66 69 72 73  l[] for the firs
282e0 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20  t cell to.  **  
282f0 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
28300 72 69 67 68 74 20 6f 66 20 74 68 65 20 69 2d 74  right of the i-t
28310 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a  h sibling page..
28320 20 20 2a 2a 20 75 73 61 62 6c 65 53 70 61 63 65    ** usableSpace
28330 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  : Number of byte
28340 73 20 6f 66 20 73 70 61 63 65 20 61 76 61 69 6c  s of space avail
28350 61 62 6c 65 20 6f 6e 20 65 61 63 68 20 73 69 62  able on each sib
28360 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f  ling..  ** .  */
28370 0a 20 20 75 73 61 62 6c 65 53 70 61 63 65 20 3d  .  usableSpace =
28380 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
28390 20 2d 20 31 32 20 2b 20 6c 65 61 66 43 6f 72 72   - 12 + leafCorr
283a0 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75  ection;.  for(su
283b0 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c  btotal=k=i=0; i<
283c0 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
283d0 20 61 73 73 65 72 74 28 20 69 3c 6e 4d 61 78 43   assert( i<nMaxC
283e0 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73 75 62 74  ells );.    subt
283f0 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69  otal += szCell[i
28400 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 73  ] + 2;.    if( s
28410 75 62 74 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65  ubtotal > usable
28420 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73  Space ){.      s
28430 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74  zNew[k] = subtot
28440 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a  al - szCell[i];.
28450 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20        cntNew[k] 
28460 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6c  = i;.      if( l
28470 65 61 66 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20  eafData ){ i--; 
28480 7d 0a 20 20 20 20 20 20 73 75 62 74 6f 74 61 6c  }.      subtotal
28490 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b   = 0;.      k++;
284a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e  .    }.  }.  szN
284b0 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c  ew[k] = subtotal
284c0 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20  ;.  cntNew[k] = 
284d0 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20  nCell;.  k++;.. 
284e0 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61 63   /*.  ** The pac
284f0 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64 20 62 79  king computed by
28500 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 6c   the previous bl
28510 6f 63 6b 20 69 73 20 62 69 61 73 65 64 20 74 6f  ock is biased to
28520 77 61 72 64 20 74 68 65 20 73 69 62 6c 69 6e 67  ward the sibling
28530 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65  s.  ** on the le
28540 66 74 20 73 69 64 65 2e 20 20 54 68 65 20 6c 65  ft side.  The le
28550 66 74 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  ft siblings are 
28560 61 6c 77 61 79 73 20 6e 65 61 72 6c 79 20 66 75  always nearly fu
28570 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a 20 20  ll, while the.  
28580 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69  ** right-most si
28590 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 6e  bling might be n
285a0 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 20 54 68  early empty.  Th
285b0 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  is block of code
285c0 20 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74   attempts.  ** t
285d0 6f 20 61 64 6a 75 73 74 20 74 68 65 20 70 61 63  o adjust the pac
285e0 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67 73  king of siblings
285f0 20 74 6f 20 67 65 74 20 61 20 62 65 74 74 65 72   to get a better
28600 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20   balance..  **. 
28610 20 2a 2a 20 54 68 69 73 20 61 64 6a 75 73 74 6d   ** This adjustm
28620 65 6e 74 20 69 73 20 6d 6f 72 65 20 74 68 61 6e  ent is more than
28630 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
28640 2e 20 20 54 68 65 20 70 61 63 6b 69 6e 67 20 61  .  The packing a
28650 62 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20  bove might.  ** 
28660 62 65 20 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c  be so out of bal
28670 61 6e 63 65 20 61 73 20 74 6f 20 62 65 20 69 6c  ance as to be il
28680 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d  legal.  For exam
28690 70 6c 65 2c 20 74 68 65 20 72 69 67 68 74 2d 6d  ple, the right-m
286a0 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67  ost.  ** sibling
286b0 20 6d 69 67 68 74 20 62 65 20 63 6f 6d 70 6c 65   might be comple
286c0 74 65 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69  tely empty.  Thi
286d0 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20  s adjustment is 
286e0 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20  not optional..  
286f0 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20  */.  for(i=k-1; 
28700 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  i>0; i--){.    i
28710 6e 74 20 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e  nt szRight = szN
28720 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20  ew[i];  /* Size 
28730 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68  of sibling on th
28740 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 69  e right */.    i
28750 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65  nt szLeft = szNe
28760 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20  w[i-1]; /* Size 
28770 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68  of sibling on th
28780 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e  e left */.    in
28790 74 20 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  t r;            
287a0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 69    /* Index of ri
287b0 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e  ght-most cell in
287c0 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f   left sibling */
287d0 0a 20 20 20 20 69 6e 74 20 64 3b 20 20 20 20 20  .    int d;     
287e0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
287f0 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20  x of first cell 
28800 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 72  to the left of r
28810 69 67 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a  ight sibling */.
28820 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b  .    r = cntNew[
28830 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20  i-1] - 1;.    d 
28840 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61  = r + 1 - leafDa
28850 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ta;.    assert( 
28860 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  d<nMaxCells );. 
28870 20 20 20 61 73 73 65 72 74 28 20 72 3c 6e 4d 61     assert( r<nMa
28880 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68  xCells );.    wh
28890 69 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d 30 20  ile( szRight==0 
288a0 7c 7c 20 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c  || szRight+szCel
288b0 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28  l[d]+2<=szLeft-(
288c0 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a  szCell[r]+2) ){.
288d0 20 20 20 20 20 20 73 7a 52 69 67 68 74 20 2b 3d        szRight +=
288e0 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a   szCell[d] + 2;.
288f0 20 20 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20        szLeft -= 
28900 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20  szCell[r] + 2;. 
28910 20 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d       cntNew[i-1]
28920 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20 63 6e  --;.      r = cn
28930 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20  tNew[i-1] - 1;. 
28940 20 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d       d = r + 1 -
28950 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20 7d   leafData;.    }
28960 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20  .    szNew[i] = 
28970 73 7a 52 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e  szRight;.    szN
28980 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74  ew[i-1] = szLeft
28990 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68  ;.  }..  /* Eith
289a0 65 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20  er we found one 
289b0 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63  or more cells (c
289c0 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20  ntnew[0])>0) or 
289d0 77 65 20 61 72 65 20 74 68 65 0a 20 20 2a 2a 20  we are the.  ** 
289e0 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  a virtual root p
289f0 61 67 65 2e 20 20 41 20 76 69 72 74 75 61 6c 20  age.  A virtual 
28a00 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77 68 65  root page is whe
28a10 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a  n the real root.
28a20 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61 67    ** page is pag
28a30 65 20 31 20 61 6e 64 20 77 65 20 61 72 65 20 74  e 1 and we are t
28a40 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66  he only child of
28a50 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 2a 2f   that page..  */
28a60 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 4e 65  .  assert( cntNe
28a70 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65  w[0]>0 || (pPare
28a80 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70  nt->pgno==1 && p
28a90 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30  Parent->nCell==0
28aa0 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ) );..  /*.  ** 
28ab0 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20 70  Allocate k new p
28ac0 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f 6c 64  ages.  Reuse old
28ad0 20 70 61 67 65 73 20 77 68 65 72 65 20 70 6f 73   pages where pos
28ae0 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  sible..  */.  as
28af0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e  sert( pPage->pgn
28b00 6f 3e 31 20 29 3b 0a 20 20 70 61 67 65 46 6c 61  o>1 );.  pageFla
28b10 67 73 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  gs = pPage->aDat
28b20 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  a[0];.  for(i=0;
28b30 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
28b40 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20  MemPage *pNew;. 
28b50 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b     if( i<nOld ){
28b60 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70  .      pNew = ap
28b70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69  New[i] = apOld[i
28b80 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77  ];.      pgnoNew
28b90 5b 69 5d 20 3d 20 70 67 6e 6f 4f 6c 64 5b 69 5d  [i] = pgnoOld[i]
28ba0 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d  ;.      apOld[i]
28bb0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
28bc0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
28bd0 74 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65  te(pNew->pDbPage
28be0 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b  );.      nNew++;
28bf0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
28c00 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
28c10 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  anup;.    }else{
28c20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
28c30 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  >0 );.      rc =
28c40 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
28c50 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26  ge(pBt, &pNew, &
28c60 70 67 6e 6f 4e 65 77 5b 69 5d 2c 20 70 67 6e 6f  pgnoNew[i], pgno
28c70 4e 65 77 5b 69 2d 31 5d 2c 20 30 29 3b 0a 20 20  New[i-1], 0);.  
28c80 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
28c90 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
28ca0 70 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69  p;.      apNew[i
28cb0 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  ] = pNew;.      
28cc0 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nNew++;.    }.  
28cd0 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79  }..  /* Free any
28ce0 20 6f 6c 64 20 70 61 67 65 73 20 74 68 61 74 20   old pages that 
28cf0 77 65 72 65 20 6e 6f 74 20 72 65 75 73 65 64 20  were not reused 
28d00 61 73 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20  as new pages..  
28d10 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f  */.  while( i<nO
28d20 6c 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  ld ){.    rc = f
28d30 72 65 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d  reePage(apOld[i]
28d40 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
28d50 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
28d60 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c 65 61 73  anup;.    releas
28d70 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b  ePage(apOld[i]);
28d80 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20  .    apOld[i] = 
28d90 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a  0;.    i++;.  }.
28da0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74  .  /*.  ** Put t
28db0 68 65 20 6e 65 77 20 70 61 67 65 73 20 69 6e 20  he new pages in 
28dc0 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  accending order.
28dd0 20 20 54 68 69 73 20 68 65 6c 70 73 20 74 6f 0a    This helps to.
28de0 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74 72 69 65    ** keep entrie
28df0 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69  s in the disk fi
28e00 6c 65 20 69 6e 20 6f 72 64 65 72 20 73 6f 20 74  le in order so t
28e10 68 61 74 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20  hat a scan.  ** 
28e20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  of the table is 
28e30 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68  a linear scan th
28e40 72 6f 75 67 68 20 74 68 65 20 66 69 6c 65 2e 20  rough the file. 
28e50 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75   That.  ** in tu
28e60 72 6e 20 68 65 6c 70 73 20 74 68 65 20 6f 70 65  rn helps the ope
28e70 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 74 6f  rating system to
28e80 20 64 65 6c 69 76 65 72 20 70 61 67 65 73 0a 20   deliver pages. 
28e90 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 69 73   ** from the dis
28ea0 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a  k more rapidly..
28eb0 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e    **.  ** An O(n
28ec0 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f  ^2) insertion so
28ed0 72 74 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20  rt algorithm is 
28ee0 75 73 65 64 2c 20 62 75 74 20 73 69 6e 63 65 0a  used, but since.
28ef0 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76 65 72 20    ** n is never 
28f00 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20 28 61 20  more than NB (a 
28f10 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c  small constant),
28f20 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a   that should.  *
28f30 2a 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c  * not be a probl
28f40 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  em..  **.  ** Wh
28f50 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f  en NB==3, this o
28f60 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ne optimization 
28f70 6d 61 6b 65 73 20 74 68 65 20 64 61 74 61 62 61  makes the databa
28f80 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74 20 32 35  se.  ** about 25
28f90 25 20 66 61 73 74 65 72 20 66 6f 72 20 6c 61 72  % faster for lar
28fa0 67 65 20 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e  ge insertions an
28fb0 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a  d deletions..  *
28fc0 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b  /.  for(i=0; i<k
28fd0 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  -1; i++){.    in
28fe0 74 20 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77  t minV = pgnoNew
28ff0 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e  [i];.    int min
29000 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a  I = i;.    for(j
29010 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b  =i+1; j<k; j++){
29020 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 4e  .      if( pgnoN
29030 65 77 5b 6a 5d 3c 28 75 6e 73 69 67 6e 65 64 29  ew[j]<(unsigned)
29040 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20 20 20 20  minV ){.        
29050 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20  minI = j;.      
29060 20 20 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77    minV = pgnoNew
29070 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [j];.      }.   
29080 20 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e 49 3e   }.    if( minI>
29090 69 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  i ){.      int t
290a0 3b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  ;.      MemPage 
290b0 2a 70 54 3b 0a 20 20 20 20 20 20 74 20 3d 20 70  *pT;.      t = p
290c0 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20  gnoNew[i];.     
290d0 20 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a   pT = apNew[i];.
290e0 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d        pgnoNew[i]
290f0 20 3d 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d   = pgnoNew[minI]
29100 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d  ;.      apNew[i]
29110 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a   = apNew[minI];.
29120 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 6d 69        pgnoNew[mi
29130 6e 49 5d 20 3d 20 74 3b 0a 20 20 20 20 20 20 61  nI] = t;.      a
29140 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b  pNew[minI] = pT;
29150 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41  .    }.  }.  TRA
29160 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c  CE(("BALANCE: ol
29170 64 3a 20 25 64 20 25 64 20 25 64 20 20 6e 65 77  d: %d %d %d  new
29180 3a 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  : %d(%d) %d(%d) 
29190 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64  %d(%d) %d(%d) %d
291a0 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 70 67 6e  (%d)\n",.    pgn
291b0 6f 4f 6c 64 5b 30 5d 2c 20 0a 20 20 20 20 6e 4f  oOld[0], .    nO
291c0 6c 64 3e 3d 32 20 3f 20 70 67 6e 6f 4f 6c 64 5b  ld>=2 ? pgnoOld[
291d0 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64  1] : 0,.    nOld
291e0 3e 3d 33 20 3f 20 70 67 6e 6f 4f 6c 64 5b 32 5d  >=3 ? pgnoOld[2]
291f0 20 3a 20 30 2c 0a 20 20 20 20 70 67 6e 6f 4e 65   : 0,.    pgnoNe
29200 77 5b 30 5d 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a  w[0], szNew[0],.
29210 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 70 67      nNew>=2 ? pg
29220 6e 6f 4e 65 77 5b 31 5d 20 3a 20 30 2c 20 6e 4e  noNew[1] : 0, nN
29230 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d  ew>=2 ? szNew[1]
29240 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d   : 0,.    nNew>=
29250 33 20 3f 20 70 67 6e 6f 4e 65 77 5b 32 5d 20 3a  3 ? pgnoNew[2] :
29260 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a   0, nNew>=3 ? sz
29270 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20  New[2] : 0,.    
29280 6e 4e 65 77 3e 3d 34 20 3f 20 70 67 6e 6f 4e 65  nNew>=4 ? pgnoNe
29290 77 5b 33 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d  w[3] : 0, nNew>=
292a0 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30  4 ? szNew[3] : 0
292b0 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20  ,.    nNew>=5 ? 
292c0 70 67 6e 6f 4e 65 77 5b 34 5d 20 3a 20 30 2c 20  pgnoNew[4] : 0, 
292d0 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b  nNew>=5 ? szNew[
292e0 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 2f 2a 0a  4] : 0));..  /*.
292f0 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73 74    ** Evenly dist
29300 72 69 62 75 74 65 20 74 68 65 20 64 61 74 61 20  ribute the data 
29310 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f  in apCell[] acro
29320 73 73 20 74 68 65 20 6e 65 77 20 70 61 67 65 73  ss the new pages
29330 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20 64 69  ..  ** Insert di
29340 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f  vider cells into
29350 20 70 50 61 72 65 6e 74 20 61 73 20 6e 65 63 65   pParent as nece
29360 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20  ssary..  */.  j 
29370 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
29380 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20  i<nNew; i++){.  
29390 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74 68    /* Assemble th
293a0 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61  e new sibling pa
293b0 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61  ge. */.    MemPa
293c0 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77  ge *pNew = apNew
293d0 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [i];.    assert(
293e0 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   j<nMaxCells );.
293f0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
29400 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 4e 65 77 5b  ->pgno==pgnoNew[
29410 69 5d 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61  i] );.    zeroPa
29420 67 65 28 70 4e 65 77 2c 20 70 61 67 65 46 6c 61  ge(pNew, pageFla
29430 67 73 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c  gs);.    assembl
29440 65 50 61 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e  ePage(pNew, cntN
29450 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c  ew[i]-j, &apCell
29460 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29  [j], &szCell[j])
29470 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
29480 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28  ew->nCell>0 || (
29490 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65  nNew==1 && cntNe
294a0 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20  w[0]==0) );.    
294b0 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f  assert( pNew->nO
294c0 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20  verflow==0 );.. 
294d0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
294e0 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
294f0 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65  database, update
29500 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
29510 20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20   entries.    ** 
29520 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 74 68  that point to th
29530 65 20 73 69 62 6c 69 6e 67 73 20 74 68 61 74 20  e siblings that 
29540 77 65 72 65 20 72 65 61 72 72 61 6e 67 65 64 2e  were rearranged.
29550 20 54 68 65 73 65 20 63 61 6e 20 62 65 3a 20 6c   These can be: l
29560 65 66 74 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64  eft.    ** child
29570 72 65 6e 20 6f 66 20 63 65 6c 6c 73 2c 20 74 68  ren of cells, th
29580 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66  e right-child of
29590 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20 6f 76   the page, or ov
295a0 65 72 66 6c 6f 77 20 70 61 67 65 73 0a 20 20 20  erflow pages.   
295b0 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62   ** pointed to b
295c0 79 20 63 65 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a  y cells..    */.
295d0 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
295e0 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 66 6f  CUUM ){.      fo
295f0 72 28 6b 3d 6a 3b 20 6b 3c 63 6e 74 4e 65 77 5b  r(k=j; k<cntNew[
29600 69 5d 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; k++){.      
29610 20 20 61 73 73 65 72 74 28 20 6b 3c 6e 4d 61 78    assert( k<nMax
29620 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 20  Cells );.       
29630 20 69 66 28 20 61 46 72 6f 6d 5b 6b 5d 3d 3d 30   if( aFrom[k]==0
29640 78 46 46 20 7c 7c 20 61 70 43 6f 70 79 5b 61 46  xFF || apCopy[aF
29650 72 6f 6d 5b 6b 5d 5d 2d 3e 70 67 6e 6f 21 3d 70  rom[k]]->pgno!=p
29660 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  New->pgno ){.   
29670 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
29680 61 70 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20  apPutOvfl(pNew, 
29690 6b 2d 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-j);.          
296a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
296b0 4b 20 26 26 20 6c 65 61 66 43 6f 72 72 65 63 74  K && leafCorrect
296c0 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ion==0 ){.      
296d0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
296e0 70 50 75 74 28 70 42 74 2c 20 67 65 74 34 62 79  pPut(pBt, get4by
296f0 74 65 28 61 70 43 65 6c 6c 5b 6b 5d 29 2c 20 50  te(apCell[k]), P
29700 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e 65  TRMAP_BTREE, pNe
29710 77 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  w->pgno);.      
29720 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
29730 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
29740 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
29750 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
29760 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 20  eanup;.         
29770 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
29780 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
29790 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a  j = cntNew[i];..
297a0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 69      /* If the si
297b0 62 6c 69 6e 67 20 70 61 67 65 20 61 73 73 65 6d  bling page assem
297c0 62 6c 65 64 20 61 62 6f 76 65 20 77 61 73 20 6e  bled above was n
297d0 6f 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  ot the right-mos
297e0 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a  t sibling,.    *
297f0 2a 20 69 6e 73 65 72 74 20 61 20 64 69 76 69 64  * insert a divid
29800 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65  er cell into the
29810 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20   parent page..  
29820 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 3c 6e    */.    if( i<n
29830 4e 65 77 2d 31 20 26 26 20 6a 3c 6e 43 65 6c 6c  New-1 && j<nCell
29840 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43   ){.      u8 *pC
29850 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a 70  ell;.      u8 *p
29860 54 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20  Temp;.      int 
29870 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  sz;..      asser
29880 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( j<nMaxCells )
29890 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20  ;.      pCell = 
298a0 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  apCell[j];.     
298b0 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20   sz = szCell[j] 
298c0 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  + leafCorrection
298d0 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20  ;.      pTemp = 
298e0 26 61 53 70 61 63 65 32 5b 69 53 70 61 63 65 32  &aSpace2[iSpace2
298f0 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e  ];.      if( !pN
29900 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ew->leaf ){.    
29910 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
29920 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c  ->aData[8], pCel
29930 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 69  l, 4);.        i
29940 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
29950 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 61 46  .         && (aF
29960 72 6f 6d 5b 6a 5d 3d 3d 30 78 46 46 20 7c 7c 20  rom[j]==0xFF || 
29970 61 70 43 6f 70 79 5b 61 46 72 6f 6d 5b 6a 5d 5d  apCopy[aFrom[j]]
29980 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67  ->pgno!=pNew->pg
29990 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  no).        ){. 
299a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74           rc = pt
299b0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 67 65 74  rmapPut(pBt, get
299c0 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20 50 54  4byte(pCell), PT
299d0 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77  RMAP_BTREE, pNew
299e0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
299f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
29a00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
29a10 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
29a20 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
29a30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
29a40 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
29a50 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20  leafData ){.    
29a60 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74 72      /* If the tr
29a70 65 65 20 69 73 20 61 20 6c 65 61 66 2d 64 61 74  ee is a leaf-dat
29a80 61 20 74 72 65 65 2c 20 61 6e 64 20 74 68 65 20  a tree, and the 
29a90 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6c 65 61  siblings are lea
29aa0 76 65 73 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a  ves, .        **
29ab0 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
29ac0 6f 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  o divider cell i
29ad0 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74  n apCell[]. Inst
29ae0 65 61 64 2c 20 74 68 65 20 64 69 76 69 64 65 72  ead, the divider
29af0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c   .        ** cel
29b00 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68  l consists of th
29b10 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 66 6f  e integer key fo
29b20 72 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  r the right-most
29b30 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20   cell of .      
29b40 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67    ** the sibling
29b50 2d 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20  -page assembled 
29b60 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20  above only..    
29b70 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 43      */.        C
29b80 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
29b90 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20        j--;.     
29ba0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
29bb0 61 72 73 65 43 65 6c 6c 50 74 72 28 70 4e 65 77  arseCellPtr(pNew
29bc0 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e  , apCell[j], &in
29bd0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 43 65  fo);.        pCe
29be0 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20  ll = pTemp;.    
29bf0 20 20 20 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70      fillInCell(p
29c00 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 2c 20 30  Parent, pCell, 0
29c10 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20  , info.nKey, 0, 
29c20 30 2c 20 30 2c 20 26 73 7a 29 3b 0a 20 20 20 20  0, 0, &sz);.    
29c30 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20      pTemp = 0;. 
29c40 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
29c50 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a      pCell -= 4;.
29c60 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 73 63 75          /* Obscu
29c70 72 65 20 63 61 73 65 20 66 6f 72 20 6e 6f 6e 2d  re case for non-
29c80 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 73 3a  leaf-data trees:
29c90 20 49 66 20 74 68 65 20 63 65 6c 6c 20 61 74 20   If the cell at 
29ca0 70 43 65 6c 6c 20 77 61 73 0a 20 20 20 20 20 20  pCell was.      
29cb0 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20    ** previously 
29cc0 73 74 6f 72 65 64 20 6f 6e 20 61 20 6c 65 61 66  stored on a leaf
29cd0 20 6e 6f 64 65 2c 20 61 6e 64 20 69 74 73 20 72   node, and its r
29ce0 65 70 6f 72 74 65 64 20 73 69 7a 65 20 77 61 73  eported size was
29cf0 20 34 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79   4.        ** by
29d00 74 65 73 2c 20 74 68 65 6e 20 69 74 20 6d 61 79  tes, then it may
29d10 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73 6d 61   actually be sma
29d20 6c 6c 65 72 20 74 68 61 6e 20 74 68 69 73 20 0a  ller than this .
29d30 20 20 20 20 20 20 20 20 2a 2a 20 28 73 65 65 20          ** (see 
29d40 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
29d50 65 43 65 6c 6c 50 74 72 28 29 2c 20 34 20 62 79  eCellPtr(), 4 by
29d60 74 65 73 20 69 73 20 74 68 65 20 6d 69 6e 69 6d  tes is the minim
29d70 75 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 20  um size of.     
29d80 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e     ** any cell).
29d90 20 42 75 74 20 69 74 20 69 73 20 69 6d 70 6f 72   But it is impor
29da0 74 61 6e 74 20 74 6f 20 70 61 73 73 20 74 68 65  tant to pass the
29db0 20 63 6f 72 72 65 63 74 20 73 69 7a 65 20 74 6f   correct size to
29dc0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73   .        ** ins
29dd0 65 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65  ertCell(), so re
29de0 70 61 72 73 65 20 74 68 65 20 63 65 6c 6c 20 6e  parse the cell n
29df0 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ow..        **. 
29e00 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74         ** Note t
29e10 68 61 74 20 74 68 69 73 20 63 61 6e 20 6e 65 76  hat this can nev
29e20 65 72 20 68 61 70 70 65 6e 20 69 6e 20 61 6e 20  er happen in an 
29e30 53 51 4c 69 74 65 20 64 61 74 61 20 66 69 6c 65  SQLite data file
29e40 2c 20 61 73 20 61 6c 6c 0a 20 20 20 20 20 20 20  , as all.       
29e50 20 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20 61 74   ** cells are at
29e60 20 6c 65 61 73 74 20 34 20 62 79 74 65 73 2e 20   least 4 bytes. 
29e70 49 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  It only happens 
29e80 69 6e 20 62 2d 74 72 65 65 73 20 75 73 65 64 0a  in b-trees used.
29e90 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 65 76          ** to ev
29ea0 61 6c 75 61 74 65 20 22 49 4e 20 28 53 45 4c 45  aluate "IN (SELE
29eb0 43 54 20 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d  CT ...)" and sim
29ec0 69 6c 61 72 20 63 6c 61 75 73 65 73 2e 0a 20 20  ilar clauses..  
29ed0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
29ee0 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d   if( szCell[j]==
29ef0 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  4 ){.          a
29f00 73 73 65 72 74 28 6c 65 61 66 43 6f 72 72 65 63  ssert(leafCorrec
29f10 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20  tion==4);.      
29f20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a      sz = cellSiz
29f30 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 70 43  ePtr(pParent, pC
29f40 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ell);.        }.
29f50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 53        }.      iS
29f60 70 61 63 65 32 20 2b 3d 20 73 7a 3b 0a 20 20 20  pace2 += sz;.   
29f70 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70     assert( sz<=p
29f80 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20 29  Bt->pageSize/4 )
29f90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
29fa0 69 53 70 61 63 65 32 3c 3d 70 42 74 2d 3e 70 61  iSpace2<=pBt->pa
29fb0 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  geSize );.      
29fc0 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28  rc = insertCell(
29fd0 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20  pParent, nxDiv, 
29fe0 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d 70  pCell, sz, pTemp
29ff0 2c 20 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 4);.      if( 
2a000 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
2a010 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
2a020 61 6e 75 70 3b 0a 20 20 20 20 20 20 70 75 74 34  anup;.      put4
2a030 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f  byte(findOverflo
2a040 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 6e 78  wCell(pParent,nx
2a050 44 69 76 29 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f  Div), pNew->pgno
2a060 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  );..      /* If 
2a070 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d  this is an auto-
2a080 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c  vacuum database,
2a090 20 61 6e 64 20 6e 6f 74 20 61 20 6c 65 61 66 2d   and not a leaf-
2a0a0 64 61 74 61 20 74 72 65 65 2c 0a 20 20 20 20 20  data tree,.     
2a0b0 20 2a 2a 20 74 68 65 6e 20 75 70 64 61 74 65 20   ** then update 
2a0c0 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
2a0d0 77 69 74 68 20 61 6e 20 65 6e 74 72 79 20 66 6f  with an entry fo
2a0e0 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
2a0f0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  age.      ** tha
2a100 74 20 74 68 65 20 63 65 6c 6c 20 6a 75 73 74 20  t the cell just 
2a110 69 6e 73 65 72 74 65 64 20 70 6f 69 6e 74 73 20  inserted points 
2a120 74 6f 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20  to (if any)..   
2a130 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
2a140 49 53 41 55 54 4f 56 41 43 55 55 4d 20 26 26 20  ISAUTOVACUUM && 
2a150 21 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20  !leafData ){.   
2a160 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
2a170 50 75 74 4f 76 66 6c 28 70 50 61 72 65 6e 74 2c  PutOvfl(pParent,
2a180 20 6e 78 44 69 76 29 3b 0a 20 20 20 20 20 20 20   nxDiv);.       
2a190 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2a1a0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2a1b0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
2a1c0 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a  anup;.        }.
2a1d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6a 2b        }.      j+
2a1e0 2b 3b 0a 20 20 20 20 20 20 6e 78 44 69 76 2b 2b  +;.      nxDiv++
2a1f0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
2a200 53 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  Set the pointer-
2a210 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 20 74 68  map entry for th
2a220 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61  e new sibling pa
2a230 67 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 49  ge. */.    if( I
2a240 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
2a250 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
2a260 50 75 74 28 70 42 74 2c 20 70 4e 65 77 2d 3e 70  Put(pBt, pNew->p
2a270 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
2a280 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  E, pParent->pgno
2a290 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2a2a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2a2b0 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
2a2c0 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
2a2d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
2a2e0 61 73 73 65 72 74 28 20 6a 3d 3d 6e 43 65 6c 6c  assert( j==nCell
2a2f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4f   );.  assert( nO
2a300 6c 64 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74  ld>0 );.  assert
2a310 28 20 6e 4e 65 77 3e 30 20 29 3b 0a 20 20 69 66  ( nNew>0 );.  if
2a320 28 20 28 70 61 67 65 46 6c 61 67 73 20 26 20 50  ( (pageFlags & P
2a330 54 46 5f 4c 45 41 46 29 3d 3d 30 20 29 7b 0a 20  TF_LEAF)==0 ){. 
2a340 20 20 20 75 38 20 2a 7a 43 68 69 6c 64 20 3d 20     u8 *zChild = 
2a350 26 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d  &apCopy[nOld-1]-
2a360 3e 61 44 61 74 61 5b 38 5d 3b 0a 20 20 20 20 6d  >aData[8];.    m
2a370 65 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65  emcpy(&apNew[nNe
2a380 77 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  w-1]->aData[8], 
2a390 7a 43 68 69 6c 64 2c 20 34 29 3b 0a 20 20 20 20  zChild, 4);.    
2a3a0 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
2a3b0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
2a3c0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 67 65  trmapPut(pBt, ge
2a3d0 74 34 62 79 74 65 28 7a 43 68 69 6c 64 29 2c 20  t4byte(zChild), 
2a3e0 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 61 70  PTRMAP_BTREE, ap
2a3f0 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 70 67 6e  New[nNew-1]->pgn
2a400 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
2a410 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2a420 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61         goto bala
2a430 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
2a440 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2a450 20 69 66 28 20 6e 78 44 69 76 3d 3d 70 50 61 72   if( nxDiv==pPar
2a460 65 6e 74 2d 3e 6e 43 65 6c 6c 2b 70 50 61 72 65  ent->nCell+pPare
2a470 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b  nt->nOverflow ){
2a480 0a 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d 6f  .    /* Right-mo
2a490 73 74 20 73 69 62 6c 69 6e 67 20 69 73 20 74 68  st sibling is th
2a4a0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69  e right-most chi
2a4b0 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 20 2a 2f  ld of pParent */
2a4c0 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70  .    put4byte(&p
2a4d0 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
2a4e0 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
2a4f0 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65  +8], pgnoNew[nNe
2a500 77 2d 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  w-1]);.  }else{.
2a510 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d 6f 73      /* Right-mos
2a520 74 20 73 69 62 6c 69 6e 67 20 69 73 20 74 68 65  t sibling is the
2a530 20 6c 65 66 74 20 63 68 69 6c 64 20 6f 66 20 74   left child of t
2a540 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
2a550 6e 20 70 50 61 72 65 6e 74 0a 20 20 20 20 2a 2a  n pParent.    **
2a560 20 70 61 73 74 20 74 68 65 20 72 69 67 68 74 2d   past the right-
2a570 6d 6f 73 74 20 64 69 76 69 64 65 72 20 65 6e 74  most divider ent
2a580 72 79 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79  ry */.    put4by
2a590 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  te(findOverflowC
2a5a0 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44  ell(pParent, nxD
2a5b0 69 76 29 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65  iv), pgnoNew[nNe
2a5c0 77 2d 31 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  w-1]);.  }..  /*
2a5d0 0a 20 20 2a 2a 20 52 65 70 61 72 65 6e 74 20 63  .  ** Reparent c
2a5e0 68 69 6c 64 72 65 6e 20 6f 66 20 61 6c 6c 20 63  hildren of all c
2a5f0 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ells..  */.  for
2a600 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b  (i=0; i<nNew; i+
2a610 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 70  +){.    rc = rep
2a620 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28  arentChildPages(
2a630 61 70 4e 65 77 5b 69 5d 2c 20 30 29 3b 0a 20 20  apNew[i], 0);.  
2a640 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2a650 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e  _OK ) goto balan
2a660 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  ce_cleanup;.  }.
2a670 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74 43    rc = reparentC
2a680 68 69 6c 64 50 61 67 65 73 28 70 50 61 72 65 6e  hildPages(pParen
2a690 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  t, 0);.  if( rc!
2a6a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
2a6b0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
2a6c0 70 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 61  p;..  /*.  ** Ba
2a6d0 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e 74  lance the parent
2a6e0 20 70 61 67 65 2e 20 20 4e 6f 74 65 20 74 68 61   page.  Note tha
2a6f0 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  t the current pa
2a700 67 65 20 28 70 50 61 67 65 29 20 6d 69 67 68 74  ge (pPage) might
2a710 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e 20  .  ** have been 
2a720 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72 65  added to the fre
2a730 65 6c 69 73 74 20 73 6f 20 69 74 20 6d 69 67 68  elist so it migh
2a740 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20 69  t no longer be i
2a750 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a  nitialized..  **
2a760 20 42 75 74 20 74 68 65 20 70 61 72 65 6e 74 20   But the parent 
2a770 70 61 67 65 20 77 69 6c 6c 20 61 6c 77 61 79 73  page will always
2a780 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e   be initialized.
2a790 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2a7a0 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20  pParent->isInit 
2a7b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 63 72 61  );.  sqlite3Scra
2a7c0 74 63 68 46 72 65 65 28 61 70 43 65 6c 6c 29 3b  tchFree(apCell);
2a7d0 0a 20 20 61 70 43 65 6c 6c 20 3d 20 30 3b 0a 20  .  apCell = 0;. 
2a7e0 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50   rc = balance(pP
2a7f0 61 72 65 6e 74 2c 20 30 29 3b 0a 20 20 0a 20 20  arent, 0);.  .  
2a800 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20  /*.  ** Cleanup 
2a810 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
2a820 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63  ..  */.balance_c
2a830 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65  leanup:.  sqlite
2a840 33 50 61 67 65 46 72 65 65 28 61 53 70 61 63 65  3PageFree(aSpace
2a850 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 63 72  2);.  sqlite3Scr
2a860 61 74 63 68 46 72 65 65 28 61 70 43 65 6c 6c 29  atchFree(apCell)
2a870 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
2a880 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72  Old; i++){.    r
2a890 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64  eleasePage(apOld
2a8a0 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  [i]);.  }.  for(
2a8b0 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b  i=0; i<nNew; i++
2a8c0 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  ){.    releasePa
2a8d0 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20  ge(apNew[i]);.  
2a8e0 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
2a8f0 70 50 61 72 65 6e 74 29 3b 0a 20 20 54 52 41 43  pParent);.  TRAC
2a900 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e  E(("BALANCE: fin
2a910 69 73 68 65 64 20 77 69 74 68 20 25 64 3a 20 6f  ished with %d: o
2a920 6c 64 3d 25 64 20 6e 65 77 3d 25 64 20 63 65 6c  ld=%d new=%d cel
2a930 6c 73 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20  ls=%d\n",.      
2a940 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c      pPage->pgno,
2a950 20 6e 4f 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65   nOld, nNew, nCe
2a960 6c 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ll));.  return r
2a970 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
2a980 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2a990 65 64 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20  ed for the root 
2a9a0 70 61 67 65 20 6f 66 20 61 20 62 74 72 65 65 20  page of a btree 
2a9b0 77 68 65 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a  when the root.**
2a9c0 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e   page contains n
2a9d0 6f 20 63 65 6c 6c 73 2e 20 20 54 68 69 73 20 69  o cells.  This i
2a9e0 73 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  s an opportunity
2a9f0 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 74 72 65   to make the tre
2aa00 65 0a 2a 2a 20 73 68 61 6c 6c 6f 77 65 72 20 62  e.** shallower b
2aa10 79 20 6f 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a  y one level..*/.
2aa20 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
2aa30 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 4d 65 6d  ce_shallower(Mem
2aa40 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
2aa50 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 3b  MemPage *pChild;
2aa60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2aa70 54 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 70  The only child p
2aa80 61 67 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a  age of pPage */.
2aa90 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64    Pgno pgnoChild
2aaa0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2aab0 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  * Page number fo
2aac0 72 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20 69 6e  r pChild */.  in
2aad0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2aae0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
2aaf0 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73  turn code from s
2ab00 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a  ubprocedures */.
2ab10 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
2ab20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ab30 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 42 54    /* The main BT
2ab40 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
2ab50 0a 20 20 69 6e 74 20 6d 78 43 65 6c 6c 50 65 72  .  int mxCellPer
2ab60 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
2ab70 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  /* Maximum numbe
2ab80 72 20 6f 66 20 63 65 6c 6c 73 20 70 65 72 20 70  r of cells per p
2ab90 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
2aba0 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
2abb0 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c        /* All cel
2abc0 6c 73 20 66 72 6f 6d 20 70 61 67 65 73 20 62 65  ls from pages be
2abd0 69 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a  ing balanced */.
2abe0 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20    u16 *szCell;  
2abf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ac00 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20  * Local size of 
2ac10 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 0a 20 20  all cells */..  
2ac20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
2ac30 50 61 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61  Parent==0 );.  a
2ac40 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
2ac50 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ell==0 );.  asse
2ac60 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
2ac70 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
2ac80 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
2ac90 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
2aca0 0a 20 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65  .  mxCellPerPage
2acb0 20 3d 20 4d 58 5f 43 45 4c 4c 28 70 42 74 29 3b   = MX_CELL(pBt);
2acc0 0a 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69  .  apCell = sqli
2acd0 74 65 33 4d 61 6c 6c 6f 63 28 20 6d 78 43 65 6c  te3Malloc( mxCel
2ace0 6c 50 65 72 50 61 67 65 2a 28 73 69 7a 65 6f 66  lPerPage*(sizeof
2acf0 28 75 38 2a 29 2b 73 69 7a 65 6f 66 28 75 31 36  (u8*)+sizeof(u16
2ad00 29 29 20 29 3b 0a 20 20 69 66 28 20 61 70 43 65  )) );.  if( apCe
2ad10 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ll==0 ) return S
2ad20 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73  QLITE_NOMEM;.  s
2ad30 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61  zCell = (u16*)&a
2ad40 70 43 65 6c 6c 5b 6d 78 43 65 6c 6c 50 65 72 50  pCell[mxCellPerP
2ad50 61 67 65 5d 3b 0a 20 20 69 66 28 20 70 50 61 67  age];.  if( pPag
2ad60 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f  e->leaf ){.    /
2ad70 2a 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 63  * The table is c
2ad80 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 20  ompletely empty 
2ad90 2a 2f 0a 20 20 20 20 54 52 41 43 45 28 28 22 42  */.    TRACE(("B
2ada0 41 4c 41 4e 43 45 3a 20 65 6d 70 74 79 20 74 61  ALANCE: empty ta
2adb0 62 6c 65 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  ble %d\n", pPage
2adc0 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73  ->pgno));.  }els
2add0 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  e{.    /* The ro
2ade0 6f 74 20 70 61 67 65 20 69 73 20 65 6d 70 74 79  ot page is empty
2adf0 20 62 75 74 20 68 61 73 20 6f 6e 65 20 63 68 69   but has one chi
2ae00 6c 64 2e 20 20 54 72 61 6e 73 66 65 72 20 74 68  ld.  Transfer th
2ae10 65 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61  e.    ** informa
2ae20 74 69 6f 6e 20 66 72 6f 6d 20 74 68 61 74 20 6f  tion from that o
2ae30 6e 65 20 63 68 69 6c 64 20 69 6e 74 6f 20 74 68  ne child into th
2ae40 65 20 72 6f 6f 74 20 70 61 67 65 20 69 66 20 69  e root page if i
2ae50 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 66  t .    ** will f
2ae60 69 74 2e 20 20 54 68 69 73 20 72 65 64 75 63 65  it.  This reduce
2ae70 73 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 74  s the depth of t
2ae80 68 65 20 74 72 65 65 20 62 79 20 6f 6e 65 2e 0a  he tree by one..
2ae90 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
2aea0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69   the root page i
2aeb0 73 20 70 61 67 65 20 31 2c 20 69 74 20 68 61 73  s page 1, it has
2aec0 20 6c 65 73 73 20 73 70 61 63 65 20 61 76 61 69   less space avai
2aed0 6c 61 62 6c 65 20 74 68 61 6e 0a 20 20 20 20 2a  lable than.    *
2aee0 2a 20 69 74 73 20 63 68 69 6c 64 20 28 64 75 65  * its child (due
2aef0 20 74 6f 20 74 68 65 20 31 30 30 20 62 79 74 65   to the 100 byte
2af00 20 68 65 61 64 65 72 20 74 68 61 74 20 6f 63 63   header that occ
2af10 75 72 73 20 61 74 20 74 68 65 20 62 65 67 69 6e  urs at the begin
2af20 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 66 20 74  ning.    ** of t
2af30 68 65 20 64 61 74 61 62 61 73 65 20 66 6c 65 29  he database fle)
2af40 2c 20 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f  , so it might no
2af50 74 20 62 65 20 61 62 6c 65 20 74 6f 20 68 6f 6c  t be able to hol
2af60 64 20 61 6c 6c 20 6f 66 20 74 68 65 20 0a 20 20  d all of the .  
2af70 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e    ** information
2af80 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61   currently conta
2af90 69 6e 65 64 20 69 6e 20 74 68 65 20 63 68 69 6c  ined in the chil
2afa0 64 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 74  d.  If this is t
2afb0 68 65 20 0a 20 20 20 20 2a 2a 20 63 61 73 65 2c  he .    ** case,
2afc0 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 64 6f 20   then do not do 
2afd0 74 68 65 20 74 72 61 6e 73 66 65 72 2e 20 20 4c  the transfer.  L
2afe0 65 61 76 65 20 70 61 67 65 20 31 20 65 6d 70 74  eave page 1 empt
2aff0 79 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20  y except.    ** 
2b000 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 70 6f  for the right-po
2b010 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63 68 69  inter to the chi
2b020 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 63 68  ld page.  The ch
2b030 69 6c 64 20 70 61 67 65 20 62 65 63 6f 6d 65 73  ild page becomes
2b040 0a 20 20 20 20 2a 2a 20 74 68 65 20 76 69 72 74  .    ** the virt
2b050 75 61 6c 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  ual root of the 
2b060 74 72 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tree..    */.   
2b070 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74   pgnoChild = get
2b080 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
2b090 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
2b0a0 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73  fset+8]);.    as
2b0b0 73 65 72 74 28 20 70 67 6e 6f 43 68 69 6c 64 3e  sert( pgnoChild>
2b0c0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
2b0d0 20 70 67 6e 6f 43 68 69 6c 64 3c 3d 70 61 67 65   pgnoChild<=page
2b0e0 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
2b0f0 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29  ->pBt->pPager) )
2b100 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2b110 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
2b120 50 61 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 43  Page->pBt, pgnoC
2b130 68 69 6c 64 2c 20 26 70 43 68 69 6c 64 2c 20 30  hild, &pChild, 0
2b140 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2b150 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77  goto end_shallow
2b160 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 69 66  _balance;.    if
2b170 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31  ( pPage->pgno==1
2b180 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
2b190 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
2b1a0 61 67 65 28 70 43 68 69 6c 64 2c 20 70 50 61 67  age(pChild, pPag
2b1b0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
2b1c0 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c   ) goto end_shal
2b1d0 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20  low_balance;.   
2b1e0 20 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c     assert( pChil
2b1f0 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  d->nOverflow==0 
2b200 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 43 68  );.      if( pCh
2b210 69 6c 64 2d 3e 6e 46 72 65 65 3e 3d 31 30 30 20  ild->nFree>=100 
2b220 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
2b230 65 20 63 68 69 6c 64 20 69 6e 66 6f 72 6d 61 74  e child informat
2b240 69 6f 6e 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20  ion will fit on 
2b250 74 68 65 20 72 6f 6f 74 20 70 61 67 65 2c 20 73  the root page, s
2b260 6f 20 64 6f 20 74 68 65 0a 20 20 20 20 20 20 20  o do the.       
2b270 20 2a 2a 20 63 6f 70 79 20 2a 2f 0a 20 20 20 20   ** copy */.    
2b280 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
2b290 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50 61 67     zeroPage(pPag
2b2a0 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61  e, pChild->aData
2b2b0 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  [0]);.        fo
2b2c0 72 28 69 3d 30 3b 20 69 3c 70 43 68 69 6c 64 2d  r(i=0; i<pChild-
2b2d0 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  >nCell; i++){.  
2b2e0 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 69          apCell[i
2b2f0 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 43 68  ] = findCell(pCh
2b300 69 6c 64 2c 69 29 3b 0a 20 20 20 20 20 20 20 20  ild,i);.        
2b310 20 20 73 7a 43 65 6c 6c 5b 69 5d 20 3d 20 63 65    szCell[i] = ce
2b320 6c 6c 53 69 7a 65 50 74 72 28 70 43 68 69 6c 64  llSizePtr(pChild
2b330 2c 20 61 70 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20  , apCell[i]);.  
2b340 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b350 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70 50 61  assemblePage(pPa
2b360 67 65 2c 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c  ge, pChild->nCel
2b370 6c 2c 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c  l, apCell, szCel
2b380 6c 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43  l);.        /* C
2b390 6f 70 79 20 74 68 65 20 72 69 67 68 74 2d 70 6f  opy the right-po
2b3a0 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68 69  inter of the chi
2b3b0 6c 64 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  ld to the parent
2b3c0 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 74  . */.        put
2b3d0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
2b3e0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
2b3f0 66 73 65 74 2b 38 5d 2c 20 0a 20 20 20 20 20 20  fset+8], .      
2b400 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26        get4byte(&
2b410 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 70 43  pChild->aData[pC
2b420 68 69 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b  hild->hdrOffset+
2b430 38 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 66 72  8]));.        fr
2b440 65 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a  eePage(pChild);.
2b450 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
2b460 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20 25  BALANCE: child %
2b470 64 20 74 72 61 6e 73 66 65 72 20 74 6f 20 70 61  d transfer to pa
2b480 67 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d  ge 1\n", pChild-
2b490 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d  >pgno));.      }
2b4a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
2b4b0 20 54 68 65 20 63 68 69 6c 64 20 68 61 73 20 6d   The child has m
2b4c0 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ore information 
2b4d0 74 68 61 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e  that will fit on
2b4e0 20 74 68 65 20 72 6f 6f 74 2e 0a 20 20 20 20 20   the root..     
2b4f0 20 20 20 2a 2a 20 54 68 65 20 74 72 65 65 20 69     ** The tree i
2b500 73 20 61 6c 72 65 61 64 79 20 62 61 6c 61 6e 63  s already balanc
2b510 65 64 2e 20 20 44 6f 20 6e 6f 74 68 69 6e 67 2e  ed.  Do nothing.
2b520 20 2a 2f 0a 20 20 20 20 20 20 20 20 54 52 41 43   */.        TRAC
2b530 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 68 69  E(("BALANCE: chi
2b540 6c 64 20 25 64 20 77 69 6c 6c 20 6e 6f 74 20 66  ld %d will not f
2b550 69 74 20 6f 6e 20 70 61 67 65 20 31 5c 6e 22 2c  it on page 1\n",
2b560 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b   pChild->pgno));
2b570 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
2b580 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  se{.      memcpy
2b590 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 70  (pPage->aData, p
2b5a0 43 68 69 6c 64 2d 3e 61 44 61 74 61 2c 20 70 50  Child->aData, pP
2b5b0 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
2b5c0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 61  Size);.      pPa
2b5d0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
2b5e0 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61        pPage->pPa
2b5f0 72 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  rent = 0;.      
2b600 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2b610 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c  eInitPage(pPage,
2b620 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
2b630 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
2b640 20 29 3b 0a 20 20 20 20 20 20 66 72 65 65 50 61   );.      freePa
2b650 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20  ge(pChild);.    
2b660 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
2b670 45 3a 20 74 72 61 6e 73 66 65 72 20 63 68 69 6c  E: transfer chil
2b680 64 20 25 64 20 69 6e 74 6f 20 72 6f 6f 74 20 25  d %d into root %
2b690 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
2b6a0 20 20 20 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f      pChild->pgno
2b6b0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b  , pPage->pgno));
2b6c0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
2b6d0 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67  reparentChildPag
2b6e0 65 73 28 70 50 61 67 65 2c 20 31 29 3b 0a 20 20  es(pPage, 1);.  
2b6f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2b700 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
2b710 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56  .    if( ISAUTOV
2b720 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 69  ACUUM ){.      i
2b730 6e 74 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28  nt i;.      for(
2b740 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  i=0; i<pPage->nC
2b750 65 6c 6c 3b 20 69 2b 2b 29 7b 20 0a 20 20 20 20  ell; i++){ .    
2b760 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
2b770 75 74 4f 76 66 6c 28 70 50 61 67 65 2c 20 69 29  utOvfl(pPage, i)
2b780 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2b790 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2b7a0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
2b7b0 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63  d_shallow_balanc
2b7c0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
2b7d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72     }.    }.    r
2b7e0 65 6c 65 61 73 65 50 61 67 65 28 70 43 68 69 6c  eleasePage(pChil
2b7f0 64 29 3b 0a 20 20 7d 0a 65 6e 64 5f 73 68 61 6c  d);.  }.end_shal
2b800 6c 6f 77 5f 62 61 6c 61 6e 63 65 3a 0a 20 20 73  low_balance:.  s
2b810 71 6c 69 74 65 33 5f 66 72 65 65 28 61 70 43 65  qlite3_free(apCe
2b820 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ll);.  return rc
2b830 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ;.}.../*.** The 
2b840 72 6f 6f 74 20 70 61 67 65 20 69 73 20 6f 76 65  root page is ove
2b850 72 66 75 6c 6c 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  rfull.**.** When
2b860 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 43   this happens, C
2b870 72 65 61 74 65 20 61 20 6e 65 77 20 63 68 69 6c  reate a new chil
2b880 64 20 70 61 67 65 20 61 6e 64 20 63 6f 70 79 20  d page and copy 
2b890 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
2b8a0 6f 66 20 74 68 65 20 72 6f 6f 74 20 69 6e 74 6f  of the root into
2b8b0 20 74 68 65 20 63 68 69 6c 64 2e 20 20 54 68 65   the child.  The
2b8c0 6e 20 6d 61 6b 65 20 74 68 65 20 72 6f 6f 74 0a  n make the root.
2b8d0 2a 2a 20 70 61 67 65 20 61 6e 20 65 6d 70 74 79  ** page an empty
2b8e0 20 70 61 67 65 20 77 69 74 68 20 72 69 67 68 74   page with right
2b8f0 43 68 69 6c 64 20 70 6f 69 6e 74 69 6e 67 20 74  Child pointing t
2b900 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 63 68 69  o the new.** chi
2b910 6c 64 2e 20 20 20 46 69 6e 61 6c 6c 79 2c 20 63  ld.   Finally, c
2b920 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 69 6e 74 65  all balance_inte
2b930 72 6e 61 6c 28 29 20 6f 6e 20 74 68 65 20 6e 65  rnal() on the ne
2b940 77 20 63 68 69 6c 64 0a 2a 2a 20 74 6f 20 63 61  w child.** to ca
2b950 75 73 65 20 69 74 20 74 6f 20 73 70 6c 69 74 2e  use it to split.
2b960 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
2b970 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 4d 65  alance_deeper(Me
2b980 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
2b990 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2b9a0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76       /* Return v
2b9b0 61 6c 75 65 20 66 72 6f 6d 20 73 75 62 70 72 6f  alue from subpro
2b9c0 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 4d 65 6d  cedures */.  Mem
2b9d0 50 61 67 65 20 2a 70 43 68 69 6c 64 3b 20 20 20  Page *pChild;   
2b9e0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61   /* Pointer to a
2b9f0 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20   new child page 
2ba00 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68  */.  Pgno pgnoCh
2ba10 69 6c 64 3b 20 20 20 20 20 2f 2a 20 50 61 67 65  ild;     /* Page
2ba20 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
2ba30 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f  ew child page */
2ba40 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2ba50 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
2ba60 20 42 54 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   BTree */.  int 
2ba70 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20  usableSize;     
2ba80 2f 2a 20 54 6f 74 61 6c 20 75 73 61 62 6c 65 20  /* Total usable 
2ba90 73 69 7a 65 20 6f 66 20 61 20 70 61 67 65 20 2a  size of a page *
2baa0 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
2bab0 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
2bac0 6e 74 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  nt of the parent
2bad0 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 63   page */.  u8 *c
2bae0 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f  data;          /
2baf0 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * Content of the
2bb00 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20   child page */. 
2bb10 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
2bb20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
2bb30 6f 20 70 61 67 65 20 68 65 61 64 65 72 20 69 6e  o page header in
2bb40 20 70 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74   parent */.  int
2bb50 20 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20   brk;           
2bb60 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 6f   /* Offset to co
2bb70 6e 74 65 6e 74 20 6f 66 20 66 69 72 73 74 20 63  ntent of first c
2bb80 65 6c 6c 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f  ell in parent */
2bb90 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
2bba0 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29 3b  e->pParent==0 );
2bbb0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2bbc0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b  ->nOverflow>0 );
2bbd0 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
2bbe0 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
2bbf0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2bc00 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
2bc10 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65  .  rc = allocate
2bc20 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
2bc30 70 43 68 69 6c 64 2c 20 26 70 67 6e 6f 43 68 69  pChild, &pgnoChi
2bc40 6c 64 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  ld, pPage->pgno,
2bc50 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20   0);.  if( rc ) 
2bc60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 61 73 73  return rc;.  ass
2bc70 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2bc80 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 43 68  rIswriteable(pCh
2bc90 69 6c 64 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ild->pDbPage) );
2bca0 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  .  usableSize = 
2bcb0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
2bcc0 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
2bcd0 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20  >aData;.  hdr = 
2bce0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2bcf0 3b 0a 20 20 62 72 6b 20 3d 20 67 65 74 32 62 79  ;.  brk = get2by
2bd00 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
2bd10 3b 0a 20 20 63 64 61 74 61 20 3d 20 70 43 68 69  ;.  cdata = pChi
2bd20 6c 64 2d 3e 61 44 61 74 61 3b 0a 20 20 6d 65 6d  ld->aData;.  mem
2bd30 63 70 79 28 63 64 61 74 61 2c 20 26 64 61 74 61  cpy(cdata, &data
2bd40 5b 68 64 72 5d 2c 20 70 50 61 67 65 2d 3e 63 65  [hdr], pPage->ce
2bd50 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 61 67 65  llOffset+2*pPage
2bd60 2d 3e 6e 43 65 6c 6c 2d 68 64 72 29 3b 0a 20 20  ->nCell-hdr);.  
2bd70 6d 65 6d 63 70 79 28 26 63 64 61 74 61 5b 62 72  memcpy(&cdata[br
2bd80 6b 5d 2c 20 26 64 61 74 61 5b 62 72 6b 5d 2c 20  k], &data[brk], 
2bd90 75 73 61 62 6c 65 53 69 7a 65 2d 62 72 6b 29 3b  usableSize-brk);
2bda0 0a 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 69  .  if( pChild->i
2bdb0 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e 20 53  sInit ) return S
2bdc0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
2bdd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2bde0 65 65 49 6e 69 74 50 61 67 65 28 70 43 68 69 6c  eeInitPage(pChil
2bdf0 64 2c 20 70 50 61 67 65 29 3b 0a 20 20 69 66 28  d, pPage);.  if(
2be00 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
2be10 63 65 64 65 65 70 65 72 5f 6f 75 74 3b 0a 20 20  cedeeper_out;.  
2be20 6d 65 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e 61  memcpy(pChild->a
2be30 4f 76 66 6c 2c 20 70 50 61 67 65 2d 3e 61 4f 76  Ovfl, pPage->aOv
2be40 66 6c 2c 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  fl, pPage->nOver
2be50 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 50 61 67  flow*sizeof(pPag
2be60 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20  e->aOvfl[0]));. 
2be70 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c   pChild->nOverfl
2be80 6f 77 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ow = pPage->nOve
2be90 72 66 6c 6f 77 3b 0a 20 20 69 66 28 20 70 43 68  rflow;.  if( pCh
2bea0 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29  ild->nOverflow )
2beb0 7b 0a 20 20 20 20 70 43 68 69 6c 64 2d 3e 6e 46  {.    pChild->nF
2bec0 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61  ree = 0;.  }.  a
2bed0 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e  ssert( pChild->n
2bee0 43 65 6c 6c 3d 3d 70 50 61 67 65 2d 3e 6e 43 65  Cell==pPage->nCe
2bef0 6c 6c 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  ll );.  zeroPage
2bf00 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e  (pPage, pChild->
2bf10 61 44 61 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f  aData[0] & ~PTF_
2bf20 4c 45 41 46 29 3b 0a 20 20 70 75 74 34 62 79 74  LEAF);.  put4byt
2bf30 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
2bf40 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2bf50 2b 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b  +8], pgnoChild);
2bf60 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e  .  TRACE(("BALAN
2bf70 43 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25 64  CE: copy root %d
2bf80 20 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61   into %d\n", pPa
2bf90 67 65 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64  ge->pgno, pChild
2bfa0 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 69 66 28 20  ->pgno));.  if( 
2bfb0 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a  ISAUTOVACUUM ){.
2bfc0 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 72      int i;.    r
2bfd0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
2bfe0 74 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c  t, pChild->pgno,
2bff0 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
2c000 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  Page->pgno);.   
2c010 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
2c020 61 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f 75 74  alancedeeper_out
2c030 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2c040 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20  <pChild->nCell; 
2c050 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
2c060 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70   ptrmapPutOvfl(p
2c070 43 68 69 6c 64 2c 20 69 29 3b 0a 20 20 20 20 20  Child, i);.     
2c080 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2c090 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
2c0a0 74 6f 20 62 61 6c 61 6e 63 65 64 65 65 70 65 72  to balancedeeper
2c0b0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
2c0c0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 72 65 70    }.    rc = rep
2c0d0 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28  arentChildPages(
2c0e0 70 43 68 69 6c 64 2c 20 31 29 3b 0a 20 20 7d 0a  pChild, 1);.  }.
2c0f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2c100 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
2c110 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28  balance_nonroot(
2c120 70 43 68 69 6c 64 29 3b 0a 20 20 7d 0a 0a 62 61  pChild);.  }..ba
2c130 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f 75 74 3a  lancedeeper_out:
2c140 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
2c150 43 68 69 6c 64 29 3b 0a 20 20 72 65 74 75 72 6e  Child);.  return
2c160 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
2c170 63 69 64 65 20 69 66 20 74 68 65 20 70 61 67 65  cide if the page
2c180 20 70 50 61 67 65 20 6e 65 65 64 73 20 74 6f 20   pPage needs to 
2c190 62 65 20 62 61 6c 61 6e 63 65 64 2e 20 20 49 66  be balanced.  If
2c1a0 20 62 61 6c 61 6e 63 69 6e 67 20 69 73 0a 2a 2a   balancing is.**
2c1b0 20 72 65 71 75 69 72 65 64 2c 20 63 61 6c 6c 20   required, call 
2c1c0 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20  the appropriate 
2c1d0 62 61 6c 61 6e 63 69 6e 67 20 72 6f 75 74 69 6e  balancing routin
2c1e0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2c1f0 20 62 61 6c 61 6e 63 65 28 4d 65 6d 50 61 67 65   balance(MemPage
2c200 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 6e 73   *pPage, int ins
2c210 65 72 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ert){.  int rc =
2c220 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73   SQLITE_OK;.  as
2c230 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2c240 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
2c250 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2c260 20 69 66 28 20 70 50 61 67 65 2d 3e 70 50 61 72   if( pPage->pPar
2c270 65 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  ent==0 ){.    rc
2c280 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2c290 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
2c2a0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
2c2b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
2c2c0 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e  Page->nOverflow>
2c2d0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
2c2e0 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 70  balance_deeper(p
2c2f0 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
2c300 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2c310 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 65  OK && pPage->nCe
2c320 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ll==0 ){.      r
2c330 63 20 3d 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c  c = balance_shal
2c340 6c 6f 77 65 72 28 70 50 61 67 65 29 3b 0a 20 20  lower(pPage);.  
2c350 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
2c360 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65   if( pPage->nOve
2c370 72 66 6c 6f 77 3e 30 20 7c 7c 20 0a 20 20 20 20  rflow>0 || .    
2c380 20 20 20 20 28 21 69 6e 73 65 72 74 20 26 26 20      (!insert && 
2c390 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 70 50 61  pPage->nFree>pPa
2c3a0 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
2c3b0 69 7a 65 2a 32 2f 33 29 20 29 7b 0a 20 20 20 20  ize*2/3) ){.    
2c3c0 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e    rc = balance_n
2c3d0 6f 6e 72 6f 6f 74 28 70 50 61 67 65 29 3b 0a 20  onroot(pPage);. 
2c3e0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2c3f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
2c400 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
2c410 6b 73 20 61 6c 6c 20 63 75 72 73 6f 72 73 20 74  ks all cursors t
2c420 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 74 61 62  hat point to tab
2c430 6c 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a 2a 20  le pgnoRoot..** 
2c440 49 66 20 61 6e 79 20 6f 66 20 74 68 6f 73 65 20  If any of those 
2c450 63 75 72 73 6f 72 73 20 77 65 72 65 20 6f 70 65  cursors were ope
2c460 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d  ned with wrFlag=
2c470 3d 30 20 69 6e 20 61 20 64 69 66 66 65 72 65 6e  =0 in a differen
2c480 74 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63 6f  t.** database co
2c490 6e 6e 65 63 74 69 6f 6e 20 28 61 20 64 61 74 61  nnection (a data
2c4a0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
2c4b0 74 68 61 74 20 73 68 61 72 65 73 20 74 68 65 20  that shares the 
2c4c0 70 61 67 65 72 0a 2a 2a 20 63 61 63 68 65 20 77  pager.** cache w
2c4d0 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20  ith the current 
2c4e0 63 6f 6e 6e 65 63 74 69 6f 6e 29 20 61 6e 64 20  connection) and 
2c4f0 74 68 61 74 20 6f 74 68 65 72 20 63 6f 6e 6e 65  that other conne
2c500 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 6e 6f 74  ction .** is not
2c510 20 69 6e 20 74 68 65 20 52 65 61 64 55 6e 63 6f   in the ReadUnco
2c520 6d 6d 6d 69 74 74 65 64 20 73 74 61 74 65 2c 20  mmmitted state, 
2c530 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
2c540 65 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53 51  e returns .** SQ
2c550 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 2a 2a 0a  LITE_LOCKED..**.
2c560 2a 2a 20 41 73 20 77 65 6c 6c 20 61 73 20 63 75  ** As well as cu
2c570 72 73 6f 72 73 20 77 69 74 68 20 77 72 46 6c 61  rsors with wrFla
2c580 67 3d 3d 30 2c 20 63 75 72 73 6f 72 73 20 77 69  g==0, cursors wi
2c590 74 68 20 77 72 46 6c 61 67 3d 3d 31 20 61 6e 64  th wrFlag==1 and
2c5a0 20 0a 2a 2a 20 69 73 49 6e 63 72 62 6c 6f 62 48   .** isIncrblobH
2c5b0 61 6e 64 6c 65 3d 3d 31 20 61 72 65 20 61 6c 73  andle==1 are als
2c5c0 6f 20 63 6f 6e 73 69 64 65 72 65 64 20 27 72 65  o considered 're
2c5d0 61 64 27 20 63 75 72 73 6f 72 73 2e 20 49 6e 63  ad' cursors. Inc
2c5e0 72 65 6d 65 6e 74 61 6c 20 0a 2a 2a 20 62 6c 6f  remental .** blo
2c5f0 62 20 63 75 72 73 6f 72 73 20 61 72 65 20 75 73  b cursors are us
2c600 65 64 20 66 6f 72 20 62 6f 74 68 20 72 65 61 64  ed for both read
2c610 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67 2e  ing and writing.
2c620 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 67 6e 6f  .**.** When pgno
2c630 52 6f 6f 74 20 69 73 20 74 68 65 20 72 6f 6f 74  Root is the root
2c640 20 70 61 67 65 20 6f 66 20 61 6e 20 69 6e 74 6b   page of an intk
2c650 65 79 20 74 61 62 6c 65 2c 20 74 68 69 73 20 66  ey table, this f
2c660 75 6e 63 74 69 6f 6e 20 69 73 20 61 6c 73 6f 0a  unction is also.
2c670 2a 2a 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  ** responsible f
2c680 6f 72 20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20  or invalidating 
2c690 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62  incremental blob
2c6a0 20 63 75 72 73 6f 72 73 20 77 68 65 6e 20 74 68   cursors when th
2c6b0 65 20 74 61 62 6c 65 20 72 6f 77 0a 2a 2a 20 6f  e table row.** o
2c6c0 6e 20 77 68 69 63 68 20 74 68 65 79 20 61 72 65  n which they are
2c6d0 20 6f 70 65 6e 65 64 20 69 73 20 64 65 6c 65 74   opened is delet
2c6e0 65 64 20 6f 72 20 6d 6f 64 69 66 69 65 64 2e 20  ed or modified. 
2c6f0 43 75 72 73 6f 72 73 20 61 72 65 20 69 6e 76 61  Cursors are inva
2c700 6c 69 64 61 74 65 64 0a 2a 2a 20 61 63 63 6f 72  lidated.** accor
2c710 64 69 6e 67 20 74 6f 20 74 68 65 20 66 6f 6c 6c  ding to the foll
2c720 6f 77 69 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a  owing rules:.**.
2c730 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 42 74 72  **   1) When Btr
2c740 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 20 69  eeClearTable() i
2c750 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6f 6d 70  s called to comp
2c760 6c 65 74 65 6c 79 20 64 65 6c 65 74 65 20 74 68  letely delete th
2c770 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 20 20  e contents.**   
2c780 20 20 20 6f 66 20 61 20 42 2d 54 72 65 65 20 74     of a B-Tree t
2c790 61 62 6c 65 2c 20 70 45 78 63 6c 75 64 65 20 69  able, pExclude i
2c7a0 73 20 73 65 74 20 74 6f 20 7a 65 72 6f 20 61 6e  s set to zero an
2c7b0 64 20 70 61 72 61 6d 65 74 65 72 20 69 52 6f 77  d parameter iRow
2c7c0 20 69 73 20 0a 2a 2a 20 20 20 20 20 20 73 65 74   is .**      set
2c7d0 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e   to non-zero. In
2c7e0 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 69   this case all i
2c7f0 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20  ncremental blob 
2c800 63 75 72 73 6f 72 73 20 6f 70 65 6e 0a 2a 2a 20  cursors open.** 
2c810 20 20 20 20 20 6f 6e 20 74 68 65 20 74 61 62 6c       on the tabl
2c820 65 20 72 6f 6f 74 65 64 20 61 74 20 70 67 6e 6f  e rooted at pgno
2c830 52 6f 6f 74 20 61 72 65 20 69 6e 76 61 6c 69 64  Root are invalid
2c840 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29  ated..**.**   2)
2c850 20 57 68 65 6e 20 42 74 72 65 65 49 6e 73 65 72   When BtreeInser
2c860 74 28 29 2c 20 42 74 72 65 65 44 65 6c 65 74 65  t(), BtreeDelete
2c870 28 29 20 6f 72 20 42 74 72 65 65 50 75 74 44 61  () or BtreePutDa
2c880 74 61 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74  ta() is called t
2c890 6f 20 0a 2a 2a 20 20 20 20 20 20 6d 6f 64 69 66  o .**      modif
2c8a0 79 20 61 20 74 61 62 6c 65 20 72 6f 77 20 76 69  y a table row vi
2c8b0 61 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  a an SQL stateme
2c8c0 6e 74 2c 20 70 45 78 63 6c 75 64 65 20 69 73 20  nt, pExclude is 
2c8d0 73 65 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 20  set to the .**  
2c8e0 20 20 20 20 77 72 69 74 65 20 63 75 72 73 6f 72      write cursor
2c8f0 20 75 73 65 64 20 74 6f 20 64 6f 20 74 68 65 20   used to do the 
2c900 6d 6f 64 69 66 69 63 61 74 69 6f 6e 20 61 6e 64  modification and
2c910 20 70 61 72 61 6d 65 74 65 72 20 69 52 6f 77 20   parameter iRow 
2c920 69 73 20 73 65 74 0a 2a 2a 20 20 20 20 20 20 74  is set.**      t
2c930 6f 20 74 68 65 20 69 6e 74 65 67 65 72 20 72 6f  o the integer ro
2c940 77 20 69 64 20 6f 66 20 74 68 65 20 42 2d 54 72  w id of the B-Tr
2c950 65 65 20 65 6e 74 72 79 20 62 65 69 6e 67 20 6d  ee entry being m
2c960 6f 64 69 66 69 65 64 2e 20 55 6e 6c 65 73 73 0a  odified. Unless.
2c970 2a 2a 20 20 20 20 20 20 70 45 78 63 6c 75 64 65  **      pExclude
2c980 20 69 73 20 69 74 73 65 6c 66 20 61 6e 20 69 6e   is itself an in
2c990 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63  cremental blob c
2c9a0 75 72 73 6f 72 2c 20 74 68 65 6e 20 61 6c 6c 20  ursor, then all 
2c9b0 69 6e 63 72 65 6d 65 6e 74 61 6c 0a 2a 2a 20 20  incremental.**  
2c9c0 20 20 20 20 62 6c 6f 62 20 63 75 72 73 6f 72 73      blob cursors
2c9d0 20 6f 70 65 6e 20 6f 6e 20 72 6f 77 20 69 52 6f   open on row iRo
2c9e0 77 20 6f 66 20 74 68 65 20 42 2d 54 72 65 65 20  w of the B-Tree 
2c9f0 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e  are invalidated.
2ca00 0a 2a 2a 0a 2a 2a 20 20 20 33 29 20 49 66 20 62  .**.**   3) If b
2ca10 6f 74 68 20 70 45 78 63 6c 75 64 65 20 61 6e 64  oth pExclude and
2ca20 20 69 52 6f 77 20 61 72 65 20 73 65 74 20 74 6f   iRow are set to
2ca30 20 7a 65 72 6f 2c 20 6e 6f 20 69 6e 63 72 65 6d   zero, no increm
2ca40 65 6e 74 61 6c 20 62 6c 6f 62 20 0a 2a 2a 20 20  ental blob .**  
2ca50 20 20 20 20 63 75 72 73 6f 72 73 20 61 72 65 20      cursors are 
2ca60 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a  invalidated..*/.
2ca70 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b  static int check
2ca80 52 65 61 64 4c 6f 63 6b 73 28 0a 20 20 42 74 72  ReadLocks(.  Btr
2ca90 65 65 20 2a 70 42 74 72 65 65 2c 20 0a 20 20 50  ee *pBtree, .  P
2caa0 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74 2c 20 0a 20  gno pgnoRoot, . 
2cab0 20 42 74 43 75 72 73 6f 72 20 2a 70 45 78 63 6c   BtCursor *pExcl
2cac0 75 64 65 2c 0a 20 20 69 36 34 20 69 52 6f 77 0a  ude,.  i64 iRow.
2cad0 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
2cae0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
2caf0 74 20 3d 20 70 42 74 72 65 65 2d 3e 70 42 74 3b  t = pBtree->pBt;
2cb00 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
2cb10 20 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 61   pBtree->db;.  a
2cb20 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
2cb30 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42  reeHoldsMutex(pB
2cb40 74 72 65 65 29 20 29 3b 0a 20 20 66 6f 72 28 70  tree) );.  for(p
2cb50 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
2cb60 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
2cb70 20 20 20 69 66 28 20 70 3d 3d 70 45 78 63 6c 75     if( p==pExclu
2cb80 64 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  de ) continue;. 
2cb90 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f     if( p->pgnoRo
2cba0 6f 74 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 20 63  ot!=pgnoRoot ) c
2cbb0 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65 66  ontinue;.#ifndef
2cbc0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
2cbd0 52 42 4c 4f 42 0a 20 20 20 20 69 66 28 20 70 2d  RBLOB.    if( p-
2cbe0 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  >isIncrblobHandl
2cbf0 65 20 26 26 20 28 20 0a 20 20 20 20 20 20 20 20  e && ( .        
2cc00 20 28 21 70 45 78 63 6c 75 64 65 20 26 26 20 69   (!pExclude && i
2cc10 52 6f 77 29 0a 20 20 20 20 20 20 7c 7c 20 28 70  Row).      || (p
2cc20 45 78 63 6c 75 64 65 20 26 26 20 21 70 45 78 63  Exclude && !pExc
2cc30 6c 75 64 65 2d 3e 69 73 49 6e 63 72 62 6c 6f 62  lude->isIncrblob
2cc40 48 61 6e 64 6c 65 20 26 26 20 70 2d 3e 69 6e 66  Handle && p->inf
2cc50 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 0a 20 20  o.nKey==iRow).  
2cc60 20 20 29 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65    )){.      p->e
2cc70 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
2cc80 4e 56 41 4c 49 44 3b 0a 20 20 20 20 7d 0a 23 65  NVALID;.    }.#e
2cc90 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 2d 3e  ndif.    if( p->
2cca0 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56  eState!=CURSOR_V
2ccb0 41 4c 49 44 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ALID ) continue;
2ccc0 0a 20 20 20 20 69 66 28 20 70 2d 3e 77 72 46 6c  .    if( p->wrFl
2ccd0 61 67 3d 3d 30 20 0a 23 69 66 6e 64 65 66 20 53  ag==0 .#ifndef S
2cce0 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
2ccf0 4c 4f 42 0a 20 20 20 20 20 7c 7c 20 70 2d 3e 69  LOB.     || p->i
2cd00 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 0a  sIncrblobHandle.
2cd10 23 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20 20  #endif.    ){.  
2cd20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 4f      sqlite3 *dbO
2cd30 74 68 65 72 20 3d 20 70 2d 3e 70 42 74 72 65 65  ther = p->pBtree
2cd40 2d 3e 64 62 3b 0a 20 20 20 20 20 20 69 66 28 20  ->db;.      if( 
2cd50 64 62 4f 74 68 65 72 3d 3d 30 20 7c 7c 0a 20 20  dbOther==0 ||.  
2cd60 20 20 20 20 20 20 20 28 64 62 4f 74 68 65 72 21         (dbOther!
2cd70 3d 64 62 20 26 26 20 28 64 62 4f 74 68 65 72 2d  =db && (dbOther-
2cd80 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
2cd90 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29  ReadUncommitted)
2cda0 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ==0) ){.        
2cdb0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
2cdc0 43 4b 45 44 3b 0a 20 20 20 20 20 20 7d 0a 20 20  CKED;.      }.  
2cdd0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2cde0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2cdf0 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65  *.** Insert a ne
2ce00 77 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  w record into th
2ce10 65 20 42 54 72 65 65 2e 20 20 54 68 65 20 6b 65  e BTree.  The ke
2ce20 79 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70  y is given by (p
2ce30 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20 61 6e 64  Key,nKey).** and
2ce40 20 74 68 65 20 64 61 74 61 20 69 73 20 67 69 76   the data is giv
2ce50 65 6e 20 62 79 20 28 70 44 61 74 61 2c 6e 44 61  en by (pData,nDa
2ce60 74 61 29 2e 20 20 54 68 65 20 63 75 72 73 6f 72  ta).  The cursor
2ce70 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 74 6f   is used only to
2ce80 0a 2a 2a 20 64 65 66 69 6e 65 20 77 68 61 74 20  .** define what 
2ce90 74 61 62 6c 65 20 74 68 65 20 72 65 63 6f 72 64  table the record
2cea0 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 73 65 72   should be inser
2ceb0 74 65 64 20 69 6e 74 6f 2e 20 20 54 68 65 20 63  ted into.  The c
2cec0 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74  ursor.** is left
2ced0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72   pointing at a r
2cee0 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a  andom location..
2cef0 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 49 4e 54  **.** For an INT
2cf00 4b 45 59 20 74 61 62 6c 65 2c 20 6f 6e 6c 79 20  KEY table, only 
2cf10 74 68 65 20 6e 4b 65 79 20 76 61 6c 75 65 20 6f  the nKey value o
2cf20 66 20 74 68 65 20 6b 65 79 20 69 73 20 75 73 65  f the key is use
2cf30 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a 2a 20 69  d.  pKey is.** i
2cf40 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20 61 20 5a  gnored.  For a Z
2cf50 45 52 4f 44 41 54 41 20 74 61 62 6c 65 2c 20 74  ERODATA table, t
2cf60 68 65 20 70 44 61 74 61 20 61 6e 64 20 6e 44 61  he pData and nDa
2cf70 74 61 20 61 72 65 20 62 6f 74 68 20 69 67 6e 6f  ta are both igno
2cf80 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  red..*/.int sqli
2cf90 74 65 33 42 74 72 65 65 49 6e 73 65 72 74 28 0a  te3BtreeInsert(.
2cfa0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
2cfb0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2cfc0 20 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20   /* Insert data 
2cfd0 69 6e 74 6f 20 74 68 65 20 74 61 62 6c 65 20 6f  into the table o
2cfe0 66 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f  f this cursor */
2cff0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
2d000 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c 20 20  Key, i64 nKey,  
2d010 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 6f 66 20    /* The key of 
2d020 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64 20 2a  the new record *
2d030 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
2d040 70 44 61 74 61 2c 20 69 6e 74 20 6e 44 61 74 61  pData, int nData
2d050 2c 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 6f  ,  /* The data o
2d060 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72 64  f the new record
2d070 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c   */.  int nZero,
2d080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d090 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2d0a0 66 20 65 78 74 72 61 20 30 20 62 79 74 65 73 20  f extra 0 bytes 
2d0b0 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 64 61 74  to append to dat
2d0c0 61 20 2a 2f 0a 20 20 69 6e 74 20 61 70 70 65 6e  a */.  int appen
2d0d0 64 42 69 61 73 20 20 20 20 20 20 20 20 20 20 20  dBias           
2d0e0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2d0f0 20 74 68 69 73 20 69 73 20 6c 69 6b 65 6c 79 20   this is likely 
2d100 61 6e 20 61 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a  an append */.){.
2d110 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
2d120 6c 6f 63 3b 0a 20 20 69 6e 74 20 73 7a 4e 65 77  loc;.  int szNew
2d130 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
2d140 67 65 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d  ge;.  Btree *p =
2d150 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20   pCur->pBtree;. 
2d160 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
2d170 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67   p->pBt;.  unsig
2d180 6e 65 64 20 63 68 61 72 20 2a 6f 6c 64 43 65 6c  ned char *oldCel
2d190 6c 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  l;.  unsigned ch
2d1a0 61 72 20 2a 6e 65 77 43 65 6c 6c 20 3d 20 30 3b  ar *newCell = 0;
2d1b0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2d1c0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
2d1d0 72 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  r) );.  if( pBt-
2d1e0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d  >inTransaction!=
2d1f0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
2d200 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74     /* Must start
2d210 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62   a transaction b
2d220 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e 20 69  efore doing an i
2d230 6e 73 65 72 74 20 2a 2f 0a 20 20 20 20 72 63 20  nsert */.    rc 
2d240 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  = pBt->readOnly 
2d250 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  ? SQLITE_READONL
2d260 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  Y : SQLITE_ERROR
2d270 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
2d280 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
2d290 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b  pBt->readOnly );
2d2a0 0a 20 20 69 66 28 20 21 70 43 75 72 2d 3e 77 72  .  if( !pCur->wr
2d2b0 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75  Flag ){.    retu
2d2c0 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 20  rn SQLITE_PERM; 
2d2d0 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 6f 74 20    /* Cursor not 
2d2e0 6f 70 65 6e 20 66 6f 72 20 77 72 69 74 69 6e 67  open for writing
2d2f0 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 63 68   */.  }.  if( ch
2d300 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 43 75  eckReadLocks(pCu
2d310 72 2d 3e 70 42 74 72 65 65 2c 20 70 43 75 72 2d  r->pBtree, pCur-
2d320 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2c  >pgnoRoot, pCur,
2d330 20 6e 4b 65 79 29 20 29 7b 0a 20 20 20 20 72 65   nKey) ){.    re
2d340 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
2d350 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c 65  ED; /* The table
2d360 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20   pCur points to 
2d370 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
2d380 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75  */.  }.  if( pCu
2d390 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2d3a0 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72  R_FAULT ){.    r
2d3b0 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
2d3c0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 61 76 65  ;.  }..  /* Save
2d3d0 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f   the positions o
2d3e0 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73  f any other curs
2d3f0 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73  ors open on this
2d400 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6c 65 61   table */.  clea
2d410 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
2d420 70 43 75 72 29 3b 0a 20 20 69 66 28 20 0a 20 20  pCur);.  if( .  
2d430 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63    SQLITE_OK!=(rc
2d440 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
2d450 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  s(pBt, pCur->pgn
2d460 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 20 7c 7c  oRoot, pCur)) ||
2d470 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d  .    SQLITE_OK!=
2d480 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72  (rc = sqlite3Btr
2d490 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70  eeMoveto(pCur, p
2d4a0 4b 65 79 2c 20 30 2c 20 6e 4b 65 79 2c 20 61 70  Key, 0, nKey, ap
2d4b0 70 65 6e 64 42 69 61 73 2c 20 26 6c 6f 63 29 29  pendBias, &loc))
2d4c0 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
2d4d0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67   rc;.  }..  pPag
2d4e0 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
2d4f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2d500 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65 79  ->intKey || nKey
2d510 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=0 );.  assert(
2d520 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 7c 7c 20   pPage->leaf || 
2d530 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29  !pPage->intKey )
2d540 3b 0a 20 20 54 52 41 43 45 28 28 22 49 4e 53 45  ;.  TRACE(("INSE
2d550 52 54 3a 20 74 61 62 6c 65 3d 25 64 20 6e 6b 65  RT: table=%d nke
2d560 79 3d 25 6c 6c 64 20 6e 64 61 74 61 3d 25 64 20  y=%lld ndata=%d 
2d570 70 61 67 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20  page=%d %s\n",. 
2d580 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70           pCur->p
2d590 67 6e 6f 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e  gnoRoot, nKey, n
2d5a0 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 67 6e  Data, pPage->pgn
2d5b0 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 6c 6f 63  o,.          loc
2d5c0 3d 3d 30 20 3f 20 22 6f 76 65 72 77 72 69 74 65  ==0 ? "overwrite
2d5d0 22 20 3a 20 22 6e 65 77 20 65 6e 74 72 79 22 29  " : "new entry")
2d5e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2d5f0 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
2d600 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63  allocateTempSpac
2d610 65 28 70 42 74 29 3b 0a 20 20 6e 65 77 43 65 6c  e(pBt);.  newCel
2d620 6c 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70 61  l = pBt->pTmpSpa
2d630 63 65 3b 0a 20 20 69 66 28 20 6e 65 77 43 65 6c  ce;.  if( newCel
2d640 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
2d650 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63  LITE_NOMEM;.  rc
2d660 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50   = fillInCell(pP
2d670 61 67 65 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b  age, newCell, pK
2d680 65 79 2c 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c  ey, nKey, pData,
2d690 20 6e 44 61 74 61 2c 20 6e 5a 65 72 6f 2c 20 26   nData, nZero, &
2d6a0 73 7a 4e 65 77 29 3b 0a 20 20 69 66 28 20 72 63  szNew);.  if( rc
2d6b0 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65   ) goto end_inse
2d6c0 72 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a  rt;.  assert( sz
2d6d0 4e 65 77 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72  New==cellSizePtr
2d6e0 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29  (pPage, newCell)
2d6f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 7a   );.  assert( sz
2d700 4e 65 77 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a  New<=MX_CELL_SIZ
2d710 45 28 70 42 74 29 20 29 3b 0a 20 20 69 66 28 20  E(pBt) );.  if( 
2d720 6c 6f 63 3d 3d 30 20 26 26 20 43 55 52 53 4f 52  loc==0 && CURSOR
2d730 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  _VALID==pCur->eS
2d740 74 61 74 65 20 29 7b 0a 20 20 20 20 75 31 36 20  tate ){.    u16 
2d750 73 7a 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65 72  szOld;.    asser
2d760 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20  t( pCur->idx>=0 
2d770 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61  && pCur->idx<pPa
2d780 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
2d790 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2d7a0 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
2d7b0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
2d7c0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 67 6f 74   rc ){.      got
2d7d0 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20  o end_insert;.  
2d7e0 20 20 7d 0a 20 20 20 20 6f 6c 64 43 65 6c 6c 20    }.    oldCell 
2d7f0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
2d800 2c 20 70 43 75 72 2d 3e 69 64 78 29 3b 0a 20 20  , pCur->idx);.  
2d810 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2d820 61 66 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  af ){.      memc
2d830 70 79 28 6e 65 77 43 65 6c 6c 2c 20 6f 6c 64 43  py(newCell, oldC
2d840 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 20  ell, 4);.    }. 
2d850 20 20 20 73 7a 4f 6c 64 20 3d 20 63 65 6c 6c 53     szOld = cellS
2d860 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6f 6c  izePtr(pPage, ol
2d870 64 43 65 6c 6c 29 3b 0a 20 20 20 20 72 63 20 3d  dCell);.    rc =
2d880 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65   clearCell(pPage
2d890 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20  , oldCell);.    
2d8a0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
2d8b0 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 64 72  d_insert;.    dr
2d8c0 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  opCell(pPage, pC
2d8d0 75 72 2d 3e 69 64 78 2c 20 73 7a 4f 6c 64 29 3b  ur->idx, szOld);
2d8e0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63  .  }else if( loc
2d8f0 3c 30 20 26 26 20 70 50 61 67 65 2d 3e 6e 43 65  <0 && pPage->nCe
2d900 6c 6c 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65  ll>0 ){.    asse
2d910 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  rt( pPage->leaf 
2d920 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78  );.    pCur->idx
2d930 2b 2b 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e  ++;.    pCur->in
2d940 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
2d950 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
2d960 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  y = 0;.  }else{.
2d970 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2d980 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20  e->leaf );.  }. 
2d990 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c   rc = insertCell
2d9a0 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  (pPage, pCur->id
2d9b0 78 2c 20 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e 65  x, newCell, szNe
2d9c0 77 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  w, 0, 0);.  if( 
2d9d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
2d9e0 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b  goto end_insert;
2d9f0 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28  .  rc = balance(
2da00 70 50 61 67 65 2c 20 31 29 3b 0a 20 20 69 66 28  pPage, 1);.  if(
2da10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2da20 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74  {.    moveToRoot
2da30 28 70 43 75 72 29 3b 0a 20 20 7d 0a 65 6e 64 5f  (pCur);.  }.end_
2da40 69 6e 73 65 72 74 3a 0a 20 20 72 65 74 75 72 6e  insert:.  return
2da50 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
2da60 6c 65 74 65 20 74 68 65 20 65 6e 74 72 79 20 74  lete the entry t
2da70 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 69  hat the cursor i
2da80 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20  s pointing to.  
2da90 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73  The cursor.** is
2daa0 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61   left pointing a
2dab0 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74  t a random locat
2dac0 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
2dad0 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28 42  te3BtreeDelete(B
2dae0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
2daf0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
2db00 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
2db10 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2db20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 72 63  *pCell;.  int rc
2db30 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69  ;.  Pgno pgnoChi
2db40 6c 64 20 3d 20 30 3b 0a 20 20 42 74 72 65 65 20  ld = 0;.  Btree 
2db50 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65  *p = pCur->pBtre
2db60 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e;.  BtShared *p
2db70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
2db80 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
2db90 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
2dba0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2dbb0 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69  e->isInit );.  i
2dbc0 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f( pBt->inTransa
2dbd0 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49  ction!=TRANS_WRI
2dbe0 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73  TE ){.    /* Mus
2dbf0 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61  t start a transa
2dc00 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 64 6f 69  ction before doi
2dc10 6e 67 20 61 20 64 65 6c 65 74 65 20 2a 2f 0a 20  ng a delete */. 
2dc20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61     rc = pBt->rea
2dc30 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52  dOnly ? SQLITE_R
2dc40 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45  EADONLY : SQLITE
2dc50 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75  _ERROR;.    retu
2dc60 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
2dc70 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f  ert( !pBt->readO
2dc80 6e 6c 79 20 29 3b 0a 20 20 69 66 28 20 70 43 75  nly );.  if( pCu
2dc90 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2dca0 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72  R_FAULT ){.    r
2dcb0 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
2dcc0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72  ;.  }.  if( pCur
2dcd0 2d 3e 69 64 78 20 3e 3d 20 70 50 61 67 65 2d 3e  ->idx >= pPage->
2dce0 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74  nCell ){.    ret
2dcf0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
2dd00 3b 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72  ;  /* The cursor
2dd10 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67   is not pointing
2dd20 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a   to anything */.
2dd30 20 20 7d 0a 20 20 69 66 28 20 21 70 43 75 72 2d    }.  if( !pCur-
2dd40 3e 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 72  >wrFlag ){.    r
2dd50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
2dd60 4d 3b 20 20 20 2f 2a 20 44 69 64 20 6e 6f 74 20  M;   /* Did not 
2dd70 6f 70 65 6e 20 74 68 69 73 20 63 75 72 73 6f 72  open this cursor
2dd80 20 66 6f 72 20 77 72 69 74 69 6e 67 20 2a 2f 0a   for writing */.
2dd90 20 20 7d 0a 20 20 69 66 28 20 63 68 65 63 6b 52    }.  if( checkR
2dda0 65 61 64 4c 6f 63 6b 73 28 70 43 75 72 2d 3e 70  eadLocks(pCur->p
2ddb0 42 74 72 65 65 2c 20 70 43 75 72 2d 3e 70 67 6e  Btree, pCur->pgn
2ddc0 6f 52 6f 6f 74 2c 20 70 43 75 72 2c 20 70 43 75  oRoot, pCur, pCu
2ddd0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 20 29 7b  r->info.nKey) ){
2dde0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
2ddf0 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68  TE_LOCKED; /* Th
2de00 65 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f 69  e table pCur poi
2de10 6e 74 73 20 74 6f 20 68 61 73 20 61 20 72 65 61  nts to has a rea
2de20 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 0a 20  d lock */.  }.. 
2de30 20 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20   /* Restore the 
2de40 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70  current cursor p
2de50 6f 73 69 74 69 6f 6e 20 28 61 20 6e 6f 2d 6f 70  osition (a no-op
2de60 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
2de70 73 20 6e 6f 74 20 69 6e 20 0a 20 20 2a 2a 20 43  s not in .  ** C
2de80 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
2de90 4b 20 73 74 61 74 65 29 20 61 6e 64 20 73 61 76  K state) and sav
2dea0 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20  e the positions 
2deb0 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72  of any other cur
2dec0 73 6f 72 73 20 0a 20 20 2a 2a 20 6f 70 65 6e 20  sors .  ** open 
2ded0 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c  on the same tabl
2dee0 65 2e 20 54 68 65 6e 20 63 61 6c 6c 20 73 71 6c  e. Then call sql
2def0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
2df00 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 20 20 2a   on the page.  *
2df10 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74 72 79  * that the entry
2df20 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64   will be deleted
2df30 20 66 72 6f 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66   from..  */.  if
2df40 28 20 0a 20 20 20 20 28 72 63 20 3d 20 72 65 73  ( .    (rc = res
2df50 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
2df60 6f 6e 28 70 43 75 72 29 29 21 3d 30 20 7c 7c 0a  on(pCur))!=0 ||.
2df70 20 20 20 20 28 72 63 20 3d 20 73 61 76 65 41 6c      (rc = saveAl
2df80 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43  lCursors(pBt, pC
2df90 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  ur->pgnoRoot, pC
2dfa0 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28  ur))!=0 ||.    (
2dfb0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2dfc0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
2dfd0 62 50 61 67 65 29 29 21 3d 30 0a 20 20 29 7b 0a  bPage))!=0.  ){.
2dfe0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2dff0 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20   }..  /* Locate 
2e000 74 68 65 20 63 65 6c 6c 20 77 69 74 68 69 6e 20  the cell within 
2e010 69 74 73 20 70 61 67 65 20 61 6e 64 20 6c 65 61  its page and lea
2e020 76 65 20 70 43 65 6c 6c 20 70 6f 69 6e 74 69 6e  ve pCell pointin
2e030 67 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61  g to the.  ** da
2e040 74 61 2e 20 54 68 65 20 63 6c 65 61 72 43 65 6c  ta. The clearCel
2e050 6c 28 29 20 63 61 6c 6c 20 66 72 65 65 73 20 61  l() call frees a
2e060 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
2e070 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
2e080 68 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e  h the.  ** cell.
2e090 20 54 68 65 20 63 65 6c 6c 20 69 74 73 65 6c 66   The cell itself
2e0a0 20 69 73 20 73 74 69 6c 6c 20 69 6e 74 61 63 74   is still intact
2e0b0 2e 0a 20 20 2a 2f 0a 20 20 70 43 65 6c 6c 20 3d  ..  */.  pCell =
2e0c0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
2e0d0 20 70 43 75 72 2d 3e 69 64 78 29 3b 0a 20 20 69   pCur->idx);.  i
2e0e0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2e0f0 29 7b 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c 64  ){.    pgnoChild
2e100 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c   = get4byte(pCel
2e110 6c 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63  l);.  }.  rc = c
2e120 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20  learCell(pPage, 
2e130 70 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20 72 63  pCell);.  if( rc
2e140 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
2e150 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70  c;.  }..  if( !p
2e160 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2e170 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
2e180 65 6e 74 72 79 20 77 65 20 61 72 65 20 61 62 6f  entry we are abo
2e190 75 74 20 74 6f 20 64 65 6c 65 74 65 20 69 73 20  ut to delete is 
2e1a0 6e 6f 74 20 61 20 6c 65 61 66 20 73 6f 20 69 66  not a leaf so if
2e1b0 20 77 65 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a   we do not.    *
2e1c0 2a 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77  * do something w
2e1d0 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 61 20 68  e will leave a h
2e1e0 6f 6c 65 20 6f 6e 20 61 6e 20 69 6e 74 65 72 6e  ole on an intern
2e1f0 61 6c 20 70 61 67 65 2e 0a 20 20 20 20 2a 2a 20  al page..    ** 
2e200 57 65 20 68 61 76 65 20 74 6f 20 66 69 6c 6c 20  We have to fill 
2e210 74 68 65 20 68 6f 6c 65 20 62 79 20 6d 6f 76 69  the hole by movi
2e220 6e 67 20 69 6e 20 61 20 63 65 6c 6c 20 66 72 6f  ng in a cell fro
2e230 6d 20 61 20 6c 65 61 66 2e 20 20 54 68 65 0a 20  m a leaf.  The. 
2e240 20 20 20 2a 2a 20 6e 65 78 74 20 43 65 6c 6c 20     ** next Cell 
2e250 61 66 74 65 72 20 74 68 65 20 6f 6e 65 20 74 6f  after the one to
2e260 20 62 65 20 64 65 6c 65 74 65 64 20 69 73 20 67   be deleted is g
2e270 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69  uaranteed to exi
2e280 73 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 6f  st and.    ** to
2e290 20 62 65 20 61 20 6c 65 61 66 20 73 6f 20 77 65   be a leaf so we
2e2a0 20 63 61 6e 20 75 73 65 20 69 74 2e 0a 20 20 20   can use it..   
2e2b0 20 2a 2f 0a 20 20 20 20 42 74 43 75 72 73 6f 72   */.    BtCursor
2e2c0 20 6c 65 61 66 43 75 72 3b 0a 20 20 20 20 75 6e   leafCur;.    un
2e2d0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4e 65  signed char *pNe
2e2e0 78 74 3b 0a 20 20 20 20 69 6e 74 20 6e 6f 74 55  xt;.    int notU
2e2f0 73 65 64 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  sed;.    unsigne
2e300 64 20 63 68 61 72 20 2a 74 65 6d 70 43 65 6c 6c  d char *tempCell
2e310 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
2e320 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  ( !pPage->intKey
2e330 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   );.    sqlite3B
2e340 74 72 65 65 47 65 74 54 65 6d 70 43 75 72 73 6f  treeGetTempCurso
2e350 72 28 70 43 75 72 2c 20 26 6c 65 61 66 43 75 72  r(pCur, &leafCur
2e360 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
2e370 74 65 33 42 74 72 65 65 4e 65 78 74 28 26 6c 65  te3BtreeNext(&le
2e380 61 66 43 75 72 2c 20 26 6e 6f 74 55 73 65 64 29  afCur, &notUsed)
2e390 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2e3a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2e3b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2e3c0 65 72 57 72 69 74 65 28 6c 65 61 66 43 75 72 2e  erWrite(leafCur.
2e3d0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
2e3e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
2e3f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2e400 20 20 20 20 20 20 75 31 36 20 73 7a 4e 65 78 74        u16 szNext
2e410 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  ;.      TRACE(("
2e420 44 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25 64  DELETE: table=%d
2e430 20 64 65 6c 65 74 65 20 69 6e 74 65 72 6e 61 6c   delete internal
2e440 20 66 72 6f 6d 20 25 64 20 72 65 70 6c 61 63 65   from %d replace
2e450 20 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22   from leaf %d\n"
2e460 2c 0a 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  ,.         pCur-
2e470 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65  >pgnoRoot, pPage
2e480 2d 3e 70 67 6e 6f 2c 20 6c 65 61 66 43 75 72 2e  ->pgno, leafCur.
2e490 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20  pPage->pgno));. 
2e4a0 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50       dropCell(pP
2e4b0 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
2e4c0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
2e4d0 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20  e, pCell));.    
2e4e0 20 20 70 4e 65 78 74 20 3d 20 66 69 6e 64 43 65    pNext = findCe
2e4f0 6c 6c 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65  ll(leafCur.pPage
2e500 2c 20 6c 65 61 66 43 75 72 2e 69 64 78 29 3b 0a  , leafCur.idx);.
2e510 20 20 20 20 20 20 73 7a 4e 65 78 74 20 3d 20 63        szNext = c
2e520 65 6c 6c 53 69 7a 65 50 74 72 28 6c 65 61 66 43  ellSizePtr(leafC
2e530 75 72 2e 70 50 61 67 65 2c 20 70 4e 65 78 74 29  ur.pPage, pNext)
2e540 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2e550 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74  MX_CELL_SIZE(pBt
2e560 29 3e 3d 73 7a 4e 65 78 74 2b 34 20 29 3b 0a 20  )>=szNext+4 );. 
2e570 20 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d       allocateTem
2e580 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20  pSpace(pBt);.   
2e590 20 20 20 74 65 6d 70 43 65 6c 6c 20 3d 20 70 42     tempCell = pB
2e5a0 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  t->pTmpSpace;.  
2e5b0 20 20 20 20 69 66 28 20 74 65 6d 70 43 65 6c 6c      if( tempCell
2e5c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
2e5d0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
2e5e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2e5f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2e600 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
2e610 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61  = insertCell(pPa
2e620 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 70  ge, pCur->idx, p
2e630 4e 65 78 74 2d 34 2c 20 73 7a 4e 65 78 74 2b 34  Next-4, szNext+4
2e640 2c 20 74 65 6d 70 43 65 6c 6c 2c 20 30 29 3b 0a  , tempCell, 0);.
2e650 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2e660 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2e670 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  ){.        put4b
2e680 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77  yte(findOverflow
2e690 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
2e6a0 2d 3e 69 64 78 29 2c 20 70 67 6e 6f 43 68 69 6c  ->idx), pgnoChil
2e6b0 64 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  d);.        rc =
2e6c0 20 62 61 6c 61 6e 63 65 28 70 50 61 67 65 2c 20   balance(pPage, 
2e6d0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
2e6e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2e6f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 64  _OK ){.        d
2e700 72 6f 70 43 65 6c 6c 28 6c 65 61 66 43 75 72 2e  ropCell(leafCur.
2e710 70 50 61 67 65 2c 20 6c 65 61 66 43 75 72 2e 69  pPage, leafCur.i
2e720 64 78 2c 20 73 7a 4e 65 78 74 29 3b 0a 20 20 20  dx, szNext);.   
2e730 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
2e740 65 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c  e(leafCur.pPage,
2e750 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
2e760 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
2e770 72 65 65 52 65 6c 65 61 73 65 54 65 6d 70 43 75  reeReleaseTempCu
2e780 72 73 6f 72 28 26 6c 65 61 66 43 75 72 29 3b 0a  rsor(&leafCur);.
2e790 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 52 41    }else{.    TRA
2e7a0 43 45 28 28 22 44 45 4c 45 54 45 3a 20 74 61 62  CE(("DELETE: tab
2e7b0 6c 65 3d 25 64 20 64 65 6c 65 74 65 20 66 72 6f  le=%d delete fro
2e7c0 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20  m leaf %d\n",.  
2e7d0 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52       pCur->pgnoR
2e7e0 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  oot, pPage->pgno
2e7f0 29 29 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c  ));.    dropCell
2e800 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  (pPage, pCur->id
2e810 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  x, cellSizePtr(p
2e820 50 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20  Page, pCell));. 
2e830 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28     rc = balance(
2e840 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 7d 0a 20  pPage, 0);.  }. 
2e850 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2e860 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f  OK ){.    moveTo
2e870 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a  Root(pCur);.  }.
2e880 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2e890 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
2e8a0 65 77 20 42 54 72 65 65 20 74 61 62 6c 65 2e 20  ew BTree table. 
2e8b0 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 54   Write into *piT
2e8c0 61 62 6c 65 20 74 68 65 20 70 61 67 65 0a 2a 2a  able the page.**
2e8d0 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
2e8e0 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65  root page of the
2e8f0 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   new table..**.*
2e900 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20 74 79  * The type of ty
2e910 70 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  pe is determined
2e920 20 62 79 20 74 68 65 20 66 6c 61 67 73 20 70 61   by the flags pa
2e930 72 61 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20 74  rameter.  Only t
2e940 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  he.** following 
2e950 76 61 6c 75 65 73 20 6f 66 20 66 6c 61 67 73 20  values of flags 
2e960 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  are currently in
2e970 20 75 73 65 2e 20 20 4f 74 68 65 72 20 76 61 6c   use.  Other val
2e980 75 65 73 20 66 6f 72 0a 2a 2a 20 66 6c 61 67 73  ues for.** flags
2e990 20 6d 69 67 68 74 20 6e 6f 74 20 77 6f 72 6b 3a   might not work:
2e9a0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 42 54 52 45 45  .**.**     BTREE
2e9b0 5f 49 4e 54 4b 45 59 7c 42 54 52 45 45 5f 4c 45  _INTKEY|BTREE_LE
2e9c0 41 46 44 41 54 41 20 20 20 20 20 55 73 65 64 20  AFDATA     Used 
2e9d0 66 6f 72 20 53 51 4c 20 74 61 62 6c 65 73 20 77  for SQL tables w
2e9e0 69 74 68 20 72 6f 77 69 64 20 6b 65 79 73 0a 2a  ith rowid keys.*
2e9f0 2a 20 20 20 20 20 42 54 52 45 45 5f 5a 45 52 4f  *     BTREE_ZERO
2ea00 44 41 54 41 20 20 20 20 20 20 20 20 20 20 20 20  DATA            
2ea10 20 20 20 20 20 20 55 73 65 64 20 66 6f 72 20 53        Used for S
2ea20 51 4c 20 69 6e 64 69 63 65 73 0a 2a 2f 0a 73 74  QL indices.*/.st
2ea30 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 72  atic int btreeCr
2ea40 65 61 74 65 54 61 62 6c 65 28 42 74 72 65 65 20  eateTable(Btree 
2ea50 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c 65  *p, int *piTable
2ea60 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
2ea70 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2ea80 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67  p->pBt;.  MemPag
2ea90 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 50 67 6e 6f  e *pRoot;.  Pgno
2eaa0 20 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e 74   pgnoRoot;.  int
2eab0 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
2eac0 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64  sqlite3BtreeHold
2ead0 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 69  sMutex(p) );.  i
2eae0 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f( pBt->inTransa
2eaf0 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49  ction!=TRANS_WRI
2eb00 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73  TE ){.    /* Mus
2eb10 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61  t start a transa
2eb20 63 74 69 6f 6e 20 66 69 72 73 74 20 2a 2f 0a 20  ction first */. 
2eb30 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61     rc = pBt->rea
2eb40 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52  dOnly ? SQLITE_R
2eb50 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45  EADONLY : SQLITE
2eb60 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75  _ERROR;.    retu
2eb70 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
2eb80 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f  ert( !pBt->readO
2eb90 6e 6c 79 20 29 3b 0a 0a 23 69 66 64 65 66 20 53  nly );..#ifdef S
2eba0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2ebb0 41 43 55 55 4d 0a 20 20 72 63 20 3d 20 61 6c 6c  ACUUM.  rc = all
2ebc0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
2ebd0 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e  Bt, &pRoot, &pgn
2ebe0 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20  oRoot, 1, 0);.  
2ebf0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
2ec00 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6c  turn rc;.  }.#el
2ec10 73 65 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  se.  if( pBt->au
2ec20 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
2ec30 50 67 6e 6f 20 70 67 6e 6f 4d 6f 76 65 3b 20 20  Pgno pgnoMove;  
2ec40 20 20 20 20 2f 2a 20 4d 6f 76 65 20 61 20 70 61      /* Move a pa
2ec50 67 65 20 68 65 72 65 20 74 6f 20 6d 61 6b 65 20  ge here to make 
2ec60 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 72 6f 6f  room for the roo
2ec70 74 2d 70 61 67 65 20 2a 2f 0a 20 20 20 20 4d 65  t-page */.    Me
2ec80 6d 50 61 67 65 20 2a 70 50 61 67 65 4d 6f 76 65  mPage *pPageMove
2ec90 3b 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f  ; /* The page to
2eca0 20 6d 6f 76 65 20 74 6f 2e 20 2a 2f 0a 0a 20 20   move to. */..  
2ecb0 20 20 2f 2a 20 43 72 65 61 74 69 6e 67 20 61 20    /* Creating a 
2ecc0 6e 65 77 20 74 61 62 6c 65 20 6d 61 79 20 70 72  new table may pr
2ecd0 6f 62 61 62 6c 79 20 72 65 71 75 69 72 65 20 6d  obably require m
2ece0 6f 76 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e  oving an existin
2ecf0 67 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  g database.    *
2ed00 2a 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66  * to make room f
2ed10 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  or the new table
2ed20 73 20 72 6f 6f 74 20 70 61 67 65 2e 20 49 6e 20  s root page. In 
2ed30 63 61 73 65 20 74 68 69 73 20 70 61 67 65 20 74  case this page t
2ed40 75 72 6e 73 0a 20 20 20 20 2a 2a 20 6f 75 74 20  urns.    ** out 
2ed50 74 6f 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  to be an overflo
2ed60 77 20 70 61 67 65 2c 20 64 65 6c 65 74 65 20 61  w page, delete a
2ed70 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ll overflow page
2ed80 2d 6d 61 70 20 63 61 63 68 65 73 0a 20 20 20 20  -map caches.    
2ed90 2a 2a 20 68 65 6c 64 20 62 79 20 6f 70 65 6e 20  ** held by open 
2eda0 63 75 72 73 6f 72 73 2e 0a 20 20 20 20 2a 2f 0a  cursors..    */.
2edb0 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c      invalidateAl
2edc0 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
2edd0 42 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  Bt);..    /* Rea
2ede0 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d  d the value of m
2edf0 65 74 61 5b 33 5d 20 66 72 6f 6d 20 74 68 65 20  eta[3] from the 
2ee00 64 61 74 61 62 61 73 65 20 74 6f 20 64 65 74 65  database to dete
2ee10 72 6d 69 6e 65 20 77 68 65 72 65 20 74 68 65 0a  rmine where the.
2ee20 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65      ** root page
2ee30 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
2ee40 65 20 73 68 6f 75 6c 64 20 67 6f 2e 20 6d 65 74  e should go. met
2ee50 61 5b 33 5d 20 69 73 20 74 68 65 20 6c 61 72 67  a[3] is the larg
2ee60 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20  est root-page.  
2ee70 20 20 2a 2a 20 63 72 65 61 74 65 64 20 73 6f 20    ** created so 
2ee80 66 61 72 2c 20 73 6f 20 74 68 65 20 6e 65 77 20  far, so the new 
2ee90 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 28 6d 65  root-page is (me
2eea0 74 61 5b 33 5d 2b 31 29 2e 0a 20 20 20 20 2a 2f  ta[3]+1)..    */
2eeb0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2eec0 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 70 2c  3BtreeGetMeta(p,
2eed0 20 34 2c 20 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a   4, &pgnoRoot);.
2eee0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2eef0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2ef00 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2ef10 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a      pgnoRoot++;.
2ef20 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20  .    /* The new 
2ef30 72 6f 6f 74 2d 70 61 67 65 20 6d 61 79 20 6e 6f  root-page may no
2ef40 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f  t be allocated o
2ef50 6e 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  n a pointer-map 
2ef60 70 61 67 65 2c 20 6f 72 20 74 68 65 0a 20 20 20  page, or the.   
2ef70 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45   ** PENDING_BYTE
2ef80 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
2ef90 20 20 77 68 69 6c 65 28 20 70 67 6e 6f 52 6f 6f    while( pgnoRoo
2efa0 74 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f  t==PTRMAP_PAGENO
2efb0 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 29 20  (pBt, pgnoRoot) 
2efc0 7c 7c 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 52  ||.        pgnoR
2efd0 6f 6f 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  oot==PENDING_BYT
2efe0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
2eff0 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b       pgnoRoot++;
2f000 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
2f010 74 28 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20 29  t( pgnoRoot>=3 )
2f020 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61  ;..    /* Alloca
2f030 74 65 20 61 20 70 61 67 65 2e 20 54 68 65 20 70  te a page. The p
2f040 61 67 65 20 74 68 61 74 20 63 75 72 72 65 6e 74  age that current
2f050 6c 79 20 72 65 73 69 64 65 73 20 61 74 20 70 67  ly resides at pg
2f060 6e 6f 52 6f 6f 74 20 77 69 6c 6c 0a 20 20 20 20  noRoot will.    
2f070 2a 2a 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 74  ** be moved to t
2f080 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  he allocated pag
2f090 65 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61 6c  e (unless the al
2f0a0 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68 61 70  located page hap
2f0b0 70 65 6e 73 0a 20 20 20 20 2a 2a 20 74 6f 20 72  pens.    ** to r
2f0c0 65 73 69 64 65 20 61 74 20 70 67 6e 6f 52 6f 6f  eside at pgnoRoo
2f0d0 74 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  t)..    */.    r
2f0e0 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
2f0f0 65 50 61 67 65 28 70 42 74 2c 20 26 70 50 61 67  ePage(pBt, &pPag
2f100 65 4d 6f 76 65 2c 20 26 70 67 6e 6f 4d 6f 76 65  eMove, &pgnoMove
2f110 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 0a  , pgnoRoot, 1);.
2f120 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2f130 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2f140 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2f150 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 4d 6f 76  .    if( pgnoMov
2f160 65 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20  e!=pgnoRoot ){. 
2f170 20 20 20 20 20 2f 2a 20 70 67 6e 6f 52 6f 6f 74       /* pgnoRoot
2f180 20 69 73 20 74 68 65 20 70 61 67 65 20 74 68 61   is the page tha
2f190 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66  t will be used f
2f1a0 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  or the root-page
2f1b0 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   of.      ** the
2f1c0 20 6e 65 77 20 74 61 62 6c 65 20 28 61 73 73 75   new table (assu
2f1d0 6d 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 64 69  ming an error di
2f1e0 64 20 6e 6f 74 20 6f 63 63 75 72 29 2e 20 42 75  d not occur). Bu
2f1f0 74 20 77 65 20 77 65 72 65 0a 20 20 20 20 20 20  t we were.      
2f200 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 67 6e  ** allocated pgn
2f210 6f 4d 6f 76 65 2e 20 49 66 20 72 65 71 75 69 72  oMove. If requir
2f220 65 64 20 28 69 2e 65 2e 20 69 66 20 69 74 20 77  ed (i.e. if it w
2f230 61 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64  as not allocated
2f240 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 65 78 74  .      ** by ext
2f250 65 6e 64 69 6e 67 20 74 68 65 20 66 69 6c 65 29  ending the file)
2f260 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  , the current pa
2f270 67 65 20 61 74 20 70 6f 73 69 74 69 6f 6e 20 70  ge at position p
2f280 67 6e 6f 4d 6f 76 65 0a 20 20 20 20 20 20 2a 2a  gnoMove.      **
2f290 20 69 73 20 61 6c 72 65 61 64 79 20 6a 6f 75 72   is already jour
2f2a0 6e 61 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  naled..      */.
2f2b0 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a        u8 eType;.
2f2c0 20 20 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50        Pgno iPtrP
2f2d0 61 67 65 3b 0a 0a 20 20 20 20 20 20 72 65 6c 65  age;..      rele
2f2e0 61 73 65 50 61 67 65 28 70 50 61 67 65 4d 6f 76  asePage(pPageMov
2f2f0 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 6f  e);..      /* Mo
2f300 76 65 20 74 68 65 20 70 61 67 65 20 63 75 72 72  ve the page curr
2f310 65 6e 74 6c 79 20 61 74 20 70 67 6e 6f 52 6f 6f  ently at pgnoRoo
2f320 74 20 74 6f 20 70 67 6e 6f 4d 6f 76 65 2e 20 2a  t to pgnoMove. *
2f330 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
2f340 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
2f350 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  (pBt, pgnoRoot, 
2f360 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20  &pRoot, 0);.    
2f370 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2f380 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2f390 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2f3a0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  }.      rc = ptr
2f3b0 6d 61 70 47 65 74 28 70 42 74 2c 20 70 67 6e 6f  mapGet(pBt, pgno
2f3c0 52 6f 6f 74 2c 20 26 65 54 79 70 65 2c 20 26 69  Root, &eType, &i
2f3d0 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20  PtrPage);.      
2f3e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2f3f0 4b 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  K || eType==PTRM
2f400 41 50 5f 52 4f 4f 54 50 41 47 45 20 7c 7c 20 65  AP_ROOTPAGE || e
2f410 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
2f420 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20  EPAGE ){.       
2f430 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
2f440 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ot);.        ret
2f450 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
2f460 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54        assert( eT
2f470 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype!=PTRMAP_ROOT
2f480 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20 61 73  PAGE );.      as
2f490 73 65 72 74 28 20 65 54 79 70 65 21 3d 50 54 52  sert( eType!=PTR
2f4a0 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 3b 0a  MAP_FREEPAGE );.
2f4b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2f4c0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 52 6f  e3PagerWrite(pRo
2f4d0 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ot->pDbPage);.  
2f4e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2f4f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2f500 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
2f510 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ot);.        ret
2f520 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
2f530 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63        rc = reloc
2f540 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 52 6f  atePage(pBt, pRo
2f550 6f 74 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  ot, eType, iPtrP
2f560 61 67 65 2c 20 70 67 6e 6f 4d 6f 76 65 2c 20 30  age, pgnoMove, 0
2f570 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
2f580 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 0a 20 20  Page(pRoot);..  
2f590 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 74 68      /* Obtain th
2f5a0 65 20 70 61 67 65 20 61 74 20 70 67 6e 6f 52 6f  e page at pgnoRo
2f5b0 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ot */.      if( 
2f5c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2f5d0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2f5e0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
2f5f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2f600 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
2f610 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74  pgnoRoot, &pRoot
2f620 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
2f630 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2f640 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2f650 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
2f660 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2f670 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e  gerWrite(pRoot->
2f680 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
2f690 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2f6a0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  K ){.        rel
2f6b0 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b  easePage(pRoot);
2f6c0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2f6d0 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
2f6e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 6f  }else{.      pRo
2f6f0 6f 74 20 3d 20 70 50 61 67 65 4d 6f 76 65 3b 0a  ot = pPageMove;.
2f700 20 20 20 20 7d 20 0a 0a 20 20 20 20 2f 2a 20 55      } ..    /* U
2f710 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
2f720 72 2d 6d 61 70 20 61 6e 64 20 6d 65 74 61 2d 64  r-map and meta-d
2f730 61 74 61 20 77 69 74 68 20 74 68 65 20 6e 65 77  ata with the new
2f740 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
2f750 72 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70  r. */.    rc = p
2f760 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
2f770 6e 6f 52 6f 6f 74 2c 20 50 54 52 4d 41 50 5f 52  noRoot, PTRMAP_R
2f780 4f 4f 54 50 41 47 45 2c 20 30 29 3b 0a 20 20 20  OOTPAGE, 0);.   
2f790 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2f7a0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
2f7b0 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ot);.      retur
2f7c0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
2f7d0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2f7e0 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34  eUpdateMeta(p, 4
2f7f0 2c 20 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20  , pgnoRoot);.   
2f800 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2f810 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
2f820 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ot);.      retur
2f830 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d  n rc;.    }..  }
2f840 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 61  else{.    rc = a
2f850 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
2f860 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70  (pBt, &pRoot, &p
2f870 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a  gnoRoot, 1, 0);.
2f880 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2f890 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64  urn rc;.  }.#end
2f8a0 69 66 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  if.  assert( sql
2f8b0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
2f8c0 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50  able(pRoot->pDbP
2f8d0 61 67 65 29 20 29 3b 0a 20 20 7a 65 72 6f 50 61  age) );.  zeroPa
2f8e0 67 65 28 70 52 6f 6f 74 2c 20 66 6c 61 67 73 20  ge(pRoot, flags 
2f8f0 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 73  | PTF_LEAF);.  s
2f900 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
2f910 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29  (pRoot->pDbPage)
2f920 3b 0a 20 20 2a 70 69 54 61 62 6c 65 20 3d 20 28  ;.  *piTable = (
2f930 69 6e 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20  int)pgnoRoot;.  
2f940 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2f950 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
2f960 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
2f970 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70  Btree *p, int *p
2f980 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67  iTable, int flag
2f990 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
2f9a0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
2f9b0 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e  r(p);.  p->pBt->
2f9c0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63  db = p->db;.  rc
2f9d0 20 3d 20 62 74 72 65 65 43 72 65 61 74 65 54 61   = btreeCreateTa
2f9e0 62 6c 65 28 70 2c 20 70 69 54 61 62 6c 65 2c 20  ble(p, piTable, 
2f9f0 66 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65  flags);.  sqlite
2fa00 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
2fa10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2fa20 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 74 68 65 20  /*.** Erase the 
2fa30 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20 70  given database p
2fa40 61 67 65 20 61 6e 64 20 61 6c 6c 20 69 74 73 20  age and all its 
2fa50 63 68 69 6c 64 72 65 6e 2e 20 20 52 65 74 75 72  children.  Retur
2fa60 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 74 6f  n.** the page to
2fa70 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
2fa80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65  /.static int cle
2fa90 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28 0a  arDatabasePage(.
2faa0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
2fab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
2fac0 65 20 42 54 72 65 65 20 74 68 61 74 20 63 6f 6e  e BTree that con
2fad0 74 61 69 6e 73 20 74 68 65 20 74 61 62 6c 65 20  tains the table 
2fae0 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
2faf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2fb00 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 6c 65  ge number to cle
2fb10 61 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ar */.  MemPage 
2fb20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20 20 2f 2a  *pParent,     /*
2fb30 20 50 61 72 65 6e 74 20 70 61 67 65 2e 20 20 4e   Parent page.  N
2fb40 55 4c 4c 20 66 6f 72 20 74 68 65 20 72 6f 6f 74  ULL for the root
2fb50 20 2a 2f 0a 20 20 69 6e 74 20 66 72 65 65 50 61   */.  int freePa
2fb60 67 65 46 6c 61 67 20 20 20 20 20 20 2f 2a 20 44  geFlag      /* D
2fb70 65 61 6c 6c 6f 63 61 74 65 20 70 61 67 65 20 69  eallocate page i
2fb80 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 4d  f true */.){.  M
2fb90 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
2fba0 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  0;.  int rc;.  u
2fbb0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
2fbc0 65 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  ell;.  int i;.. 
2fbd0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2fbe0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
2fbf0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
2fc00 20 70 67 6e 6f 3e 70 61 67 65 72 50 61 67 65 63   pgno>pagerPagec
2fc10 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
2fc20 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
2fc30 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
2fc40 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  KPT;.  }..  rc =
2fc50 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
2fc60 70 42 74 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67  pBt, pgno, &pPag
2fc70 65 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 69  e, pParent);.  i
2fc80 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65  f( rc ) goto cle
2fc90 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f  ardatabasepage_o
2fca0 75 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ut;.  for(i=0; i
2fcb0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69  <pPage->nCell; i
2fcc0 2b 2b 29 7b 0a 20 20 20 20 70 43 65 6c 6c 20 3d  ++){.    pCell =
2fcd0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
2fce0 20 69 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50   i);.    if( !pP
2fcf0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
2fd00 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74     rc = clearDat
2fd10 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20 67  abasePage(pBt, g
2fd20 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20  et4byte(pCell), 
2fd30 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 2c 20  pPage->pParent, 
2fd40 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  1);.      if( rc
2fd50 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74   ) goto cleardat
2fd60 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20  abasepage_out;. 
2fd70 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6c     }.    rc = cl
2fd80 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  earCell(pPage, p
2fd90 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  Cell);.    if( r
2fda0 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61  c ) goto clearda
2fdb0 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a  tabasepage_out;.
2fdc0 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
2fdd0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 63  ->leaf ){.    rc
2fde0 20 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73 65   = clearDatabase
2fdf0 50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79  Page(pBt, get4by
2fe00 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
2fe10 5b 38 5d 29 2c 20 70 50 61 67 65 2d 3e 70 50 61  [8]), pPage->pPa
2fe20 72 65 6e 74 2c 20 31 29 3b 0a 20 20 20 20 69 66  rent, 1);.    if
2fe30 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61  ( rc ) goto clea
2fe40 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75  rdatabasepage_ou
2fe50 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 72 65  t;.  }.  if( fre
2fe60 65 50 61 67 65 46 6c 61 67 20 29 7b 0a 20 20 20  ePageFlag ){.   
2fe70 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70   rc = freePage(p
2fe80 50 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 20 69  Page);.  }else i
2fe90 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  f( (rc = sqlite3
2fea0 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
2feb0 2d 3e 70 44 62 50 61 67 65 29 29 3d 3d 30 20 29  ->pDbPage))==0 )
2fec0 7b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70  {.    zeroPage(p
2fed0 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 61 44 61  Page, pPage->aDa
2fee0 74 61 5b 30 5d 20 7c 20 50 54 46 5f 4c 45 41 46  ta[0] | PTF_LEAF
2fef0 29 3b 0a 20 20 7d 0a 0a 63 6c 65 61 72 64 61 74  );.  }..cleardat
2ff00 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3a 0a 20  abasepage_out:. 
2ff10 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
2ff20 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ge);.  return rc
2ff30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
2ff40 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  e all informatio
2ff50 6e 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20  n from a single 
2ff60 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
2ff70 61 62 61 73 65 2e 20 20 69 54 61 62 6c 65 20 69  abase.  iTable i
2ff80 73 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75  s.** the page nu
2ff90 6d 62 65 72 20 6f 66 20 74 68 65 20 72 6f 6f 74  mber of the root
2ffa0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20   of the table.  
2ffb0 41 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69  After this routi
2ffc0 6e 65 20 72 65 74 75 72 6e 73 2c 0a 2a 2a 20 74  ne returns,.** t
2ffd0 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  he root page is 
2ffe0 65 6d 70 74 79 2c 20 62 75 74 20 73 74 69 6c 6c  empty, but still
2fff0 20 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54   exists..**.** T
30000 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
30010 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54   fail with SQLIT
30020 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72  E_LOCKED if ther
30030 65 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a  e are any open.*
30040 2a 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 6f  * read cursors o
30050 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 4f 70  n the table.  Op
30060 65 6e 20 77 72 69 74 65 20 63 75 72 73 6f 72 73  en write cursors
30070 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68   are moved to th
30080 65 0a 2a 2a 20 72 6f 6f 74 20 6f 66 20 74 68 65  e.** root of the
30090 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73   table..*/.int s
300a0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
300b0 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20  Table(Btree *p, 
300c0 69 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 69  int iTable){.  i
300d0 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
300e0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
300f0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
30100 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e  nter(p);.  pBt->
30110 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66  db = p->db;.  if
30120 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  ( p->inTrans!=TR
30130 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
30140 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f   rc = pBt->readO
30150 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41  nly ? SQLITE_REA
30160 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45  DONLY : SQLITE_E
30170 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66  RROR;.  }else if
30180 28 20 28 72 63 20 3d 20 63 68 65 63 6b 52 65 61  ( (rc = checkRea
30190 64 4c 6f 63 6b 73 28 70 2c 20 69 54 61 62 6c 65  dLocks(p, iTable
301a0 2c 20 30 2c 20 31 29 29 21 3d 53 51 4c 49 54 45  , 0, 1))!=SQLITE
301b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f  _OK ){.    /* no
301c0 74 68 69 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20  thing to do */. 
301d0 20 7d 65 6c 73 65 20 69 66 28 20 53 51 4c 49 54   }else if( SQLIT
301e0 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65  E_OK!=(rc = save
301f0 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20  AllCursors(pBt, 
30200 69 54 61 62 6c 65 2c 20 30 29 29 20 29 7b 0a 20  iTable, 0)) ){. 
30210 20 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f     /* nothing to
30220 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a   do */.  }else{.
30230 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61      rc = clearDa
30240 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20  tabasePage(pBt, 
30250 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 30 2c  (Pgno)iTable, 0,
30260 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   0);.  }.  sqlit
30270 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
30280 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
30290 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c  ./*.** Erase all
302a0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
302b0 61 20 74 61 62 6c 65 20 61 6e 64 20 61 64 64 20  a table and add 
302c0 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  the root of the 
302d0 74 61 62 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20  table to.** the 
302e0 66 72 65 65 6c 69 73 74 2e 20 20 45 78 63 65 70  freelist.  Excep
302f0 74 2c 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74  t, the root of t
30300 68 65 20 70 72 69 6e 63 69 70 6c 65 20 74 61 62  he principle tab
30310 6c 65 20 28 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a  le (the one on.*
30320 2a 20 70 61 67 65 20 31 29 20 69 73 20 6e 65 76  * page 1) is nev
30330 65 72 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  er added to the 
30340 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  freelist..**.** 
30350 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c  This routine wil
30360 6c 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49  l fail with SQLI
30370 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65  TE_LOCKED if the
30380 72 65 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a  re are any open.
30390 2a 2a 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68  ** cursors on th
303a0 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  e table..**.** I
303b0 66 20 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20  f AUTOVACUUM is 
303c0 65 6e 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20  enabled and the 
303d0 70 61 67 65 20 61 74 20 69 54 61 62 6c 65 20 69  page at iTable i
303e0 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 2a  s not the last.*
303f0 2a 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74  * root page in t
30400 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30410 2c 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20  , then the last 
30420 72 6f 6f 74 20 70 61 67 65 20 0a 2a 2a 20 69 6e  root page .** in
30430 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
30440 6c 65 20 69 73 20 6d 6f 76 65 64 20 69 6e 74 6f  le is moved into
30450 20 74 68 65 20 73 6c 6f 74 20 66 6f 72 6d 65 72   the slot former
30460 6c 79 20 6f 63 63 75 70 69 65 64 20 62 79 0a 2a  ly occupied by.*
30470 2a 20 69 54 61 62 6c 65 20 61 6e 64 20 74 68 61  * iTable and tha
30480 74 20 6c 61 73 74 20 73 6c 6f 74 20 66 6f 72 6d  t last slot form
30490 65 72 6c 79 20 6f 63 63 75 70 69 65 64 20 62 79  erly occupied by
304a0 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70   the last root p
304b0 61 67 65 0a 2a 2a 20 69 73 20 61 64 64 65 64 20  age.** is added 
304c0 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  to the freelist 
304d0 69 6e 73 74 65 61 64 20 6f 66 20 69 54 61 62 6c  instead of iTabl
304e0 65 2e 20 20 49 6e 20 74 68 69 73 20 73 61 79 2c  e.  In this say,
304f0 20 61 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   all.** root pag
30500 65 73 20 61 72 65 20 6b 65 70 74 20 61 74 20 74  es are kept at t
30510 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
30520 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
30530 65 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 6e  e, which.** is n
30540 65 63 65 73 73 61 72 79 20 66 6f 72 20 41 55 54  ecessary for AUT
30550 4f 56 41 43 55 55 4d 20 74 6f 20 77 6f 72 6b 20  OVACUUM to work 
30560 72 69 67 68 74 2e 20 20 2a 70 69 4d 6f 76 65 64  right.  *piMoved
30570 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 0a   is set to the .
30580 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  ** page number t
30590 68 61 74 20 75 73 65 64 20 74 6f 20 62 65 20 74  hat used to be t
305a0 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67  he last root pag
305b0 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 62 65  e in the file be
305c0 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6d 6f 76 65  fore.** the move
305d0 2e 20 20 49 66 20 6e 6f 20 70 61 67 65 20 67 65  .  If no page ge
305e0 74 73 20 6d 6f 76 65 64 2c 20 2a 70 69 4d 6f 76  ts moved, *piMov
305f0 65 64 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a  ed is set to 0..
30600 2a 2a 20 54 68 65 20 6c 61 73 74 20 72 6f 6f 74  ** The last root
30610 20 70 61 67 65 20 69 73 20 72 65 63 6f 72 64 65   page is recorde
30620 64 20 69 6e 20 6d 65 74 61 5b 33 5d 20 61 6e 64  d in meta[3] and
30630 20 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a   the value of.**
30640 20 6d 65 74 61 5b 33 5d 20 69 73 20 75 70 64 61   meta[3] is upda
30650 74 65 64 20 62 79 20 74 68 69 73 20 70 72 6f 63  ted by this proc
30660 65 64 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  edure..*/.static
30670 20 69 6e 74 20 62 74 72 65 65 44 72 6f 70 54 61   int btreeDropTa
30680 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ble(Btree *p, in
30690 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70  t iTable, int *p
306a0 69 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72  iMoved){.  int r
306b0 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  c;.  MemPage *pP
306c0 61 67 65 20 3d 20 30 3b 0a 20 20 42 74 53 68 61  age = 0;.  BtSha
306d0 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
306e0 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  t;..  assert( sq
306f0 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
30700 75 74 65 78 28 70 29 20 29 3b 0a 20 20 69 66 28  utex(p) );.  if(
30710 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41   p->inTrans!=TRA
30720 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
30730 72 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64  return pBt->read
30740 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45  Only ? SQLITE_RE
30750 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f  ADONLY : SQLITE_
30760 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
30770 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
30780 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65 20 69  o drop a table i
30790 66 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61 72  f any cursors ar
307a0 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 20 20  e open on the.  
307b0 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 69  ** database. Thi
307c0 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20  s is because in 
307d0 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65  auto-vacuum mode
307e0 20 74 68 65 20 62 61 63 6b 65 6e 64 20 6d 61 79   the backend may
307f0 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 6d 6f  .  ** need to mo
30800 76 65 20 61 6e 6f 74 68 65 72 20 72 6f 6f 74 2d  ve another root-
30810 70 61 67 65 20 74 6f 20 66 69 6c 6c 20 61 20 67  page to fill a g
30820 61 70 20 6c 65 66 74 20 62 79 20 74 68 65 20 64  ap left by the d
30830 65 6c 65 74 65 64 0a 20 20 2a 2a 20 72 6f 6f 74  eleted.  ** root
30840 20 70 61 67 65 2e 20 49 66 20 61 6e 20 6f 70 65   page. If an ope
30850 6e 20 63 75 72 73 6f 72 20 77 61 73 20 75 73 69  n cursor was usi
30860 6e 67 20 74 68 69 73 20 70 61 67 65 20 61 20 70  ng this page a p
30870 72 6f 62 6c 65 6d 20 77 6f 75 6c 64 20 0a 20 20  roblem would .  
30880 2a 2a 20 6f 63 63 75 72 2e 0a 20 20 2a 2f 0a 20  ** occur..  */. 
30890 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72 73 6f   if( pBt->pCurso
308a0 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
308b0 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20  SQLITE_LOCKED;. 
308c0 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   }..  rc = sqlit
308d0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
308e0 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c 65  Bt, (Pgno)iTable
308f0 2c 20 26 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  , &pPage, 0);.  
30900 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
30910 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
30920 65 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c  e3BtreeClearTabl
30930 65 28 70 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20  e(p, iTable);.  
30940 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
30950 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29  leasePage(pPage)
30960 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
30970 0a 20 20 7d 0a 0a 20 20 2a 70 69 4d 6f 76 65 64  .  }..  *piMoved
30980 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69 54 61   = 0;..  if( iTa
30990 62 6c 65 3e 31 20 29 7b 0a 23 69 66 64 65 66 20  ble>1 ){.#ifdef 
309a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
309b0 56 41 43 55 55 4d 0a 20 20 20 20 72 63 20 3d 20  VACUUM.    rc = 
309c0 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b  freePage(pPage);
309d0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
309e0 28 70 50 61 67 65 29 3b 0a 23 65 6c 73 65 0a 20  (pPage);.#else. 
309f0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
30a00 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
30a10 50 67 6e 6f 20 6d 61 78 52 6f 6f 74 50 67 6e 6f  Pgno maxRootPgno
30a20 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
30a30 69 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61  ite3BtreeGetMeta
30a40 28 70 2c 20 34 2c 20 26 6d 61 78 52 6f 6f 74 50  (p, 4, &maxRootP
30a50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
30a60 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
30a70 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65  .        release
30a80 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
30a90 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
30aa0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
30ab0 66 28 20 69 54 61 62 6c 65 3d 3d 6d 61 78 52 6f  f( iTable==maxRo
30ac0 6f 74 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20  otPgno ){.      
30ad0 20 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c    /* If the tabl
30ae0 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20  e being dropped 
30af0 69 73 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  is the table wit
30b00 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f  h the largest ro
30b10 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20  ot-page.        
30b20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65  ** number in the
30b30 20 64 61 74 61 62 61 73 65 2c 20 70 75 74 20 74   database, put t
30b40 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 6e 20  he root page on 
30b50 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 20 0a  the free list. .
30b60 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
30b70 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
30b80 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
30b90 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
30ba0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ge);.        if(
30bb0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30bc0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
30bd0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
30be0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
30bf0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62        /* The tab
30c00 6c 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64  le being dropped
30c10 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
30c20 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d  he largest root-
30c30 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
30c40 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 64 61  number in the da
30c50 74 61 62 61 73 65 2e 20 53 6f 20 6d 6f 76 65 20  tabase. So move 
30c60 74 68 65 20 70 61 67 65 20 74 68 61 74 20 64 6f  the page that do
30c70 65 73 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20  es into the .   
30c80 20 20 20 20 20 2a 2a 20 67 61 70 20 6c 65 66 74       ** gap left
30c90 20 62 79 20 74 68 65 20 64 65 6c 65 74 65 64 20   by the deleted 
30ca0 72 6f 6f 74 2d 70 61 67 65 2e 0a 20 20 20 20 20  root-page..     
30cb0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4d 65     */.        Me
30cc0 6d 50 61 67 65 20 2a 70 4d 6f 76 65 3b 0a 20 20  mPage *pMove;.  
30cd0 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
30ce0 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
30cf0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
30d00 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
30d10 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d  maxRootPgno, &pM
30d20 6f 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ove, 0);.       
30d30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30d40 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
30d50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
30d60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
30d70 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70  = relocatePage(p
30d80 42 74 2c 20 70 4d 6f 76 65 2c 20 50 54 52 4d 41  Bt, pMove, PTRMA
30d90 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20 69  P_ROOTPAGE, 0, i
30da0 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  Table, 0);.     
30db0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
30dc0 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Move);.        i
30dd0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
30de0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
30df0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
30e00 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
30e10 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
30e20 61 67 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74  age(pBt, maxRoot
30e30 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29  Pgno, &pMove, 0)
30e40 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
30e50 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
30e60 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
30e70 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
30e80 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50        rc = freeP
30e90 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20  age(pMove);.    
30ea0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
30eb0 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20  pMove);.        
30ec0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
30ed0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
30ee0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
30ef0 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 69 4d    }.        *piM
30f00 6f 76 65 64 20 3d 20 6d 61 78 52 6f 6f 74 50 67  oved = maxRootPg
30f10 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  no;.      }..   
30f20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 65     /* Set the ne
30f30 77 20 27 6d 61 78 2d 72 6f 6f 74 2d 70 61 67 65  w 'max-root-page
30f40 27 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 64  ' value in the d
30f50 61 74 61 62 61 73 65 20 68 65 61 64 65 72 2e 20  atabase header. 
30f60 54 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 73  This.      ** is
30f70 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20 6c   the old value l
30f80 65 73 73 20 6f 6e 65 2c 20 6c 65 73 73 20 6f 6e  ess one, less on
30f90 65 20 6d 6f 72 65 20 69 66 20 74 68 61 74 20 68  e more if that h
30fa0 61 70 70 65 6e 73 20 74 6f 0a 20 20 20 20 20 20  appens to.      
30fb0 2a 2a 20 62 65 20 61 20 72 6f 6f 74 2d 70 61 67  ** be a root-pag
30fc0 65 20 6e 75 6d 62 65 72 2c 20 6c 65 73 73 20 6f  e number, less o
30fd0 6e 65 20 61 67 61 69 6e 20 69 66 20 74 68 61 74  ne again if that
30fe0 20 69 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   is the.      **
30ff0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41   PENDING_BYTE_PA
31000 47 45 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  GE..      */.   
31010 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d     maxRootPgno--
31020 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 61 78 52  ;.      if( maxR
31030 6f 6f 74 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47  ootPgno==PENDING
31040 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
31050 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52 6f  ){.        maxRo
31060 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20  otPgno--;.      
31070 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 61 78 52  }.      if( maxR
31080 6f 6f 74 50 67 6e 6f 3d 3d 50 54 52 4d 41 50 5f  ootPgno==PTRMAP_
31090 50 41 47 45 4e 4f 28 70 42 74 2c 20 6d 61 78 52  PAGENO(pBt, maxR
310a0 6f 6f 74 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20  ootPgno) ){.    
310b0 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d      maxRootPgno-
310c0 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  -;.      }.     
310d0 20 61 73 73 65 72 74 28 20 6d 61 78 52 6f 6f 74   assert( maxRoot
310e0 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
310f0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
31100 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
31110 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
31120 74 61 28 70 2c 20 34 2c 20 6d 61 78 52 6f 6f 74  ta(p, 4, maxRoot
31130 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Pgno);.    }else
31140 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72 65  {.      rc = fre
31150 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
31160 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
31170 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65  pPage);.    }.#e
31180 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
31190 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 42    /* If sqlite3B
311a0 74 72 65 65 44 72 6f 70 54 61 62 6c 65 20 77 61  treeDropTable wa
311b0 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 61 67 65  s called on page
311c0 20 31 2e 20 2a 2f 0a 20 20 20 20 7a 65 72 6f 50   1. */.    zeroP
311d0 61 67 65 28 70 50 61 67 65 2c 20 50 54 46 5f 49  age(pPage, PTF_I
311e0 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 20 29  NTKEY|PTF_LEAF )
311f0 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
31200 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  e(pPage);.  }.  
31210 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 69  return rc;  .}.i
31220 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  nt sqlite3BtreeD
31230 72 6f 70 54 61 62 6c 65 28 42 74 72 65 65 20 2a  ropTable(Btree *
31240 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69  p, int iTable, i
31250 6e 74 20 2a 70 69 4d 6f 76 65 64 29 7b 0a 20 20  nt *piMoved){.  
31260 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
31270 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
31280 20 20 70 2d 3e 70 42 74 2d 3e 64 62 20 3d 20 70    p->pBt->db = p
31290 2d 3e 64 62 3b 0a 20 20 72 63 20 3d 20 62 74 72  ->db;.  rc = btr
312a0 65 65 44 72 6f 70 54 61 62 6c 65 28 70 2c 20 69  eeDropTable(p, i
312b0 54 61 62 6c 65 2c 20 70 69 4d 6f 76 65 64 29 3b  Table, piMoved);
312c0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
312d0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
312e0 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
312f0 52 65 61 64 20 74 68 65 20 6d 65 74 61 2d 69 6e  Read the meta-in
31300 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 6f 66  formation out of
31310 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65   a database file
31320 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73  .  Meta[0].** is
31330 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
31340 72 65 65 20 70 61 67 65 73 20 63 75 72 72 65 6e  ree pages curren
31350 74 6c 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  tly in the datab
31360 61 73 65 2e 20 20 4d 65 74 61 5b 31 5d 0a 2a 2a  ase.  Meta[1].**
31370 20 74 68 72 6f 75 67 68 20 6d 65 74 61 5b 31 35   through meta[15
31380 5d 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  ] are available 
31390 66 6f 72 20 75 73 65 20 62 79 20 68 69 67 68 65  for use by highe
313a0 72 20 6c 61 79 65 72 73 2e 20 20 4d 65 74 61 5b  r layers.  Meta[
313b0 30 5d 0a 2a 2a 20 69 73 20 72 65 61 64 2d 6f 6e  0].** is read-on
313c0 6c 79 2c 20 74 68 65 20 6f 74 68 65 72 73 20 61  ly, the others a
313d0 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 0a 2a  re read/write..*
313e0 2a 20 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61  * .** The schema
313f0 20 6c 61 79 65 72 20 6e 75 6d 62 65 72 73 20 6d   layer numbers m
31400 65 74 61 20 76 61 6c 75 65 73 20 64 69 66 66 65  eta values diffe
31410 72 65 6e 74 6c 79 2e 20 20 41 74 20 74 68 65 20  rently.  At the 
31420 73 63 68 65 6d 61 0a 2a 2a 20 6c 61 79 65 72 20  schema.** layer 
31430 28 61 6e 64 20 74 68 65 20 53 65 74 43 6f 6f 6b  (and the SetCook
31440 69 65 20 61 6e 64 20 52 65 61 64 43 6f 6f 6b 69  ie and ReadCooki
31450 65 20 6f 70 63 6f 64 65 73 29 20 74 68 65 20 6e  e opcodes) the n
31460 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 66 72 65 65  umber of.** free
31470 20 70 61 67 65 73 20 69 73 20 6e 6f 74 20 76 69   pages is not vi
31480 73 69 62 6c 65 2e 20 20 53 6f 20 43 6f 6f 6b 69  sible.  So Cooki
31490 65 5b 30 5d 20 69 73 20 74 68 65 20 73 61 6d 65  e[0] is the same
314a0 20 61 73 20 4d 65 74 61 5b 31 5d 2e 0a 2a 2f 0a   as Meta[1]..*/.
314b0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
314c0 47 65 74 4d 65 74 61 28 42 74 72 65 65 20 2a 70  GetMeta(Btree *p
314d0 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20 2a  , int idx, u32 *
314e0 70 4d 65 74 61 29 7b 0a 20 20 44 62 50 61 67 65  pMeta){.  DbPage
314f0 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 69 6e 74   *pDbPage;.  int
31500 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20   rc;.  unsigned 
31510 63 68 61 72 20 2a 70 50 31 3b 0a 20 20 42 74 53  char *pP1;.  BtS
31520 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
31530 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  pBt;..  sqlite3B
31540 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
31550 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
31560 0a 0a 20 20 2f 2a 20 52 65 61 64 69 6e 67 20 61  ..  /* Reading a
31570 20 6d 65 74 61 2d 64 61 74 61 20 76 61 6c 75 65   meta-data value
31580 20 72 65 71 75 69 72 65 73 20 61 20 72 65 61 64   requires a read
31590 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20 31 20  -lock on page 1 
315a0 28 61 6e 64 20 68 65 6e 63 65 0a 20 20 2a 2a 20  (and hence.  ** 
315b0 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
315c0 72 20 74 61 62 6c 65 2e 20 57 65 20 67 72 61 62  r table. We grab
315d0 20 74 68 69 73 20 6c 6f 63 6b 20 72 65 67 61 72   this lock regar
315e0 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
315f0 20 6f 72 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65   or.  ** not the
31600 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f   SQLITE_ReadUnco
31610 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73 20  mmitted flag is 
31620 73 65 74 20 28 74 68 65 20 74 61 62 6c 65 20 72  set (the table r
31630 6f 6f 74 65 64 20 61 74 20 70 61 67 65 0a 20 20  ooted at page.  
31640 2a 2a 20 31 20 69 73 20 74 72 65 61 74 65 64 20  ** 1 is treated 
31650 61 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73  as a special cas
31660 65 20 62 79 20 71 75 65 72 79 54 61 62 6c 65 4c  e by queryTableL
31670 6f 63 6b 28 29 20 61 6e 64 20 6c 6f 63 6b 54 61  ock() and lockTa
31680 62 6c 65 28 29 29 2e 0a 20 20 2a 2f 0a 20 20 72  ble())..  */.  r
31690 63 20 3d 20 71 75 65 72 79 54 61 62 6c 65 4c 6f  c = queryTableLo
316a0 63 6b 28 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f  ck(p, 1, READ_LO
316b0 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  CK);.  if( rc!=S
316c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
316d0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
316e0 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
316f0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65   rc;.  }..  asse
31700 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69 64  rt( idx>=0 && id
31710 78 3c 3d 31 35 20 29 3b 0a 20 20 72 63 20 3d 20  x<=15 );.  rc = 
31720 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
31730 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 31 2c 20  pBt->pPager, 1, 
31740 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  &pDbPage);.  if(
31750 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74   rc ){.    sqlit
31760 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
31770 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
31780 20 20 7d 0a 20 20 70 50 31 20 3d 20 28 75 6e 73    }.  pP1 = (uns
31790 69 67 6e 65 64 20 63 68 61 72 20 2a 29 73 71 6c  igned char *)sql
317a0 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
317b0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 2a 70 4d  (pDbPage);.  *pM
317c0 65 74 61 20 3d 20 67 65 74 34 62 79 74 65 28 26  eta = get4byte(&
317d0 70 50 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d 29  pP1[36 + idx*4])
317e0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
317f0 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
31800 0a 20 20 2f 2a 20 49 66 20 61 75 74 6f 76 61 63  .  /* If autovac
31810 75 75 6d 65 64 20 69 73 20 64 69 73 61 62 6c 65  uumed is disable
31820 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 20  d in this build 
31830 62 75 74 20 77 65 20 61 72 65 20 74 72 79 69 6e  but we are tryin
31840 67 20 74 6f 20 0a 20 20 2a 2a 20 61 63 63 65 73  g to .  ** acces
31850 73 20 61 6e 20 61 75 74 6f 76 61 63 75 75 6d 65  s an autovacuume
31860 64 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  d database, then
31870 20 6d 61 6b 65 20 74 68 65 20 64 61 74 61 62 61   make the databa
31880 73 65 20 72 65 61 64 6f 6e 6c 79 2e 20 0a 20 20  se readonly. .  
31890 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
318a0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
318b0 0a 20 20 69 66 28 20 69 64 78 3d 3d 34 20 26 26  .  if( idx==4 &&
318c0 20 2a 70 4d 65 74 61 3e 30 20 29 20 70 42 74 2d   *pMeta>0 ) pBt-
318d0 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 23  >readOnly = 1;.#
318e0 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 72 61 62  endif..  /* Grab
318f0 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20 6f   the read-lock o
31900 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20 72  n page 1. */.  r
31910 63 20 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70 2c  c = lockTable(p,
31920 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a   1, READ_LOCK);.
31930 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
31940 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
31950 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   rc;.}../*.** Wr
31960 69 74 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61  ite meta-informa
31970 74 69 6f 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74  tion back into t
31980 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d 65  he database.  Me
31990 74 61 5b 30 5d 20 69 73 0a 2a 2a 20 72 65 61 64  ta[0] is.** read
319a0 2d 6f 6e 6c 79 20 61 6e 64 20 6d 61 79 20 6e 6f  -only and may no
319b0 74 20 62 65 20 77 72 69 74 74 65 6e 2e 0a 2a 2f  t be written..*/
319c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
319d0 65 55 70 64 61 74 65 4d 65 74 61 28 42 74 72 65  eUpdateMeta(Btre
319e0 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 75  e *p, int idx, u
319f0 33 32 20 69 4d 65 74 61 29 7b 0a 20 20 42 74 53  32 iMeta){.  BtS
31a00 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
31a10 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  pBt;.  unsigned 
31a20 63 68 61 72 20 2a 70 50 31 3b 0a 20 20 69 6e 74  char *pP1;.  int
31a30 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 69   rc;.  assert( i
31a40 64 78 3e 3d 31 20 26 26 20 69 64 78 3c 3d 31 35  dx>=1 && idx<=15
31a50 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
31a60 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42  eeEnter(p);.  pB
31a70 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  t->db = p->db;. 
31a80 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
31a90 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
31aa0 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65      rc = pBt->re
31ab0 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f  adOnly ? SQLITE_
31ac0 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54  READONLY : SQLIT
31ad0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65  E_ERROR;.  }else
31ae0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  {.    assert( pB
31af0 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 3b 0a  t->pPage1!=0 );.
31b00 20 20 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70      pP1 = pBt->p
31b10 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20  Page1->aData;.  
31b20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
31b30 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50  gerWrite(pBt->pP
31b40 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age1->pDbPage);.
31b50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
31b60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
31b70 75 74 34 62 79 74 65 28 26 70 50 31 5b 33 36 20  ut4byte(&pP1[36 
31b80 2b 20 69 64 78 2a 34 5d 2c 20 69 4d 65 74 61 29  + idx*4], iMeta)
31b90 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
31ba0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
31bb0 0a 20 20 20 20 20 20 69 66 28 20 69 64 78 3d 3d  .      if( idx==
31bc0 37 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  7 ){.        ass
31bd0 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61  ert( pBt->autoVa
31be0 63 75 75 6d 20 7c 7c 20 69 4d 65 74 61 3d 3d 30  cuum || iMeta==0
31bf0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
31c00 72 74 28 20 69 4d 65 74 61 3d 3d 30 20 7c 7c 20  rt( iMeta==0 || 
31c10 69 4d 65 74 61 3d 3d 31 20 29 3b 0a 20 20 20 20  iMeta==1 );.    
31c20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
31c30 75 75 6d 20 3d 20 69 4d 65 74 61 3b 0a 20 20 20  uum = iMeta;.   
31c40 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
31c50 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  }.  }.  sqlite3B
31c60 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
31c70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
31c80 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
31c90 6c 61 67 20 62 79 74 65 20 61 74 20 74 68 65 20  lag byte at the 
31ca0 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
31cb0 20 70 61 67 65 20 74 68 61 74 20 74 68 65 20 63   page that the c
31cc0 75 72 73 6f 72 0a 2a 2a 20 69 73 20 63 75 72 72  ursor.** is curr
31cd0 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74  ently pointing t
31ce0 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  o..*/.int sqlite
31cf0 33 42 74 72 65 65 46 6c 61 67 73 28 42 74 43 75  3BtreeFlags(BtCu
31d00 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f  rsor *pCur){.  /
31d10 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 61 62 6f  * TODO: What abo
31d20 75 74 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  ut CURSOR_REQUIR
31d30 45 53 45 45 4b 20 73 74 61 74 65 3f 20 50 72 6f  ESEEK state? Pro
31d40 62 61 62 6c 79 20 6e 65 65 64 20 74 6f 20 63 61  bably need to ca
31d50 6c 6c 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 43  ll.  ** restoreC
31d60 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20  ursorPosition() 
31d70 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 4d 65 6d  here..  */.  Mem
31d80 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 72  Page *pPage;.  r
31d90 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
31da0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 70 50  tion(pCur);.  pP
31db0 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
31dc0 65 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  e;.  assert( cur
31dd0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
31de0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
31df0 20 70 50 61 67 65 2d 3e 70 42 74 3d 3d 70 43 75   pPage->pBt==pCu
31e00 72 2d 3e 70 42 74 20 29 3b 0a 20 20 72 65 74 75  r->pBt );.  retu
31e10 72 6e 20 70 50 61 67 65 20 3f 20 70 50 61 67 65  rn pPage ? pPage
31e20 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
31e30 64 72 4f 66 66 73 65 74 5d 20 3a 20 30 3b 0a 7d  drOffset] : 0;.}
31e40 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
31e50 74 68 65 20 70 61 67 65 72 20 61 73 73 6f 63 69  the pager associ
31e60 61 74 65 64 20 77 69 74 68 20 61 20 42 54 72 65  ated with a BTre
31e70 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
31e80 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20   is used for.** 
31e90 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
31ea0 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 50  gging only..*/.P
31eb0 61 67 65 72 20 2a 73 71 6c 69 74 65 33 42 74 72  ager *sqlite3Btr
31ec0 65 65 50 61 67 65 72 28 42 74 72 65 65 20 2a 70  eePager(Btree *p
31ed0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  ){.  return p->p
31ee0 42 74 2d 3e 70 50 61 67 65 72 3b 0a 7d 0a 0a 23  Bt->pPager;.}..#
31ef0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
31f00 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
31f10 43 4b 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  CK./*.** Append 
31f20 61 20 6d 65 73 73 61 67 65 20 74 6f 20 74 68 65  a message to the
31f30 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73   error message s
31f40 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  tring..*/.static
31f50 20 76 6f 69 64 20 63 68 65 63 6b 41 70 70 65 6e   void checkAppen
31f60 64 4d 73 67 28 0a 20 20 49 6e 74 65 67 72 69 74  dMsg(.  Integrit
31f70 79 43 6b 20 2a 70 43 68 65 63 6b 2c 0a 20 20 63  yCk *pCheck,.  c
31f80 68 61 72 20 2a 7a 4d 73 67 31 2c 0a 20 20 63 6f  har *zMsg1,.  co
31f90 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
31fa0 74 2c 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 76 61  t,.  ....){.  va
31fb0 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20  _list ap;.  if( 
31fc0 21 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20 29  !pCheck->mxErr )
31fd0 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 68 65 63   return;.  pChec
31fe0 6b 2d 3e 6d 78 45 72 72 2d 2d 3b 0a 20 20 70 43  k->mxErr--;.  pC
31ff0 68 65 63 6b 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  heck->nErr++;.  
32000 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
32010 72 6d 61 74 29 3b 0a 20 20 69 66 28 20 70 43 68  rmat);.  if( pCh
32020 65 63 6b 2d 3e 65 72 72 4d 73 67 2e 6e 43 68 61  eck->errMsg.nCha
32030 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
32040 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26  StrAccumAppend(&
32050 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2c 20  pCheck->errMsg, 
32060 22 5c 6e 22 2c 20 31 29 3b 0a 20 20 7d 0a 20 20  "\n", 1);.  }.  
32070 69 66 28 20 7a 4d 73 67 31 20 29 7b 0a 20 20 20  if( zMsg1 ){.   
32080 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
32090 41 70 70 65 6e 64 28 26 70 43 68 65 63 6b 2d 3e  Append(&pCheck->
320a0 65 72 72 4d 73 67 2c 20 7a 4d 73 67 31 2c 20 2d  errMsg, zMsg1, -
320b0 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  1);.  }.  sqlite
320c0 33 56 58 50 72 69 6e 74 66 28 26 70 43 68 65 63  3VXPrintf(&pChec
320d0 6b 2d 3e 65 72 72 4d 73 67 2c 20 31 2c 20 7a 46  k->errMsg, 1, zF
320e0 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61  ormat, ap);.  va
320f0 5f 65 6e 64 28 61 70 29 3b 0a 7d 0a 23 65 6e 64  _end(ap);.}.#end
32100 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
32110 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
32120 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  K */..#ifndef SQ
32130 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
32140 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20  ITY_CHECK./*.** 
32150 41 64 64 20 31 20 74 6f 20 74 68 65 20 72 65 66  Add 1 to the ref
32160 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
32170 20 70 61 67 65 20 69 50 61 67 65 2e 20 20 49 66   page iPage.  If
32180 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63   this is the sec
32190 6f 6e 64 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  ond.** reference
321a0 20 74 6f 20 74 68 65 20 70 61 67 65 2c 20 61 64   to the page, ad
321b0 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  d an error messa
321c0 67 65 20 74 6f 20 70 43 68 65 63 6b 2d 3e 7a 45  ge to pCheck->zE
321d0 72 72 4d 73 67 2e 0a 2a 2a 20 52 65 74 75 72 6e  rrMsg..** Return
321e0 20 31 20 69 66 20 74 68 65 72 65 20 61 72 65 20   1 if there are 
321f0 32 20 6f 72 65 20 6d 6f 72 65 20 72 65 66 65 72  2 ore more refer
32200 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
32210 65 20 61 6e 64 20 30 20 69 66 0a 2a 2a 20 69 66  e and 0 if.** if
32220 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
32230 73 74 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  st reference to 
32240 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
32250 41 6c 73 6f 20 63 68 65 63 6b 20 74 68 61 74 20  Also check that 
32260 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
32270 69 73 20 69 6e 20 62 6f 75 6e 64 73 2e 0a 2a 2f  is in bounds..*/
32280 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63  .static int chec
32290 6b 52 65 66 28 49 6e 74 65 67 72 69 74 79 43 6b  kRef(IntegrityCk
322a0 20 2a 70 43 68 65 63 6b 2c 20 69 6e 74 20 69 50   *pCheck, int iP
322b0 61 67 65 2c 20 63 68 61 72 20 2a 7a 43 6f 6e 74  age, char *zCont
322c0 65 78 74 29 7b 0a 20 20 69 66 28 20 69 50 61 67  ext){.  if( iPag
322d0 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  e==0 ) return 1;
322e0 0a 20 20 69 66 28 20 69 50 61 67 65 3e 70 43 68  .  if( iPage>pCh
322f0 65 63 6b 2d 3e 6e 50 61 67 65 20 7c 7c 20 69 50  eck->nPage || iP
32300 61 67 65 3c 30 20 29 7b 0a 20 20 20 20 63 68 65  age<0 ){.    che
32310 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
32320 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 69  ck, zContext, "i
32330 6e 76 61 6c 69 64 20 70 61 67 65 20 6e 75 6d 62  nvalid page numb
32340 65 72 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a  er %d", iPage);.
32350 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
32360 7d 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e  }.  if( pCheck->
32370 61 6e 52 65 66 5b 69 50 61 67 65 5d 3d 3d 31 20  anRef[iPage]==1 
32380 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65  ){.    checkAppe
32390 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
323a0 6f 6e 74 65 78 74 2c 20 22 32 6e 64 20 72 65 66  ontext, "2nd ref
323b0 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 25  erence to page %
323c0 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  d", iPage);.    
323d0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
323e0 72 65 74 75 72 6e 20 20 28 70 43 68 65 63 6b 2d  return  (pCheck-
323f0 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d 2b 2b 29  >anRef[iPage]++)
32400 3e 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  >1;.}..#ifndef S
32410 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
32420 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ACUUM./*.** Chec
32430 6b 20 74 68 61 74 20 74 68 65 20 65 6e 74 72 79  k that the entry
32440 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   in the pointer-
32450 6d 61 70 20 66 6f 72 20 70 61 67 65 20 69 43 68  map for page iCh
32460 69 6c 64 20 6d 61 70 73 20 74 6f 20 0a 2a 2a 20  ild maps to .** 
32470 70 61 67 65 20 69 50 61 72 65 6e 74 2c 20 70 6f  page iParent, po
32480 69 6e 74 65 72 20 74 79 70 65 20 70 74 72 54 79  inter type ptrTy
32490 70 65 2e 20 49 66 20 6e 6f 74 2c 20 61 70 70 65  pe. If not, appe
324a0 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  nd an error mess
324b0 61 67 65 0a 2a 2a 20 74 6f 20 70 43 68 65 63 6b  age.** to pCheck
324c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
324d0 20 63 68 65 63 6b 50 74 72 6d 61 70 28 0a 20 20   checkPtrmap(.  
324e0 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68  IntegrityCk *pCh
324f0 65 63 6b 2c 20 20 20 2f 2a 20 49 6e 74 65 67 72  eck,   /* Integr
32500 69 74 79 20 63 68 65 63 6b 20 63 6f 6e 74 65 78  ity check contex
32510 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69  t */.  Pgno iChi
32520 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ld,           /*
32530 20 43 68 69 6c 64 20 70 61 67 65 20 6e 75 6d 62   Child page numb
32540 65 72 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65  er */.  u8 eType
32550 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
32560 2a 20 45 78 70 65 63 74 65 64 20 70 6f 69 6e 74  * Expected point
32570 65 72 20 6d 61 70 20 74 79 70 65 20 2a 2f 0a 20  er map type */. 
32580 20 50 67 6e 6f 20 69 50 61 72 65 6e 74 2c 20 20   Pgno iParent,  
32590 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63          /* Expec
325a0 74 65 64 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  ted pointer map 
325b0 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
325c0 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43  er */.  char *zC
325d0 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20 20 2f  ontext         /
325e0 2a 20 43 6f 6e 74 65 78 74 20 64 65 73 63 72 69  * Context descri
325f0 70 74 69 6f 6e 20 28 75 73 65 64 20 66 6f 72 20  ption (used for 
32600 65 72 72 6f 72 20 6d 73 67 29 20 2a 2f 0a 29 7b  error msg) */.){
32610 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 38 20  .  int rc;.  u8 
32620 65 50 74 72 6d 61 70 54 79 70 65 3b 0a 20 20 50  ePtrmapType;.  P
32630 67 6e 6f 20 69 50 74 72 6d 61 70 50 61 72 65 6e  gno iPtrmapParen
32640 74 3b 0a 0a 20 20 72 63 20 3d 20 70 74 72 6d 61  t;..  rc = ptrma
32650 70 47 65 74 28 70 43 68 65 63 6b 2d 3e 70 42 74  pGet(pCheck->pBt
32660 2c 20 69 43 68 69 6c 64 2c 20 26 65 50 74 72 6d  , iChild, &ePtrm
32670 61 70 54 79 70 65 2c 20 26 69 50 74 72 6d 61 70  apType, &iPtrmap
32680 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72  Parent);.  if( r
32690 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
326a0 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
326b0 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
326c0 65 78 74 2c 20 22 46 61 69 6c 65 64 20 74 6f 20  ext, "Failed to 
326d0 72 65 61 64 20 70 74 72 6d 61 70 20 6b 65 79 3d  read ptrmap key=
326e0 25 64 22 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20  %d", iChild);.  
326f0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
32700 20 69 66 28 20 65 50 74 72 6d 61 70 54 79 70 65   if( ePtrmapType
32710 21 3d 65 54 79 70 65 20 7c 7c 20 69 50 74 72 6d  !=eType || iPtrm
32720 61 70 50 61 72 65 6e 74 21 3d 69 50 61 72 65 6e  apParent!=iParen
32730 74 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70  t ){.    checkAp
32740 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
32750 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20  zContext, .     
32760 20 22 42 61 64 20 70 74 72 20 6d 61 70 20 65 6e   "Bad ptr map en
32770 74 72 79 20 6b 65 79 3d 25 64 20 65 78 70 65 63  try key=%d expec
32780 74 65 64 3d 28 25 64 2c 25 64 29 20 67 6f 74 3d  ted=(%d,%d) got=
32790 28 25 64 2c 25 64 29 22 2c 20 0a 20 20 20 20 20  (%d,%d)", .     
327a0 20 69 43 68 69 6c 64 2c 20 65 54 79 70 65 2c 20   iChild, eType, 
327b0 69 50 61 72 65 6e 74 2c 20 65 50 74 72 6d 61 70  iParent, ePtrmap
327c0 54 79 70 65 2c 20 69 50 74 72 6d 61 70 50 61 72  Type, iPtrmapPar
327d0 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  ent);.  }.}.#end
327e0 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  if../*.** Check 
327f0 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  the integrity of
32800 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 6f 72   the freelist or
32810 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   of an overflow 
32820 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2a 20 56 65  page list..** Ve
32830 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e 75  rify that the nu
32840 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
32850 20 74 68 65 20 6c 69 73 74 20 69 73 20 4e 2e 0a   the list is N..
32860 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
32870 68 65 63 6b 4c 69 73 74 28 0a 20 20 49 6e 74 65  heckList(.  Inte
32880 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c  grityCk *pCheck,
32890 20 20 2f 2a 20 49 6e 74 65 67 72 69 74 79 20 63    /* Integrity c
328a0 68 65 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  hecking context 
328b0 2a 2f 0a 20 20 69 6e 74 20 69 73 46 72 65 65 4c  */.  int isFreeL
328c0 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 72  ist,       /* Tr
328d0 75 65 20 66 6f 72 20 61 20 66 72 65 65 6c 69 73  ue for a freelis
328e0 74 2e 20 20 46 61 6c 73 65 20 66 6f 72 20 6f 76  t.  False for ov
328f0 65 72 66 6c 6f 77 20 70 61 67 65 20 6c 69 73 74  erflow page list
32900 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67 65 2c   */.  int iPage,
32910 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
32920 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 66  age number for f
32930 69 72 73 74 20 70 61 67 65 20 69 6e 20 74 68 65  irst page in the
32940 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 4e   list */.  int N
32950 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32960 20 2f 2a 20 45 78 70 65 63 74 65 64 20 6e 75 6d   /* Expected num
32970 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
32980 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 63 68  the list */.  ch
32990 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20 20  ar *zContext    
329a0 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66      /* Context f
329b0 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  or error message
329c0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
329d0 0a 20 20 69 6e 74 20 65 78 70 65 63 74 65 64 20  .  int expected 
329e0 3d 20 4e 3b 0a 20 20 69 6e 74 20 69 46 69 72 73  = N;.  int iFirs
329f0 74 20 3d 20 69 50 61 67 65 3b 0a 20 20 77 68 69  t = iPage;.  whi
32a00 6c 65 28 20 4e 2d 2d 20 3e 20 30 20 26 26 20 70  le( N-- > 0 && p
32a10 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20 29 7b 0a  Check->mxErr ){.
32a20 20 20 20 20 44 62 50 61 67 65 20 2a 70 4f 76 66      DbPage *pOvf
32a30 6c 50 61 67 65 3b 0a 20 20 20 20 75 6e 73 69 67  lPage;.    unsig
32a40 6e 65 64 20 63 68 61 72 20 2a 70 4f 76 66 6c 44  ned char *pOvflD
32a50 61 74 61 3b 0a 20 20 20 20 69 66 28 20 69 50 61  ata;.    if( iPa
32a60 67 65 3c 31 20 29 7b 0a 20 20 20 20 20 20 63 68  ge<1 ){.      ch
32a70 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
32a80 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20  eck, zContext,. 
32a90 20 20 20 20 20 20 20 20 22 25 64 20 6f 66 20 25          "%d of %
32aa0 64 20 70 61 67 65 73 20 6d 69 73 73 69 6e 67 20  d pages missing 
32ab0 66 72 6f 6d 20 6f 76 65 72 66 6c 6f 77 20 6c 69  from overflow li
32ac0 73 74 20 73 74 61 72 74 69 6e 67 20 61 74 20 25  st starting at %
32ad0 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 2b  d",.          N+
32ae0 31 2c 20 65 78 70 65 63 74 65 64 2c 20 69 46 69  1, expected, iFi
32af0 72 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rst);.      brea
32b00 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
32b10 20 63 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b   checkRef(pCheck
32b20 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78  , iPage, zContex
32b30 74 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  t) ) break;.    
32b40 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
32b50 47 65 74 28 70 43 68 65 63 6b 2d 3e 70 50 61 67  Get(pCheck->pPag
32b60 65 72 2c 20 28 50 67 6e 6f 29 69 50 61 67 65 2c  er, (Pgno)iPage,
32b70 20 26 70 4f 76 66 6c 50 61 67 65 29 20 29 7b 0a   &pOvflPage) ){.
32b80 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
32b90 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
32ba0 6e 74 65 78 74 2c 20 22 66 61 69 6c 65 64 20 74  ntext, "failed t
32bb0 6f 20 67 65 74 20 70 61 67 65 20 25 64 22 2c 20  o get page %d", 
32bc0 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 62 72  iPage);.      br
32bd0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  eak;.    }.    p
32be0 4f 76 66 6c 44 61 74 61 20 3d 20 28 75 6e 73 69  OvflData = (unsi
32bf0 67 6e 65 64 20 63 68 61 72 20 2a 29 73 71 6c 69  gned char *)sqli
32c00 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
32c10 70 4f 76 66 6c 50 61 67 65 29 3b 0a 20 20 20 20  pOvflPage);.    
32c20 69 66 28 20 69 73 46 72 65 65 4c 69 73 74 20 29  if( isFreeList )
32c30 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  {.      int n = 
32c40 67 65 74 34 62 79 74 65 28 26 70 4f 76 66 6c 44  get4byte(&pOvflD
32c50 61 74 61 5b 34 5d 29 3b 0a 23 69 66 6e 64 65 66  ata[4]);.#ifndef
32c60 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
32c70 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66  OVACUUM.      if
32c80 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61  ( pCheck->pBt->a
32c90 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
32ca0 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70       checkPtrmap
32cb0 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20  (pCheck, iPage, 
32cc0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c  PTRMAP_FREEPAGE,
32cd0 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20   0, zContext);. 
32ce0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
32cf0 20 20 20 20 69 66 28 20 6e 3e 70 43 68 65 63 6b      if( n>pCheck
32d00 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
32d10 65 2f 34 2d 32 20 29 7b 0a 20 20 20 20 20 20 20  e/4-2 ){.       
32d20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
32d30 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
32d40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 22 66 72  ,.           "fr
32d50 65 65 6c 69 73 74 20 6c 65 61 66 20 63 6f 75 6e  eelist leaf coun
32d60 74 20 74 6f 6f 20 62 69 67 20 6f 6e 20 70 61 67  t too big on pag
32d70 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20  e %d", iPage);. 
32d80 20 20 20 20 20 20 20 4e 2d 2d 3b 0a 20 20 20 20         N--;.    
32d90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
32da0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
32db0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  ++){.          P
32dc0 67 6e 6f 20 69 46 72 65 65 50 61 67 65 20 3d 20  gno iFreePage = 
32dd0 67 65 74 34 62 79 74 65 28 26 70 4f 76 66 6c 44  get4byte(&pOvflD
32de0 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 23 69 66  ata[8+i*4]);.#if
32df0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
32e00 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
32e10 20 20 20 20 20 20 69 66 28 20 70 43 68 65 63 6b        if( pCheck
32e20 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
32e30 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  m ){.           
32e40 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68   checkPtrmap(pCh
32e50 65 63 6b 2c 20 69 46 72 65 65 50 61 67 65 2c 20  eck, iFreePage, 
32e60 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c  PTRMAP_FREEPAGE,
32e70 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20   0, zContext);. 
32e80 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69           }.#endi
32e90 66 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63  f.          chec
32ea0 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69 46 72  kRef(pCheck, iFr
32eb0 65 65 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74  eePage, zContext
32ec0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
32ed0 20 20 20 20 20 4e 20 2d 3d 20 6e 3b 0a 20 20 20       N -= n;.   
32ee0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64     }.    }.#ifnd
32ef0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
32f00 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 65 6c  UTOVACUUM.    el
32f10 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  se{.      /* If 
32f20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 73 75  this database su
32f30 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
32f40 75 6d 20 61 6e 64 20 69 50 61 67 65 20 69 73 20  um and iPage is 
32f50 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 20 20 20  not the last.   
32f60 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
32f70 69 73 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  is overflow list
32f80 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  , check that the
32f90 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
32fa0 72 79 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20  ry for.      ** 
32fb0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61  the following pa
32fc0 67 65 20 6d 61 74 63 68 65 73 20 69 50 61 67 65  ge matches iPage
32fd0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
32fe0 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74   if( pCheck->pBt
32ff0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
33000 4e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  N>0 ){.        i
33010 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f 76 66   = get4byte(pOvf
33020 6c 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  lData);.        
33030 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65  checkPtrmap(pChe
33040 63 6b 2c 20 69 2c 20 50 54 52 4d 41 50 5f 4f 56  ck, i, PTRMAP_OV
33050 45 52 46 4c 4f 57 32 2c 20 69 50 61 67 65 2c 20  ERFLOW2, iPage, 
33060 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  zContext);.     
33070 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
33080 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34      iPage = get4
33090 62 79 74 65 28 70 4f 76 66 6c 44 61 74 61 29 3b  byte(pOvflData);
330a0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
330b0 72 55 6e 72 65 66 28 70 4f 76 66 6c 50 61 67 65  rUnref(pOvflPage
330c0 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
330d0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  /* SQLITE_OMIT_I
330e0 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a  NTEGRITY_CHECK *
330f0 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
33100 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
33110 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 44 6f 20  _CHECK./*.** Do 
33120 76 61 72 69 6f 75 73 20 73 61 6e 69 74 79 20 63  various sanity c
33130 68 65 63 6b 73 20 6f 6e 20 61 20 73 69 6e 67 6c  hecks on a singl
33140 65 20 70 61 67 65 20 6f 66 20 61 20 74 72 65 65  e page of a tree
33150 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65  .  Return.** the
33160 20 74 72 65 65 20 64 65 70 74 68 2e 20 20 52 6f   tree depth.  Ro
33170 6f 74 20 70 61 67 65 73 20 72 65 74 75 72 6e 20  ot pages return 
33180 30 2e 20 20 50 61 72 65 6e 74 73 20 6f 66 20 72  0.  Parents of r
33190 6f 6f 74 20 70 61 67 65 73 0a 2a 2a 20 72 65 74  oot pages.** ret
331a0 75 72 6e 20 31 2c 20 61 6e 64 20 73 6f 20 66 6f  urn 1, and so fo
331b0 72 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 73  rth..** .** Thes
331c0 65 20 63 68 65 63 6b 73 20 61 72 65 20 64 6f 6e  e checks are don
331d0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 31 2e  e:.**.**      1.
331e0 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 61 74    Make sure that
331f0 20 63 65 6c 6c 73 20 61 6e 64 20 66 72 65 65 62   cells and freeb
33200 6c 6f 63 6b 73 20 64 6f 20 6e 6f 74 20 6f 76 65  locks do not ove
33210 72 6c 61 70 0a 2a 2a 20 20 20 20 20 20 20 20 20  rlap.**         
33220 20 62 75 74 20 63 6f 6d 62 69 6e 65 20 74 6f 20   but combine to 
33230 63 6f 6d 70 6c 65 74 65 6c 79 20 63 6f 76 65 72  completely cover
33240 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 20 4e   the page..**  N
33250 4f 20 20 32 2e 20 20 4d 61 6b 65 20 73 75 72 65  O  2.  Make sure
33260 20 63 65 6c 6c 20 6b 65 79 73 20 61 72 65 20 69   cell keys are i
33270 6e 20 6f 72 64 65 72 2e 0a 2a 2a 20 20 4e 4f 20  n order..**  NO 
33280 20 33 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 6e   3.  Make sure n
33290 6f 20 6b 65 79 20 69 73 20 6c 65 73 73 20 74 68  o key is less th
332a0 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
332b0 4c 6f 77 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20  LowerBound..**  
332c0 4e 4f 20 20 34 2e 20 20 4d 61 6b 65 20 73 75 72  NO  4.  Make sur
332d0 65 20 6e 6f 20 6b 65 79 20 69 73 20 67 72 65 61  e no key is grea
332e0 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
332f0 6c 20 74 6f 20 7a 55 70 70 65 72 42 6f 75 6e 64  l to zUpperBound
33300 2e 0a 2a 2a 20 20 20 20 20 20 35 2e 20 20 43 68  ..**      5.  Ch
33310 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74  eck the integrit
33320 79 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61  y of overflow pa
33330 67 65 73 2e 0a 2a 2a 20 20 20 20 20 20 36 2e 20  ges..**      6. 
33340 20 52 65 63 75 72 73 69 76 65 6c 79 20 63 61 6c   Recursively cal
33350 6c 20 63 68 65 63 6b 54 72 65 65 50 61 67 65 20  l checkTreePage 
33360 6f 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 2e  on all children.
33370 0a 2a 2a 20 20 20 20 20 20 37 2e 20 20 56 65 72  .**      7.  Ver
33380 69 66 79 20 74 68 61 74 20 74 68 65 20 64 65 70  ify that the dep
33390 74 68 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 72  th of all childr
333a0 65 6e 20 69 73 20 74 68 65 20 73 61 6d 65 2e 0a  en is the same..
333b0 2a 2a 20 20 20 20 20 20 38 2e 20 20 4d 61 6b 65  **      8.  Make
333c0 20 73 75 72 65 20 74 68 69 73 20 70 61 67 65 20   sure this page 
333d0 69 73 20 61 74 20 6c 65 61 73 74 20 33 33 25 20  is at least 33% 
333e0 66 75 6c 6c 20 6f 72 20 65 6c 73 65 20 69 74 20  full or else it 
333f0 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74  is.**          t
33400 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  he root of the t
33410 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ree..*/.static i
33420 6e 74 20 63 68 65 63 6b 54 72 65 65 50 61 67 65  nt checkTreePage
33430 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20  (.  IntegrityCk 
33440 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20 43 6f 6e  *pCheck,  /* Con
33450 74 65 78 74 20 66 6f 72 20 74 68 65 20 73 61 6e  text for the san
33460 69 74 79 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69  ity check */.  i
33470 6e 74 20 69 50 61 67 65 2c 20 20 20 20 20 20 20  nt iPage,       
33480 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
33490 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
334a0 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 4d 65  to check */.  Me
334b0 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
334c0 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61      /* Parent pa
334d0 67 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50  ge */.  char *zP
334e0 61 72 65 6e 74 43 6f 6e 74 65 78 74 20 20 2f 2a  arentContext  /*
334f0 20 50 61 72 65 6e 74 20 63 6f 6e 74 65 78 74 20   Parent context 
33500 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  */.){.  MemPage 
33510 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 69 2c  *pPage;.  int i,
33520 20 72 63 2c 20 64 65 70 74 68 2c 20 64 32 2c 20   rc, depth, d2, 
33530 70 67 6e 6f 2c 20 63 6e 74 3b 0a 20 20 69 6e 74  pgno, cnt;.  int
33540 20 68 64 72 2c 20 63 65 6c 6c 53 74 61 72 74 3b   hdr, cellStart;
33550 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20  .  int nCell;.  
33560 75 38 20 2a 64 61 74 61 3b 0a 20 20 42 74 53 68  u8 *data;.  BtSh
33570 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 69 6e 74  ared *pBt;.  int
33580 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63   usableSize;.  c
33590 68 61 72 20 7a 43 6f 6e 74 65 78 74 5b 31 30 30  har zContext[100
335a0 5d 3b 0a 20 20 63 68 61 72 20 2a 68 69 74 3b 0a  ];.  char *hit;.
335b0 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
335c0 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74  ntf(sizeof(zCont
335d0 65 78 74 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  ext), zContext, 
335e0 22 50 61 67 65 20 25 64 3a 20 22 2c 20 69 50 61  "Page %d: ", iPa
335f0 67 65 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ge);..  /* Check
33600 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 65   that the page e
33610 78 69 73 74 73 0a 20 20 2a 2f 0a 20 20 70 42 74  xists.  */.  pBt
33620 20 3d 20 70 43 68 65 63 6b 2d 3e 70 42 74 3b 0a   = pCheck->pBt;.
33630 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
33640 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
33650 20 20 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29    if( iPage==0 )
33660 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
33670 20 63 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b   checkRef(pCheck
33680 2c 20 69 50 61 67 65 2c 20 7a 50 61 72 65 6e 74  , iPage, zParent
33690 43 6f 6e 74 65 78 74 29 20 29 20 72 65 74 75 72  Context) ) retur
336a0 6e 20 30 3b 0a 20 20 69 66 28 20 28 72 63 20 3d  n 0;.  if( (rc =
336b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
336c0 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29  Page(pBt, (Pgno)
336d0 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
336e0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 63 68 65  ))!=0 ){.    che
336f0 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
33700 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20  ck, zContext,.  
33710 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20       "unable to 
33720 67 65 74 20 74 68 65 20 70 61 67 65 2e 20 65 72  get the page. er
33730 72 6f 72 20 63 6f 64 65 3d 25 64 22 2c 20 72 63  ror code=%d", rc
33740 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
33750 0a 20 20 7d 0a 20 20 69 66 28 20 28 72 63 20 3d  .  }.  if( (rc =
33760 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
33770 74 50 61 67 65 28 70 50 61 67 65 2c 20 70 50 61  tPage(pPage, pPa
33780 72 65 6e 74 29 29 21 3d 30 20 29 7b 0a 20 20 20  rent))!=0 ){.   
33790 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
337a0 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
337b0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
337c0 20 20 20 20 20 20 22 73 71 6c 69 74 65 33 42 74        "sqlite3Bt
337d0 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 72 65  reeInitPage() re
337e0 74 75 72 6e 73 20 65 72 72 6f 72 20 63 6f 64 65  turns error code
337f0 20 25 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 72   %d", rc);.    r
33800 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
33810 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
33820 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
33830 20 6f 75 74 20 61 6c 6c 20 74 68 65 20 63 65 6c   out all the cel
33840 6c 73 2e 0a 20 20 2a 2f 0a 20 20 64 65 70 74 68  ls..  */.  depth
33850 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
33860 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20   i<pPage->nCell 
33870 26 26 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72  && pCheck->mxErr
33880 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
33890 70 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 73  pCell;.    int s
338a0 7a 3b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  z;.    CellInfo 
338b0 69 6e 66 6f 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  info;..    /* Ch
338c0 65 63 6b 20 70 61 79 6c 6f 61 64 20 6f 76 65 72  eck payload over
338d0 66 6c 6f 77 20 70 61 67 65 73 0a 20 20 20 20 2a  flow pages.    *
338e0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  /.    sqlite3_sn
338f0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43  printf(sizeof(zC
33900 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65 78  ontext), zContex
33910 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
33920 22 4f 6e 20 74 72 65 65 20 70 61 67 65 20 25 64  "On tree page %d
33930 20 63 65 6c 6c 20 25 64 3a 20 22 2c 20 69 50 61   cell %d: ", iPa
33940 67 65 2c 20 69 29 3b 0a 20 20 20 20 70 43 65 6c  ge, i);.    pCel
33950 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
33960 67 65 2c 69 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge,i);.    sqlit
33970 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
33980 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
33990 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 73 7a  , &info);.    sz
339a0 20 3d 20 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20   = info.nData;. 
339b0 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69     if( !pPage->i
339c0 6e 74 4b 65 79 20 29 20 73 7a 20 2b 3d 20 69 6e  ntKey ) sz += in
339d0 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 61 73 73  fo.nKey;.    ass
339e0 65 72 74 28 20 73 7a 3d 3d 69 6e 66 6f 2e 6e 50  ert( sz==info.nP
339f0 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 69 66  ayload );.    if
33a00 28 20 73 7a 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  ( sz>info.nLocal
33a10 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50   ){.      int nP
33a20 61 67 65 20 3d 20 28 73 7a 20 2d 20 69 6e 66 6f  age = (sz - info
33a30 2e 6e 4c 6f 63 61 6c 20 2b 20 75 73 61 62 6c 65  .nLocal + usable
33a40 53 69 7a 65 20 2d 20 35 29 2f 28 75 73 61 62 6c  Size - 5)/(usabl
33a50 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20  eSize - 4);.    
33a60 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20    Pgno pgnoOvfl 
33a70 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
33a80 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
33a90 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ]);.#ifndef SQLI
33aa0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
33ab0 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  UM.      if( pBt
33ac0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
33ad0 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72          checkPtr
33ae0 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f  map(pCheck, pgno
33af0 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  Ovfl, PTRMAP_OVE
33b00 52 46 4c 4f 57 31 2c 20 69 50 61 67 65 2c 20 7a  RFLOW1, iPage, z
33b10 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  Context);.      
33b20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63  }.#endif.      c
33b30 68 65 63 6b 4c 69 73 74 28 70 43 68 65 63 6b 2c  heckList(pCheck,
33b40 20 30 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 6e 50   0, pgnoOvfl, nP
33b50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  age, zContext);.
33b60 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68      }..    /* Ch
33b70 65 63 6b 20 73 61 6e 69 74 79 20 6f 66 20 6c 65  eck sanity of le
33b80 66 74 20 63 68 69 6c 64 20 70 61 67 65 2e 0a 20  ft child page.. 
33b90 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70     */.    if( !p
33ba0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
33bb0 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
33bc0 79 74 65 28 70 43 65 6c 6c 29 3b 0a 23 69 66 6e  yte(pCell);.#ifn
33bd0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
33be0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
33bf0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
33c00 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
33c10 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65  checkPtrmap(pChe
33c20 63 6b 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50  ck, pgno, PTRMAP
33c30 5f 42 54 52 45 45 2c 20 69 50 61 67 65 2c 20 7a  _BTREE, iPage, z
33c40 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  Context);.      
33c50 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 64  }.#endif.      d
33c60 32 20 3d 20 63 68 65 63 6b 54 72 65 65 50 61 67  2 = checkTreePag
33c70 65 28 70 43 68 65 63 6b 2c 70 67 6e 6f 2c 70 50  e(pCheck,pgno,pP
33c80 61 67 65 2c 7a 43 6f 6e 74 65 78 74 29 3b 0a 20  age,zContext);. 
33c90 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20       if( i>0 && 
33ca0 64 32 21 3d 64 65 70 74 68 20 29 7b 0a 20 20 20  d2!=depth ){.   
33cb0 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
33cc0 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
33cd0 74 65 78 74 2c 20 22 43 68 69 6c 64 20 70 61 67  text, "Child pag
33ce0 65 20 64 65 70 74 68 20 64 69 66 66 65 72 73 22  e depth differs"
33cf0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
33d00 20 64 65 70 74 68 20 3d 20 64 32 3b 0a 20 20 20   depth = d2;.   
33d10 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50   }.  }.  if( !pP
33d20 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
33d30 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
33d40 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
33d50 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
33d60 38 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  8]);.    sqlite3
33d70 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
33d80 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e  (zContext), zCon
33d90 74 65 78 74 2c 20 0a 20 20 20 20 20 20 20 20 20  text, .         
33da0 20 20 20 20 20 20 20 20 20 20 20 20 22 4f 6e 20              "On 
33db0 70 61 67 65 20 25 64 20 61 74 20 72 69 67 68 74  page %d at right
33dc0 20 63 68 69 6c 64 3a 20 22 2c 20 69 50 61 67 65   child: ", iPage
33dd0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
33de0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
33df0 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
33e00 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
33e10 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70     checkPtrmap(p
33e20 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54 52  Check, pgno, PTR
33e30 4d 41 50 5f 42 54 52 45 45 2c 20 69 50 61 67 65  MAP_BTREE, iPage
33e40 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  , 0);.    }.#end
33e50 69 66 0a 20 20 20 20 63 68 65 63 6b 54 72 65 65  if.    checkTree
33e60 50 61 67 65 28 70 43 68 65 63 6b 2c 20 70 67 6e  Page(pCheck, pgn
33e70 6f 2c 20 70 50 61 67 65 2c 20 7a 43 6f 6e 74 65  o, pPage, zConte
33e80 78 74 29 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20  xt);.  }. .  /* 
33e90 43 68 65 63 6b 20 66 6f 72 20 63 6f 6d 70 6c 65  Check for comple
33ea0 74 65 20 63 6f 76 65 72 61 67 65 20 6f 66 20 74  te coverage of t
33eb0 68 65 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 64  he page.  */.  d
33ec0 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
33ed0 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  ta;.  hdr = pPag
33ee0 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
33ef0 68 69 74 20 3d 20 73 71 6c 69 74 65 33 50 61 67  hit = sqlite3Pag
33f00 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61  eMalloc( pBt->pa
33f10 67 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20  geSize );.  if( 
33f20 68 69 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  hit ){.    memse
33f30 74 28 68 69 74 2c 20 30 2c 20 75 73 61 62 6c 65  t(hit, 0, usable
33f40 53 69 7a 65 20 29 3b 0a 20 20 20 20 6d 65 6d 73  Size );.    mems
33f50 65 74 28 68 69 74 2c 20 31 2c 20 67 65 74 32 62  et(hit, 1, get2b
33f60 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
33f70 29 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20  ));.    nCell = 
33f80 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
33f90 64 72 2b 33 5d 29 3b 0a 20 20 20 20 63 65 6c 6c  dr+3]);.    cell
33fa0 53 74 61 72 74 20 3d 20 68 64 72 20 2b 20 31 32  Start = hdr + 12
33fb0 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   - 4*pPage->leaf
33fc0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
33fd0 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
33fe0 20 20 20 20 69 6e 74 20 70 63 20 3d 20 67 65 74      int pc = get
33ff0 32 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c  2byte(&data[cell
34000 53 74 61 72 74 2b 69 2a 32 5d 29 3b 0a 20 20 20  Start+i*2]);.   
34010 20 20 20 75 31 36 20 73 69 7a 65 20 3d 20 63 65     u16 size = ce
34020 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
34030 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20   &data[pc]);.   
34040 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
34050 69 66 28 20 28 70 63 2b 73 69 7a 65 2d 31 29 3e  if( (pc+size-1)>
34060 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 70  =usableSize || p
34070 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  c<0 ){.        c
34080 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
34090 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20  heck, 0, .      
340a0 20 20 20 20 20 20 22 43 6f 72 72 75 70 74 69 6f        "Corruptio
340b0 6e 20 64 65 74 65 63 74 65 64 20 69 6e 20 63 65  n detected in ce
340c0 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65 20 25 64  ll %d on page %d
340d0 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b 0a 20 20  ",i,iPage,0);.  
340e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
340f0 20 20 20 66 6f 72 28 6a 3d 70 63 2b 73 69 7a 65     for(j=pc+size
34100 2d 31 3b 20 6a 3e 3d 70 63 3b 20 6a 2d 2d 29 20  -1; j>=pc; j--) 
34110 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20  hit[j]++;.      
34120 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  }.    }.    for(
34130 63 6e 74 3d 30 2c 20 69 3d 67 65 74 32 62 79 74  cnt=0, i=get2byt
34140 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b  e(&data[hdr+1]);
34150 20 69 3e 30 20 26 26 20 69 3c 75 73 61 62 6c 65   i>0 && i<usable
34160 53 69 7a 65 20 26 26 20 63 6e 74 3c 31 30 30 30  Size && cnt<1000
34170 30 3b 20 0a 20 20 20 20 20 20 20 20 20 20 20 63  0; .           c
34180 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74  nt++){.      int
34190 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65   size = get2byte
341a0 28 26 64 61 74 61 5b 69 2b 32 5d 29 3b 0a 20 20  (&data[i+2]);.  
341b0 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
341c0 20 69 66 28 20 28 69 2b 73 69 7a 65 2d 31 29 3e   if( (i+size-1)>
341d0 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 69  =usableSize || i
341e0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  <0 ){.        ch
341f0 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
34200 65 63 6b 2c 20 30 2c 20 20 0a 20 20 20 20 20 20  eck, 0,  .      
34210 20 20 20 20 20 20 22 43 6f 72 72 75 70 74 69 6f        "Corruptio
34220 6e 20 64 65 74 65 63 74 65 64 20 69 6e 20 63 65  n detected in ce
34230 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65 20 25 64  ll %d on page %d
34240 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b 0a 20 20  ",i,iPage,0);.  
34250 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34260 20 20 20 66 6f 72 28 6a 3d 69 2b 73 69 7a 65 2d     for(j=i+size-
34270 31 3b 20 6a 3e 3d 69 3b 20 6a 2d 2d 29 20 68 69  1; j>=i; j--) hi
34280 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  t[j]++;.      }.
34290 20 20 20 20 20 20 69 20 3d 20 67 65 74 32 62 79        i = get2by
342a0 74 65 28 26 64 61 74 61 5b 69 5d 29 3b 0a 20 20  te(&data[i]);.  
342b0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 63 6e    }.    for(i=cn
342c0 74 3d 30 3b 20 69 3c 75 73 61 62 6c 65 53 69 7a  t=0; i<usableSiz
342d0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  e; i++){.      i
342e0 66 28 20 68 69 74 5b 69 5d 3d 3d 30 20 29 7b 0a  f( hit[i]==0 ){.
342f0 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20          cnt++;. 
34300 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68       }else if( h
34310 69 74 5b 69 5d 3e 31 20 29 7b 0a 20 20 20 20 20  it[i]>1 ){.     
34320 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
34330 67 28 70 43 68 65 63 6b 2c 20 30 2c 0a 20 20 20  g(pCheck, 0,.   
34340 20 20 20 20 20 20 20 22 4d 75 6c 74 69 70 6c 65         "Multiple
34350 20 75 73 65 73 20 66 6f 72 20 62 79 74 65 20 25   uses for byte %
34360 64 20 6f 66 20 70 61 67 65 20 25 64 22 2c 20 69  d of page %d", i
34370 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , iPage);.      
34380 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
34390 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
343a0 6e 74 21 3d 64 61 74 61 5b 68 64 72 2b 37 5d 20  nt!=data[hdr+7] 
343b0 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70  ){.      checkAp
343c0 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
343d0 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 46  0, .          "F
343e0 72 61 67 6d 65 6e 74 65 64 20 73 70 61 63 65 20  ragmented space 
343f0 69 73 20 25 64 20 62 79 74 65 20 72 65 70 6f 72  is %d byte repor
34400 74 65 64 20 61 73 20 25 64 20 6f 6e 20 70 61 67  ted as %d on pag
34410 65 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20  e %d",.         
34420 20 63 6e 74 2c 20 64 61 74 61 5b 68 64 72 2b 37   cnt, data[hdr+7
34430 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 7d  ], iPage);.    }
34440 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50 61  .  }.  sqlite3Pa
34450 67 65 46 72 65 65 28 68 69 74 29 3b 0a 0a 20 20  geFree(hit);..  
34460 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
34470 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 65 70  e);.  return dep
34480 74 68 2b 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  th+1;.}.#endif /
34490 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
344a0 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f  TEGRITY_CHECK */
344b0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
344c0 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
344d0 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73  CHECK./*.** This
344e0 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20   routine does a 
344f0 63 6f 6d 70 6c 65 74 65 20 63 68 65 63 6b 20 6f  complete check o
34500 66 20 74 68 65 20 67 69 76 65 6e 20 42 54 72 65  f the given BTre
34510 65 20 66 69 6c 65 2e 20 20 61 52 6f 6f 74 5b 5d  e file.  aRoot[]
34520 20 69 73 0a 2a 2a 20 61 6e 20 61 72 72 61 79 20   is.** an array 
34530 6f 66 20 70 61 67 65 73 20 6e 75 6d 62 65 72 73  of pages numbers
34540 20 77 65 72 65 20 65 61 63 68 20 70 61 67 65 20   were each page 
34550 6e 75 6d 62 65 72 20 69 73 20 74 68 65 20 72 6f  number is the ro
34560 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 61 20  ot page of.** a 
34570 74 61 62 6c 65 2e 20 20 6e 52 6f 6f 74 20 69 73  table.  nRoot is
34580 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
34590 6e 74 72 69 65 73 20 69 6e 20 61 52 6f 6f 74 2e  ntries in aRoot.
345a0 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74  .**.** If everyt
345b0 68 69 6e 67 20 63 68 65 63 6b 73 20 6f 75 74 2c  hing checks out,
345c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
345d0 74 75 72 6e 73 20 4e 55 4c 4c 2e 20 20 49 66 20  turns NULL.  If 
345e0 73 6f 6d 65 74 68 69 6e 67 20 69 73 0a 2a 2a 20  something is.** 
345f0 61 6d 69 73 73 2c 20 61 6e 20 65 72 72 6f 72 20  amiss, an error 
34600 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74  message is writt
34610 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f  en into memory o
34620 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
34630 6c 6f 63 28 29 0a 2a 2a 20 61 6e 64 20 61 20 70  loc().** and a p
34640 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 20 65  ointer to that e
34650 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
34660 72 65 74 75 72 6e 65 64 2e 20 20 54 68 65 20 63  returned.  The c
34670 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
34680 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
34690 65 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68  e for freeing th
346a0 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
346b0 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e  when it is done.
346c0 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
346d0 33 42 74 72 65 65 49 6e 74 65 67 72 69 74 79 43  3BtreeIntegrityC
346e0 68 65 63 6b 28 0a 20 20 42 74 72 65 65 20 2a 70  heck(.  Btree *p
346f0 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72  ,     /* The btr
34700 65 65 20 74 6f 20 62 65 20 63 68 65 63 6b 65 64  ee to be checked
34710 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 6f 6f 74   */.  int *aRoot
34720 2c 20 20 20 2f 2a 20 41 6e 20 61 72 72 61 79 20  ,   /* An array 
34730 6f 66 20 72 6f 6f 74 20 70 61 67 65 73 20 6e 75  of root pages nu
34740 6d 62 65 72 73 20 66 6f 72 20 69 6e 64 69 76 69  mbers for indivi
34750 64 75 61 6c 20 74 72 65 65 73 20 2a 2f 0a 20 20  dual trees */.  
34760 69 6e 74 20 6e 52 6f 6f 74 2c 20 20 20 20 2f 2a  int nRoot,    /*
34770 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
34780 65 73 20 69 6e 20 61 52 6f 6f 74 5b 5d 20 2a 2f  es in aRoot[] */
34790 0a 20 20 69 6e 74 20 6d 78 45 72 72 2c 20 20 20  .  int mxErr,   
347a0 20 2f 2a 20 53 74 6f 70 20 72 65 70 6f 72 74 69   /* Stop reporti
347b0 6e 67 20 65 72 72 6f 72 73 20 61 66 74 65 72 20  ng errors after 
347c0 74 68 69 73 20 6d 61 6e 79 20 2a 2f 0a 20 20 69  this many */.  i
347d0 6e 74 20 2a 70 6e 45 72 72 20 20 20 20 2f 2a 20  nt *pnErr    /* 
347e0 57 72 69 74 65 20 6e 75 6d 62 65 72 20 6f 66 20  Write number of 
347f0 65 72 72 6f 72 73 20 73 65 65 6e 20 74 6f 20 74  errors seen to t
34800 68 69 73 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  his variable */.
34810 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
34820 74 20 6e 52 65 66 3b 0a 20 20 49 6e 74 65 67 72  t nRef;.  Integr
34830 69 74 79 43 6b 20 73 43 68 65 63 6b 3b 0a 20 20  ityCk sCheck;.  
34840 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
34850 70 2d 3e 70 42 74 3b 0a 20 20 63 68 61 72 20 7a  p->pBt;.  char z
34860 45 72 72 5b 31 30 30 5d 3b 0a 0a 20 20 73 71 6c  Err[100];..  sql
34870 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
34880 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70  );.  pBt->db = p
34890 2d 3e 64 62 3b 0a 20 20 6e 52 65 66 20 3d 20 73  ->db;.  nRef = s
348a0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
348b0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
348c0 3b 0a 20 20 69 66 28 20 6c 6f 63 6b 42 74 72 65  ;.  if( lockBtre
348d0 65 57 69 74 68 52 65 74 72 79 28 70 29 21 3d 53  eWithRetry(p)!=S
348e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
348f0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
34900 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
34910 20 73 71 6c 69 74 65 33 53 74 72 44 75 70 28 22   sqlite3StrDup("
34920 55 6e 61 62 6c 65 20 74 6f 20 61 63 71 75 69 72  Unable to acquir
34930 65 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e  e a read lock on
34940 20 74 68 65 20 64 61 74 61 62 61 73 65 22 29 3b   the database");
34950 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e 70 42  .  }.  sCheck.pB
34960 74 20 3d 20 70 42 74 3b 0a 20 20 73 43 68 65 63  t = pBt;.  sChec
34970 6b 2e 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e  k.pPager = pBt->
34980 70 50 61 67 65 72 3b 0a 20 20 73 43 68 65 63 6b  pPager;.  sCheck
34990 2e 6e 50 61 67 65 20 3d 20 70 61 67 65 72 50 61  .nPage = pagerPa
349a0 67 65 63 6f 75 6e 74 28 73 43 68 65 63 6b 2e 70  gecount(sCheck.p
349b0 50 61 67 65 72 29 3b 0a 20 20 73 43 68 65 63 6b  Pager);.  sCheck
349c0 2e 6d 78 45 72 72 20 3d 20 6d 78 45 72 72 3b 0a  .mxErr = mxErr;.
349d0 20 20 73 43 68 65 63 6b 2e 6e 45 72 72 20 3d 20    sCheck.nErr = 
349e0 30 3b 0a 20 20 2a 70 6e 45 72 72 20 3d 20 30 3b  0;.  *pnErr = 0;
349f0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
34a00 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
34a10 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e    if( pBt->nTrun
34a20 63 21 3d 30 20 29 7b 0a 20 20 20 20 73 43 68 65  c!=0 ){.    sChe
34a30 63 6b 2e 6e 50 61 67 65 20 3d 20 70 42 74 2d 3e  ck.nPage = pBt->
34a40 6e 54 72 75 6e 63 3b 0a 20 20 7d 0a 23 65 6e 64  nTrunc;.  }.#end
34a50 69 66 0a 20 20 69 66 28 20 73 43 68 65 63 6b 2e  if.  if( sCheck.
34a60 6e 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nPage==0 ){.    
34a70 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
34a80 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 73 71  sed(pBt);.    sq
34a90 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
34aa0 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  p);.    return 0
34ab0 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e 61  ;.  }.  sCheck.a
34ac0 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 4d 61  nRef = sqlite3Ma
34ad0 6c 6c 6f 63 28 20 28 73 43 68 65 63 6b 2e 6e 50  lloc( (sCheck.nP
34ae0 61 67 65 2b 31 29 2a 73 69 7a 65 6f 66 28 73 43  age+1)*sizeof(sC
34af0 68 65 63 6b 2e 61 6e 52 65 66 5b 30 5d 29 20 29  heck.anRef[0]) )
34b00 3b 0a 20 20 69 66 28 20 21 73 43 68 65 63 6b 2e  ;.  if( !sCheck.
34b10 61 6e 52 65 66 20 29 7b 0a 20 20 20 20 75 6e 6c  anRef ){.    unl
34b20 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
34b30 28 70 42 74 29 3b 0a 20 20 20 20 2a 70 6e 45 72  (pBt);.    *pnEr
34b40 72 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74  r = 1;.    sqlit
34b50 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
34b60 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
34b70 74 65 33 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62  te3MPrintf(p->db
34b80 2c 20 22 55 6e 61 62 6c 65 20 74 6f 20 6d 61 6c  , "Unable to mal
34b90 6c 6f 63 20 25 64 20 62 79 74 65 73 22 2c 20 0a  loc %d bytes", .
34ba0 20 20 20 20 20 20 20 20 28 73 43 68 65 63 6b 2e          (sCheck.
34bb0 6e 50 61 67 65 2b 31 29 2a 73 69 7a 65 6f 66 28  nPage+1)*sizeof(
34bc0 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 30 5d 29  sCheck.anRef[0])
34bd0 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
34be0 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67  ; i<=sCheck.nPag
34bf0 65 3b 20 69 2b 2b 29 7b 20 73 43 68 65 63 6b 2e  e; i++){ sCheck.
34c00 61 6e 52 65 66 5b 69 5d 20 3d 20 30 3b 20 7d 0a  anRef[i] = 0; }.
34c10 20 20 69 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59    i = PENDING_BY
34c20 54 45 5f 50 41 47 45 28 70 42 74 29 3b 0a 20 20  TE_PAGE(pBt);.  
34c30 69 66 28 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50  if( i<=sCheck.nP
34c40 61 67 65 20 29 7b 0a 20 20 20 20 73 43 68 65 63  age ){.    sChec
34c50 6b 2e 61 6e 52 65 66 5b 69 5d 20 3d 20 31 3b 0a  k.anRef[i] = 1;.
34c60 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 53 74 72    }.  sqlite3Str
34c70 41 63 63 75 6d 49 6e 69 74 28 26 73 43 68 65 63  AccumInit(&sChec
34c80 6b 2e 65 72 72 4d 73 67 2c 20 7a 45 72 72 2c 20  k.errMsg, zErr, 
34c90 73 69 7a 65 6f 66 28 7a 45 72 72 29 2c 20 32 30  sizeof(zErr), 20
34ca0 30 30 30 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  000);..  /* Chec
34cb0 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20  k the integrity 
34cc0 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a  of the freelist.
34cd0 20 20 2a 2f 0a 20 20 63 68 65 63 6b 4c 69 73 74    */.  checkList
34ce0 28 26 73 43 68 65 63 6b 2c 20 31 2c 20 67 65 74  (&sCheck, 1, get
34cf0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
34d00 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 2c 0a  e1->aData[32]),.
34d10 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74 34              get4
34d20 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
34d30 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 2c 20 22  1->aData[36]), "
34d40 4d 61 69 6e 20 66 72 65 65 6c 69 73 74 3a 20 22  Main freelist: "
34d50 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 61  );..  /* Check a
34d60 6c 6c 20 74 68 65 20 74 61 62 6c 65 73 2e 0a 20  ll the tables.. 
34d70 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
34d80 3c 6e 52 6f 6f 74 20 26 26 20 73 43 68 65 63 6b  <nRoot && sCheck
34d90 2e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a 20 20  .mxErr; i++){.  
34da0 20 20 69 66 28 20 61 52 6f 6f 74 5b 69 5d 3d 3d    if( aRoot[i]==
34db0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69  0 ) continue;.#i
34dc0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
34dd0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
34de0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
34df0 63 75 75 6d 20 26 26 20 61 52 6f 6f 74 5b 69 5d  cuum && aRoot[i]
34e00 3e 31 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  >1 ){.      chec
34e10 6b 50 74 72 6d 61 70 28 26 73 43 68 65 63 6b 2c  kPtrmap(&sCheck,
34e20 20 61 52 6f 6f 74 5b 69 5d 2c 20 50 54 52 4d 41   aRoot[i], PTRMA
34e30 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20 30  P_ROOTPAGE, 0, 0
34e40 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
34e50 20 20 20 20 63 68 65 63 6b 54 72 65 65 50 61 67      checkTreePag
34e60 65 28 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f 74  e(&sCheck, aRoot
34e70 5b 69 5d 2c 20 30 2c 20 22 4c 69 73 74 20 6f 66  [i], 0, "List of
34e80 20 74 72 65 65 20 72 6f 6f 74 73 3a 20 22 29 3b   tree roots: ");
34e90 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
34ea0 73 75 72 65 20 65 76 65 72 79 20 70 61 67 65 20  sure every page 
34eb0 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 72  in the file is r
34ec0 65 66 65 72 65 6e 63 65 64 0a 20 20 2a 2f 0a 20  eferenced.  */. 
34ed0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 73 43 68   for(i=1; i<=sCh
34ee0 65 63 6b 2e 6e 50 61 67 65 20 26 26 20 73 43 68  eck.nPage && sCh
34ef0 65 63 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b  eck.mxErr; i++){
34f00 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
34f10 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
34f20 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e     if( sCheck.an
34f30 52 65 66 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20  Ref[i]==0 ){.   
34f40 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
34f50 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50  g(&sCheck, 0, "P
34f60 61 67 65 20 25 64 20 69 73 20 6e 65 76 65 72 20  age %d is never 
34f70 75 73 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d  used", i);.    }
34f80 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 49 66  .#else.    /* If
34f90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75   the database su
34fa0 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
34fb0 75 6d 2c 20 6d 61 6b 65 20 73 75 72 65 20 6e 6f  um, make sure no
34fc0 20 74 61 62 6c 65 73 20 63 6f 6e 74 61 69 6e 0a   tables contain.
34fd0 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65      ** reference
34fe0 73 20 74 6f 20 70 6f 69 6e 74 65 72 2d 6d 61 70  s to pointer-map
34ff0 20 70 61 67 65 73 2e 0a 20 20 20 20 2a 2f 0a 20   pages..    */. 
35000 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e     if( sCheck.an
35010 52 65 66 5b 69 5d 3d 3d 30 20 26 26 20 0a 20 20  Ref[i]==0 && .  
35020 20 20 20 20 20 28 50 54 52 4d 41 50 5f 50 41 47       (PTRMAP_PAG
35030 45 4e 4f 28 70 42 74 2c 20 69 29 21 3d 69 20 7c  ENO(pBt, i)!=i |
35040 7c 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  | !pBt->autoVacu
35050 75 6d 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65  um) ){.      che
35060 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68  ckAppendMsg(&sCh
35070 65 63 6b 2c 20 30 2c 20 22 50 61 67 65 20 25 64  eck, 0, "Page %d
35080 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 22 2c   is never used",
35090 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   i);.    }.    i
350a0 66 28 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b  f( sCheck.anRef[
350b0 69 5d 21 3d 30 20 26 26 20 0a 20 20 20 20 20 20  i]!=0 && .      
350c0 20 28 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28   (PTRMAP_PAGENO(
350d0 70 42 74 2c 20 69 29 3d 3d 69 20 26 26 20 70 42  pBt, i)==i && pB
350e0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 20 29  t->autoVacuum) )
350f0 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70  {.      checkApp
35100 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20  endMsg(&sCheck, 
35110 30 2c 20 22 50 6f 69 6e 74 65 72 20 6d 61 70 20  0, "Pointer map 
35120 70 61 67 65 20 25 64 20 69 73 20 72 65 66 65 72  page %d is refer
35130 65 6e 63 65 64 22 2c 20 69 29 3b 0a 20 20 20 20  enced", i);.    
35140 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20  }.#endif.  }..  
35150 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69  /* Make sure thi
35160 73 20 61 6e 61 6c 79 73 69 73 20 64 69 64 20 6e  s analysis did n
35170 6f 74 20 6c 65 61 76 65 20 61 6e 79 20 75 6e 72  ot leave any unr
35180 65 66 28 29 20 70 61 67 65 73 0a 20 20 2a 2f 0a  ef() pages.  */.
35190 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55    unlockBtreeIfU
351a0 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20 69 66  nused(pBt);.  if
351b0 28 20 6e 52 65 66 20 21 3d 20 73 71 6c 69 74 65  ( nRef != sqlite
351c0 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
351d0 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20  Bt->pPager) ){. 
351e0 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
351f0 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 0a 20  g(&sCheck, 0, . 
35200 20 20 20 20 20 22 4f 75 74 73 74 61 6e 64 69 6e       "Outstandin
35210 67 20 70 61 67 65 20 63 6f 75 6e 74 20 67 6f 65  g page count goe
35220 73 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 20  s from %d to %d 
35230 64 75 72 69 6e 67 20 74 68 69 73 20 61 6e 61 6c  during this anal
35240 79 73 69 73 22 2c 0a 20 20 20 20 20 20 6e 52 65  ysis",.      nRe
35250 66 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  f, sqlite3PagerR
35260 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  efcount(pBt->pPa
35270 67 65 72 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  ger).    );.  }.
35280 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 20 75 70 20  .  /* Clean  up 
35290 61 6e 64 20 72 65 70 6f 72 74 20 65 72 72 6f 72  and report error
352a0 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  s..  */.  sqlite
352b0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
352c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73    sqlite3_free(s
352d0 43 68 65 63 6b 2e 61 6e 52 65 66 29 3b 0a 20 20  Check.anRef);.  
352e0 2a 70 6e 45 72 72 20 3d 20 73 43 68 65 63 6b 2e  *pnErr = sCheck.
352f0 6e 45 72 72 3b 0a 20 20 69 66 28 20 73 43 68 65  nErr;.  if( sChe
35300 63 6b 2e 6e 45 72 72 3d 3d 30 20 29 20 73 71 6c  ck.nErr==0 ) sql
35310 69 74 65 33 53 74 72 41 63 63 75 6d 52 65 73 65  ite3StrAccumRese
35320 74 28 26 73 43 68 65 63 6b 2e 65 72 72 4d 73 67  t(&sCheck.errMsg
35330 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
35340 74 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73  te3StrAccumFinis
35350 68 28 26 73 43 68 65 63 6b 2e 65 72 72 4d 73 67  h(&sCheck.errMsg
35360 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
35370 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
35380 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 2f  RITY_CHECK */../
35390 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
353a0 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
353b0 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
353c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
353d0 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 66  *.** The pager f
353e0 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e 76 61 72  ilename is invar
353f0 69 61 6e 74 20 61 73 20 6c 6f 6e 67 20 61 73 20  iant as long as 
35400 74 68 65 20 70 61 67 65 72 20 69 73 0a 2a 2a 20  the pager is.** 
35410 6f 70 65 6e 20 73 6f 20 69 74 20 69 73 20 73 61  open so it is sa
35420 66 65 20 74 6f 20 61 63 63 65 73 73 20 77 69 74  fe to access wit
35430 68 6f 75 74 20 74 68 65 20 42 74 53 68 61 72 65  hout the BtShare
35440 64 20 6d 75 74 65 78 2e 0a 2a 2f 0a 63 6f 6e 73  d mutex..*/.cons
35450 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42  t char *sqlite3B
35460 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
35470 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
35480 65 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61  ert( p->pBt->pPa
35490 67 65 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  ger!=0 );.  retu
354a0 72 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 46  rn sqlite3PagerF
354b0 69 6c 65 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e  ilename(p->pBt->
354c0 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPager);.}../*.*
354d0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 74  * Return the pat
354e0 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72  hname of the dir
354f0 65 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74  ectory that cont
35500 61 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73  ains the databas
35510 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e file..**.** Th
35520 65 20 70 61 67 65 72 20 64 69 72 65 63 74 6f 72  e pager director
35530 79 20 6e 61 6d 65 20 69 73 20 69 6e 76 61 72 69  y name is invari
35540 61 6e 74 20 61 73 20 6c 6f 6e 67 20 61 73 20 74  ant as long as t
35550 68 65 20 70 61 67 65 72 20 69 73 0a 2a 2a 20 6f  he pager is.** o
35560 70 65 6e 20 73 6f 20 69 74 20 69 73 20 73 61 66  pen so it is saf
35570 65 20 74 6f 20 61 63 63 65 73 73 20 77 69 74 68  e to access with
35580 6f 75 74 20 74 68 65 20 42 74 53 68 61 72 65 64  out the BtShared
35590 20 6d 75 74 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74   mutex..*/.const
355a0 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74   char *sqlite3Bt
355b0 72 65 65 47 65 74 44 69 72 6e 61 6d 65 28 42 74  reeGetDirname(Bt
355c0 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  ree *p){.  asser
355d0 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  t( p->pBt->pPage
355e0 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  r!=0 );.  return
355f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 69 72   sqlite3PagerDir
35600 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61  name(p->pBt->pPa
35610 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ger);.}../*.** R
35620 65 74 75 72 6e 20 74 68 65 20 70 61 74 68 6e 61  eturn the pathna
35630 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  me of the journa
35640 6c 20 66 69 6c 65 20 66 6f 72 20 74 68 69 73 20  l file for this 
35650 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 72 65  database. The re
35660 74 75 72 6e 0a 2a 2a 20 76 61 6c 75 65 20 6f 66  turn.** value of
35670 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
35680 20 74 68 65 20 73 61 6d 65 20 72 65 67 61 72 64   the same regard
35690 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20  less of whether 
356a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
356b0 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72 65  .** has been cre
356c0 61 74 65 64 20 6f 72 20 6e 6f 74 2e 0a 2a 2a 0a  ated or not..**.
356d0 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6a 6f 75  ** The pager jou
356e0 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73  rnal filename is
356f0 20 69 6e 76 61 72 69 61 6e 74 20 61 73 20 6c 6f   invariant as lo
35700 6e 67 20 61 73 20 74 68 65 20 70 61 67 65 72 20  ng as the pager 
35710 69 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20 69 74  is.** open so it
35720 20 69 73 20 73 61 66 65 20 74 6f 20 61 63 63 65   is safe to acce
35730 73 73 20 77 69 74 68 6f 75 74 20 74 68 65 20 42  ss without the B
35740 74 53 68 61 72 65 64 20 6d 75 74 65 78 2e 0a 2a  tShared mutex..*
35750 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
35760 6c 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75  lite3BtreeGetJou
35770 72 6e 61 6c 6e 61 6d 65 28 42 74 72 65 65 20 2a  rnalname(Btree *
35780 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
35790 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20  >pBt->pPager!=0 
357a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
357b0 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e  te3PagerJournaln
357c0 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  ame(p->pBt->pPag
357d0 65 72 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  er);.}..#ifndef 
357e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
357f0 55 4d 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68  UM./*.** Copy th
35800 65 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65  e complete conte
35810 6e 74 20 6f 66 20 70 42 74 46 72 6f 6d 20 69 6e  nt of pBtFrom in
35820 74 6f 20 70 42 74 54 6f 2e 20 20 41 20 74 72 61  to pBtTo.  A tra
35830 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74  nsaction.** must
35840 20 62 65 20 61 63 74 69 76 65 20 66 6f 72 20 62   be active for b
35850 6f 74 68 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  oth files..**.**
35860 20 54 68 65 20 73 69 7a 65 20 6f 66 20 66 69 6c   The size of fil
35870 65 20 70 54 6f 20 6d 61 79 20 62 65 20 72 65 64  e pTo may be red
35880 75 63 65 64 20 62 79 20 74 68 69 73 20 6f 70 65  uced by this ope
35890 72 61 74 69 6f 6e 2e 0a 2a 2a 20 49 66 20 61 6e  ration..** If an
358a0 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
358b0 67 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  g, the transacti
358c0 6f 6e 20 6f 6e 20 70 54 6f 20 69 73 20 72 6f 6c  on on pTo is rol
358d0 6c 65 64 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a  led back. .**.**
358e0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
358f0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29  CommitPhaseOne()
35900 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 6f   may be called o
35910 6e 20 70 54 6f 20 62 65 66 6f 72 65 20 72 65 74  n pTo before ret
35920 75 72 6e 69 6e 67 2e 20 0a 2a 2a 20 54 68 65 20  urning. .** The 
35930 63 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 66 69  caller should fi
35940 6e 69 73 68 20 63 6f 6d 6d 69 74 74 69 6e 67 20  nish committing 
35950 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
35960 6f 6e 20 70 54 6f 20 62 79 20 63 61 6c 6c 69 6e  on pTo by callin
35970 67 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65  g.** sqlite3Btre
35980 65 43 6f 6d 6d 69 74 28 29 2e 0a 2a 2f 0a 73 74  eCommit()..*/.st
35990 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 6f  atic int btreeCo
359a0 70 79 46 69 6c 65 28 42 74 72 65 65 20 2a 70 54  pyFile(Btree *pT
359b0 6f 2c 20 42 74 72 65 65 20 2a 70 46 72 6f 6d 29  o, Btree *pFrom)
359c0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
359d0 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 6e 6f 20 69  ITE_OK;.  Pgno i
359e0 3b 0a 0a 20 20 50 67 6e 6f 20 6e 46 72 6f 6d 50  ;..  Pgno nFromP
359f0 61 67 65 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  age;     /* Numb
35a00 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70  er of pages in p
35a10 46 72 6f 6d 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e  From */.  Pgno n
35a20 54 6f 50 61 67 65 3b 20 20 20 20 20 20 20 2f 2a  ToPage;       /*
35a30 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
35a40 20 69 6e 20 70 54 6f 20 2a 2f 0a 20 20 50 67 6e   in pTo */.  Pgn
35a50 6f 20 6e 4e 65 77 50 61 67 65 3b 20 20 20 20 20  o nNewPage;     
35a60 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
35a70 67 65 73 20 69 6e 20 70 54 6f 20 61 66 74 65 72  ges in pTo after
35a80 20 74 68 65 20 63 6f 70 79 20 2a 2f 0a 0a 20 20   the copy */..  
35a90 50 67 6e 6f 20 69 53 6b 69 70 3b 20 20 20 20 20  Pgno iSkip;     
35aa0 20 20 20 20 2f 2a 20 50 65 6e 64 69 6e 67 20 62      /* Pending b
35ab0 79 74 65 20 70 61 67 65 20 69 6e 20 70 54 6f 20  yte page in pTo 
35ac0 2a 2f 0a 20 20 69 6e 74 20 6e 54 6f 50 61 67 65  */.  int nToPage
35ad0 53 69 7a 65 3b 20 20 20 20 2f 2a 20 50 61 67 65  Size;    /* Page
35ae0 20 73 69 7a 65 20 6f 66 20 70 54 6f 20 69 6e 20   size of pTo in 
35af0 62 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e  bytes */.  int n
35b00 46 72 6f 6d 50 61 67 65 53 69 7a 65 3b 20 20 2f  FromPageSize;  /
35b10 2a 20 50 61 67 65 20 73 69 7a 65 20 6f 66 20 70  * Page size of p
35b20 46 72 6f 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f  From in bytes */
35b30 0a 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ..  BtShared *pB
35b40 74 54 6f 20 3d 20 70 54 6f 2d 3e 70 42 74 3b 0a  tTo = pTo->pBt;.
35b50 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 46    BtShared *pBtF
35b60 72 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74  rom = pFrom->pBt
35b70 3b 0a 20 20 70 42 74 54 6f 2d 3e 64 62 20 3d 20  ;.  pBtTo->db = 
35b80 70 54 6f 2d 3e 64 62 3b 0a 20 20 70 42 74 46 72  pTo->db;.  pBtFr
35b90 6f 6d 2d 3e 64 62 20 3d 20 70 46 72 6f 6d 2d 3e  om->db = pFrom->
35ba0 64 62 3b 0a 0a 20 20 6e 54 6f 50 61 67 65 53 69  db;..  nToPageSi
35bb0 7a 65 20 3d 20 70 42 74 54 6f 2d 3e 70 61 67 65  ze = pBtTo->page
35bc0 53 69 7a 65 3b 0a 20 20 6e 46 72 6f 6d 50 61 67  Size;.  nFromPag
35bd0 65 53 69 7a 65 20 3d 20 70 42 74 46 72 6f 6d 2d  eSize = pBtFrom-
35be0 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 69 66  >pageSize;..  if
35bf0 28 20 70 54 6f 2d 3e 69 6e 54 72 61 6e 73 21 3d  ( pTo->inTrans!=
35c00 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 70  TRANS_WRITE || p
35c10 46 72 6f 6d 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  From->inTrans!=T
35c20 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
35c30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
35c40 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
35c50 20 70 42 74 54 6f 2d 3e 70 43 75 72 73 6f 72 20   pBtTo->pCursor 
35c60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
35c70 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a  LITE_BUSY;.  }..
35c80 20 20 6e 54 6f 50 61 67 65 20 3d 20 70 61 67 65    nToPage = page
35c90 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 54 6f  rPagecount(pBtTo
35ca0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 6e 46 72  ->pPager);.  nFr
35cb0 6f 6d 50 61 67 65 20 3d 20 70 61 67 65 72 50 61  omPage = pagerPa
35cc0 67 65 63 6f 75 6e 74 28 70 42 74 46 72 6f 6d 2d  gecount(pBtFrom-
35cd0 3e 70 50 61 67 65 72 29 3b 0a 20 20 69 53 6b 69  >pPager);.  iSki
35ce0 70 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  p = PENDING_BYTE
35cf0 5f 50 41 47 45 28 70 42 74 54 6f 29 3b 0a 0a 20  _PAGE(pBtTo);.. 
35d00 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 6e 4e 65   /* Variable nNe
35d10 77 50 61 67 65 20 69 73 20 74 68 65 20 6e 75 6d  wPage is the num
35d20 62 65 72 20 6f 66 20 70 61 67 65 73 20 72 65 71  ber of pages req
35d30 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74  uired to store t
35d40 68 65 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 73  he.  ** contents
35d50 20 6f 66 20 70 46 72 6f 6d 20 75 73 69 6e 67 20   of pFrom using 
35d60 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
35d70 2d 73 69 7a 65 20 6f 66 20 70 54 6f 2e 0a 20 20  -size of pTo..  
35d80 2a 2f 0a 20 20 6e 4e 65 77 50 61 67 65 20 3d 20  */.  nNewPage = 
35d90 28 28 69 36 34 29 6e 46 72 6f 6d 50 61 67 65 20  ((i64)nFromPage 
35da0 2a 20 28 69 36 34 29 6e 46 72 6f 6d 50 61 67 65  * (i64)nFromPage
35db0 53 69 7a 65 20 2b 20 28 69 36 34 29 6e 54 6f 50  Size + (i64)nToP
35dc0 61 67 65 53 69 7a 65 20 2d 20 31 29 20 2f 20 0a  ageSize - 1) / .
35dd0 20 20 20 20 20 20 28 69 36 34 29 6e 54 6f 50 61        (i64)nToPa
35de0 67 65 53 69 7a 65 3b 0a 0a 20 20 66 6f 72 28 69  geSize;..  for(i
35df0 3d 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =1; rc==SQLITE_O
35e00 4b 20 26 26 20 28 69 3c 3d 6e 54 6f 50 61 67 65  K && (i<=nToPage
35e10 20 7c 7c 20 69 3c 3d 6e 4e 65 77 50 61 67 65 29   || i<=nNewPage)
35e20 3b 20 69 2b 2b 29 7b 0a 0a 20 20 20 20 2f 2a 20  ; i++){..    /* 
35e30 4a 6f 75 72 6e 61 6c 20 74 68 65 20 6f 72 69 67  Journal the orig
35e40 69 6e 61 6c 20 70 61 67 65 2e 0a 20 20 20 20 2a  inal page..    *
35e50 2a 0a 20 20 20 20 2a 2a 20 69 53 6b 69 70 20 69  *.    ** iSkip i
35e60 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
35e70 72 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67  r of the locking
35e80 20 70 61 67 65 20 28 50 45 4e 44 49 4e 47 5f 42   page (PENDING_B
35e90 59 54 45 5f 50 41 47 45 29 0a 20 20 20 20 2a 2a  YTE_PAGE).    **
35ea0 20 69 6e 20 64 61 74 61 62 61 73 65 20 2a 70 54   in database *pT
35eb0 6f 20 28 62 65 66 6f 72 65 20 74 68 65 20 63 6f  o (before the co
35ec0 70 79 29 2e 20 54 68 69 73 20 70 61 67 65 20 69  py). This page i
35ed0 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20  s never written 
35ee0 0a 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65  .    ** into the
35ef0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 55   journal file. U
35f00 6e 6c 65 73 73 20 69 3d 3d 69 53 6b 69 70 20 6f  nless i==iSkip o
35f10 72 20 74 68 65 20 70 61 67 65 20 77 61 73 20 6e  r the page was n
35f20 6f 74 0a 20 20 20 20 2a 2a 20 70 72 65 73 65 6e  ot.    ** presen
35f30 74 20 69 6e 20 70 54 6f 20 62 65 66 6f 72 65 20  t in pTo before 
35f40 74 68 65 20 63 6f 70 79 20 6f 70 65 72 61 74 69  the copy operati
35f50 6f 6e 2c 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  on, journal page
35f60 20 69 20 66 72 6f 6d 20 70 54 6f 2e 0a 20 20 20   i from pTo..   
35f70 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 21 3d 69   */.    if( i!=i
35f80 53 6b 69 70 20 26 26 20 69 3c 3d 6e 54 6f 50 61  Skip && i<=nToPa
35f90 67 65 20 29 7b 0a 20 20 20 20 20 20 44 62 50 61  ge ){.      DbPa
35fa0 67 65 20 2a 70 44 62 50 61 67 65 20 3d 20 30 3b  ge *pDbPage = 0;
35fb0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
35fc0 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 54  te3PagerGet(pBtT
35fd0 6f 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20 26 70  o->pPager, i, &p
35fe0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
35ff0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
36000 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
36010 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
36020 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  te(pDbPage);.   
36030 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
36040 49 54 45 5f 4f 4b 20 26 26 20 69 3e 6e 46 72 6f  ITE_OK && i>nFro
36050 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  mPage ){.       
36060 20 20 20 2f 2a 20 59 65 61 68 2e 20 20 49 74 20     /* Yeah.  It 
36070 73 65 65 6d 73 20 77 69 65 72 64 20 74 6f 20 63  seems wierd to c
36080 61 6c 6c 20 44 6f 6e 74 57 72 69 74 65 28 29 20  all DontWrite() 
36090 72 69 67 68 74 20 61 66 74 65 72 20 57 72 69 74  right after Writ
360a0 65 28 29 2e 20 42 75 74 0a 20 20 20 20 20 20 20  e(). But.       
360b0 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 62 65     ** that is be
360c0 63 61 75 73 65 20 74 68 65 20 6e 61 6d 65 73 20  cause the names 
360d0 6f 66 20 74 68 6f 73 65 20 70 72 6f 63 65 64 75  of those procedu
360e0 72 65 73 20 64 6f 20 6e 6f 74 20 65 78 61 63 74  res do not exact
360f0 6c 79 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ly .          **
36100 20 72 65 70 72 65 73 65 6e 74 20 77 68 61 74 20   represent what 
36110 74 68 65 79 20 64 6f 2e 20 20 57 72 69 74 65 28  they do.  Write(
36120 29 20 72 65 61 6c 6c 79 20 6d 65 61 6e 73 20 22  ) really means "
36130 70 75 74 20 74 68 69 73 20 70 61 67 65 20 69 6e  put this page in
36140 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a   the.          *
36150 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * rollback journ
36160 61 6c 20 61 6e 64 20 6d 61 72 6b 20 69 74 20 61  al and mark it a
36170 73 20 64 69 72 74 79 20 73 6f 20 74 68 61 74 20  s dirty so that 
36180 69 74 20 77 69 6c 6c 20 62 65 20 77 72 69 74 74  it will be writt
36190 65 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  en.          ** 
361a0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
361b0 66 69 6c 65 20 6c 61 74 65 72 2e 22 20 20 44 6f  file later."  Do
361c0 6e 74 57 72 69 74 65 28 29 20 75 6e 64 6f 65 73  ntWrite() undoes
361d0 20 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 74   the second part
361e0 20 6f 66 0a 20 20 20 20 20 20 20 20 20 20 2a 2a   of.          **
361f0 20 74 68 61 74 20 61 6e 64 20 70 72 65 76 65 6e   that and preven
36200 74 73 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ts the page from
36210 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 74   being written t
36220 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
36230 54 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  The.          **
36240 20 70 61 67 65 20 69 73 20 73 74 69 6c 6c 20 6f   page is still o
36250 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
36260 6f 75 72 6e 61 6c 2c 20 74 68 6f 75 67 68 2e 20  ournal, though. 
36270 20 41 6e 64 20 74 68 61 74 20 69 73 20 74 68 65   And that is the
36280 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77   .          ** w
36290 68 6f 6c 65 20 70 6f 69 6e 74 20 6f 66 20 74 68  hole point of th
362a0 69 73 20 62 6c 6f 63 6b 3a 20 74 6f 20 70 75 74  is block: to put
362b0 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 72 6f   pages on the ro
362c0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20  llback journal. 
362d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  .          */.  
362e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
362f0 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 44  agerDontWrite(pD
36300 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
36310 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
36320 33 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50  3PagerUnref(pDbP
36330 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
36340 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76 65 72    }..    /* Over
36350 77 72 69 74 65 20 74 68 65 20 64 61 74 61 20 69  write the data i
36360 6e 20 70 61 67 65 20 69 20 6f 66 20 74 68 65 20  n page i of the 
36370 74 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20  target database 
36380 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
36390 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 21 3d 69  QLITE_OK && i!=i
363a0 53 6b 69 70 20 26 26 20 69 3c 3d 6e 4e 65 77 50  Skip && i<=nNewP
363b0 61 67 65 20 29 7b 0a 0a 20 20 20 20 20 20 44 62  age ){..      Db
363c0 50 61 67 65 20 2a 70 54 6f 50 61 67 65 20 3d 20  Page *pToPage = 
363d0 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
363e0 5f 69 6e 74 36 34 20 69 4f 66 66 3b 0a 0a 20 20  _int64 iOff;..  
363f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
36400 50 61 67 65 72 47 65 74 28 70 42 74 54 6f 2d 3e  PagerGet(pBtTo->
36410 70 50 61 67 65 72 2c 20 69 2c 20 26 70 54 6f 50  pPager, i, &pToP
36420 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
36430 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
36440 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
36450 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
36460 70 54 6f 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pToPage);.      
36470 7d 0a 0a 20 20 20 20 20 20 66 6f 72 28 0a 20 20  }..      for(.  
36480 20 20 20 20 20 20 69 4f 66 66 3d 28 69 2d 31 29        iOff=(i-1)
36490 2a 6e 54 6f 50 61 67 65 53 69 7a 65 3b 20 0a 20  *nToPageSize; . 
364a0 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
364b0 45 5f 4f 4b 20 26 26 20 69 4f 66 66 3c 69 2a 6e  E_OK && iOff<i*n
364c0 54 6f 50 61 67 65 53 69 7a 65 3b 20 0a 20 20 20  ToPageSize; .   
364d0 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 46 72       iOff += nFr
364e0 6f 6d 50 61 67 65 53 69 7a 65 0a 20 20 20 20 20  omPageSize.     
364f0 20 29 7b 0a 20 20 20 20 20 20 20 20 44 62 50 61   ){.        DbPa
36500 67 65 20 2a 70 46 72 6f 6d 50 61 67 65 20 3d 20  ge *pFromPage = 
36510 30 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  0;.        Pgno 
36520 69 46 72 6f 6d 20 3d 20 28 69 4f 66 66 2f 6e 46  iFrom = (iOff/nF
36530 72 6f 6d 50 61 67 65 53 69 7a 65 29 2b 31 3b 0a  romPageSize)+1;.
36540 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72  .        if( iFr
36550 6f 6d 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  om==PENDING_BYTE
36560 5f 50 41 47 45 28 70 42 74 46 72 6f 6d 29 20 29  _PAGE(pBtFrom) )
36570 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  {.          cont
36580 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
36590 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
365a0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
365b0 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72 2c 20 69  tFrom->pPager, i
365c0 46 72 6f 6d 2c 20 26 70 46 72 6f 6d 50 61 67 65  From, &pFromPage
365d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
365e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
365f0 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
36600 7a 54 6f 20 3d 20 73 71 6c 69 74 65 33 50 61 67  zTo = sqlite3Pag
36610 65 72 47 65 74 44 61 74 61 28 70 54 6f 50 61 67  erGetData(pToPag
36620 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68  e);.          ch
36630 61 72 20 2a 7a 46 72 6f 6d 20 3d 20 73 71 6c 69  ar *zFrom = sqli
36640 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
36650 70 46 72 6f 6d 50 61 67 65 29 3b 0a 20 20 20 20  pFromPage);.    
36660 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 3b        int nCopy;
36670 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ..          if( 
36680 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 3e 3d 6e  nFromPageSize>=n
36690 54 6f 50 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ToPageSize ){.  
366a0 20 20 20 20 20 20 20 20 20 20 7a 46 72 6f 6d 20            zFrom 
366b0 2b 3d 20 28 28 69 2d 31 29 2a 6e 54 6f 50 61 67  += ((i-1)*nToPag
366c0 65 53 69 7a 65 20 2d 20 28 28 69 46 72 6f 6d 2d  eSize - ((iFrom-
366d0 31 29 2a 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65  1)*nFromPageSize
366e0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
366f0 6e 43 6f 70 79 20 3d 20 6e 54 6f 50 61 67 65 53  nCopy = nToPageS
36700 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ize;.          }
36710 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
36720 20 20 7a 54 6f 20 2b 3d 20 28 28 28 69 46 72 6f    zTo += (((iFro
36730 6d 2d 31 29 2a 6e 46 72 6f 6d 50 61 67 65 53 69  m-1)*nFromPageSi
36740 7a 65 29 20 2d 20 28 69 2d 31 29 2a 6e 54 6f 50  ze) - (i-1)*nToP
36750 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
36760 20 20 20 20 20 20 6e 43 6f 70 79 20 3d 20 6e 46        nCopy = nF
36770 72 6f 6d 50 61 67 65 53 69 7a 65 3b 0a 20 20 20  romPageSize;.   
36780 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
36790 20 20 20 20 6d 65 6d 63 70 79 28 7a 54 6f 2c 20      memcpy(zTo, 
367a0 7a 46 72 6f 6d 2c 20 6e 43 6f 70 79 29 3b 0a 09  zFrom, nCopy);..
367b0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
367c0 72 65 66 28 70 46 72 6f 6d 50 61 67 65 29 3b 0a  ref(pFromPage);.
367d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
367e0 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f  }..      if( pTo
367f0 50 61 67 65 20 29 20 73 71 6c 69 74 65 33 50 61  Page ) sqlite3Pa
36800 67 65 72 55 6e 72 65 66 28 70 54 6f 50 61 67 65  gerUnref(pToPage
36810 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
36820 2f 2a 20 49 66 20 74 68 69 6e 67 73 20 68 61 76  /* If things hav
36830 65 20 77 6f 72 6b 65 64 20 73 6f 20 66 61 72 2c  e worked so far,
36840 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
36850 6c 65 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62  le may need to b
36860 65 20 0a 20 20 2a 2a 20 74 72 75 6e 63 61 74 65  e .  ** truncate
36870 64 2e 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 70  d. The complex p
36880 61 72 74 20 69 73 20 74 68 61 74 20 69 74 20 6d  art is that it m
36890 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 74 72  ay need to be tr
368a0 75 6e 63 61 74 65 64 20 74 6f 0a 20 20 2a 2a 20  uncated to.  ** 
368b0 61 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6e  a size that is n
368c0 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75  ot an integer mu
368d0 6c 74 69 70 6c 65 20 6f 66 20 6e 54 6f 50 61 67  ltiple of nToPag
368e0 65 53 69 7a 65 20 2d 20 74 68 65 20 63 75 72 72  eSize - the curr
368f0 65 6e 74 0a 20 20 2a 2a 20 70 61 67 65 20 73 69  ent.  ** page si
36900 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70  ze used by the p
36910 61 67 65 72 20 61 73 73 6f 63 69 61 74 65 64 20  ager associated 
36920 77 69 74 68 20 42 2d 54 72 65 65 20 70 54 6f 2e  with B-Tree pTo.
36930 0a 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 65  .  **.  ** For e
36940 78 61 6d 70 6c 65 2c 20 73 61 79 20 74 68 65 20  xample, say the 
36950 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 70 54 6f  page-size of pTo
36960 20 69 73 20 32 30 34 38 20 62 79 74 65 73 20 61   is 2048 bytes a
36970 6e 64 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  nd the original 
36980 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  .  ** number of 
36990 70 61 67 65 73 20 69 73 20 35 20 28 31 30 20 4b  pages is 5 (10 K
369a0 42 20 66 69 6c 65 29 2e 20 49 66 20 70 46 72 6f  B file). If pFro
369b0 6d 20 68 61 73 20 61 20 70 61 67 65 20 73 69 7a  m has a page siz
369c0 65 20 6f 66 20 31 30 32 34 20 0a 20 20 2a 2a 20  e of 1024 .  ** 
369d0 62 79 74 65 73 20 61 6e 64 20 39 20 70 61 67 65  bytes and 9 page
369e0 73 2c 20 74 68 65 6e 20 74 68 65 20 66 69 6c 65  s, then the file
369f0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 74 72 75   needs to be tru
36a00 6e 63 61 74 65 64 20 74 6f 20 39 4b 42 2e 0a 20  ncated to 9KB.. 
36a10 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
36a20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
36a30 66 28 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65  f( nFromPageSize
36a40 21 3d 6e 54 6f 50 61 67 65 53 69 7a 65 20 29 7b  !=nToPageSize ){
36a50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
36a60 69 6c 65 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c  ile *pFile = sql
36a70 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 42  ite3PagerFile(pB
36a80 74 54 6f 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  tTo->pPager);.  
36a90 20 20 20 20 69 36 34 20 69 53 69 7a 65 20 3d 20      i64 iSize = 
36aa0 28 69 36 34 29 6e 46 72 6f 6d 50 61 67 65 53 69  (i64)nFromPageSi
36ab0 7a 65 20 2a 20 28 69 36 34 29 6e 46 72 6f 6d 50  ze * (i64)nFromP
36ac0 61 67 65 3b 0a 20 20 20 20 20 20 69 36 34 20 69  age;.      i64 i
36ad0 4e 6f 77 20 3d 20 28 69 36 34 29 28 28 6e 54 6f  Now = (i64)((nTo
36ae0 50 61 67 65 3e 6e 4e 65 77 50 61 67 65 29 3f 6e  Page>nNewPage)?n
36af0 54 6f 50 61 67 65 3a 6e 4e 65 77 50 61 67 65 29  ToPage:nNewPage)
36b00 20 2a 20 28 69 36 34 29 6e 54 6f 50 61 67 65 53   * (i64)nToPageS
36b10 69 7a 65 3b 20 0a 20 20 20 20 20 20 69 36 34 20  ize; .      i64 
36b20 69 50 65 6e 64 69 6e 67 20 3d 20 28 28 69 36 34  iPending = ((i64
36b30 29 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  )PENDING_BYTE_PA
36b40 47 45 28 70 42 74 54 6f 29 2d 31 29 20 2a 28 69  GE(pBtTo)-1) *(i
36b50 36 34 29 6e 54 6f 50 61 67 65 53 69 7a 65 3b 0a  64)nToPageSize;.
36b60 20 20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28    .      assert(
36b70 20 69 53 69 7a 65 3c 3d 69 4e 6f 77 20 29 3b 0a   iSize<=iNow );.
36b80 20 20 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d    .      /* Comm
36b90 69 74 20 70 68 61 73 65 20 6f 6e 65 20 73 79 6e  it phase one syn
36ba0 63 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  cs the journal f
36bb0 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ile associated w
36bc0 69 74 68 20 70 54 6f 20 0a 20 20 20 20 20 20 2a  ith pTo .      *
36bd0 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  * containing the
36be0 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 2e 20   original data. 
36bf0 49 74 20 64 6f 65 73 20 6e 6f 74 20 73 79 6e 63  It does not sync
36c00 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
36c10 6c 65 0a 20 20 20 20 20 20 2a 2a 20 69 74 73 65  le.      ** itse
36c20 6c 66 2e 20 41 66 74 65 72 20 64 6f 69 6e 67 20  lf. After doing 
36c30 74 68 69 73 20 69 74 20 69 73 20 73 61 66 65 20  this it is safe 
36c40 74 6f 20 75 73 65 20 4f 73 54 72 75 6e 63 61 74  to use OsTruncat
36c50 65 28 29 20 61 6e 64 20 6f 74 68 65 72 0a 20 20  e() and other.  
36c60 20 20 20 20 2a 2a 20 66 69 6c 65 20 41 50 49 73      ** file APIs
36c70 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
36c80 20 66 69 6c 65 20 64 69 72 65 63 74 6c 79 2e 0a   file directly..
36c90 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
36ca0 42 74 54 6f 2d 3e 64 62 20 3d 20 70 54 6f 2d 3e  BtTo->db = pTo->
36cb0 64 62 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  db;.      rc = s
36cc0 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
36cd0 74 50 68 61 73 65 4f 6e 65 28 70 42 74 54 6f 2d  tPhaseOne(pBtTo-
36ce0 3e 70 50 61 67 65 72 2c 20 30 2c 20 30 2c 20 31  >pPager, 0, 0, 1
36cf0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 53 69  );.      if( iSi
36d00 7a 65 3c 69 4e 6f 77 20 26 26 20 72 63 3d 3d 53  ze<iNow && rc==S
36d10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
36d20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
36d30 4f 73 54 72 75 6e 63 61 74 65 28 70 46 69 6c 65  OsTruncate(pFile
36d40 2c 20 69 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  , iSize);.      
36d50 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 54 68  }.  .      /* Th
36d60 65 20 6c 6f 6f 70 20 74 68 61 74 20 63 6f 70 69  e loop that copi
36d70 65 64 20 64 61 74 61 20 66 72 6f 6d 20 64 61 74  ed data from dat
36d80 61 62 61 73 65 20 70 46 72 6f 6d 20 74 6f 20 70  abase pFrom to p
36d90 54 6f 20 64 69 64 20 6e 6f 74 0a 20 20 20 20 20  To did not.     
36da0 20 2a 2a 20 70 6f 70 75 6c 61 74 65 20 74 68 65   ** populate the
36db0 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65 20 6f 66   locking page of
36dc0 20 64 61 74 61 62 61 73 65 20 70 54 6f 2e 20 49   database pTo. I
36dd0 66 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  f the page-size 
36de0 6f 66 0a 20 20 20 20 20 20 2a 2a 20 70 46 72 6f  of.      ** pFro
36df0 6d 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  m is smaller tha
36e00 6e 20 74 68 61 74 20 6f 66 20 70 54 6f 2c 20 74  n that of pTo, t
36e10 68 69 73 20 6d 65 61 6e 73 20 73 6f 6d 65 20 64  his means some d
36e20 61 74 61 20 77 69 6c 6c 0a 20 20 20 20 20 20 2a  ata will.      *
36e30 2a 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20  * not have been 
36e40 63 6f 70 69 65 64 2e 20 0a 20 20 20 20 20 20 2a  copied. .      *
36e50 2a 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20  *.      ** This 
36e60 62 6c 6f 63 6b 20 63 6f 70 69 65 73 20 74 68 65  block copies the
36e70 20 6d 69 73 73 69 6e 67 20 64 61 74 61 20 66 72   missing data fr
36e80 6f 6d 20 64 61 74 61 62 61 73 65 20 70 46 72 6f  om database pFro
36e90 6d 20 74 6f 20 70 54 6f 20 0a 20 20 20 20 20 20  m to pTo .      
36ea0 2a 2a 20 75 73 69 6e 67 20 66 69 6c 65 20 41 50  ** using file AP
36eb0 49 73 2e 20 54 68 69 73 20 69 73 20 73 61 66 65  Is. This is safe
36ec0 20 62 65 63 61 75 73 65 20 61 74 20 74 68 69 73   because at this
36ed0 20 70 6f 69 6e 74 20 77 65 20 6b 6e 6f 77 20 74   point we know t
36ee0 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c  hat.      ** all
36ef0 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
36f00 20 64 61 74 61 20 66 72 6f 6d 20 70 54 6f 20 68   data from pTo h
36f10 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 69  as been synced i
36f20 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 20 20 2a  nto the .      *
36f30 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  * journal file. 
36f40 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74  At this point it
36f50 20 77 6f 75 6c 64 20 62 65 20 73 61 66 65 20 74   would be safe t
36f60 6f 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 61 74  o do anything at
36f70 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 74 6f  .      ** all to
36f80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
36f90 6c 65 20 65 78 63 65 70 74 20 74 72 75 6e 63 61  le except trunca
36fa0 74 65 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79  te it to zero by
36fb0 74 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  tes..      */.  
36fc0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
36fd0 54 45 5f 4f 4b 20 26 26 20 6e 46 72 6f 6d 50 61  TE_OK && nFromPa
36fe0 67 65 53 69 7a 65 3c 6e 54 6f 50 61 67 65 53 69  geSize<nToPageSi
36ff0 7a 65 20 26 26 20 69 53 69 7a 65 3e 69 50 65 6e  ze && iSize>iPen
37000 64 69 6e 67 29 7b 0a 20 20 20 20 20 20 20 20 69  ding){.        i
37010 36 34 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20  64 iOff;.       
37020 20 66 6f 72 28 0a 20 20 20 20 20 20 20 20 20 20   for(.          
37030 69 4f 66 66 3d 69 50 65 6e 64 69 6e 67 3b 20 0a  iOff=iPending; .
37040 20 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51            rc==SQ
37050 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4f 66 66 3c  LITE_OK && iOff<
37060 28 69 50 65 6e 64 69 6e 67 2b 6e 54 6f 50 61 67  (iPending+nToPag
37070 65 53 69 7a 65 29 3b 20 0a 20 20 20 20 20 20 20  eSize); .       
37080 20 20 20 69 4f 66 66 20 2b 3d 20 6e 46 72 6f 6d     iOff += nFrom
37090 50 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20 20  PageSize.       
370a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62   ){.          Db
370b0 50 61 67 65 20 2a 70 46 72 6f 6d 50 61 67 65 20  Page *pFromPage 
370c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 50  = 0;.          P
370d0 67 6e 6f 20 69 46 72 6f 6d 20 3d 20 28 69 4f 66  gno iFrom = (iOf
370e0 66 2f 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 29  f/nFromPageSize)
370f0 2b 31 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20  +1;.  .         
37100 20 69 66 28 20 69 46 72 6f 6d 3d 3d 50 45 4e 44   if( iFrom==PEND
37110 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
37120 74 46 72 6f 6d 29 20 7c 7c 20 69 46 72 6f 6d 3e  tFrom) || iFrom>
37130 6e 46 72 6f 6d 50 61 67 65 20 29 7b 0a 20 20 20  nFromPage ){.   
37140 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
37150 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
37160 20 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d   .          rc =
37170 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
37180 28 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72  (pBtFrom->pPager
37190 2c 20 69 46 72 6f 6d 2c 20 26 70 46 72 6f 6d 50  , iFrom, &pFromP
371a0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
371b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
371c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
371d0 20 63 68 61 72 20 2a 7a 46 72 6f 6d 20 3d 20 73   char *zFrom = s
371e0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
371f0 74 61 28 70 46 72 6f 6d 50 61 67 65 29 3b 0a 20  ta(pFromPage);. 
37200 20 09 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33   .  rc = sqlite3
37210 4f 73 57 72 69 74 65 28 70 46 69 6c 65 2c 20 7a  OsWrite(pFile, z
37220 46 72 6f 6d 2c 20 6e 46 72 6f 6d 50 61 67 65 53  From, nFromPageS
37230 69 7a 65 2c 20 69 4f 66 66 29 3b 0a 20 20 20 20  ize, iOff);.    
37240 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
37250 61 67 65 72 55 6e 72 65 66 28 70 46 72 6f 6d 50  agerUnref(pFromP
37260 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
37270 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
37280 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20    }.  .      /* 
37290 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73  Sync the databas
372a0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20  e file */.      
372b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
372c0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
372d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79  = sqlite3PagerSy
372e0 6e 63 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72  nc(pBtTo->pPager
372f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
37300 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
37310 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
37320 6e 63 61 74 65 28 70 42 74 54 6f 2d 3e 70 50 61  ncate(pBtTo->pPa
37330 67 65 72 2c 20 6e 4e 65 77 50 61 67 65 29 3b 0a  ger, nNewPage);.
37340 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
37350 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
37360 20 20 20 20 20 70 42 74 54 6f 2d 3e 70 61 67 65       pBtTo->page
37370 53 69 7a 65 46 69 78 65 64 20 3d 20 30 3b 0a 20  SizeFixed = 0;. 
37380 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
37390 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rc ){.    sqlite
373a0 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70  3BtreeRollback(p
373b0 54 6f 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  To);.  }..  retu
373c0 72 6e 20 72 63 3b 20 20 0a 7d 0a 69 6e 74 20 73  rn rc;  .}.int s
373d0 71 6c 69 74 65 33 42 74 72 65 65 43 6f 70 79 46  qlite3BtreeCopyF
373e0 69 6c 65 28 42 74 72 65 65 20 2a 70 54 6f 2c 20  ile(Btree *pTo, 
373f0 42 74 72 65 65 20 2a 70 46 72 6f 6d 29 7b 0a 20  Btree *pFrom){. 
37400 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
37410 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 54 6f  e3BtreeEnter(pTo
37420 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
37430 65 45 6e 74 65 72 28 70 46 72 6f 6d 29 3b 0a 20  eEnter(pFrom);. 
37440 20 72 63 20 3d 20 62 74 72 65 65 43 6f 70 79 46   rc = btreeCopyF
37450 69 6c 65 28 70 54 6f 2c 20 70 46 72 6f 6d 29 3b  ile(pTo, pFrom);
37460 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
37470 65 61 76 65 28 70 46 72 6f 6d 29 3b 0a 20 20 73  eave(pFrom);.  s
37480 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
37490 28 70 54 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pTo);.  return 
374a0 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  rc;.}..#endif /*
374b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43   SQLITE_OMIT_VAC
374c0 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  UUM */../*.** Re
374d0 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
374e0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
374f0 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74  s active..*/.int
37500 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
37510 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 29  nTrans(Btree *p)
37520 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  {.  assert( p==0
37530 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65   || sqlite3_mute
37540 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
37550 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e  tex) );.  return
37560 20 28 70 20 26 26 20 28 70 2d 3e 69 6e 54 72 61   (p && (p->inTra
37570 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  ns==TRANS_WRITE)
37580 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
37590 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61  rn non-zero if a
375a0 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
375b0 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
375c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
375d0 42 74 72 65 65 49 73 49 6e 53 74 6d 74 28 42 74  BtreeIsInStmt(Bt
375e0 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  ree *p){.  asser
375f0 74 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48  t( sqlite3BtreeH
37600 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a  oldsMutex(p) );.
37610 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 70 42 74    return (p->pBt
37620 20 26 26 20 70 2d 3e 70 42 74 2d 3e 69 6e 53 74   && p->pBt->inSt
37630 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  mt);.}../*.** Re
37640 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
37650 20 61 20 72 65 61 64 20 28 6f 72 20 77 72 69 74   a read (or writ
37660 65 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  e) transaction i
37670 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74  s active..*/.int
37680 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
37690 6e 52 65 61 64 54 72 61 6e 73 28 42 74 72 65 65  nReadTrans(Btree
376a0 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
376b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
376c0 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
376d0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20   );.  return (p 
376e0 26 26 20 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  && (p->inTrans!=
376f0 54 52 41 4e 53 5f 4e 4f 4e 45 29 29 3b 0a 7d 0a  TRANS_NONE));.}.
37700 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
37710 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70  tion returns a p
37720 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 6c 6f 62  ointer to a blob
37730 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63   of memory assoc
37740 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20  iated with.** a 
37750 73 69 6e 67 6c 65 20 73 68 61 72 65 64 2d 62 74  single shared-bt
37760 72 65 65 2e 20 54 68 65 20 6d 65 6d 6f 72 79 20  ree. The memory 
37770 69 73 20 75 73 65 64 20 62 79 20 63 6c 69 65 6e  is used by clien
37780 74 20 63 6f 64 65 20 66 6f 72 20 69 74 73 20 6f  t code for its o
37790 77 6e 0a 2a 2a 20 70 75 72 70 6f 73 65 73 20 28  wn.** purposes (
377a0 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20  for example, to 
377b0 73 74 6f 72 65 20 61 20 68 69 67 68 2d 6c 65 76  store a high-lev
377c0 65 6c 20 73 63 68 65 6d 61 20 61 73 73 6f 63 69  el schema associ
377d0 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68  ated with .** th
377e0 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 29 2e  e shared-btree).
377f0 20 54 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   The btree layer
37800 20 6d 61 6e 61 67 65 73 20 72 65 66 65 72 65 6e   manages referen
37810 63 65 20 63 6f 75 6e 74 69 6e 67 20 69 73 73 75  ce counting issu
37820 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  es..**.** The fi
37830 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 69 73  rst time this is
37840 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61   called on a sha
37850 72 65 64 2d 62 74 72 65 65 2c 20 6e 42 79 74 65  red-btree, nByte
37860 73 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72  s bytes of memor
37870 79 0a 2a 2a 20 61 72 65 20 61 6c 6c 6f 63 61 74  y.** are allocat
37880 65 64 2c 20 7a 65 72 6f 65 64 2c 20 61 6e 64 20  ed, zeroed, and 
37890 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
378a0 63 61 6c 6c 65 72 2e 20 46 6f 72 20 65 61 63 68  caller. For each
378b0 20 73 75 62 73 65 71 75 65 6e 74 20 0a 2a 2a 20   subsequent .** 
378c0 63 61 6c 6c 20 74 68 65 20 6e 42 79 74 65 73 20  call the nBytes 
378d0 70 61 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e  parameter is ign
378e0 6f 72 65 64 20 61 6e 64 20 61 20 70 6f 69 6e 74  ored and a point
378f0 65 72 20 74 6f 20 74 68 65 20 73 61 6d 65 20 62  er to the same b
37900 6c 6f 62 0a 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79  lob.** of memory
37910 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 0a 2a   returned. .**.*
37920 2a 20 49 66 20 74 68 65 20 6e 42 79 74 65 73 20  * If the nBytes 
37930 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 20 61  parameter is 0 a
37940 6e 64 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d  nd the blob of m
37950 65 6d 6f 72 79 20 68 61 73 20 6e 6f 74 20 79 65  emory has not ye
37960 74 20 62 65 65 6e 0a 2a 2a 20 61 6c 6c 6f 63 61  t been.** alloca
37970 74 65 64 2c 20 61 20 6e 75 6c 6c 20 70 6f 69 6e  ted, a null poin
37980 74 65 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ter is returned.
37990 20 49 66 20 74 68 65 20 62 6c 6f 62 20 68 61 73   If the blob has
379a0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a   already been.**
379b0 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69   allocated, it i
379c0 73 20 72 65 74 75 72 6e 65 64 20 61 73 20 6e 6f  s returned as no
379d0 72 6d 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4a 75 73 74  rmal..**.** Just
379e0 20 62 65 66 6f 72 65 20 74 68 65 20 73 68 61 72   before the shar
379f0 65 64 2d 62 74 72 65 65 20 69 73 20 63 6c 6f 73  ed-btree is clos
37a00 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ed, the function
37a10 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 0a   passed as the .
37a20 2a 2a 20 78 46 72 65 65 20 61 72 67 75 6d 65 6e  ** xFree argumen
37a30 74 20 77 68 65 6e 20 74 68 65 20 6d 65 6d 6f 72  t when the memor
37a40 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 77 61 73  y allocation was
37a50 20 6d 61 64 65 20 69 73 20 69 6e 76 6f 6b 65 64   made is invoked
37a60 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 62 6c 6f 62   on the .** blob
37a70 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65   of allocated me
37a80 6d 6f 72 79 2e 20 54 68 69 73 20 66 75 6e 63 74  mory. This funct
37a90 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63  ion should not c
37aa0 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  all sqlite3_free
37ab0 28 29 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 65 6d  ().** on the mem
37ac0 6f 72 79 2c 20 74 68 65 20 62 74 72 65 65 20 6c  ory, the btree l
37ad0 61 79 65 72 20 64 6f 65 73 20 74 68 61 74 2e 0a  ayer does that..
37ae0 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
37af0 42 74 72 65 65 53 63 68 65 6d 61 28 42 74 72 65  BtreeSchema(Btre
37b00 65 20 2a 70 2c 20 69 6e 74 20 6e 42 79 74 65 73  e *p, int nBytes
37b10 2c 20 76 6f 69 64 28 2a 78 46 72 65 65 29 28 76  , void(*xFree)(v
37b20 6f 69 64 20 2a 29 29 7b 0a 20 20 42 74 53 68 61  oid *)){.  BtSha
37b30 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
37b40 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  t;.  sqlite3Btre
37b50 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28  eEnter(p);.  if(
37b60 20 21 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 26   !pBt->pSchema &
37b70 26 20 6e 42 79 74 65 73 20 29 7b 0a 20 20 20 20  & nBytes ){.    
37b80 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 3d 20 73  pBt->pSchema = s
37b90 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
37ba0 28 6e 42 79 74 65 73 29 3b 0a 20 20 20 20 70 42  (nBytes);.    pB
37bb0 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 3d  t->xFreeSchema =
37bc0 20 78 46 72 65 65 3b 0a 20 20 7d 0a 20 20 73 71   xFree;.  }.  sq
37bd0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
37be0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 74  p);.  return pBt
37bf0 2d 3e 70 53 63 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a  ->pSchema;.}../*
37c00 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
37c10 69 66 20 61 6e 6f 74 68 65 72 20 75 73 65 72 20  if another user 
37c20 6f 66 20 74 68 65 20 73 61 6d 65 20 73 68 61 72  of the same shar
37c30 65 64 20 62 74 72 65 65 20 61 73 20 74 68 65 20  ed btree as the 
37c40 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 68 61 6e 64  argument.** hand
37c50 6c 65 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c  le holds an excl
37c60 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  usive lock on th
37c70 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  e sqlite_master 
37c80 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  table..*/.int sq
37c90 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61  lite3BtreeSchema
37ca0 4c 6f 63 6b 65 64 28 42 74 72 65 65 20 2a 70 29  Locked(Btree *p)
37cb0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
37cc0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
37cd0 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
37ce0 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
37cf0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
37d00 3b 0a 20 20 72 63 20 3d 20 28 71 75 65 72 79 54  ;.  rc = (queryT
37d10 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54  ableLock(p, MAST
37d20 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f  ER_ROOT, READ_LO
37d30 43 4b 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 3b  CK)!=SQLITE_OK);
37d40 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
37d50 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
37d60 6e 20 72 63 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65  n rc;.}...#ifnde
37d70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
37d80 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a  ARED_CACHE./*.**
37d90 20 4f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   Obtain a lock o
37da0 6e 20 74 68 65 20 74 61 62 6c 65 20 77 68 6f 73  n the table whos
37db0 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 69  e root page is i
37dc0 54 61 62 2e 20 20 54 68 65 0a 2a 2a 20 6c 6f 63  Tab.  The.** loc
37dd0 6b 20 69 73 20 61 20 77 72 69 74 65 20 6c 6f 63  k is a write loc
37de0 6b 20 69 66 20 69 73 57 72 69 74 65 6c 6f 63 6b  k if isWritelock
37df0 20 69 73 20 74 72 75 65 20 6f 72 20 61 20 72 65   is true or a re
37e00 61 64 20 6c 6f 63 6b 0a 2a 2a 20 69 66 20 69 74  ad lock.** if it
37e10 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e   is false..*/.in
37e20 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 6f  t sqlite3BtreeLo
37e30 63 6b 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  ckTable(Btree *p
37e40 2c 20 69 6e 74 20 69 54 61 62 2c 20 75 38 20 69  , int iTab, u8 i
37e50 73 57 72 69 74 65 4c 6f 63 6b 29 7b 0a 20 20 69  sWriteLock){.  i
37e60 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
37e70 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72  K;.  if( p->shar
37e80 61 62 6c 65 20 29 7b 0a 20 20 20 20 75 38 20 6c  able ){.    u8 l
37e90 6f 63 6b 54 79 70 65 20 3d 20 52 45 41 44 5f 4c  ockType = READ_L
37ea0 4f 43 4b 20 2b 20 69 73 57 72 69 74 65 4c 6f 63  OCK + isWriteLoc
37eb0 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 52  k;.    assert( R
37ec0 45 41 44 5f 4c 4f 43 4b 2b 31 3d 3d 57 52 49 54  EAD_LOCK+1==WRIT
37ed0 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73  E_LOCK );.    as
37ee0 73 65 72 74 28 20 69 73 57 72 69 74 65 4c 6f 63  sert( isWriteLoc
37ef0 6b 3d 3d 30 20 7c 7c 20 69 73 57 72 69 74 65 4c  k==0 || isWriteL
37f00 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 20 20 73 71  ock==1 );.    sq
37f10 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
37f20 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 71 75 65  p);.    rc = que
37f30 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69  ryTableLock(p, i
37f40 54 61 62 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a  Tab, lockType);.
37f50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
37f60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
37f70 63 20 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70 2c  c = lockTable(p,
37f80 20 69 54 61 62 2c 20 6c 6f 63 6b 54 79 70 65 29   iTab, lockType)
37f90 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
37fa0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
37fb0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
37fc0 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  c;.}.#endif..#if
37fd0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
37fe0 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20  _INCRBLOB./*.** 
37ff0 41 72 67 75 6d 65 6e 74 20 70 43 73 72 20 6d 75  Argument pCsr mu
38000 73 74 20 62 65 20 61 20 63 75 72 73 6f 72 20 6f  st be a cursor o
38010 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e  pened for writin
38020 67 20 6f 6e 20 61 6e 20 0a 2a 2a 20 49 4e 54 4b  g on an .** INTK
38030 45 59 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74  EY table current
38040 6c 79 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ly pointing at a
38050 20 76 61 6c 69 64 20 74 61 62 6c 65 20 65 6e 74   valid table ent
38060 72 79 2e 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ry. .** This fun
38070 63 74 69 6f 6e 20 6d 6f 64 69 66 69 65 73 20 74  ction modifies t
38080 68 65 20 64 61 74 61 20 73 74 6f 72 65 64 20 61  he data stored a
38090 73 20 70 61 72 74 20 6f 66 20 74 68 61 74 20 65  s part of that e
380a0 6e 74 72 79 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68  ntry..** Only th
380b0 65 20 64 61 74 61 20 63 6f 6e 74 65 6e 74 20 6d  e data content m
380c0 61 79 20 6f 6e 6c 79 20 62 65 20 6d 6f 64 69 66  ay only be modif
380d0 69 65 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 70  ied, it is not p
380e0 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 63 68  ossible.** to ch
380f0 61 6e 67 65 20 74 68 65 20 6c 65 6e 67 74 68 20  ange the length 
38100 6f 66 20 74 68 65 20 64 61 74 61 20 73 74 6f 72  of the data stor
38110 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
38120 65 33 42 74 72 65 65 50 75 74 44 61 74 61 28 42  e3BtreePutData(B
38130 74 43 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 75  tCursor *pCsr, u
38140 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
38150 6d 74 2c 20 76 6f 69 64 20 2a 7a 29 7b 0a 20 20  mt, void *z){.  
38160 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
38170 6c 64 73 4d 75 74 65 78 28 70 43 73 72 29 20 29  ldsMutex(pCsr) )
38180 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
38190 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
381a0 43 73 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Csr->pBtree->db-
381b0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
381c0 65 72 74 28 70 43 73 72 2d 3e 69 73 49 6e 63 72  ert(pCsr->isIncr
381d0 62 6c 6f 62 48 61 6e 64 6c 65 29 3b 0a 0a 20 20  blobHandle);..  
381e0 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
381f0 69 74 69 6f 6e 28 70 43 73 72 29 3b 0a 20 20 61  ition(pCsr);.  a
38200 73 73 65 72 74 28 20 70 43 73 72 2d 3e 65 53 74  ssert( pCsr->eSt
38210 61 74 65 21 3d 43 55 52 53 4f 52 5f 52 45 51 55  ate!=CURSOR_REQU
38220 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28  IRESEEK );.  if(
38230 20 70 43 73 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCsr->eState!=C
38240 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
38250 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
38260 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 0a 20 20 2f  _ABORT;.  }..  /
38270 2a 20 43 68 65 63 6b 20 73 6f 6d 65 20 70 72 65  * Check some pre
38280 63 6f 6e 64 69 74 69 6f 6e 73 3a 20 0a 20 20 2a  conditions: .  *
38290 2a 20 20 20 28 61 29 20 74 68 65 20 63 75 72 73  *   (a) the curs
382a0 6f 72 20 69 73 20 6f 70 65 6e 20 66 6f 72 20 77  or is open for w
382b0 72 69 74 69 6e 67 2c 0a 20 20 2a 2a 20 20 20 28  riting,.  **   (
382c0 62 29 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72  b) there is no r
382d0 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead-lock on the 
382e0 74 61 62 6c 65 20 62 65 69 6e 67 20 6d 6f 64 69  table being modi
382f0 66 69 65 64 20 61 6e 64 0a 20 20 2a 2a 20 20 20  fied and.  **   
38300 28 63 29 20 74 68 65 20 63 75 72 73 6f 72 20 70  (c) the cursor p
38310 6f 69 6e 74 73 20 61 74 20 61 20 76 61 6c 69 64  oints at a valid
38320 20 72 6f 77 20 6f 66 20 61 6e 20 69 6e 74 4b 65   row of an intKe
38330 79 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  y table..  */.  
38340 69 66 28 20 21 70 43 73 72 2d 3e 77 72 46 6c 61  if( !pCsr->wrFla
38350 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  g ){.    return 
38360 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
38370 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
38380 70 43 73 72 2d 3e 70 42 74 2d 3e 72 65 61 64 4f  pCsr->pBt->readO
38390 6e 6c 79 20 0a 20 20 20 20 20 20 20 20 20 20 26  nly .          &
383a0 26 20 70 43 73 72 2d 3e 70 42 74 2d 3e 69 6e 54  & pCsr->pBt->inT
383b0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
383c0 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28  S_WRITE );.  if(
383d0 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28   checkReadLocks(
383e0 70 43 73 72 2d 3e 70 42 74 72 65 65 2c 20 70 43  pCsr->pBtree, pC
383f0 73 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  sr->pgnoRoot, pC
38400 73 72 2c 20 30 29 20 29 7b 0a 20 20 20 20 72 65  sr, 0) ){.    re
38410 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
38420 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c 65  ED; /* The table
38430 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20   pCur points to 
38440 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
38450 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 73  */.  }.  if( pCs
38460 72 2d 3e 65