/ Hex Artifact Content
Login

Artifact 6d25027de7c26b1c0a69ad3f2045f944e20fba22:


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 36 39 20 32 30 30 38 2f 30  c,v 1.469 2008/0
0190: 36 2f 32 33 20 30 39 3a 35 30 3a 35 31 20 64 61  6/23 09:50:51 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 53 51 4c 49 54 45 5f 54 45  */.#if SQLITE_TE
0390: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  ST.int sqlite3Bt
03a0: 72 65 65 54 72 61 63 65 3d 30 3b 20 20 2f 2a 20  reeTrace=0;  /* 
03b0: 54 72 75 65 20 74 6f 20 65 6e 61 62 6c 65 20 74  True to enable t
03c0: 72 61 63 69 6e 67 20 2a 2f 0a 23 65 6e 64 69 66  racing */.#endif
03d0: 0a 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ....#ifndef SQLI
03e0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
03f0: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 66 6c 61  ACHE./*.** A fla
0400: 67 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68  g to indicate wh
0410: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 73 68 61  ether or not sha
0420: 72 65 64 20 63 61 63 68 65 20 69 73 20 65 6e 61  red cache is ena
0430: 62 6c 65 64 2e 20 20 41 6c 73 6f 2c 0a 2a 2a 20  bled.  Also,.** 
0440: 61 20 6c 69 73 74 20 6f 66 20 42 74 53 68 61 72  a list of BtShar
0450: 65 64 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20  ed objects that 
0460: 61 72 65 20 65 6c 69 67 69 62 6c 65 20 66 6f 72  are eligible for
0470: 20 70 61 72 74 69 63 69 70 61 74 69 6f 6e 0a 2a   participation.*
0480: 2a 20 69 6e 20 73 68 61 72 65 64 20 63 61 63 68  * in shared cach
0490: 65 2e 20 20 54 68 65 20 76 61 72 69 61 62 6c 65  e.  The variable
04a0: 73 20 68 61 76 65 20 66 69 6c 65 20 73 63 6f 70  s have file scop
04b0: 65 20 64 75 72 69 6e 67 20 6e 6f 72 6d 61 6c 20  e during normal 
04c0: 62 75 69 6c 64 73 2c 0a 2a 2a 20 62 75 74 20 74  builds,.** but t
04d0: 68 65 20 74 65 73 74 20 68 61 72 6e 65 73 73 20  he test harness 
04e0: 6e 65 65 64 73 20 74 6f 20 61 63 63 65 73 73 20  needs to access 
04f0: 74 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  these variables 
0500: 73 6f 20 77 65 20 6d 61 6b 65 20 74 68 65 6d 0a  so we make them.
0510: 2a 2a 20 67 6c 6f 62 61 6c 20 66 6f 72 20 74 65  ** global for te
0520: 73 74 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69  st builds..*/.#i
0530: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
0540: 0a 42 74 53 68 61 72 65 64 20 2a 73 71 6c 69 74  .BtShared *sqlit
0550: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
0560: 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74  t = 0;.int sqlit
0570: 65 33 53 68 61 72 65 64 43 61 63 68 65 45 6e 61  e3SharedCacheEna
0580: 62 6c 65 64 20 3d 20 30 3b 0a 23 65 6c 73 65 0a  bled = 0;.#else.
0590: 73 74 61 74 69 63 20 42 74 53 68 61 72 65 64 20  static BtShared 
05a0: 2a 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  *sqlite3SharedCa
05b0: 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 73 74 61  cheList = 0;.sta
05c0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 53  tic int sqlite3S
05d0: 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65  haredCacheEnable
05e0: 64 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65  d = 0;.#endif.#e
05f0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
0600: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
0610: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
0620: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
0630: 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62  CACHE./*.** Enab
0640: 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68  le or disable th
0650: 65 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61  e shared pager a
0660: 6e 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72  nd schema featur
0670: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  es..**.** This r
0680: 6f 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66  outine has no ef
0690: 66 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67  fect on existing
06a0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
06b0: 74 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68  tions..** The sh
06c0: 61 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69  ared cache setti
06d0: 6e 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20  ng effects only 
06e0: 66 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a  future calls to.
06f0: 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  ** sqlite3_open(
0700: 29 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  ), sqlite3_open1
0710: 36 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f  6(), or sqlite3_
0720: 6f 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e  open_v2()..*/.in
0730: 74 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  t sqlite3_enable
0740: 5f 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e  _shared_cache(in
0750: 74 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c  t enable){.  sql
0760: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 45  ite3SharedCacheE
0770: 6e 61 62 6c 65 64 20 3d 20 65 6e 61 62 6c 65 3b  nabled = enable;
0780: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
0790: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  _OK;.}.#endif...
07a0: 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65  /*.** Forward de
07b0: 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  claration.*/.sta
07c0: 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52 65 61  tic int checkRea
07d0: 64 4c 6f 63 6b 73 28 42 74 72 65 65 2a 2c 20 50  dLocks(Btree*, P
07e0: 67 6e 6f 2c 20 42 74 43 75 72 73 6f 72 2a 2c 20  gno, BtCursor*, 
07f0: 69 36 34 29 3b 0a 0a 0a 23 69 66 64 65 66 20 53  i64);...#ifdef S
0800: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0810: 44 5f 43 41 43 48 45 0a 20 20 2f 2a 0a 20 20 2a  D_CACHE.  /*.  *
0820: 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 73 20  * The functions 
0830: 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 29  queryTableLock()
0840: 2c 20 6c 6f 63 6b 54 61 62 6c 65 28 29 20 61 6e  , lockTable() an
0850: 64 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65  d unlockAllTable
0860: 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70 75 6c  s().  ** manipul
0870: 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74  ate entries in t
0880: 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f 63  he BtShared.pLoc
0890: 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 75 73  k linked list us
08a0: 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 2a 2a  ed to store.  **
08b0: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 74 61   shared-cache ta
08c0: 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 73 2e  ble level locks.
08d0: 20 49 66 20 74 68 65 20 6c 69 62 72 61 72 79 20   If the library 
08e0: 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  is compiled with
08f0: 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72 65 64   the.  ** shared
0900: 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20 64  -cache feature d
0910: 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68  isabled, then th
0920: 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65 72  ere is only ever
0930: 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a 20 6f   one user.  ** o
0940: 66 20 65 61 63 68 20 42 74 53 68 61 72 65 64 20  f each BtShared 
0950: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 73 6f  structure and so
0960: 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 69 73   this locking is
0970: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20   not necessary. 
0980: 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e 65 20  .  ** So define 
0990: 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74 65 64  the lock related
09a0: 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 6e 6f   functions as no
09b0: 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23 64 65  -ops..  */.  #de
09c0: 66 69 6e 65 20 71 75 65 72 79 54 61 62 6c 65 4c  fine queryTableL
09d0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
09e0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 6c  E_OK.  #define l
09f0: 6f 63 6b 54 61 62 6c 65 28 61 2c 62 2c 63 29 20  ockTable(a,b,c) 
0a00: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
0a10: 69 6e 65 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62  ine unlockAllTab
0a20: 6c 65 73 28 61 29 0a 23 65 6e 64 69 66 0a 0a 23  les(a).#endif..#
0a30: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0a40: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
0a50: 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f 20 73  /*.** Query to s
0a60: 65 65 20 69 66 20 62 74 72 65 65 20 68 61 6e 64  ee if btree hand
0a70: 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69 6e 20  le p may obtain 
0a80: 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 65  a lock of type e
0a90: 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44 5f 4c  Lock .** (READ_L
0aa0: 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43  OCK or WRITE_LOC
0ab0: 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  K) on the table 
0ac0: 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69  with root-page i
0ad0: 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 53  Tab. Return.** S
0ae0: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65 20  QLITE_OK if the 
0af0: 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62 74 61  lock may be obta
0b00: 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69 6e 67  ined (by calling
0b10: 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29 2c 20 6f   lockTable()), o
0b20: 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  r.** SQLITE_LOCK
0b30: 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74  ED if not..*/.st
0b40: 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 54 61  atic int queryTa
0b50: 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70  bleLock(Btree *p
0b60: 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75 38 20  , Pgno iTab, u8 
0b70: 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72  eLock){.  BtShar
0b80: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
0b90: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65  ;.  BtLock *pIte
0ba0: 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  r;..  assert( sq
0bb0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
0bc0: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 0a 20 20  utex(p) );.  .  
0bd0: 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  /* This is a no-
0be0: 6f 70 20 69 66 20 74 68 65 20 73 68 61 72 65 64  op if the shared
0bf0: 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e  -cache is not en
0c00: 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21  abled */.  if( !
0c10: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
0c20: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
0c30: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  _OK;.  }..  /* I
0c40: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e  f some other con
0c50: 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69  nection is holdi
0c60: 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ng an exclusive 
0c70: 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72  lock, the.  ** r
0c80: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61  equested lock ma
0c90: 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65  y not be obtaine
0ca0: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  d..  */.  if( pB
0cb0: 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 20 26 26  t->pExclusive &&
0cc0: 20 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65   pBt->pExclusive
0cd0: 21 3d 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=p ){.    retur
0ce0: 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b  n SQLITE_LOCKED;
0cf0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20  .  }..  /* This 
0d00: 28 61 6c 6f 6e 67 20 77 69 74 68 20 6c 6f 63 6b  (along with lock
0d10: 54 61 62 6c 65 28 29 29 20 69 73 20 77 68 65 72  Table()) is wher
0d20: 65 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d  e the ReadUncomm
0d30: 69 74 74 65 64 20 66 6c 61 67 20 69 73 0a 20 20  itted flag is.  
0d40: 2a 2a 20 64 65 61 6c 74 20 77 69 74 68 2e 20 49  ** dealt with. I
0d50: 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  f the caller is 
0d60: 71 75 65 72 79 69 6e 67 20 66 6f 72 20 61 20 72  querying for a r
0d70: 65 61 64 2d 6c 6f 63 6b 20 61 6e 64 20 74 68 65  ead-lock and the
0d80: 20 66 6c 61 67 20 69 73 0a 20 20 2a 2a 20 73 65   flag is.  ** se
0d90: 74 2c 20 69 74 20 69 73 20 75 6e 63 6f 6e 64 69  t, it is uncondi
0da0: 74 69 6f 6e 61 6c 6c 79 20 67 72 61 6e 74 65 64  tionally granted
0db0: 20 2d 20 65 76 65 6e 20 69 66 20 74 68 65 72 65   - even if there
0dc0: 20 61 72 65 20 77 72 69 74 65 2d 6c 6f 63 6b 73   are write-locks
0dd0: 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 74 61 62  .  ** on the tab
0de0: 6c 65 2e 20 49 66 20 61 20 77 72 69 74 65 2d 6c  le. If a write-l
0df0: 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
0e00: 2c 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d  , the ReadUncomm
0e10: 69 74 74 65 64 20 66 6c 61 67 0a 20 20 2a 2a 20  itted flag.  ** 
0e20: 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65  is not considere
0e30: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20  d..  **.  ** In 
0e40: 66 75 6e 63 74 69 6f 6e 20 6c 6f 63 6b 54 61 62  function lockTab
0e50: 6c 65 28 29 2c 20 69 66 20 61 20 72 65 61 64 2d  le(), if a read-
0e60: 6c 6f 63 6b 20 69 73 20 64 65 6d 61 6e 64 65 64  lock is demanded
0e70: 20 61 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 52   and the .  ** R
0e80: 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66  eadUncommitted f
0e90: 6c 61 67 20 69 73 20 73 65 74 2c 20 6e 6f 20 65  lag is set, no e
0ea0: 6e 74 72 79 20 69 73 20 61 64 64 65 64 20 74 6f  ntry is added to
0eb0: 20 74 68 65 20 6c 6f 63 6b 73 20 6c 69 73 74 20   the locks list 
0ec0: 0a 20 20 2a 2a 20 28 42 74 53 68 61 72 65 64 2e  .  ** (BtShared.
0ed0: 70 4c 6f 63 6b 29 2e 0a 20 20 2a 2a 0a 20 20 2a  pLock)..  **.  *
0ee0: 2a 20 54 6f 20 73 75 6d 6d 61 72 69 7a 65 3a 20  * To summarize: 
0ef0: 49 66 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d  If the ReadUncom
0f00: 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 73  mitted flag is s
0f10: 65 74 2c 20 74 68 65 6e 20 72 65 61 64 20 63 75  et, then read cu
0f20: 72 73 6f 72 73 20 64 6f 0a 20 20 2a 2a 20 6e 6f  rsors do.  ** no
0f30: 74 20 63 72 65 61 74 65 20 6f 72 20 72 65 73 70  t create or resp
0f40: 65 63 74 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2e  ect table locks.
0f50: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 6f   The locking pro
0f60: 63 65 64 75 72 65 20 66 6f 72 20 61 20 0a 20 20  cedure for a .  
0f70: 2a 2a 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20  ** write-cursor 
0f80: 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 2e  does not change.
0f90: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20  .  */.  if( .   
0fa0: 20 21 70 2d 3e 64 62 20 7c 7c 20 0a 20 20 20 20   !p->db || .    
0fb0: 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  0==(p->db->flags
0fc0: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
0fd0: 6d 6d 69 74 74 65 64 29 20 7c 7c 20 0a 20 20 20  mmitted) || .   
0fe0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
0ff0: 43 4b 20 7c 7c 0a 20 20 20 20 69 54 61 62 3d 3d  CK ||.    iTab==
1000: 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20 20 29 7b  MASTER_ROOT.  ){
1010: 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70  .    for(pIter=p
1020: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72  Bt->pLock; pIter
1030: 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70  ; pIter=pIter->p
1040: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
1050: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d   pIter->pBtree!=
1060: 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61 62  p && pIter->iTab
1070: 6c 65 3d 3d 69 54 61 62 20 26 26 20 0a 20 20 20  le==iTab && .   
1080: 20 20 20 20 20 20 20 28 70 49 74 65 72 2d 3e 65         (pIter->e
1090: 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20 7c 7c 20 65  Lock!=eLock || e
10a0: 4c 6f 63 6b 21 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock!=READ_LOCK)
10b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
10c0: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
10d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
10f0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
1100: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
1110: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
1120: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1130: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
1140: 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  HE./*.** Add a l
1150: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
1160: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
1170: 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73 68  iTable to the sh
1180: 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64 0a  ared-btree used.
1190: 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e 64  ** by Btree hand
11a0: 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72 20  le p. Parameter 
11b0: 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65 69  eLock must be ei
11c0: 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f  ther READ_LOCK o
11d0: 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b  r .** WRITE_LOCK
11e0: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
11f0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
1200: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64   the lock is add
1210: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
1220: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64   SQLITE_BUSY and
1230: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
1240: 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 72 65 74   may also be ret
1250: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
1260: 20 69 6e 74 20 6c 6f 63 6b 54 61 62 6c 65 28 42   int lockTable(B
1270: 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54  tree *p, Pgno iT
1280: 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b  able, u8 eLock){
1290: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
12a0: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c   = p->pBt;.  BtL
12b0: 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a  ock *pLock = 0;.
12c0: 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b    BtLock *pIter;
12d0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
12e0: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
12f0: 65 78 28 70 29 20 29 3b 0a 0a 20 20 2f 2a 20 54  ex(p) );..  /* T
1300: 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  his is a no-op i
1310: 66 20 74 68 65 20 73 68 61 72 65 64 2d 63 61 63  f the shared-cac
1320: 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65  he is not enable
1330: 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 73  d */.  if( !p->s
1340: 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 72  harable ){.    r
1350: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1360: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1370: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79  SQLITE_OK==query
1380: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
1390: 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a  ble, eLock) );..
13a0: 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61 64    /* If the read
13b0: 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  -uncommitted fla
13c0: 67 20 69 73 20 73 65 74 20 61 6e 64 20 61 20 72  g is set and a r
13d0: 65 61 64 2d 6c 6f 63 6b 20 69 73 20 72 65 71 75  ead-lock is requ
13e0: 65 73 74 65 64 2c 0a 20 20 2a 2a 20 72 65 74 75  ested,.  ** retu
13f0: 72 6e 20 65 61 72 6c 79 20 77 69 74 68 6f 75 74  rn early without
1400: 20 61 64 64 69 6e 67 20 61 6e 20 65 6e 74 72 79   adding an entry
1410: 20 74 6f 20 74 68 65 20 42 74 53 68 61 72 65 64   to the BtShared
1420: 2e 70 4c 6f 63 6b 20 6c 69 73 74 2e 20 53 65 65  .pLock list. See
1430: 0a 20 20 2a 2a 20 63 6f 6d 6d 65 6e 74 20 69 6e  .  ** comment in
1440: 20 66 75 6e 63 74 69 6f 6e 20 71 75 65 72 79 54   function queryT
1450: 61 62 6c 65 4c 6f 63 6b 28 29 20 66 6f 72 20 6d  ableLock() for m
1460: 6f 72 65 20 69 6e 66 6f 20 6f 6e 20 68 61 6e 64  ore info on hand
1470: 6c 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 52  ling .  ** the R
1480: 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66  eadUncommitted f
1490: 6c 61 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  lag..  */.  if( 
14a0: 0a 20 20 20 20 28 70 2d 3e 64 62 29 20 26 26 20  .    (p->db) && 
14b0: 0a 20 20 20 20 28 70 2d 3e 64 62 2d 3e 66 6c 61  .    (p->db->fla
14c0: 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e  gs&SQLITE_ReadUn
14d0: 63 6f 6d 6d 69 74 74 65 64 29 20 26 26 20 0a 20  committed) && . 
14e0: 20 20 20 28 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f     (eLock==READ_
14f0: 4c 4f 43 4b 29 20 26 26 0a 20 20 20 20 69 54 61  LOCK) &&.    iTa
1500: 62 6c 65 21 3d 4d 41 53 54 45 52 5f 52 4f 4f 54  ble!=MASTER_ROOT
1510: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
1520: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1530: 0a 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72  .  /* First sear
1540: 63 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20  ch the list for 
1550: 61 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b  an existing lock
1560: 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20   on this table. 
1570: 2a 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70  */.  for(pIter=p
1580: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72  Bt->pLock; pIter
1590: 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70  ; pIter=pIter->p
15a0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
15b0: 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Iter->iTable==iT
15c0: 61 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70  able && pIter->p
15d0: 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20  Btree==p ){.    
15e0: 20 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b    pLock = pIter;
15f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1600: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
1610: 20 74 68 65 20 61 62 6f 76 65 20 73 65 61 72 63   the above searc
1620: 68 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61  h did not find a
1630: 20 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61   BtLock struct a
1640: 73 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65  ssociating Btree
1650: 20 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62   p.  ** with tab
1660: 6c 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63  le iTable, alloc
1670: 61 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b  ate one and link
1680: 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73   it into the lis
1690: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  t..  */.  if( !p
16a0: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63  Lock ){.    pLoc
16b0: 6b 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71  k = (BtLock *)sq
16c0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
16d0: 73 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b  sizeof(BtLock));
16e0: 0a 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20  .    if( !pLock 
16f0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1700: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1710: 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69    }.    pLock->i
1720: 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a  Table = iTable;.
1730: 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65      pLock->pBtre
1740: 65 20 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b  e = p;.    pLock
1750: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
1760: 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70  Lock;.    pBt->p
1770: 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20  Lock = pLock;.  
1780: 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
1790: 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72  BtLock.eLock var
17a0: 69 61 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78  iable to the max
17b0: 69 6d 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72  imum of the curr
17c0: 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e  ent lock.  ** an
17d0: 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  d the requested 
17e0: 6c 6f 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73  lock. This means
17f0: 20 69 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b   if a write-lock
1800: 20 77 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c   was already hel
1810: 64 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61  d.  ** and a rea
1820: 64 2d 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64  d-lock requested
1830: 2c 20 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72  , we don't incor
1840: 72 65 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65  rectly downgrade
1850: 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a   the lock..  */.
1860: 20 20 61 73 73 65 72 74 28 20 57 52 49 54 45 5f    assert( WRITE_
1870: 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29  LOCK>READ_LOCK )
1880: 3b 0a 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c  ;.  if( eLock>pL
1890: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20  ock->eLock ){.  
18a0: 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d    pLock->eLock =
18b0: 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72   eLock;.  }..  r
18c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18d0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51  .}.#endif /* !SQ
18e0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
18f0: 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64  _CACHE */..#ifnd
1900: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1910: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
1920: 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68  * Release all th
1930: 65 20 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c  e table locks (l
1940: 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69  ocks obtained vi
1950: 61 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 20 6c  a calls to the l
1960: 6f 63 6b 54 61 62 6c 65 28 29 0a 2a 2a 20 70 72  ockTable().** pr
1970: 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20 62 79  ocedure) held by
1980: 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e   Btree handle p.
1990: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
19a0: 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28  unlockAllTables(
19b0: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
19c0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
19d0: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a  pBt;.  BtLock **
19e0: 70 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70  ppIter = &pBt->p
19f0: 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28  Lock;..  assert(
1a00: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
1a10: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
1a20: 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61  assert( p->shara
1a30: 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65  ble || 0==*ppIte
1a40: 72 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a  r );..  while( *
1a50: 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74  ppIter ){.    Bt
1a60: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70  Lock *pLock = *p
1a70: 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72  pIter;.    asser
1a80: 74 28 20 70 42 74 2d 3e 70 45 78 63 6c 75 73 69  t( pBt->pExclusi
1a90: 76 65 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 45  ve==0 || pBt->pE
1aa0: 78 63 6c 75 73 69 76 65 3d 3d 70 4c 6f 63 6b 2d  xclusive==pLock-
1ab0: 3e 70 42 74 72 65 65 20 29 3b 0a 20 20 20 20 69  >pBtree );.    i
1ac0: 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65  f( pLock->pBtree
1ad0: 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  ==p ){.      *pp
1ae0: 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e  Iter = pLock->pN
1af0: 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ext;.      sqlit
1b00: 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a  e3_free(pLock);.
1b10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b20: 20 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b   ppIter = &pLock
1b30: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
1b40: 20 7d 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 70   }..  if( pBt->p
1b50: 45 78 63 6c 75 73 69 76 65 3d 3d 70 20 29 7b 0a  Exclusive==p ){.
1b60: 20 20 20 20 70 42 74 2d 3e 70 45 78 63 6c 75 73      pBt->pExclus
1b70: 69 76 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23  ive = 0;.  }.}.#
1b80: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1b90: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
1ba0: 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69  E */..static voi
1bb0: 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65  d releasePage(Me
1bc0: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20  mPage *pPage);  
1bd0: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
1be0: 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 56  ence */../*.** V
1bf0: 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63  erify that the c
1c00: 75 72 73 6f 72 20 68 6f 6c 64 73 20 61 20 6d 75  ursor holds a mu
1c10: 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61  tex on the BtSha
1c20: 72 65 64 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  red.*/.#ifndef N
1c30: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
1c40: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1c50: 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a  x(BtCursor *p){.
1c60: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1c70: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70  _mutex_held(p->p
1c80: 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65  Bt->mutex);.}.#e
1c90: 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53  ndif...#ifndef S
1ca0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
1cb0: 4c 4f 42 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69  LOB./*.** Invali
1cc0: 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  date the overflo
1cd0: 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
1ce0: 65 20 66 6f 72 20 63 75 72 73 6f 72 20 70 43 75  e for cursor pCu
1cf0: 72 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74  r, if any..*/.st
1d00: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
1d10: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
1d20: 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
1d30: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
1d40: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1d50: 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ur) );.  sqlite3
1d60: 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 4f 76 65  _free(pCur->aOve
1d70: 72 66 6c 6f 77 29 3b 0a 20 20 70 43 75 72 2d 3e  rflow);.  pCur->
1d80: 61 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d  aOverflow = 0;.}
1d90: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61  ../*.** Invalida
1da0: 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
1db0: 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
1dc0: 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  for all cursors 
1dd0: 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65  opened.** on the
1de0: 20 73 68 61 72 65 64 20 62 74 72 65 65 20 73 74   shared btree st
1df0: 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a  ructure pBt..*/.
1e00: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61  static void inva
1e10: 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
1e20: 77 43 61 63 68 65 28 42 74 53 68 61 72 65 64 20  wCache(BtShared 
1e30: 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f  *pBt){.  BtCurso
1e40: 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  r *p;.  assert( 
1e50: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1e60: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
1e70: 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
1e80: 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
1e90: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 76 61  pNext){.    inva
1ea0: 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61  lidateOverflowCa
1eb0: 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65  che(p);.  }.}.#e
1ec0: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 69 6e  lse.  #define in
1ed0: 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
1ee0: 43 61 63 68 65 28 78 29 0a 20 20 23 64 65 66 69  Cache(x).  #defi
1ef0: 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c  ne invalidateAll
1f00: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 78 29  OverflowCache(x)
1f10: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53  .#endif../*.** S
1f20: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
1f30: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
1f40: 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  in the variables
1f50: 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a   BtCursor.nKey .
1f60: 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  ** and BtCursor.
1f70: 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72  pKey. The cursor
1f80: 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20  's state is set 
1f90: 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  to CURSOR_REQUIR
1fa0: 45 53 45 45 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  ESEEK..*/.static
1fb0: 20 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50   int saveCursorP
1fc0: 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72  osition(BtCursor
1fd0: 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
1fe0: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55  c;..  assert( CU
1ff0: 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72  RSOR_VALID==pCur
2000: 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73  ->eState );.  as
2010: 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70  sert( 0==pCur->p
2020: 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
2030: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
2040: 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 72 63  x(pCur) );..  rc
2050: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b   = sqlite3BtreeK
2060: 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 70 43  eySize(pCur, &pC
2070: 75 72 2d 3e 6e 4b 65 79 29 3b 0a 0a 20 20 2f 2a  ur->nKey);..  /*
2080: 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   If this is an i
2090: 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20 74 68 65  ntKey table, the
20a0: 6e 20 74 68 65 20 61 62 6f 76 65 20 63 61 6c 6c  n the above call
20b0: 20 74 6f 20 42 74 72 65 65 4b 65 79 53 69 7a 65   to BtreeKeySize
20c0: 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74  ().  ** stores t
20d0: 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 69  he integer key i
20e0: 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e  n pCur->nKey. In
20f0: 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73 20   this case this 
2100: 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c  value is.  ** al
2110: 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  l that is requir
2120: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
2130: 66 20 70 43 75 72 20 69 73 20 6e 6f 74 20 6f 70  f pCur is not op
2140: 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a  en on an intKey.
2150: 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e    ** table, then
2160: 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f   malloc space fo
2170: 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  r and store the 
2180: 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73  pCur->nKey bytes
2190: 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61   of key .  ** da
21a0: 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ta..  */.  if( r
21b0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
21c0: 30 3d 3d 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  0==pCur->pPage->
21d0: 69 6e 74 4b 65 79 29 7b 0a 20 20 20 20 76 6f 69  intKey){.    voi
21e0: 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65  d *pKey = sqlite
21f0: 33 4d 61 6c 6c 6f 63 28 70 43 75 72 2d 3e 6e 4b  3Malloc(pCur->nK
2200: 65 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65  ey);.    if( pKe
2210: 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
2220: 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28  sqlite3BtreeKey(
2230: 70 43 75 72 2c 20 30 2c 20 70 43 75 72 2d 3e 6e  pCur, 0, pCur->n
2240: 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20  Key, pKey);.    
2250: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2260: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
2270: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79  Cur->pKey = pKey
2280: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2290: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
22a0: 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20  ree(pKey);.     
22b0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
22c0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
22d0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
22e0: 0a 20 20 61 73 73 65 72 74 28 20 21 70 43 75 72  .  assert( !pCur
22f0: 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ->pPage->intKey 
2300: 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20 29  || !pCur->pKey )
2310: 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
2320: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
2330: 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
2340: 70 50 61 67 65 29 3b 0a 20 20 20 20 70 43 75 72  pPage);.    pCur
2350: 2d 3e 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  ->pPage = 0;.   
2360: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2370: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
2380: 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c  EK;.  }..  inval
2390: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
23a0: 68 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75  he(pCur);.  retu
23b0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
23c0: 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
23d0: 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72  ns of all cursor
23e0: 73 20 65 78 63 65 70 74 20 70 45 78 63 65 70 74  s except pExcept
23f0: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 74 61 62   open on the tab
2400: 6c 65 20 0a 2a 2a 20 77 69 74 68 20 72 6f 6f 74  le .** with root
2410: 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 55 73 75  -page iRoot. Usu
2420: 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20 63 61  ally, this is ca
2430: 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65  lled just before
2440: 20 63 75 72 73 6f 72 0a 2a 2a 20 70 45 78 63 65   cursor.** pExce
2450: 70 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d 6f  pt is used to mo
2460: 64 69 66 79 20 74 68 65 20 74 61 62 6c 65 20 28  dify the table (
2470: 42 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72  BtreeDelete() or
2480: 20 42 74 72 65 65 49 6e 73 65 72 74 28 29 29 2e   BtreeInsert()).
2490: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
24a0: 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 42 74  aveAllCursors(Bt
24b0: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
24c0: 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f  o iRoot, BtCurso
24d0: 72 20 2a 70 45 78 63 65 70 74 29 7b 0a 20 20 42  r *pExcept){.  B
24e0: 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73  tCursor *p;.  as
24f0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2500: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
2510: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
2520: 28 20 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20  ( pExcept==0 || 
2530: 70 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42  pExcept->pBt==pB
2540: 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  t );.  for(p=pBt
2550: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
2560: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
2570: 66 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26  f( p!=pExcept &&
2580: 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d   (0==iRoot || p-
2590: 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74  >pgnoRoot==iRoot
25a0: 29 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 2d  ) && .        p-
25b0: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
25c0: 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 69  VALID ){.      i
25d0: 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75 72 73  nt rc = saveCurs
25e0: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20  orPosition(p);. 
25f0: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
2600: 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20  OK!=rc ){.      
2610: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2620: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2630: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2640: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  K;.}../*.** Clea
2650: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  r the current cu
2660: 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a  rsor position..*
2670: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
2680: 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
2690: 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  n(BtCursor *pCur
26a0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
26b0: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
26c0: 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ur) );.  sqlite3
26d0: 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  _free(pCur->pKey
26e0: 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 20  );.  pCur->pKey 
26f0: 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74  = 0;.  pCur->eSt
2700: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
2710: 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ALID;.}../*.** R
2720: 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
2730: 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f  r to the positio
2740: 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72 20  n it was in (or 
2750: 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20 70  as close to as p
2760: 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e  ossible).** when
2770: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
2780: 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65 64  ion() was called
2790: 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73  . Note that this
27a0: 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74 68   call deletes th
27b0: 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73 69  e .** saved posi
27c0: 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64  tion info stored
27d0: 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50 6f   by saveCursorPo
27e0: 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65  sition(), so the
27f0: 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20  re can be.** at 
2800: 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74 69  most one effecti
2810: 76 65 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61  ve restoreOrClea
2820: 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
2830: 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63  ) call after eac
2840: 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72  h .** saveCursor
2850: 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2a 0a 2a  Position()..**.*
2860: 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  * If the second 
2870: 61 72 67 75 6d 65 6e 74 20 61 72 67 75 6d 65 6e  argument argumen
2880: 74 20 2d 20 64 6f 53 65 65 6b 20 2d 20 69 73 20  t - doSeek - is 
2890: 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73 74  false, then inst
28a0: 65 61 64 20 6f 66 20 0a 2a 2a 20 72 65 74 75 72  ead of .** retur
28b0: 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20  ning the cursor 
28c0: 74 6f 20 69 74 73 20 73 61 76 65 64 20 70 6f 73  to its saved pos
28d0: 69 74 69 6f 6e 2c 20 61 6e 79 20 73 61 76 65 64  ition, any saved
28e0: 20 70 6f 73 69 74 69 6f 6e 20 69 73 20 64 65 6c   position is del
28f0: 65 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20  eted.** and the 
2900: 63 75 72 73 6f 72 20 73 74 61 74 65 20 73 65 74  cursor state set
2910: 20 74 6f 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c   to CURSOR_INVAL
2920: 49 44 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ID..*/.int sqlit
2930: 65 33 42 74 72 65 65 52 65 73 74 6f 72 65 4f 72  e3BtreeRestoreOr
2940: 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  ClearCursorPosit
2950: 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ion(BtCursor *pC
2960: 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ur){.  int rc;. 
2970: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
2980: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
2990: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
29a0: 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f  r->eState>=CURSO
29b0: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
29c0: 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
29d0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
29e0: 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  T ){.    return 
29f0: 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a  pCur->skip;.  }.
2a00: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2a10: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2a20: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
2a30: 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c  treeMoveto(pCur,
2a40: 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 30 2c 20   pCur->pKey, 0, 
2a50: 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26  pCur->nKey, 0, &
2a60: 70 43 75 72 2d 3e 73 6b 69 70 29 3b 0a 20 20 69  pCur->skip);.  i
2a70: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2a80: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2a90: 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
2aa0: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79  ;.    pCur->pKey
2ab0: 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
2ac0: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2ad0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
2ae0: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2af0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a  RSOR_INVALID );.
2b00: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2b10: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74  .}..#define rest
2b20: 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72  oreOrClearCursor
2b30: 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20  Position(p) \.  
2b40: 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53  (p->eState>=CURS
2b50: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 3f  OR_REQUIRESEEK ?
2b60: 20 5c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69   \.         sqli
2b70: 74 65 33 42 74 72 65 65 52 65 73 74 6f 72 65 4f  te3BtreeRestoreO
2b80: 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
2b90: 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20  tion(p) : \.    
2ba0: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a       SQLITE_OK).
2bb0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2bc0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2bd0: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61  /*.** Given a pa
2be0: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72  ge number of a r
2bf0: 65 67 75 6c 61 72 20 64 61 74 61 62 61 73 65 20  egular database 
2c00: 70 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  page, return the
2c10: 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20   page.** number 
2c20: 66 6f 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  for the pointer-
2c30: 6d 61 70 20 70 61 67 65 20 74 68 61 74 20 63 6f  map page that co
2c40: 6e 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79  ntains the entry
2c50: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75   for the.** inpu
2c60: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  t page number..*
2c70: 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74  /.static Pgno pt
2c80: 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61  rmapPageno(BtSha
2c90: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
2ca0: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67  gno){.  int nPag
2cb0: 65 73 50 65 72 4d 61 70 50 61 67 65 2c 20 69 50  esPerMapPage, iP
2cc0: 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61 73  trMap, ret;.  as
2cd0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2ce0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
2cf0: 74 65 78 29 20 29 3b 0a 20 20 6e 50 61 67 65 73  tex) );.  nPages
2d00: 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42  PerMapPage = (pB
2d10: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29  t->usableSize/5)
2d20: 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20  +1;.  iPtrMap = 
2d30: 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50  (pgno-2)/nPagesP
2d40: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74  erMapPage;.  ret
2d50: 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67   = (iPtrMap*nPag
2d60: 65 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20  esPerMapPage) + 
2d70: 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50  2; .  if( ret==P
2d80: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2d90: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74  (pBt) ){.    ret
2da0: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
2db0: 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57   ret;.}../*.** W
2dc0: 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e  rite an entry in
2dd0: 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  to the pointer m
2de0: 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ap..**.** This r
2df0: 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20 74  outine updates t
2e00: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
2e10: 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75  ntry for page nu
2e20: 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f  mber 'key'.** so
2e30: 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f   that it maps to
2e40: 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61 6e   type 'eType' an
2e50: 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75  d parent page nu
2e60: 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 20  mber 'pgno'..** 
2e70: 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  An error code is
2e80: 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d   returned if som
2e90: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
2ea0: 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c  g, otherwise SQL
2eb0: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
2ec0: 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 28  c int ptrmapPut(
2ed0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
2ee0: 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70  gno key, u8 eTyp
2ef0: 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 29 7b  e, Pgno parent){
2f00: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
2f10: 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  ge;  /* The poin
2f20: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
2f30: 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20    u8 *pPtrmap;  
2f40: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
2f50: 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20  er map data */. 
2f60: 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20   Pgno iPtrmap;  
2f70: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
2f80: 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65  r map page numbe
2f90: 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  r */.  int offse
2fa0: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  t;       /* Offs
2fb0: 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61  et in pointer ma
2fc0: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
2fd0: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
2fe0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2ff0: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
3000: 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72  .  /* The master
3010: 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75  -journal page nu
3020: 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20  mber must never 
3030: 62 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69  be used as a poi
3040: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
3050: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54  .  assert( 0==PT
3060: 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
3070: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41   PENDING_BYTE_PA
3080: 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61  GE(pBt)) );..  a
3090: 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
30a0: 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20  Vacuum );.  if( 
30b0: 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  key==0 ){.    re
30c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
30d0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
30e0: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
30f0: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
3100: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
3110: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
3120: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
3130: 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  &pDbPage);.  if(
3140: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
3150: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
3160: 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20  .  }.  offset = 
3170: 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54  PTRMAP_PTROFFSET
3180: 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 70 50  (pBt, key);.  pP
3190: 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71  trmap = (u8 *)sq
31a0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
31b0: 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69  a(pDbPage);..  i
31c0: 66 28 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61  f( eType!=pPtrma
31d0: 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74  p[offset] || get
31e0: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
31f0: 66 66 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e  ffset+1])!=paren
3200: 74 20 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28  t ){.    TRACE((
3210: 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20  "PTRMAP_UPDATE: 
3220: 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20  %d->(%d,%d)\n", 
3230: 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65  key, eType, pare
3240: 6e 74 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  nt));.    rc = s
3250: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
3260: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
3270: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
3280: 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61   ){.      pPtrma
3290: 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70  p[offset] = eTyp
32a0: 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  e;.      put4byt
32b0: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
32c0: 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20  t+1], parent);. 
32d0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
32e0: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
32f0: 62 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e  bPage);.  return
3300: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
3310: 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d  ad an entry from
3320: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
3330: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
3340: 74 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74  tine retrieves t
3350: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
3360: 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b  ntry for page 'k
3370: 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20  ey', writing.** 
3380: 74 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72  the type and par
3390: 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ent page number 
33a0: 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a  to *pEType and *
33b0: 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65  pPgno respective
33c0: 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20  ly..** An error 
33d0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
33e0: 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   if something go
33f0: 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77  es wrong, otherw
3400: 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  ise SQLITE_OK..*
3410: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
3420: 6d 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20  mapGet(BtShared 
3430: 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20  *pBt, Pgno key, 
3440: 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f  u8 *pEType, Pgno
3450: 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61   *pPgno){.  DbPa
3460: 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f  ge *pDbPage;   /
3470: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
3480: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
3490: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f  iPtrmap;       /
34a0: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  * Pointer map pa
34b0: 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38  ge index */.  u8
34c0: 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20   *pPtrmap;      
34d0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
34e0: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69  page data */.  i
34f0: 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  nt offset;      
3500: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65    /* Offset of e
3510: 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20  ntry in pointer 
3520: 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  map */.  int rc;
3530: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
3540: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
3550: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
3560: 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41   iPtrmap = PTRMA
3570: 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65  P_PAGENO(pBt, ke
3580: 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  y);.  rc = sqlit
3590: 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
35a0: 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c  pPager, iPtrmap,
35b0: 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66   &pDbPage);.  if
35c0: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72  ( rc!=0 ){.    r
35d0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
35e0: 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29  pPtrmap = (u8 *)
35f0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
3600: 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20  ata(pDbPage);.. 
3610: 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50   offset = PTRMAP
3620: 5f 50 54 52 4f 46 46 53 45 54 28 70 42 74 2c 20  _PTROFFSET(pBt, 
3630: 6b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20  key);.  assert( 
3640: 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a  pEType!=0 );.  *
3650: 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70  pEType = pPtrmap
3660: 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20  [offset];.  if( 
3670: 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d  pPgno ) *pPgno =
3680: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
3690: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a  ap[offset+1]);..
36a0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
36b0: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
36c0: 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c  if( *pEType<1 ||
36d0: 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65 74   *pEType>5 ) ret
36e0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
36f0: 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75 72  PT_BKPT;.  retur
3700: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
3710: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
3720: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
3730: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e   */../*.** Given
3740: 20 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e   a btree page an
3750: 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28  d a cell index (
3760: 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73  0 means the firs
3770: 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65  t cell on.** the
3780: 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74   page, 1 means t
3790: 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20  he second cell, 
37a0: 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65  and so forth) re
37b0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a  turn a pointer.*
37c0: 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  * to the cell co
37d0: 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ntent..**.** Thi
37e0: 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
37f0: 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74  only for pages t
3800: 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61  hat do not conta
3810: 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  in overflow cell
3820: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69  s..*/.#define fi
3830: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
3840: 65 6c 6c 29 20 5c 0a 20 20 28 28 70 50 61 67 65  ell) \.  ((pPage
3850: 29 2d 3e 61 44 61 74 61 20 2b 20 67 65 74 32 62  )->aData + get2b
3860: 79 74 65 28 26 28 70 50 61 67 65 29 2d 3e 61 44  yte(&(pPage)->aD
3870: 61 74 61 5b 28 70 50 61 67 65 29 2d 3e 63 65 6c  ata[(pPage)->cel
3880: 6c 4f 66 66 73 65 74 2b 32 2a 28 69 43 65 6c 6c  lOffset+2*(iCell
3890: 29 5d 29 29 0a 23 69 66 64 65 66 20 53 51 4c 49  )])).#ifdef SQLI
38a0: 54 45 5f 54 45 53 54 0a 75 38 20 2a 73 71 6c 69  TE_TEST.u8 *sqli
38b0: 74 65 33 42 74 72 65 65 46 69 6e 64 43 65 6c 6c  te3BtreeFindCell
38c0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
38d0: 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 61   int iCell){.  a
38e0: 73 73 65 72 74 28 20 69 43 65 6c 6c 3e 3d 30 20  ssert( iCell>=0 
38f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43 65  );.  assert( iCe
3900: 6c 6c 3c 67 65 74 32 62 79 74 65 28 26 70 50 61  ll<get2byte(&pPa
3910: 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
3920: 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29 20 29  >hdrOffset+3]) )
3930: 3b 0a 20 20 72 65 74 75 72 6e 20 66 69 6e 64 43  ;.  return findC
3940: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
3950: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
3960: 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63  ** This a more c
3970: 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f  omplex version o
3980: 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69  f sqlite3BtreeFi
3990: 6e 64 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f  ndCell() that wo
39a0: 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61 67 65 73  rks for.** pages
39b0: 20 74 68 61 74 20 64 6f 20 63 6f 6e 74 61 69 6e   that do contain
39c0: 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e   overflow cells.
39d0: 20 20 53 65 65 20 69 6e 73 65 72 74 0a 2a 2f 0a    See insert.*/.
39e0: 73 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64 4f  static u8 *findO
39f0: 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50  verflowCell(MemP
3a00: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
3a10: 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b  iCell){.  int i;
3a20: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
3a30: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
3a40: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
3a50: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61 67   );.  for(i=pPag
3a60: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20  e->nOverflow-1; 
3a70: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
3a80: 69 6e 74 20 6b 3b 0a 20 20 20 20 73 74 72 75 63  int k;.    struc
3a90: 74 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a 70 4f 76  t _OvflCell *pOv
3aa0: 66 6c 3b 0a 20 20 20 20 70 4f 76 66 6c 20 3d 20  fl;.    pOvfl = 
3ab0: 26 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 69 5d  &pPage->aOvfl[i]
3ac0: 3b 0a 20 20 20 20 6b 20 3d 20 70 4f 76 66 6c 2d  ;.    k = pOvfl-
3ad0: 3e 69 64 78 3b 0a 20 20 20 20 69 66 28 20 6b 3c  >idx;.    if( k<
3ae0: 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =iCell ){.      
3af0: 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a  if( k==iCell ){.
3b00: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
3b10: 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a 20 20 20  Ovfl->pCell;.   
3b20: 20 20 20 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c     }.      iCell
3b30: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  --;.    }.  }.  
3b40: 72 65 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28  return findCell(
3b50: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d  pPage, iCell);.}
3b60: 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20  ../*.** Parse a 
3b70: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f  cell content blo
3b80: 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74  ck and fill in t
3b90: 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75  he CellInfo stru
3ba0: 63 74 75 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a  cture.  There.**
3bb0: 20 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e   are two version
3bc0: 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
3bd0: 6f 6e 2e 20 20 73 71 6c 69 74 65 33 42 74 72 65  on.  sqlite3Btre
3be0: 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b  eParseCell() tak
3bf0: 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e  es a .** cell in
3c00: 64 65 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e  dex as the secon
3c10: 64 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 73  d argument and s
3c20: 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
3c30: 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61  CellPtr() .** ta
3c40: 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  kes a pointer to
3c50: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65   the body of the
3c60: 20 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63   cell as its sec
3c70: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  ond argument..**
3c80: 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20  .** Within this 
3c90: 66 69 6c 65 2c 20 74 68 65 20 70 61 72 73 65 43  file, the parseC
3ca0: 65 6c 6c 28 29 20 6d 61 63 72 6f 20 63 61 6e 20  ell() macro can 
3cb0: 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61  be called instea
3cc0: 64 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 42  d of.** sqlite3B
3cd0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
3ce0: 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d 65 20 63  (). Using some c
3cf0: 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69 73 20 77  ompilers, this w
3d00: 69 6c 6c 20 62 65 20 66 61 73 74 65 72 2e 0a 2a  ill be faster..*
3d10: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
3d20: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
3d30: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
3d40: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
3d50: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
3d60: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a  e cell */.  u8 *
3d70: 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
3d80: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
3d90: 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e  o the cell text.
3da0: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
3db0: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
3dc0: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
3dd0: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
3de0: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
3df0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3e00: 72 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 20  r bytes in cell 
3e10: 63 6f 6e 74 65 6e 74 20 68 65 61 64 65 72 20 2a  content header *
3e20: 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64  /.  u32 nPayload
3e30: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
3e40: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
3e50: 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a  f cell payload *
3e60: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
3e70: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3e80: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
3e90: 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e  x) );..  pInfo->
3ea0: 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20  pCell = pCell;. 
3eb0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
3ec0: 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65  leaf==0 || pPage
3ed0: 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 6e  ->leaf==1 );.  n
3ee0: 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   = pPage->childP
3ef0: 74 72 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  trSize;.  assert
3f00: 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65 2d 3e  ( n==4-4*pPage->
3f10: 6c 65 61 66 20 29 3b 0a 20 20 69 66 28 20 70 50  leaf );.  if( pP
3f20: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a  age->hasData ){.
3f30: 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69      n += getVari
3f40: 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20  nt32(&pCell[n], 
3f50: 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 65 6c  nPayload);.  }el
3f60: 73 65 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64  se{.    nPayload
3f70: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 49 6e 66   = 0;.  }.  pInf
3f80: 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c  o->nData = nPayl
3f90: 6f 61 64 3b 0a 20 20 69 66 28 20 70 50 61 67 65  oad;.  if( pPage
3fa0: 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
3fb0: 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26  n += getVarint(&
3fc0: 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 20 2a  pCell[n], (u64 *
3fd0: 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a  )&pInfo->nKey);.
3fe0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 33 32    }else{.    u32
3ff0: 20 78 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74   x;.    n += get
4000: 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b  Varint32(&pCell[
4010: 6e 5d 2c 20 78 29 3b 0a 20 20 20 20 70 49 6e 66  n], x);.    pInf
4020: 6f 2d 3e 6e 4b 65 79 20 3d 20 78 3b 0a 20 20 20  o->nKey = x;.   
4030: 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 78 3b 0a   nPayload += x;.
4040: 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61    }.  pInfo->nPa
4050: 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64  yload = nPayload
4060: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48 65 61 64  ;.  pInfo->nHead
4070: 65 72 20 3d 20 6e 3b 0a 20 20 69 66 28 20 6e 50  er = n;.  if( nP
4080: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
4090: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f  axLocal ){.    /
40a0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
40b0: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
40c0: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
40d0: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
40e0: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
40f0: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
4100: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
4110: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  d..    */.    in
4120: 74 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20  t nSize;        
4130: 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
4140: 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  of cell content 
4150: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
4160: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
4170: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49  nPayload;.    pI
4180: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d  nfo->iOverflow =
4190: 20 30 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20   0;.    nSize = 
41a0: 6e 50 61 79 6c 6f 61 64 20 2b 20 6e 3b 0a 20 20  nPayload + n;.  
41b0: 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 7b    if( nSize<4 ){
41c0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 34  .      nSize = 4
41d0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69  ;        /* Mini
41e0: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
41f0: 20 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20   4 */.    }.    
4200: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e  pInfo->nSize = n
4210: 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Size;.  }else{. 
4220: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79     /* If the pay
4230: 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69  load will not fi
4240: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20  t completely on 
4250: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20  the local page, 
4260: 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74  we have.    ** t
4270: 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63  o decide how muc
4280: 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  h to store local
4290: 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20  ly and how much 
42a0: 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20  to spill onto.  
42b0: 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
42c0: 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65  ges.  The strate
42d0: 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a  gy is to minimiz
42e0: 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
42f0: 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73 70  unused.    ** sp
4300: 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20  ace on overflow 
4310: 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70  pages while keep
4320: 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ing the amount o
4330: 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a  f local storage.
4340: 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65      ** in betwee
4350: 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d  n minLocal and m
4360: 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a  axLocal..    **.
4370: 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20      ** Warning: 
4380: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61   changing the wa
4390: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  y overflow paylo
43a0: 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65  ad is distribute
43b0: 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20  d in any.    ** 
43c0: 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  way will result 
43d0: 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  in an incompatib
43e0: 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a  le file format..
43f0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d      */.    int m
4400: 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e  inLocal;  /* Min
4410: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
4420: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
4430: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d  lly */.    int m
4440: 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78  axLocal;  /* Max
4450: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
4460: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
4470: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  lly */.    int s
4480: 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65  urplus;   /* Ove
4490: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76  rflow payload av
44a0: 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61  ailable for loca
44b0: 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20  l storage */..  
44c0: 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61    minLocal = pPa
44d0: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
44e0: 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61    maxLocal = pPa
44f0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  ge->maxLocal;.  
4500: 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c    surplus = minL
4510: 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64  ocal + (nPayload
4520: 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50   - minLocal)%(pP
4530: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
4540: 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 69  Size - 4);.    i
4550: 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61  f( surplus <= ma
4560: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  xLocal ){.      
4570: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
4580: 73 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c  surplus;.    }el
4590: 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  se{.      pInfo-
45a0: 3e 6e 4c 6f 63 61 6c 20 3d 20 6d 69 6e 4c 6f 63  >nLocal = minLoc
45b0: 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  al;.    }.    pI
45c0: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d  nfo->iOverflow =
45d0: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b   pInfo->nLocal +
45e0: 20 6e 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   n;.    pInfo->n
45f0: 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f  Size = pInfo->iO
4600: 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d  verflow + 4;.  }
4610: 0a 7d 0a 23 64 65 66 69 6e 65 20 70 61 72 73 65  .}.#define parse
4620: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
4630: 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20 73 71  l, pInfo) \.  sq
4640: 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
4650: 65 6c 6c 50 74 72 28 28 70 50 61 67 65 29 2c 20  ellPtr((pPage), 
4660: 66 69 6e 64 43 65 6c 6c 28 28 70 50 61 67 65 29  findCell((pPage)
4670: 2c 20 28 69 43 65 6c 6c 29 29 2c 20 28 70 49 6e  , (iCell)), (pIn
4680: 66 6f 29 29 0a 76 6f 69 64 20 73 71 6c 69 74 65  fo)).void sqlite
4690: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
46a0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
46b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
46c0: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
46d0: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  e cell */.  int 
46e0: 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  iCell,          
46f0: 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
4700: 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65  index.  First ce
4710: 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c  ll is 0 */.  Cel
4720: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
4730: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
4740: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
4750: 2f 0a 29 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c  /.){.  parseCell
4760: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70  (pPage, iCell, p
4770: 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Info);.}../*.** 
4780: 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
4790: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  l number of byte
47a0: 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65  s that a Cell ne
47b0: 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a  eds in the cell.
47c0: 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  ** data area of 
47d0: 74 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20  the btree-page. 
47e0: 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62   The return numb
47f0: 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  er includes the 
4800: 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61  cell.** data hea
4810: 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61  der and the loca
4820: 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e  l payload, but n
4830: 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ot any overflow 
4840: 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73  page or.** the s
4850: 70 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65  pace used by the
4860: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a   cell pointer..*
4870: 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
4880: 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c  .static u16 cell
4890: 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Size(MemPage *pP
48a0: 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b  age, int iCell){
48b0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
48c0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
48d0: 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
48e0: 20 69 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   iCell, &info);.
48f0: 20 20 72 65 74 75 72 6e 20 69 6e 66 6f 2e 6e 53    return info.nS
4900: 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 73 74  ize;.}.#endif.st
4910: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
4920: 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  ePtr(MemPage *pP
4930: 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b  age, u8 *pCell){
4940: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
4950: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
4960: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
4970: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
4980: 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 66 6f  );.  return info
4990: 2e 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 6e 64  .nSize;.}..#ifnd
49a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
49b0: 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
49c0: 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c  If the cell pCel
49d0: 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65 20  l, part of page 
49e0: 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61  pPage contains a
49f0: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61   pointer.** to a
4a00: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
4a10: 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79   insert an entry
4a20: 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
4a30: 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65  r-map.** for the
4a40: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a   overflow page..
4a50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74  */.static int pt
4a60: 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d  rmapPutOvflPtr(M
4a70: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
4a80: 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 69 66 28  8 *pCell){.  if(
4a90: 20 70 43 65 6c 6c 20 29 7b 0a 20 20 20 20 43 65   pCell ){.    Ce
4aa0: 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
4ab0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
4ac0: 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
4ad0: 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
4ae0: 20 20 20 20 61 73 73 65 72 74 28 20 28 69 6e 66      assert( (inf
4af0: 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e  o.nData+(pPage->
4b00: 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b  intKey?0:info.nK
4b10: 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c  ey))==info.nPayl
4b20: 6f 61 64 20 29 3b 0a 20 20 20 20 69 66 28 20 28  oad );.    if( (
4b30: 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67  info.nData+(pPag
4b40: 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f  e->intKey?0:info
4b50: 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f  .nKey))>info.nLo
4b60: 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  cal ){.      Pgn
4b70: 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  o ovfl = get4byt
4b80: 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
4b90: 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20  verflow]);.     
4ba0: 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75   return ptrmapPu
4bb0: 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76  t(pPage->pBt, ov
4bc0: 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
4bd0: 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e  LOW1, pPage->pgn
4be0: 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  o);.    }.  }.  
4bf0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
4c00: 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  ;.}./*.** If the
4c10: 20 63 65 6c 6c 20 77 69 74 68 20 69 6e 64 65 78   cell with index
4c20: 20 69 43 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70   iCell on page p
4c30: 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  Page contains a 
4c40: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e  pointer.** to an
4c50: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
4c60: 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20  insert an entry 
4c70: 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
4c80: 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20  -map.** for the 
4c90: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a  overflow page..*
4ca0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
4cb0: 6d 61 70 50 75 74 4f 76 66 6c 28 4d 65 6d 50 61  mapPutOvfl(MemPa
4cc0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
4cd0: 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 43 65  Cell){.  u8 *pCe
4ce0: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ll;.  assert( sq
4cf0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
4d00: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
4d10: 65 78 29 20 29 3b 0a 20 20 70 43 65 6c 6c 20 3d  ex) );.  pCell =
4d20: 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c   findOverflowCel
4d30: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b  l(pPage, iCell);
4d40: 0a 20 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70  .  return ptrmap
4d50: 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
4d60: 2c 20 70 43 65 6c 6c 29 3b 0a 7d 0a 23 65 6e 64  , pCell);.}.#end
4d70: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61  if.../*.** Defra
4d80: 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65 20 67  gment the page g
4d90: 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73  iven.  All Cells
4da0: 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68   are moved to th
4db0: 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20  e.** end of the 
4dc0: 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66 72 65  page and all fre
4dd0: 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c 6c 65  e space is colle
4de0: 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a  cted into one.**
4df0: 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74 68 61   big FreeBlk tha
4e00: 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77  t occurs in betw
4e10: 65 65 6e 20 74 68 65 20 68 65 61 64 65 72 20 61  een the header a
4e20: 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74  nd cell.** point
4e30: 65 72 20 61 72 72 61 79 20 61 6e 64 20 74 68 65  er array and the
4e40: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
4e50: 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ea..*/.static in
4e60: 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  t defragmentPage
4e70: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
4e80: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
4e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4ea0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
4eb0: 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20  /.  int pc;     
4ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4ed0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 69  * Address of a i
4ee0: 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  -th cell */.  in
4ef0: 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20 20  t addr;         
4f00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
4f10: 65 74 20 6f 66 20 66 69 72 73 74 20 62 79 74 65  et of first byte
4f20: 20 61 66 74 65 72 20 63 65 6c 6c 20 70 6f 69 6e   after cell poin
4f30: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  ter array */.  i
4f40: 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
4f50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
4f60: 73 65 74 20 74 6f 20 74 68 65 20 70 61 67 65 20  set to the page 
4f70: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
4f80: 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
4f90: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
4fa0: 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  f a cell */.  in
4fb0: 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
4fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4fd0: 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74  er of usable byt
4fe0: 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a  es on a page */.
4ff0: 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74    int cellOffset
5000: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
5010: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  Offset to the ce
5020: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
5030: 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 3b 20 20   */.  int brk;  
5040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5050: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
5060: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
5070: 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  rea */.  int nCe
5080: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
5090: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
50a0: 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61   cells on the pa
50b0: 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ge */.  unsigned
50c0: 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20   char *data;    
50d0: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64     /* The page d
50e0: 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ata */.  unsigne
50f0: 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20  d char *temp;   
5100: 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61      /* Temp area
5110: 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   for cell conten
5120: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
5130: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
5140: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
5150: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
5160: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
5170: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
5180: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
5190: 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45  leSize <= SQLITE
51a0: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29  _MAX_PAGE_SIZE )
51b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
51c0: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
51d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
51e0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
51f0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
5200: 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 73  x) );.  temp = s
5210: 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
5220: 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42 74 2d  pace(pPage->pBt-
5230: 3e 70 50 61 67 65 72 29 3b 0a 20 20 64 61 74 61  >pPager);.  data
5240: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
5250: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
5260: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c  hdrOffset;.  cel
5270: 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
5280: 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e  >cellOffset;.  n
5290: 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
52a0: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ell;.  assert( n
52b0: 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26  Cell==get2byte(&
52c0: 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a  data[hdr+3]) );.
52d0: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
52e0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
52f0: 65 53 69 7a 65 3b 0a 20 20 62 72 6b 20 3d 20 67  eSize;.  brk = g
5300: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
5310: 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28  r+5]);.  memcpy(
5320: 26 74 65 6d 70 5b 62 72 6b 5d 2c 20 26 64 61 74  &temp[brk], &dat
5330: 61 5b 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69  a[brk], usableSi
5340: 7a 65 20 2d 20 62 72 6b 29 3b 0a 20 20 62 72 6b  ze - brk);.  brk
5350: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20   = usableSize;. 
5360: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
5370: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
5380: 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54  *pAddr;     /* T
5390: 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69  he i-th cell poi
53a0: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64  nter */.    pAdd
53b0: 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66  r = &data[cellOf
53c0: 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20  fset + i*2];.   
53d0: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70   pc = get2byte(p
53e0: 41 64 64 72 29 3b 0a 20 20 20 20 61 73 73 65 72  Addr);.    asser
53f0: 74 28 20 70 63 3c 70 50 61 67 65 2d 3e 70 42 74  t( pc<pPage->pBt
5400: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
5410: 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53      size = cellS
5420: 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 74  izePtr(pPage, &t
5430: 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20 20 62 72  emp[pc]);.    br
5440: 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20 6d  k -= size;.    m
5450: 65 6d 63 70 79 28 26 64 61 74 61 5b 62 72 6b 5d  emcpy(&data[brk]
5460: 2c 20 26 74 65 6d 70 5b 70 63 5d 2c 20 73 69 7a  , &temp[pc], siz
5470: 65 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  e);.    put2byte
5480: 28 70 41 64 64 72 2c 20 62 72 6b 29 3b 0a 20 20  (pAddr, brk);.  
5490: 7d 0a 20 20 61 73 73 65 72 74 28 20 62 72 6b 3e  }.  assert( brk>
54a0: 3d 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43  =cellOffset+2*nC
54b0: 65 6c 6c 20 29 3b 0a 20 20 70 75 74 32 62 79 74  ell );.  put2byt
54c0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
54d0: 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  brk);.  data[hdr
54e0: 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b  +1] = 0;.  data[
54f0: 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61  hdr+2] = 0;.  da
5500: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
5510: 20 61 64 64 72 20 3d 20 63 65 6c 6c 4f 66 66 73   addr = cellOffs
5520: 65 74 2b 32 2a 6e 43 65 6c 6c 3b 0a 20 20 6d 65  et+2*nCell;.  me
5530: 6d 73 65 74 28 26 64 61 74 61 5b 61 64 64 72 5d  mset(&data[addr]
5540: 2c 20 30 2c 20 62 72 6b 2d 61 64 64 72 29 3b 0a  , 0, brk-addr);.
5550: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5560: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  OK;.}../*.** All
5570: 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65  ocate nByte byte
5580: 73 20 6f 66 20 73 70 61 63 65 20 6f 6e 20 61 20  s of space on a 
5590: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  page..**.** Retu
55a0: 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  rn the index int
55b0: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  o pPage->aData[]
55c0: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 79   of the first by
55d0: 74 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  te of.** the new
55e0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 4f 72 20   allocation. Or 
55f0: 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 72  return 0 if ther
5600: 65 20 69 73 20 6e 6f 74 20 65 6e 6f 75 67 68 20  e is not enough 
5610: 66 72 65 65 0a 2a 2a 20 73 70 61 63 65 20 6f 6e  free.** space on
5620: 20 74 68 65 20 70 61 67 65 20 74 6f 20 73 61 74   the page to sat
5630: 69 73 66 79 20 74 68 65 20 61 6c 6c 6f 63 61 74  isfy the allocat
5640: 69 6f 6e 20 72 65 71 75 65 73 74 2e 0a 2a 2a 0a  ion request..**.
5650: 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 63  ** If the page c
5660: 6f 6e 74 61 69 6e 73 20 6e 42 79 74 65 73 20 6f  ontains nBytes o
5670: 66 20 66 72 65 65 20 73 70 61 63 65 20 62 75 74  f free space but
5680: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
5690: 6e 0a 2a 2a 20 6e 42 79 74 65 73 20 6f 66 20 63  n.** nBytes of c
56a0: 6f 6e 74 69 67 75 6f 75 73 20 66 72 65 65 20 73  ontiguous free s
56b0: 70 61 63 65 2c 20 74 68 65 6e 20 74 68 69 73 20  pace, then this 
56c0: 72 6f 75 74 69 6e 65 20 61 75 74 6f 6d 61 74 69  routine automati
56d0: 63 61 6c 6c 79 0a 2a 2a 20 63 61 6c 6c 73 20 64  cally.** calls d
56e0: 65 66 72 61 67 65 6d 65 6e 74 50 61 67 65 28 29  efragementPage()
56f0: 20 74 6f 20 63 6f 6e 73 6f 6c 69 64 61 74 65 20   to consolidate 
5700: 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 62  all free space b
5710: 65 66 6f 72 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61  efore .** alloca
5720: 74 69 6e 67 20 74 68 65 20 6e 65 77 20 63 68 75  ting the new chu
5730: 6e 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nk..*/.static in
5740: 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  t allocateSpace(
5750: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
5760: 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 69 6e  int nByte){.  in
5770: 74 20 61 64 64 72 2c 20 70 63 2c 20 68 64 72 3b  t addr, pc, hdr;
5780: 0a 20 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20 69  .  int size;.  i
5790: 6e 74 20 6e 46 72 61 67 3b 0a 20 20 69 6e 74 20  nt nFrag;.  int 
57a0: 74 6f 70 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  top;.  int nCell
57b0: 3b 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  ;.  int cellOffs
57c0: 65 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  et;.  unsigned c
57d0: 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 0a 20 20  har *data;.  .  
57e0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
57f0: 61 74 61 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ata;.  assert( s
5800: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
5810: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
5820: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
5830: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
5840: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
5850: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
5860: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
5870: 29 20 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65  ) );.  if( nByte
5880: 3c 34 20 29 20 6e 42 79 74 65 20 3d 20 34 3b 0a  <4 ) nByte = 4;.
5890: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 46 72    if( pPage->nFr
58a0: 65 65 3c 6e 42 79 74 65 20 7c 7c 20 70 50 61 67  ee<nByte || pPag
58b0: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29  e->nOverflow>0 )
58c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 50 61   return 0;.  pPa
58d0: 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e 42 79  ge->nFree -= nBy
58e0: 74 65 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  te;.  hdr = pPag
58f0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 0a 20  e->hdrOffset;.. 
5900: 20 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68 64   nFrag = data[hd
5910: 72 2b 37 5d 3b 0a 20 20 69 66 28 20 6e 46 72 61  r+7];.  if( nFra
5920: 67 3c 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53  g<60 ){.    /* S
5930: 65 61 72 63 68 20 74 68 65 20 66 72 65 65 6c 69  earch the freeli
5940: 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  st looking for a
5950: 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68   slot big enough
5960: 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 0a   to satisfy the.
5970: 20 20 20 20 2a 2a 20 73 70 61 63 65 20 72 65 71      ** space req
5980: 75 65 73 74 2e 20 2a 2f 0a 20 20 20 20 61 64 64  uest. */.    add
5990: 72 20 3d 20 68 64 72 2b 31 3b 0a 20 20 20 20 77  r = hdr+1;.    w
59a0: 68 69 6c 65 28 20 28 70 63 20 3d 20 67 65 74 32  hile( (pc = get2
59b0: 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d  byte(&data[addr]
59c0: 29 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 69  ))>0 ){.      si
59d0: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
59e0: 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
59f0: 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74    if( size>=nByt
5a00: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  e ){.        if(
5a10: 20 73 69 7a 65 3c 6e 42 79 74 65 2b 34 20 29 7b   size<nByte+4 ){
5a20: 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
5a30: 79 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 26  y(&data[addr], &
5a40: 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20  data[pc], 2);.  
5a50: 20 20 20 20 20 20 20 20 64 61 74 61 5b 68 64 72          data[hdr
5a60: 2b 37 5d 20 3d 20 6e 46 72 61 67 20 2b 20 73 69  +7] = nFrag + si
5a70: 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20  ze - nByte;.    
5a80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 63 3b        return pc;
5a90: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
5aa0: 20 20 20 20 20 20 20 20 20 20 70 75 74 32 62 79            put2by
5ab0: 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c 20  te(&data[pc+2], 
5ac0: 73 69 7a 65 2d 6e 42 79 74 65 29 3b 0a 20 20 20  size-nByte);.   
5ad0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 63         return pc
5ae0: 20 2b 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b   + size - nByte;
5af0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5b00: 20 7d 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20   }.      addr = 
5b10: 70 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  pc;.    }.  }.. 
5b20: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d   /* Allocate mem
5b30: 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70  ory from the gap
5b40: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
5b50: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
5b60: 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ay.  ** and the 
5b70: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
5b80: 61 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 3d 20  a..  */.  top = 
5b90: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
5ba0: 64 72 2b 35 5d 29 3b 0a 20 20 6e 43 65 6c 6c 20  dr+5]);.  nCell 
5bb0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
5bc0: 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 63 65 6c 6c  [hdr+3]);.  cell
5bd0: 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
5be0: 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 69 66  cellOffset;.  if
5bf0: 28 20 6e 46 72 61 67 3e 3d 36 30 20 7c 7c 20 63  ( nFrag>=60 || c
5c00: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43  ellOffset + 2*nC
5c10: 65 6c 6c 20 3e 20 74 6f 70 20 2d 20 6e 42 79 74  ell > top - nByt
5c20: 65 20 29 7b 0a 20 20 20 20 69 66 28 20 64 65 66  e ){.    if( def
5c30: 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67  ragmentPage(pPag
5c40: 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  e) ) return 0;. 
5c50: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
5c60: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
5c70: 0a 20 20 7d 0a 20 20 74 6f 70 20 2d 3d 20 6e 42  .  }.  top -= nB
5c80: 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20 63  yte;.  assert( c
5c90: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43  ellOffset + 2*nC
5ca0: 65 6c 6c 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20  ell <= top );.  
5cb0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
5cc0: 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 72  dr+5], top);.  r
5cd0: 65 74 75 72 6e 20 74 6f 70 3b 0a 7d 0a 0a 2f 2a  eturn top;.}../*
5ce0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63  .** Return a sec
5cf0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67  tion of the pPag
5d00: 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20  e->aData to the 
5d10: 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65  freelist..** The
5d20: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
5d30: 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63  he new free bloc
5d40: 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44 69 73  k is pPage->aDis
5d50: 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20  k[start].** and 
5d60: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
5d70: 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65 22 20  block is "size" 
5d80: 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73  bytes..**.** Mos
5d90: 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72 74 20  t of the effort 
5da0: 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76 65 64  here is involved
5db0: 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61 64   in coalesing ad
5dc0: 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62  jacent.** free b
5dd0: 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e  locks into a sin
5de0: 67 6c 65 20 62 69 67 20 66 72 65 65 20 62 6c 6f  gle big free blo
5df0: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
5e00: 69 64 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d  id freeSpace(Mem
5e10: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
5e20: 20 73 74 61 72 74 2c 20 69 6e 74 20 73 69 7a 65   start, int size
5e30: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70  ){.  int addr, p
5e40: 62 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20 75 6e  begin, hdr;.  un
5e50: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
5e60: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
5e70: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
5e80: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
5e90: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
5ea0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
5eb0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
5ec0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61  );.  assert( sta
5ed0: 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66  rt>=pPage->hdrOf
5ee0: 66 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c  fset+6+(pPage->l
5ef0: 65 61 66 3f 30 3a 34 29 20 29 3b 0a 20 20 61 73  eaf?0:4) );.  as
5f00: 73 65 72 74 28 20 28 73 74 61 72 74 20 2b 20 73  sert( (start + s
5f10: 69 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70 42 74  ize)<=pPage->pBt
5f20: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
5f30: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5f40: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
5f50: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
5f60: 29 3b 0a 20 20 69 66 28 20 73 69 7a 65 3c 34 20  );.  if( size<4 
5f70: 29 20 73 69 7a 65 20 3d 20 34 3b 0a 0a 23 69 66  ) size = 4;..#if
5f80: 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
5f90: 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 4f 76  E_DELETE.  /* Ov
5fa0: 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20  erwrite deleted 
5fb0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68  information with
5fc0: 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20   zeros when the 
5fd0: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 0a 20  SECURE_DELETE . 
5fe0: 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e   ** option is en
5ff0: 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
6000: 2d 74 69 6d 65 20 2a 2f 0a 20 20 6d 65 6d 73 65  -time */.  memse
6010: 74 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20  t(&data[start], 
6020: 30 2c 20 73 69 7a 65 29 3b 0a 23 65 6e 64 69 66  0, size);.#endif
6030: 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 73  ..  /* Add the s
6040: 70 61 63 65 20 62 61 63 6b 20 69 6e 74 6f 20 74  pace back into t
6050: 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  he linked list o
6060: 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 2a 2f 0a  f freeblocks */.
6070: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
6080: 64 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64 72  drOffset;.  addr
6090: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 77 68   = hdr + 1;.  wh
60a0: 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67  ile( (pbegin = g
60b0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
60c0: 64 72 5d 29 29 3c 73 74 61 72 74 20 26 26 20 70  dr]))<start && p
60d0: 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20 61  begin>0 ){.    a
60e0: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70  ssert( pbegin<=p
60f0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
6100: 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 61  eSize-4 );.    a
6110: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64  ssert( pbegin>ad
6120: 64 72 20 29 3b 0a 20 20 20 20 61 64 64 72 20 3d  dr );.    addr =
6130: 20 70 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 61   pbegin;.  }.  a
6140: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70  ssert( pbegin<=p
6150: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
6160: 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 61 73 73  eSize-4 );.  ass
6170: 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72  ert( pbegin>addr
6180: 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30 20 29 3b   || pbegin==0 );
6190: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
61a0: 61 5b 61 64 64 72 5d 2c 20 73 74 61 72 74 29 3b  a[addr], start);
61b0: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
61c0: 61 5b 73 74 61 72 74 5d 2c 20 70 62 65 67 69 6e  a[start], pbegin
61d0: 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
61e0: 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c 20 73 69  ata[start+2], si
61f0: 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  ze);.  pPage->nF
6200: 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a 0a 20 20  ree += size;..  
6210: 2f 2a 20 43 6f 61 6c 65 73 63 65 20 61 64 6a 61  /* Coalesce adja
6220: 63 65 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b 73  cent free blocks
6230: 20 2a 2f 0a 20 20 61 64 64 72 20 3d 20 70 50 61   */.  addr = pPa
6240: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b 20  ge->hdrOffset + 
6250: 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65  1;.  while( (pbe
6260: 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26  gin = get2byte(&
6270: 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29  data[addr]))>0 )
6280: 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c  {.    int pnext,
6290: 20 70 73 69 7a 65 3b 0a 20 20 20 20 61 73 73 65   psize;.    asse
62a0: 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20  rt( pbegin>addr 
62b0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
62c0: 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42  begin<=pPage->pB
62d0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  t->usableSize-4 
62e0: 29 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20 67  );.    pnext = g
62f0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  et2byte(&data[pb
6300: 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69 7a  egin]);.    psiz
6310: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
6320: 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20  ta[pbegin+2]);. 
6330: 20 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b 20     if( pbegin + 
6340: 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e 65  psize + 3 >= pne
6350: 78 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29 7b  xt && pnext>0 ){
6360: 0a 20 20 20 20 20 20 69 6e 74 20 66 72 61 67 20  .      int frag 
6370: 3d 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67 69  = pnext - (pbegi
6380: 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20 20  n+psize);.      
6390: 61 73 73 65 72 74 28 20 66 72 61 67 3c 3d 64 61  assert( frag<=da
63a0: 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
63b0: 73 65 74 2b 37 5d 20 29 3b 0a 20 20 20 20 20 20  set+7] );.      
63c0: 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  data[pPage->hdrO
63d0: 66 66 73 65 74 2b 37 5d 20 2d 3d 20 66 72 61 67  ffset+7] -= frag
63e0: 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65  ;.      put2byte
63f0: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20  (&data[pbegin], 
6400: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
6410: 6e 65 78 74 5d 29 29 3b 0a 20 20 20 20 20 20 70  next]));.      p
6420: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  ut2byte(&data[pb
6430: 65 67 69 6e 2b 32 5d 2c 20 70 6e 65 78 74 2b 67  egin+2], pnext+g
6440: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e  et2byte(&data[pn
6450: 65 78 74 2b 32 5d 29 2d 70 62 65 67 69 6e 29 3b  ext+2])-pbegin);
6460: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6470: 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b    addr = pbegin;
6480: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
6490: 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   If the cell con
64a0: 74 65 6e 74 20 61 72 65 61 20 62 65 67 69 6e 73  tent area begins
64b0: 20 77 69 74 68 20 61 20 66 72 65 65 62 6c 6f 63   with a freebloc
64c0: 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f  k, remove it. */
64d0: 0a 20 20 69 66 28 20 64 61 74 61 5b 68 64 72 2b  .  if( data[hdr+
64e0: 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20  1]==data[hdr+5] 
64f0: 26 26 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d  && data[hdr+2]==
6500: 64 61 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20  data[hdr+6] ){. 
6510: 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20     int top;.    
6520: 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74  pbegin = get2byt
6530: 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b  e(&data[hdr+1]);
6540: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
6550: 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b  a[hdr+1], &data[
6560: 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20  pbegin], 2);.   
6570: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
6580: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
6590: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
65a0: 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 20 2b 20  a[hdr+5], top + 
65b0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
65c0: 62 65 67 69 6e 2b 32 5d 29 29 3b 0a 20 20 7d 0a  begin+2]));.  }.
65d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20  }../*.** Decode 
65e0: 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 28  the flags byte (
65f0: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
6600: 66 20 74 68 65 20 68 65 61 64 65 72 29 20 66 6f  f the header) fo
6610: 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20  r a page.** and 
6620: 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64  initialize field
6630: 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65  s of the MemPage
6640: 20 73 74 72 75 63 74 75 72 65 20 61 63 63 6f 72   structure accor
6650: 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  dingly..*/.stati
6660: 63 20 76 6f 69 64 20 64 65 63 6f 64 65 46 6c 61  c void decodeFla
6670: 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  gs(MemPage *pPag
6680: 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29  e, int flagByte)
6690: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
66a0: 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79  t;     /* A copy
66b0: 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a   of pPage->pBt *
66c0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
66d0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28  ge->hdrOffset==(
66e0: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
66f0: 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61   100 : 0) );.  a
6700: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
6710: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
6720: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
6730: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
6740: 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20 28 50  = (flagByte & (P
6750: 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
6760: 41 46 44 41 54 41 29 29 21 3d 30 3b 0a 20 20 70  AFDATA))!=0;.  p
6770: 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20 3d  Page->zeroData =
6780: 20 28 66 6c 61 67 42 79 74 65 20 26 20 50 54 46   (flagByte & PTF
6790: 5f 5a 45 52 4f 44 41 54 41 29 21 3d 30 3b 0a 20  _ZERODATA)!=0;. 
67a0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28   pPage->leaf = (
67b0: 66 6c 61 67 42 79 74 65 20 26 20 50 54 46 5f 4c  flagByte & PTF_L
67c0: 45 41 46 29 21 3d 30 3b 0a 20 20 70 50 61 67 65  EAF)!=0;.  pPage
67d0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d  ->childPtrSize =
67e0: 20 34 2a 28 70 50 61 67 65 2d 3e 6c 65 61 66 3d   4*(pPage->leaf=
67f0: 3d 30 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61  =0);.  pBt = pPa
6800: 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66  ge->pBt;.  if( f
6810: 6c 61 67 42 79 74 65 20 26 20 50 54 46 5f 4c 45  lagByte & PTF_LE
6820: 41 46 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50  AFDATA ){.    pP
6830: 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 3d 20  age->leafData = 
6840: 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  1;.    pPage->ma
6850: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
6860: 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  xLeaf;.    pPage
6870: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
6880: 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c  ->minLeaf;.  }el
6890: 73 65 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6c  se{.    pPage->l
68a0: 65 61 66 44 61 74 61 20 3d 20 30 3b 0a 20 20 20  eafData = 0;.   
68b0: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
68c0: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c   = pBt->maxLocal
68d0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
68e0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
68f0: 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61  Local;.  }.  pPa
6900: 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 21 28  ge->hasData = !(
6910: 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20  pPage->zeroData 
6920: 7c 7c 20 28 21 70 50 61 67 65 2d 3e 6c 65 61 66  || (!pPage->leaf
6930: 20 26 26 20 70 50 61 67 65 2d 3e 6c 65 61 66 44   && pPage->leafD
6940: 61 74 61 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ata));.}../*.** 
6950: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61  Initialize the a
6960: 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61  uxiliary informa
6970: 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20  tion for a disk 
6980: 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  block..**.** The
6990: 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d 65 74   pParent paramet
69a0: 65 72 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69  er must be a poi
69b0: 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50  nter to the MemP
69c0: 61 67 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  age which.** is 
69d0: 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 74 68  the parent of th
69e0: 65 20 70 61 67 65 20 62 65 69 6e 67 20 69 6e 69  e page being ini
69f0: 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 72  tialized.  The r
6a00: 6f 6f 74 20 6f 66 20 61 0a 2a 2a 20 42 54 72 65  oot of a.** BTre
6a10: 65 20 68 61 73 20 6e 6f 20 70 61 72 65 6e 74 20  e has no parent 
6a20: 61 6e 64 20 73 6f 20 66 6f 72 20 74 68 61 74 20  and so for that 
6a30: 70 61 67 65 2c 20 70 50 61 72 65 6e 74 3d 3d 4e  page, pParent==N
6a40: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ULL..**.** Retur
6a50: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
6a60: 75 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73  uccess.  If we s
6a70: 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ee that the page
6a80: 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e   does.** not con
6a90: 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  tain a well-form
6aa0: 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ed database page
6ab0: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a  , then return .*
6ac0: 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  * SQLITE_CORRUPT
6ad0: 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72  .  Note that a r
6ae0: 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f  eturn of SQLITE_
6af0: 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67  OK does not.** g
6b00: 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68  uarantee that th
6b10: 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66  e page is well-f
6b20: 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20  ormed.  It only 
6b30: 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65  shows that.** we
6b40: 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63   failed to detec
6b50: 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e  t any corruption
6b60: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6b70: 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 0a 20  BtreeInitPage(. 
6b80: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
6b90: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
6ba0: 61 67 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61  age to be initia
6bb0: 6c 69 7a 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61  lized */.  MemPa
6bc0: 67 65 20 2a 70 50 61 72 65 6e 74 20 20 20 20 20  ge *pParent     
6bd0: 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 2e    /* The parent.
6be0: 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20    Might be NULL 
6bf0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 63 3b 20  */.){.  int pc; 
6c00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
6c10: 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62  dress of a freeb
6c20: 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67  lock within pPag
6c30: 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20  e->aData[] */.  
6c40: 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
6c50: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
6c60: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67  beginning of pag
6c70: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 38  e header */.  u8
6c80: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
6c90: 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61   /* Equal to pPa
6ca0: 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 42  ge->aData */.  B
6cb0: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
6cc0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
6cd0: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
6ce0: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
6cf0: 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75  Size;    /* Amou
6d00: 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61  nt of usable spa
6d10: 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  ce on each page 
6d20: 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66  */.  int cellOff
6d30: 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65  set;    /* Offse
6d40: 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20  t from start of 
6d50: 70 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65  page to first ce
6d60: 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
6d70: 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20  int nFree;      
6d80: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6d90: 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20  unused bytes on 
6da0: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  the page */.  in
6db0: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
6dc0: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
6dd0: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
6de0: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 75 38 20  nt area */.  u8 
6df0: 2a 70 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  *pOff;          
6e00: 2f 2a 20 49 74 65 72 61 74 6f 72 20 75 73 65 64  /* Iterator used
6e10: 20 74 6f 20 63 68 65 63 6b 20 61 6c 6c 20 63 65   to check all ce
6e20: 6c 6c 20 6f 66 66 73 65 74 73 20 61 72 65 20 69  ll offsets are i
6e30: 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 75 38 20  n range */.  u8 
6e40: 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  *pEnd;          
6e50: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 65 6e  /* Pointer to en
6e60: 64 20 6f 66 20 63 65 6c 6c 20 6f 66 66 73 65 74  d of cell offset
6e70: 20 61 72 72 61 79 20 2a 2f 0a 20 20 75 38 20 6d   array */.  u8 m
6e80: 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ask;           /
6e90: 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74 73 20 74  * Mask of bits t
6ea0: 68 61 74 20 6d 75 73 74 20 62 65 20 7a 65 72 6f  hat must be zero
6eb0: 20 69 6e 20 4d 53 42 20 6f 66 20 63 65 6c 6c 20   in MSB of cell 
6ec0: 6f 66 66 73 65 74 73 20 2a 2f 0a 0a 20 20 70 42  offsets */..  pB
6ed0: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
6ee0: 20 20 61 73 73 65 72 74 28 20 70 42 74 21 3d 30    assert( pBt!=0
6ef0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
6f00: 61 72 65 6e 74 3d 3d 30 20 7c 7c 20 70 50 61 72  arent==0 || pPar
6f10: 65 6e 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  ent->pBt==pBt );
6f20: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
6f30: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
6f40: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
6f50: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
6f60: 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  no==sqlite3Pager
6f70: 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
6f80: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
6f90: 61 73 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d  assert( pPage ==
6fa0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
6fb0: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
6fc0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
6fd0: 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
6fe0: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
6ff0: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
7000: 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20  bPage) );.  if( 
7010: 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 21 3d  pPage->pParent!=
7020: 70 50 61 72 65 6e 74 20 26 26 20 28 70 50 61 67  pParent && (pPag
7030: 65 2d 3e 70 50 61 72 65 6e 74 21 3d 30 20 7c 7c  e->pParent!=0 ||
7040: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 29 20   pPage->isInit) 
7050: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ){.    /* The pa
7060: 72 65 6e 74 20 70 61 67 65 20 73 68 6f 75 6c 64  rent page should
7070: 20 6e 65 76 65 72 20 63 68 61 6e 67 65 20 75 6e   never change un
7080: 6c 65 73 73 20 74 68 65 20 66 69 6c 65 20 69 73  less the file is
7090: 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20   corrupt */.    
70a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
70b0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
70c0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49    if( pPage->isI
70d0: 6e 69 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c  nit ) return SQL
70e0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
70f0: 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20  age->pParent==0 
7100: 26 26 20 70 50 61 72 65 6e 74 21 3d 30 20 29 7b  && pParent!=0 ){
7110: 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72  .    pPage->pPar
7120: 65 6e 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20  ent = pParent;. 
7130: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
7140: 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  ef(pParent->pDbP
7150: 61 67 65 29 3b 0a 20 20 7d 0a 20 20 68 64 72 20  age);.  }.  hdr 
7160: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
7170: 65 74 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61  et;.  data = pPa
7180: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 64 65 63  ge->aData;.  dec
7190: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
71a0: 64 61 74 61 5b 68 64 72 5d 29 3b 0a 20 20 70 50  data[hdr]);.  pP
71b0: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
71c0: 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64 78   0;.  pPage->idx
71d0: 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 75 73 61  Shift = 0;.  usa
71e0: 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  bleSize = pBt->u
71f0: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 70 50 61  sableSize;.  pPa
7200: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
7210: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64   cellOffset = hd
7220: 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65  r + 12 - 4*pPage
7230: 2d 3e 6c 65 61 66 3b 0a 20 20 74 6f 70 20 3d 20  ->leaf;.  top = 
7240: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
7250: 64 72 2b 35 5d 29 3b 0a 20 20 70 50 61 67 65 2d  dr+5]);.  pPage-
7260: 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74  >nCell = get2byt
7270: 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
7280: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43  .  if( pPage->nC
7290: 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29  ell>MX_CELL(pBt)
72a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 6f 20 6d 61   ){.    /* To ma
72b0: 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73  ny cells for a s
72c0: 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65  ingle page.  The
72d0: 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f   page must be co
72e0: 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 72 65 74  rrupt */.    ret
72f0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
7300: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  PT_BKPT;.  }.  i
7310: 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  f( pPage->nCell=
7320: 3d 30 20 26 26 20 70 50 61 72 65 6e 74 21 3d 30  =0 && pParent!=0
7330: 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e   && pParent->pgn
7340: 6f 21 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 41  o!=1 ){.    /* A
7350: 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 20 68 61  ll pages must ha
7360: 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ve at least one 
7370: 63 65 6c 6c 2c 20 65 78 63 65 70 74 20 66 6f 72  cell, except for
7380: 20 72 6f 6f 74 20 70 61 67 65 73 20 2a 2f 0a 20   root pages */. 
7390: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
73a0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
73b0: 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
73c0: 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20   the total free 
73d0: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
73e0: 65 20 2a 2f 0a 20 20 70 63 20 3d 20 67 65 74 32  e */.  pc = get2
73f0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
7400: 5d 29 3b 0a 20 20 6e 46 72 65 65 20 3d 20 64 61  ]);.  nFree = da
7410: 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 20  ta[hdr+7] + top 
7420: 2d 20 28 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  - (cellOffset + 
7430: 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b  2*pPage->nCell);
7440: 0a 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29  .  while( pc>0 )
7450: 7b 0a 20 20 20 20 69 6e 74 20 6e 65 78 74 2c 20  {.    int next, 
7460: 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 70 63  size;.    if( pc
7470: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 7b  >usableSize-4 ){
7480: 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62  .      /* Free b
7490: 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20  lock is off the 
74a0: 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 72 65  page */.      re
74b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
74c0: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d  UPT_BKPT; .    }
74d0: 0a 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32  .    next = get2
74e0: 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b  byte(&data[pc]);
74f0: 0a 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32  .    size = get2
7500: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
7510: 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 3e  );.    if( next>
7520: 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69  0 && next<=pc+si
7530: 7a 65 2b 33 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ze+3 ){.      /*
7540: 20 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73   Free blocks mus
7550: 74 20 62 65 20 69 6e 20 61 63 63 65 6e 64 69 6e  t be in accendin
7560: 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20  g order */.     
7570: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
7580: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
7590: 20 20 7d 0a 20 20 20 20 6e 46 72 65 65 20 2b 3d    }.    nFree +=
75a0: 20 73 69 7a 65 3b 0a 20 20 20 20 70 63 20 3d 20   size;.    pc = 
75b0: 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 50 61 67  next;.  }.  pPag
75c0: 65 2d 3e 6e 46 72 65 65 20 3d 20 6e 46 72 65 65  e->nFree = nFree
75d0: 3b 0a 20 20 69 66 28 20 6e 46 72 65 65 3e 3d 75  ;.  if( nFree>=u
75e0: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
75f0: 20 2f 2a 20 46 72 65 65 20 73 70 61 63 65 20 63   /* Free space c
7600: 61 6e 6e 6f 74 20 65 78 63 65 65 64 20 74 6f 74  annot exceed tot
7610: 61 6c 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  al page size */.
7620: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7630: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
7640: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
7650: 20 74 68 61 74 20 61 6c 6c 20 74 68 65 20 6f 66   that all the of
7660: 66 73 65 74 73 20 69 6e 20 74 68 65 20 63 65 6c  fsets in the cel
7670: 6c 20 6f 66 66 73 65 74 20 61 72 72 61 79 20 61  l offset array a
7680: 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e  re within range.
7690: 20 2a 2f 0a 20 20 6d 61 73 6b 20 3d 20 7e 28 28   */.  mask = ~((
76a0: 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69  (u8)(pBt->pageSi
76b0: 7a 65 3e 3e 38 29 29 2d 31 29 3b 0a 20 20 70 45  ze>>8))-1);.  pE
76c0: 6e 64 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  nd = &data[cellO
76d0: 66 66 73 65 74 20 2b 20 70 50 61 67 65 2d 3e 6e  ffset + pPage->n
76e0: 43 65 6c 6c 2a 32 5d 3b 0a 20 20 66 6f 72 28 70  Cell*2];.  for(p
76f0: 4f 66 66 3d 26 64 61 74 61 5b 63 65 6c 6c 4f 66  Off=&data[cellOf
7700: 66 73 65 74 5d 3b 20 70 4f 66 66 21 3d 70 45 6e  fset]; pOff!=pEn
7710: 64 20 26 26 20 21 28 28 2a 70 4f 66 66 29 26 6d  d && !((*pOff)&m
7720: 61 73 6b 29 3b 20 70 4f 66 66 2b 3d 32 29 3b 0a  ask); pOff+=2);.
7730: 20 20 69 66 28 20 70 4f 66 66 21 3d 70 45 6e 64    if( pOff!=pEnd
7740: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
7750: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
7760: 50 54 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65  PT;.  }..  pPage
7770: 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20  ->isInit = 1;.  
7780: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7790: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75  ;.}../*.** Set u
77a0: 70 20 61 20 72 61 77 20 70 61 67 65 20 73 6f 20  p a raw page so 
77b0: 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69  that it looks li
77c0: 6b 65 20 61 20 64 61 74 61 62 61 73 65 20 70 61  ke a database pa
77d0: 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f  ge holding.** no
77e0: 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61   entries..*/.sta
77f0: 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67  tic void zeroPag
7800: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
7810: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
7820: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
7830: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
7840: 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ta;.  BtShared *
7850: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
7860: 3b 0a 20 20 69 6e 74 20 68 64 72 20 3d 20 70 50  ;.  int hdr = pP
7870: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
7880: 20 20 69 6e 74 20 66 69 72 73 74 3b 0a 0a 20 20    int first;..  
7890: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
78a0: 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70  agerPagenumber(p
78b0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
78c0: 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20  pPage->pgno );. 
78d0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
78e0: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
78f0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
7900: 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b   (void*)pPage );
7910: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
7920: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
7930: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
7940: 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65  = data );.  asse
7950: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
7960: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
7970: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
7980: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7990: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
79a0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6d 65 6d  >mutex) );.  mem
79b0: 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20  set(&data[hdr], 
79c0: 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  0, pBt->usableSi
79d0: 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 64 61 74  ze - hdr);.  dat
79e0: 61 5b 68 64 72 5d 20 3d 20 66 6c 61 67 73 3b 0a  a[hdr] = flags;.
79f0: 20 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20    first = hdr + 
7a00: 38 20 2b 20 34 2a 28 28 66 6c 61 67 73 26 50 54  8 + 4*((flags&PT
7a10: 46 5f 4c 45 41 46 29 3d 3d 30 29 3b 0a 20 20 6d  F_LEAF)==0);.  m
7a20: 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b  emset(&data[hdr+
7a30: 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74  1], 0, 4);.  dat
7a40: 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
7a50: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
7a60: 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62  dr+5], pBt->usab
7a70: 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  leSize);.  pPage
7a80: 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d 3e 75  ->nFree = pBt->u
7a90: 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73  sableSize - firs
7aa0: 74 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73  t;.  decodeFlags
7ab0: 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a  (pPage, flags);.
7ac0: 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73    pPage->hdrOffs
7ad0: 65 74 20 3d 20 68 64 72 3b 0a 20 20 70 50 61 67  et = hdr;.  pPag
7ae0: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  e->cellOffset = 
7af0: 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e  first;.  pPage->
7b00: 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
7b10: 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74   pPage->idxShift
7b20: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6e   = 0;.  pPage->n
7b30: 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  Cell = 0;.  pPag
7b40: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d  e->isInit = 1;.}
7b50: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
7b60: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
7b70: 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  r.  Initialize t
7b80: 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61  he MemPage.pBt a
7b90: 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44  nd.** MemPage.aD
7ba0: 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20  ata elements if 
7bb0: 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  needed..**.** If
7bc0: 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66   the noContent f
7bd0: 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d  lag is set, it m
7be0: 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20  eans that we do 
7bf0: 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 0a 2a  not care about.*
7c00: 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * the content of
7c10: 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69   the page at thi
7c20: 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e  s time.  So do n
7c30: 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73  ot go to the dis
7c40: 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68  k.** to fetch th
7c50: 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74  e content.  Just
7c60: 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e   fill in the con
7c70: 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20  tent with zeros 
7c80: 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69  for now..** If i
7c90: 6e 20 74 68 65 20 66 75 74 75 72 65 20 77 65 20  n the future we 
7ca0: 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65  call sqlite3Page
7cb0: 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73  rWrite() on this
7cc0: 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d   page, that.** m
7cd0: 65 61 6e 73 20 77 65 20 68 61 76 65 20 73 74 61  eans we have sta
7ce0: 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65  rted to be conce
7cf0: 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65  rned about conte
7d00: 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a  nt and the disk.
7d10: 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f  ** read should o
7d20: 63 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69  ccur at that poi
7d30: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
7d40: 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 0a  e3BtreeGetPage(.
7d50: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
7d60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
7d70: 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ree */.  Pgno pg
7d80: 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
7d90: 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
7da0: 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  age to fetch */.
7db0: 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
7dc0: 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ge,    /* Return
7dd0: 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
7de0: 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20  s parameter */. 
7df0: 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20   int noContent  
7e00: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7e10: 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e  load page conten
7e20: 74 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  t if true */.){.
7e30: 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
7e40: 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 44 62  age *pPage;.  Db
7e50: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a  Page *pDbPage;..
7e60: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
7e70: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
7e80: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
7e90: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41   = sqlite3PagerA
7ea0: 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67  cquire(pBt->pPag
7eb0: 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67  er, pgno, (DbPag
7ec0: 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 6e 6f  e**)&pDbPage, no
7ed0: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 69 66 28 20  Content);.  if( 
7ee0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
7ef0: 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61    pPage = (MemPa
7f00: 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ge *)sqlite3Page
7f10: 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67  rGetExtra(pDbPag
7f20: 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61  e);.  pPage->aDa
7f30: 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ta = sqlite3Page
7f40: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
7f50: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50  );.  pPage->pDbP
7f60: 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20  age = pDbPage;. 
7f70: 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42   pPage->pBt = pB
7f80: 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f  t;.  pPage->pgno
7f90: 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65   = pgno;.  pPage
7fa0: 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50  ->hdrOffset = pP
7fb0: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31  age->pgno==1 ? 1
7fc0: 30 30 20 3a 20 30 3b 0a 20 20 2a 70 70 50 61 67  00 : 0;.  *ppPag
7fd0: 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 72 65 74  e = pPage;.  ret
7fe0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
7ff0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
8000: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
8010: 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  r and initialize
8020: 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69   it.  This routi
8030: 6e 65 0a 2a 2a 20 69 73 20 6a 75 73 74 20 61 20  ne.** is just a 
8040: 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70  convenience wrap
8050: 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72  per around separ
8060: 61 74 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20  ate calls to.** 
8070: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
8080: 61 67 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65  age() and sqlite
8090: 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 29  3BtreeInitPage()
80a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
80b0: 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a  getAndInitPage(.
80c0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
80d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
80e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
80f0: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
8100: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
8110: 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
8120: 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61  o get */.  MemPa
8130: 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
8140: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67  /* Write the pag
8150: 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a  e pointer here *
8160: 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
8170: 72 65 6e 74 20 20 20 20 20 2f 2a 20 50 61 72 65  rent     /* Pare
8180: 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a  nt of the page *
8190: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
81a0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
81b0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
81c0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
81d0: 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20   pgno==0 ){.    
81e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
81f0: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d  RRUPT_BKPT; .  }
8200: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
8210: 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
8220: 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30   pgno, ppPage, 0
8230: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
8240: 49 54 45 5f 4f 4b 20 26 26 20 28 2a 70 70 50 61  ITE_OK && (*ppPa
8250: 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29  ge)->isInit==0 )
8260: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
8270: 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
8280: 2a 70 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74  *ppPage, pParent
8290: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
82a0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
82b0: 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
82c0: 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70  pPage);.      *p
82d0: 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d  pPage = 0;.    }
82e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
82f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
8300: 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54  se a MemPage.  T
8310: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61  his should be ca
8320: 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  lled once for ea
8330: 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c  ch prior.** call
8340: 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
8350: 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  GetPage..*/.stat
8360: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
8370: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
8380: 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  ge){.  if( pPage
8390: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
83a0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
83b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
83c0: 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73  e->pBt );.    as
83d0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
83e0: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
83f0: 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
8400: 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
8410: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8420: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
8430: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
8440: 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
8450: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
8460: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
8470: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
8480: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
8490: 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 2d  agerUnref(pPage-
84a0: 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d  >pDbPage);.  }.}
84b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
84c0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
84d0: 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63  hen the referenc
84e0: 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61  e count for a pa
84f0: 67 65 0a 2a 2a 20 72 65 61 63 68 65 73 20 7a 65  ge.** reaches ze
8500: 72 6f 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20  ro.  We need to 
8510: 75 6e 72 65 66 20 74 68 65 20 70 50 61 72 65 6e  unref the pParen
8520: 74 20 70 6f 69 6e 74 65 72 20 77 68 65 6e 20 74  t pointer when t
8530: 68 61 74 0a 2a 2a 20 68 61 70 70 65 6e 73 2e 0a  hat.** happens..
8540: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
8550: 61 67 65 44 65 73 74 72 75 63 74 6f 72 28 44 62  ageDestructor(Db
8560: 50 61 67 65 20 2a 70 44 61 74 61 2c 20 69 6e 74  Page *pData, int
8570: 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 4d 65   pageSize){.  Me
8580: 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
8590: 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
85a0: 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 70  e & 7)==0 );.  p
85b0: 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20  Page = (MemPage 
85c0: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
85d0: 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20  tExtra(pData);. 
85e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
85f0: 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 73 71 6c  isInit==0 || sql
8600: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
8610: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
8620: 78 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  x) );.  if( pPag
8630: 65 2d 3e 70 50 61 72 65 6e 74 20 29 7b 0a 20 20  e->pParent ){.  
8640: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
8650: 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72  nt = pPage->pPar
8660: 65 6e 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ent;.    assert(
8670: 20 70 50 61 72 65 6e 74 2d 3e 70 42 74 3d 3d 70   pParent->pBt==p
8680: 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20  Page->pBt );.   
8690: 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20   pPage->pParent 
86a0: 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  = 0;.    release
86b0: 50 61 67 65 28 70 50 61 72 65 6e 74 29 3b 0a 20  Page(pParent);. 
86c0: 20 7d 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e   }.  pPage->isIn
86d0: 69 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  it = 0;.}../*.**
86e0: 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   During a rollba
86f0: 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67  ck, when the pag
8700: 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72  er reloads infor
8710: 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  mation into the 
8720: 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74  cache.** so that
8730: 20 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65   the cache is re
8740: 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
8750: 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20  iginal state at 
8760: 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
8770: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
8780: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72   for each page r
8790: 65 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75  estored this rou
87a0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
87b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
87c0: 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65  ne needs to rese
87d0: 74 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61  t the extra data
87e0: 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20   section at the 
87f0: 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61  end of the.** pa
8800: 67 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68  ge to agree with
8810: 20 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61   the restored da
8820: 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ta..*/.static vo
8830: 69 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62  id pageReinit(Db
8840: 50 61 67 65 20 2a 70 44 61 74 61 2c 20 69 6e 74  Page *pData, int
8850: 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 4d 65   pageSize){.  Me
8860: 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
8870: 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
8880: 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 70  e & 7)==0 );.  p
8890: 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20  Page = (MemPage 
88a0: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
88b0: 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20  tExtra(pData);. 
88c0: 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e   if( pPage->isIn
88d0: 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  it ){.    assert
88e0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
88f0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
8900: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70  >mutex) );.    p
8910: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
8920: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
8930: 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
8940: 2c 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  , pPage->pParent
8950: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
8960: 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  Invoke the busy 
8970: 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74  handler for a bt
8980: 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ree..*/.static i
8990: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
89a0: 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
89b0: 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74  (void *pArg, int
89c0: 20 6e 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20   n){.  BtShared 
89d0: 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72 65 64  *pBt = (BtShared
89e0: 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74  *)pArg;.  assert
89f0: 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61  ( pBt->db );.  a
8a00: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
8a10: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64  utex_held(pBt->d
8a20: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
8a30: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 76  eturn sqlite3Inv
8a40: 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 26  okeBusyHandler(&
8a50: 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e  pBt->db->busyHan
8a60: 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  dler);.}../*.** 
8a70: 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  Open a database 
8a80: 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69  file..** .** zFi
8a90: 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61  lename is the na
8aa0: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
8ab0: 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69  se file.  If zFi
8ac0: 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a  lename is NULL.*
8ad0: 2a 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  * a new database
8ae0: 20 77 69 74 68 20 61 20 72 61 6e 64 6f 6d 20 6e   with a random n
8af0: 61 6d 65 20 69 73 20 63 72 65 61 74 65 64 2e 20  ame is created. 
8b00: 20 54 68 69 73 20 72 61 6e 64 6f 6d 6c 79 20 6e   This randomly n
8b10: 61 6d 65 64 0a 2a 2a 20 64 61 74 61 62 61 73 65  amed.** database
8b20: 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65   file will be de
8b30: 6c 65 74 65 64 20 77 68 65 6e 20 73 71 6c 69 74  leted when sqlit
8b40: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69  e3BtreeClose() i
8b50: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 49 66 20  s called..** If 
8b60: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
8b70: 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20  emory:" then an 
8b80: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
8b90: 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  se is created.**
8ba0: 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74   that is automat
8bb0: 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64  ically destroyed
8bc0: 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
8bd0: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
8be0: 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 63  e3BtreeOpen(.  c
8bf0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
8c00: 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  name,  /* Name o
8c10: 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61  f the file conta
8c20: 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65 20  ining the BTree 
8c30: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71  database */.  sq
8c40: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
8c50: 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61        /* Associa
8c60: 74 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e  ted database han
8c70: 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  dle */.  Btree *
8c80: 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20 20 20  *ppBtree,       
8c90: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e   /* Pointer to n
8ca0: 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ew Btree object 
8cb0: 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a  written here */.
8cc0: 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
8cd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74            /* Opt
8ce0: 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66  ions */.  int vf
8cf0: 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  sFlags          
8d00: 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
8d10: 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c  d through to sql
8d20: 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29  ite3_vfs.xOpen()
8d30: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
8d40: 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20  _vfs *pVfs;     
8d50: 20 2f 2a 20 54 68 65 20 56 46 53 20 74 6f 20 75   /* The VFS to u
8d60: 73 65 20 66 6f 72 20 74 68 69 73 20 62 74 72 65  se for this btre
8d70: 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  e */.  BtShared 
8d80: 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20 2f  *pBt = 0;      /
8d90: 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f 66  * Shared part of
8da0: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
8db0: 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20   */.  Btree *p; 
8dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8dd0: 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72   Handle to retur
8de0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  n */.  int rc = 
8df0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
8e00: 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 75 6e 73   nReserve;.  uns
8e10: 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65  igned char zDbHe
8e20: 61 64 65 72 5b 31 30 30 5d 3b 0a 0a 20 20 2f 2a  ader[100];..  /*
8e30: 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62 6c   Set the variabl
8e40: 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75  e isMemdb to tru
8e50: 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  e for an in-memo
8e60: 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20  ry database, or 
8e70: 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20  .  ** false for 
8e80: 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74  a file-based dat
8e90: 61 62 61 73 65 2e 20 54 68 69 73 20 73 79 6d 62  abase. This symb
8ea0: 6f 6c 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69  ol is only requi
8eb0: 72 65 64 20 69 66 0a 20 20 2a 2a 20 65 69 74 68  red if.  ** eith
8ec0: 65 72 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  er of the shared
8ed0: 2d 64 61 74 61 20 6f 72 20 61 75 74 6f 76 61 63  -data or autovac
8ee0: 75 75 6d 20 66 65 61 74 75 72 65 73 20 61 72 65  uum features are
8ef0: 20 63 6f 6d 70 69 6c 65 64 20 0a 20 20 2a 2a 20   compiled .  ** 
8f00: 69 6e 74 6f 20 74 68 65 20 6c 69 62 72 61 72 79  into the library
8f10: 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  ..  */.#if !defi
8f20: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
8f30: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 7c 7c  SHARED_CACHE) ||
8f40: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8f50: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
8f60: 29 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49 54  ).  #ifdef SQLIT
8f70: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
8f80: 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73      const int is
8f90: 4d 65 6d 64 62 20 3d 20 30 3b 0a 20 20 23 65 6c  Memdb = 0;.  #el
8fa0: 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  se.    const int
8fb0: 20 69 73 4d 65 6d 64 62 20 3d 20 7a 46 69 6c 65   isMemdb = zFile
8fc0: 6e 61 6d 65 20 26 26 20 21 73 74 72 63 6d 70 28  name && !strcmp(
8fd0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d  zFilename, ":mem
8fe0: 6f 72 79 3a 22 29 3b 0a 20 20 23 65 6e 64 69 66  ory:");.  #endif
8ff0: 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
9000: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t( db!=0 );.  as
9010: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
9020: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
9030: 65 78 29 20 29 3b 0a 0a 20 20 70 56 66 73 20 3d  ex) );..  pVfs =
9040: 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 70 20 3d   db->pVfs;.  p =
9050: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
9060: 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29  ro(sizeof(Btree)
9070: 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20  );.  if( !p ){. 
9080: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9090: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d  _NOMEM;.  }.  p-
90a0: 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
90b0: 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d  _NONE;.  p->db =
90c0: 20 64 62 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e   db;..#if !defin
90d0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
90e0: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
90f0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
9100: 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f  OMIT_DISKIO).  /
9110: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42  *.  ** If this B
9120: 74 72 65 65 20 69 73 20 61 20 63 61 6e 64 69 64  tree is a candid
9130: 61 74 65 20 66 6f 72 20 73 68 61 72 65 64 20 63  ate for shared c
9140: 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e  ache, try to fin
9150: 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69  d an.  ** existi
9160: 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  ng BtShared obje
9170: 63 74 20 74 68 61 74 20 77 65 20 63 61 6e 20 73  ct that we can s
9180: 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20  hare with.  */. 
9190: 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 42 54   if( (flags & BT
91a0: 52 45 45 5f 50 52 49 56 41 54 45 29 3d 3d 30 0a  REE_PRIVATE)==0.
91b0: 20 20 20 26 26 20 69 73 4d 65 6d 64 62 3d 3d 30     && isMemdb==0
91c0: 0a 20 20 20 26 26 20 28 64 62 2d 3e 66 6c 61 67  .   && (db->flag
91d0: 73 20 26 20 53 51 4c 49 54 45 5f 56 74 61 62 29  s & SQLITE_Vtab)
91e0: 3d 3d 30 0a 20 20 20 26 26 20 7a 46 69 6c 65 6e  ==0.   && zFilen
91f0: 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
9200: 5b 30 5d 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  [0].  ){.    if(
9210: 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61   sqlite3SharedCa
9220: 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20  cheEnabled ){.  
9230: 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74      int nFullPat
9240: 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
9250: 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
9260: 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74    char *zFullPat
9270: 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  hname = sqlite3M
9280: 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e  alloc(nFullPathn
9290: 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ame);.      sqli
92a0: 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
92b0: 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70 2d  Shared;.      p-
92c0: 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20  >sharable = 1;. 
92d0: 20 20 20 20 20 69 66 28 20 64 62 20 29 7b 0a 20       if( db ){. 
92e0: 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73         db->flags
92f0: 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 61 72 65   |= SQLITE_Share
9300: 64 43 61 63 68 65 3b 0a 20 20 20 20 20 20 7d 0a  dCache;.      }.
9310: 20 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c        if( !zFull
9320: 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
9330: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
9340: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  (p);.        ret
9350: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
9360: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9370: 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74  sqlite3OsFullPat
9380: 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c  hname(pVfs, zFil
9390: 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c 50 61 74 68  ename, nFullPath
93a0: 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  name, zFullPathn
93b0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 6d 75 74 65  ame);.      mute
93c0: 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
93d0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
93e0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
93f0: 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73  MASTER);.      s
9400: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
9410: 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
9420: 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d 73  .      for(pBt=s
9430: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
9440: 65 4c 69 73 74 3b 20 70 42 74 3b 20 70 42 74 3d  eList; pBt; pBt=
9450: 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  pBt->pNext){.   
9460: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
9470: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
9480: 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
9490: 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  p(zFullPathname,
94a0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
94b0: 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65  ename(pBt->pPage
94c0: 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  r)).            
94d0: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
94e0: 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61  agerVfs(pBt->pPa
94f0: 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20  ger)==pVfs ){.  
9500: 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d          p->pBt =
9510: 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20   pBt;.          
9520: 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  pBt->nRef++;.   
9530: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9540: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
9550: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
9560: 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
9570: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71  hared);.      sq
9580: 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
9590: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  Pathname);.    }
95a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
95b0: 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20  EBUG.    else{. 
95c0: 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67       /* In debug
95d0: 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61   mode, we mark a
95e0: 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64 61  ll persistent da
95f0: 74 61 62 61 73 65 73 20 61 73 20 73 68 61 72 61  tabases as shara
9600: 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65  ble.      ** eve
9610: 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20  n when they are 
9620: 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72 63  not.  This exerc
9630: 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ises the locking
9640: 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20   code and.      
9650: 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70  ** gives more op
9660: 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73  portunity for as
9670: 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75  serts(sqlite3_mu
9680: 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20  tex_held()).    
9690: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20    ** statements 
96a0: 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20  to find locking 
96b0: 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20  problems..      
96c0: 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  */.      p->shar
96d0: 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  able = 1;.    }.
96e0: 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69  #endif.  }.#endi
96f0: 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29  f.  if( pBt==0 )
9700: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
9710: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
9720: 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20  serts make sure 
9730: 74 68 61 74 20 73 74 72 75 63 74 75 72 65 73 20  that structures 
9740: 75 73 65 64 20 62 79 20 74 68 65 20 62 74 72 65  used by the btre
9750: 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65  e are.    ** the
9760: 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68   right size.  Th
9770: 69 73 20 69 73 20 74 6f 20 67 75 61 72 64 20 61  is is to guard a
9780: 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e  gainst size chan
9790: 67 65 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a  ges that result.
97a0: 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70      ** when comp
97b0: 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65  iling on a diffe
97c0: 72 65 6e 74 20 61 72 63 68 69 74 65 63 74 75 72  rent architectur
97d0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
97e0: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34  sert( sizeof(i64
97f0: 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 69  )==8 || sizeof(i
9800: 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73  64)==4 );.    as
9810: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34  sert( sizeof(u64
9820: 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 75  )==8 || sizeof(u
9830: 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73  64)==4 );.    as
9840: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32  sert( sizeof(u32
9850: 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65  )==4 );.    asse
9860: 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d  rt( sizeof(u16)=
9870: 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =2 );.    assert
9880: 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d  ( sizeof(Pgno)==
9890: 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20  4 );.  .    pBt 
98a0: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
98b0: 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74  ero( sizeof(*pBt
98c0: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  ) );.    if( pBt
98d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
98e0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
98f0: 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
9900: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
9910: 0a 20 20 20 20 70 42 74 2d 3e 62 75 73 79 48 64  .    pBt->busyHd
9920: 72 2e 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65  r.xFunc = sqlite
9930: 33 42 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79  3BtreeInvokeBusy
9940: 48 61 6e 64 6c 65 72 3b 0a 20 20 20 20 70 42 74  Handler;.    pBt
9950: 2d 3e 62 75 73 79 48 64 72 2e 70 41 72 67 20 3d  ->busyHdr.pArg =
9960: 20 70 42 74 3b 0a 20 20 20 20 72 63 20 3d 20 73   pBt;.    rc = s
9970: 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28  qlite3PagerOpen(
9980: 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67  pVfs, &pBt->pPag
9990: 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20  er, zFilename,. 
99a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99b0: 20 20 20 20 20 20 20 20 20 45 58 54 52 41 5f 53           EXTRA_S
99c0: 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66 73 46  IZE, flags, vfsF
99d0: 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72  lags);.    if( r
99e0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
99f0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
9a00: 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68  e3PagerReadFileh
9a10: 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65  eader(pBt->pPage
9a20: 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64  r,sizeof(zDbHead
9a30: 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a  er),zDbHeader);.
9a40: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
9a50: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
9a60: 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f       goto btree_
9a70: 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  open_out;.    }.
9a80: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
9a90: 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70  SetBusyhandler(p
9aa0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
9ab0: 2d 3e 62 75 73 79 48 64 72 29 3b 0a 20 20 20 20  ->busyHdr);.    
9ac0: 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  p->pBt = pBt;.  
9ad0: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
9ae0: 72 53 65 74 44 65 73 74 72 75 63 74 6f 72 28 70  rSetDestructor(p
9af0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65  Bt->pPager, page
9b00: 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20  Destructor);.   
9b10: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
9b20: 52 65 69 6e 69 74 65 72 28 70 42 74 2d 3e 70 50  Reiniter(pBt->pP
9b30: 61 67 65 72 2c 20 70 61 67 65 52 65 69 6e 69 74  ager, pageReinit
9b40: 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72  );.    pBt->pCur
9b50: 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  sor = 0;.    pBt
9b60: 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
9b70: 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20    pBt->readOnly 
9b80: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  = sqlite3PagerIs
9b90: 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50  readonly(pBt->pP
9ba0: 61 67 65 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ager);.    pBt->
9bb0: 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62  pageSize = get2b
9bc0: 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 31  yte(&zDbHeader[1
9bd0: 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  6]);.    if( pBt
9be0: 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c  ->pageSize<512 |
9bf0: 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  | pBt->pageSize>
9c00: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
9c10: 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c  SIZE.         ||
9c20: 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   ((pBt->pageSize
9c30: 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  -1)&pBt->pageSiz
9c40: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  e)!=0 ){.      p
9c50: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30  Bt->pageSize = 0
9c60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
9c70: 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
9c80: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
9c90: 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23 69  t->pageSize);.#i
9ca0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9cb0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
9cc0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67     /* If the mag
9cd0: 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79  ic name ":memory
9ce0: 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61  :" will create a
9cf0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
9d00: 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20  base, then.     
9d10: 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75   ** leave the au
9d20: 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74  toVacuum mode at
9d30: 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d   0 (do not auto-
9d40: 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66  vacuum), even if
9d50: 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
9d60: 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
9d70: 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20  UUM is true. On 
9d80: 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
9d90: 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  if.      ** SQLI
9da0: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
9db0: 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65   has been define
9dc0: 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79  d, then ":memory
9dd0: 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20  :" is just a.   
9de0: 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69     ** regular fi
9df0: 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  le-name. In this
9e00: 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76   case the auto-v
9e10: 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73  acuum applies as
9e20: 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20   per normal..   
9e30: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
9e40: 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73  zFilename && !is
9e50: 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20  Memdb ){.       
9e60: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
9e70: 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
9e80: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20  LT_AUTOVACUUM ? 
9e90: 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  1 : 0);.        
9ea0: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
9eb0: 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  = (SQLITE_DEFAUL
9ec0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20  T_AUTOVACUUM==2 
9ed0: 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ? 1 : 0);.      
9ee0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e  }.#endif.      n
9ef0: 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20  Reserve = 0;.   
9f00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52   }else{.      nR
9f10: 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64  eserve = zDbHead
9f20: 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42  er[20];.      pB
9f30: 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
9f40: 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
9f50: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
9f60: 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e  CUUM.      pBt->
9f70: 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
9f80: 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t4byte(&zDbHeade
9f90: 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  r[36 + 4*4])?1:0
9fa0: 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  );.      pBt->in
9fb0: 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  crVacuum = (get4
9fc0: 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
9fd0: 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
9fe0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
9ff0: 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
a000: 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
a010: 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20  e - nReserve;.  
a020: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
a030: 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
a040: 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61   );  /* 8-byte a
a050: 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65  lignment of page
a060: 53 69 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69  Size */.    sqli
a070: 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
a080: 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
a090: 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29   &pBt->pageSize)
a0a0: 3b 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e  ;.   .#if !defin
a0b0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
a0c0: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
a0d0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
a0e0: 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20  OMIT_DISKIO).   
a0f0: 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20   /* Add the new 
a100: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
a110: 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  to the linked li
a120: 73 74 20 73 68 61 72 61 62 6c 65 20 42 74 53 68  st sharable BtSh
a130: 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  areds..    */.  
a140: 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
a150: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
a160: 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53  e3_mutex *mutexS
a170: 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70 42 74  hared;.      pBt
a180: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
a190: 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20    mutexShared = 
a1a0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
a1b0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
a1c0: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20  TATIC_MASTER);. 
a1d0: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
a1e0: 54 48 52 45 41 44 53 41 46 45 20 26 26 20 73 71  THREADSAFE && sq
a1f0: 6c 69 74 65 33 43 6f 6e 66 69 67 2e 62 43 6f 72  lite3Config.bCor
a200: 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20  eMutex ){.      
a210: 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73    pBt->mutex = s
a220: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
a230: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
a240: 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ST);.        if(
a250: 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29   pBt->mutex==0 )
a260: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
a270: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
a280: 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c           db->mal
a290: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20  locFailed = 0;. 
a2a0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74           goto bt
a2b0: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
a2c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
a2d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
a2e0: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
a2f0: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42  hared);.      pB
a300: 74 2d 3e 70 4e 65 78 74 20 3d 20 73 71 6c 69 74  t->pNext = sqlit
a310: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
a320: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
a330: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 20  SharedCacheList 
a340: 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c  = pBt;.      sql
a350: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
a360: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
a370: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
a380: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
a390: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
a3a0: 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
a3b0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
a3c0: 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20  DISKIO).  /* If 
a3d0: 74 68 65 20 6e 65 77 20 42 74 72 65 65 20 75 73  the new Btree us
a3e0: 65 73 20 61 20 73 68 61 72 61 62 6c 65 20 70 42  es a sharable pB
a3f0: 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69  tShared, then li
a400: 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20  nk the new.  ** 
a410: 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c  Btree into the l
a420: 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61  ist of all shara
a430: 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20 74  ble Btrees for t
a440: 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69  he same connecti
a450: 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73  on..  ** The lis
a460: 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63  t is kept in asc
a470: 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20  ending order by 
a480: 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a  pBt address..  *
a490: 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61  /.  if( p->shara
a4a0: 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ble ){.    int i
a4b0: 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53 69  ;.    Btree *pSi
a4c0: 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  b;.    for(i=0; 
a4d0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
a4e0: 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 69 62  .      if( (pSib
a4f0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
a500: 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73  t)!=0 && pSib->s
a510: 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
a520: 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e     while( pSib->
a530: 70 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20  pPrev ){ pSib = 
a540: 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20  pSib->pPrev; }. 
a550: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 42         if( p->pB
a560: 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20  t<pSib->pBt ){. 
a570: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
a580: 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20  t = pSib;.      
a590: 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30      p->pPrev = 0
a5a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62  ;.          pSib
a5b0: 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20  ->pPrev = p;.   
a5c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a5d0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69        while( pSi
a5e0: 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53 69 62  b->pNext && pSib
a5f0: 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e  ->pNext->pBt<p->
a600: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
a610: 20 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e     pSib = pSib->
a620: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
a630: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
a640: 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e  pNext = pSib->pN
a650: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ext;.          p
a660: 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a  ->pPrev = pSib;.
a670: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
a680: 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
a690: 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e        p->pNext->
a6a0: 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20  pPrev = p;.     
a6b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
a6c0: 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70   pSib->pNext = p
a6d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a6e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a6f0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
a700: 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d  dif.  *ppBtree =
a710: 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f   p;..btree_open_
a720: 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  out:.  if( rc!=S
a730: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
a740: 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  if( pBt && pBt->
a750: 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20  pPager ){.      
a760: 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
a770: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pBt->pPager);.
a780: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
a790: 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20  3_free(pBt);.   
a7a0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
a7b0: 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d  ;.    *ppBtree =
a7c0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
a7d0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
a7e0: 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68  crement the BtSh
a7f0: 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65  ared.nRef counte
a800: 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63  r.  When it reac
a810: 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d  hes zero,.** rem
a820: 6f 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64  ove the BtShared
a830: 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
a840: 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
a850: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75  .  Return.** tru
a860: 65 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65  e if the BtShare
a870: 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72  d.nRef counter r
a880: 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20  eaches zero and 
a890: 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20  return.** false 
a8a0: 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70  if it is still p
a8b0: 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74  ositive..*/.stat
a8c0: 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f  ic int removeFro
a8d0: 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53  mSharingList(BtS
a8e0: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66  hared *pBt){.#if
a8f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a900: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
a910: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
a920: 4d 61 73 74 65 72 3b 0a 20 20 42 74 53 68 61 72  Master;.  BtShar
a930: 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74  ed *pList;.  int
a940: 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20   removed = 0;.. 
a950: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a960: 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70  _mutex_notheld(p
a970: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
a980: 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  pMaster = sqlite
a990: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
a9a0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
a9b0: 4d 41 53 54 45 52 29 3b 0a 20 20 73 71 6c 69 74  MASTER);.  sqlit
a9c0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
a9d0: 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e  Master);.  pBt->
a9e0: 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42  nRef--;.  if( pB
a9f0: 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20  t->nRef<=0 ){.  
aa00: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 68 61    if( sqlite3Sha
aa10: 72 65 64 43 61 63 68 65 4c 69 73 74 3d 3d 70 42  redCacheList==pB
aa20: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
aa30: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
aa40: 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a  t = pBt->pNext;.
aa50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
aa60: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
aa70: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 3b  SharedCacheList;
aa80: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4c  .      while( pL
aa90: 69 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e  ist && pList->pN
aaa0: 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20  ext!=pBt ){.    
aab0: 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d      pList=pList-
aac0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
aad0: 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 20        if( pList 
aae0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
aaf0: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
ab00: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
ab10: 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49    }.    if( SQLI
ab20: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b  TE_THREADSAFE ){
ab30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
ab40: 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d  utex_free(pBt->m
ab50: 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  utex);.    }.   
ab60: 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20   removed = 1;.  
ab70: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
ab80: 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29  x_leave(pMaster)
ab90: 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76  ;.  return remov
aba0: 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75  ed;.#else.  retu
abb0: 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 1;.#endif.}..
abc0: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
abd0: 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70  pBt->pTmpSpace p
abe0: 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f  oints to an allo
abf0: 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58  cation of .** MX
ac00: 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
ac10: 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  bytes..*/.static
ac20: 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65   void allocateTe
ac30: 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64  mpSpace(BtShared
ac40: 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70   *pBt){.  if( !p
ac50: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b  Bt->pTmpSpace ){
ac60: 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  .    pBt->pTmpSp
ac70: 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ace = sqlite3Pag
ac80: 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61  eMalloc( pBt->pa
ac90: 67 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a  geSize );.  }.}.
aca0: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
acb0: 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61  pBt->pTmpSpace a
acc0: 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  llocation.*/.sta
acd0: 74 69 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d  tic void freeTem
ace0: 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20  pSpace(BtShared 
acf0: 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  *pBt){.  sqlite3
ad00: 50 61 67 65 46 72 65 65 28 20 70 42 74 2d 3e 70  PageFree( pBt->p
ad10: 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 70 42 74  TmpSpace);.  pBt
ad20: 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b  ->pTmpSpace = 0;
ad30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
ad40: 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  an open database
ad50: 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20   and invalidate 
ad60: 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a  all cursors..*/.
ad70: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
ad80: 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b  Close(Btree *p){
ad90: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
ada0: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43   = p->pBt;.  BtC
adb0: 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20  ursor *pCur;..  
adc0: 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72  /* Close all cur
add0: 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20  sors opened via 
ade0: 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f  this handle.  */
adf0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
ae00: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
ae10: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
ae20: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
ae30: 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62  er(p);.  pBt->db
ae40: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 70 43 75 72   = p->db;.  pCur
ae50: 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
ae60: 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29  .  while( pCur )
ae70: 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a  {.    BtCursor *
ae80: 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20  pTmp = pCur;.   
ae90: 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e   pCur = pCur->pN
aea0: 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d  ext;.    if( pTm
aeb0: 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  p->pBtree==p ){.
aec0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
aed0: 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54  eeCloseCursor(pT
aee0: 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  mp);.    }.  }..
aef0: 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e    /* Rollback an
af00: 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  y active transac
af10: 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68  tion and free th
af20: 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75  e handle structu
af30: 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c  re..  ** The cal
af40: 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
af50: 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70  eRollback() drop
af60: 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b  s any table-lock
af70: 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74  s held by.  ** t
af80: 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f  his handle..  */
af90: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  .  sqlite3BtreeR
afa0: 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73 71  ollback(p);.  sq
afb0: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
afc0: 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
afd0: 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68  re are still oth
afe0: 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  er outstanding r
aff0: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
b000: 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20   shared-btree.  
b010: 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72 65  ** structure, re
b020: 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65  turn now. The re
b030: 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20  mainder of this 
b040: 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73  procedure cleans
b050: 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68   .  ** up the sh
b060: 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f  ared-btree..  */
b070: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61  .  assert( p->wa
b080: 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70  ntToLock==0 && p
b090: 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20  ->locked==0 );. 
b0a0: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
b0b0: 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53  e || removeFromS
b0c0: 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20  haringList(pBt) 
b0d0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42  ){.    /* The pB
b0e0: 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f  t is no longer o
b0f0: 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69  n the sharing li
b100: 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63  st, so we can ac
b110: 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77  cess.    ** it w
b120: 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
b130: 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e   hold the mutex.
b140: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
b150: 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c  lean out and del
b160: 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65 64  ete the BtShared
b170: 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   object..    */.
b180: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
b190: 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
b1a0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
b1b0: 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  se(pBt->pPager);
b1c0: 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46  .    if( pBt->xF
b1d0: 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42 74  reeSchema && pBt
b1e0: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
b1f0: 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68     pBt->xFreeSch
b200: 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61  ema(pBt->pSchema
b210: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
b220: 69 74 65 33 5f 66 72 65 65 28 70 42 74 2d 3e 70  ite3_free(pBt->p
b230: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66 72 65  Schema);.    fre
b240: 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
b250: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
b260: 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66  e(pBt);.  }..#if
b270: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b280: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
b290: 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54  assert( p->wantT
b2a0: 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73  oLock==0 );.  as
b2b0: 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d  sert( p->locked=
b2c0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  =0 );.  if( p->p
b2d0: 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d  Prev ) p->pPrev-
b2e0: 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
b2f0: 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78  t;.  if( p->pNex
b300: 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50  t ) p->pNext->pP
b310: 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a  rev = p->pPrev;.
b320: 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
b330: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74  3_free(p);.  ret
b340: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
b350: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
b360: 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20  he limit on the 
b370: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
b380: 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 63  allowed in the c
b390: 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ache..**.** The 
b3a0: 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
b3b0: 66 20 63 61 63 68 65 20 70 61 67 65 73 20 69 73  f cache pages is
b3c0: 20 73 65 74 20 74 6f 20 74 68 65 20 61 62 73 6f   set to the abso
b3d0: 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66  lute.** value of
b3e0: 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d 78 50   mxPage.  If mxP
b3f0: 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c  age is negative,
b400: 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 0a   the pager will.
b410: 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79 6e 63  ** operate async
b420: 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77  hronously - it w
b430: 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20  ill not stop to 
b440: 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74  do fsync()s.** t
b450: 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20 69 73  o insure data is
b460: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
b470: 64 69 73 6b 20 73 75 72 66 61 63 65 20 62 65 66  disk surface bef
b480: 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e  ore.** continuin
b490: 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 73  g.  Transactions
b4a0: 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73   still work if s
b4b0: 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66  ynchronous is of
b4c0: 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61  f,.** and the da
b4d0: 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65  tabase cannot be
b4e0: 20 63 6f 72 72 75 70 74 65 64 20 69 66 20 74 68   corrupted if th
b4f0: 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72  is program.** cr
b500: 61 73 68 65 73 2e 20 20 42 75 74 20 69 66 20 74  ashes.  But if t
b510: 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
b520: 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74  tem crashes or t
b530: 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62  here is.** an ab
b540: 72 75 70 74 20 70 6f 77 65 72 20 66 61 69 6c 75  rupt power failu
b550: 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e  re when synchron
b560: 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68 65 20  ous is off, the 
b570: 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c  database.** coul
b580: 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20  d be left in an 
b590: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64  inconsistent and
b5a0: 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65 20 73   unrecoverable s
b5b0: 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f  tate..** Synchro
b5c0: 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20 64 65  nous is on by de
b5d0: 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62 61 73  fault so databas
b5e0: 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  e corruption is 
b5f0: 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20  not.** normally 
b600: 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20  a worry..*/.int 
b610: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43  sqlite3BtreeSetC
b620: 61 63 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a  acheSize(Btree *
b630: 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  p, int mxPage){.
b640: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
b650: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
b660: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
b670: 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
b680: 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
b690: 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
b6a0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
b6b0: 74 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e  tCachesize(pBt->
b6c0: 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b  pPager, mxPage);
b6d0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
b6e0: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
b6f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
b700: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
b710: 20 77 61 79 20 64 61 74 61 20 69 73 20 73 79 6e   way data is syn
b720: 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f  ced to disk in o
b730: 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65  rder to increase
b740: 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20   or decrease.** 
b750: 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74  how well the dat
b760: 61 62 61 73 65 20 72 65 73 69 73 74 73 20 64 61  abase resists da
b770: 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
b780: 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72  rashes and power
b790: 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c  .** failures.  L
b7a0: 65 76 65 6c 20 31 20 69 73 20 74 68 65 20 73 61  evel 1 is the sa
b7b0: 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f  me as asynchrono
b7c0: 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f  us (no syncs() o
b7d0: 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72  ccur and.** ther
b7e0: 65 20 69 73 20 61 20 68 69 67 68 20 70 72 6f 62  e is a high prob
b7f0: 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
b800: 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74  e)  Level 2 is t
b810: 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65  he default.  The
b820: 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20  re.** is a very 
b830: 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f  low but non-zero
b840: 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
b850: 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33  damage.  Level 3
b860: 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20   reduces the.** 
b870: 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
b880: 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65  amage to near ze
b890: 72 6f 20 62 75 74 20 77 69 74 68 20 61 20 77 72  ro but with a wr
b8a0: 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  ite performance 
b8b0: 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  reduction..*/.#i
b8c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b8d0: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
b8e0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
b8f0: 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 42  SetSafetyLevel(B
b900: 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6c 65 76  tree *p, int lev
b910: 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63  el, int fullSync
b920: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
b930: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
b940: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
b950: 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
b960: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
b970: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
b980: 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
b990: 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  rSetSafetyLevel(
b9a0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76  pBt->pPager, lev
b9b0: 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 29 3b 0a 20  el, fullSync);. 
b9c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
b9d0: 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
b9e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
b9f0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
ba00: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
ba10: 76 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74  ven btree is set
ba20: 20 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c   to safety level
ba30: 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a   1.  In other.**
ba40: 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54   words, return T
ba50: 52 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29  RUE if no sync()
ba60: 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64   occurs on the d
ba70: 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e  isk files..*/.in
ba80: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79  t sqlite3BtreeSy
ba90: 6e 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65  ncDisabled(Btree
baa0: 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
bab0: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
bac0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
bad0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
bae0: 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
baf0: 74 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69  tex) );  .  sqli
bb00: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
bb10: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 20  ;.  assert( pBt 
bb20: 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29  && pBt->pPager )
bb30: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
bb40: 50 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d  PagerNosync(pBt-
bb50: 3e 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69  >pPager);.  sqli
bb60: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
bb70: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
bb80: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
bb90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
bba0: 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65  _PRAGMAS) || !de
bbb0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
bbc0: 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20  T_VACUUM)./*.** 
bbd0: 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75  Change the defau
bbe0: 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e  lt pages size an
bbf0: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
bc00: 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70  reserved bytes p
bc10: 65 72 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  er page..**.** T
bc20: 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73  he page size mus
bc30: 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  t be a power of 
bc40: 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e  2 between 512 an
bc50: 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68 65  d 65536.  If the
bc60: 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75   page.** size su
bc70: 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20  pplied does not 
bc80: 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72  meet this constr
bc90: 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61  aint then the pa
bca0: 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a  ge size is not.*
bcb0: 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  * changed..**.**
bcc0: 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65 20   Page sizes are 
bcd0: 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62  constrained to b
bce0: 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f  e a power of two
bcf0: 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65 67   so that the reg
bd00: 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  ion.** of the da
bd10: 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64  tabase file used
bd20: 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65   for locking (be
bd30: 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49  ginning at PENDI
bd40: 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20  NG_BYTE,.** the 
bd50: 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  first byte past 
bd60: 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79  the 1GB boundary
bd70: 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e 65  , 0x40000000) ne
bd80: 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20  eds to occur.** 
bd90: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
bda0: 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a   of a page..**.*
bdb0: 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e  * If parameter n
bdc0: 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73 20  Reserve is less 
bdd0: 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
bde0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
bdf0: 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20  served.** bytes 
be00: 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66 74  per page is left
be10: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69   unchanged..*/.i
be20: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
be30: 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
be40: 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a   *p, int pageSiz
be50: 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29  e, int nReserve)
be60: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
be70: 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72  ITE_OK;.  BtShar
be80: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
be90: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
bea0: 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
beb0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78  pBt->pageSizeFix
bec0: 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
bed0: 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
bee0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
bef0: 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a  E_READONLY;.  }.
bf00: 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30    if( nReserve<0
bf10: 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65   ){.    nReserve
bf20: 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
bf30: 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
bf40: 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 61  ze;.  }.  if( pa
bf50: 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
bf60: 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
bf70: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26  MAX_PAGE_SIZE &&
bf80: 0a 20 20 20 20 20 20 20 20 28 28 70 61 67 65 53  .        ((pageS
bf90: 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29  ize-1)&pageSize)
bfa0: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
bfb0: 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
bfc0: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )==0 );.    asse
bfd0: 72 74 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31  rt( !pBt->pPage1
bfe0: 20 26 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f   && !pBt->pCurso
bff0: 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61  r );.    pBt->pa
c000: 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
c010: 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  e;.    freeTempS
c020: 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 72  pace(pBt);.    r
c030: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
c040: 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
c050: 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
c060: 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  ageSize);.  }.  
c070: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
c080: 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
c090: 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 73 71  - nReserve;.  sq
c0a0: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
c0b0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
c0c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
c0d0: 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64   the currently d
c0e0: 65 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65  efined page size
c0f0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
c100: 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 28  treeGetPageSize(
c110: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74  Btree *p){.  ret
c120: 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65  urn p->pBt->page
c130: 53 69 7a 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  Size;.}.int sqli
c140: 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
c150: 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ve(Btree *p){.  
c160: 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
c170: 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
c180: 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67   n = p->pBt->pag
c190: 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e  eSize - p->pBt->
c1a0: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71  usableSize;.  sq
c1b0: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
c1c0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  p);.  return n;.
c1d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
c1e0: 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
c1f0: 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62 61  unt for a databa
c200: 73 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  se if mxPage is 
c210: 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20  positive..** No 
c220: 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
c230: 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 30 20   if mxPage is 0 
c240: 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20  or negative..** 
c250: 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
c260: 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67  e value of mxPag
c270: 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61  e, return the ma
c280: 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
c290: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
c2a0: 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e  BtreeMaxPageCoun
c2b0: 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
c2c0: 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e  mxPage){.  int n
c2d0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
c2e0: 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
c2f0: 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50  sqlite3PagerMaxP
c300: 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d  ageCount(p->pBt-
c310: 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29  >pPager, mxPage)
c320: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
c330: 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
c340: 72 6e 20 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn n;.}.#endif /
c350: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
c360: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
c370: 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65  GMAS) || !define
c380: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  d(SQLITE_OMIT_VA
c390: 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  CUUM) */../*.** 
c3a0: 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f  Change the 'auto
c3b0: 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74  -vacuum' propert
c3c0: 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  y of the databas
c3d0: 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f 56  e. If the 'autoV
c3e0: 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65  acuum'.** parame
c3f0: 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
c400: 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75   then auto-vacuu
c410: 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65  m mode is enable
c420: 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a  d. If zero, it.*
c430: 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54  * is disabled. T
c440: 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
c450: 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61   for the auto-va
c460: 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73  cuum property is
c470: 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20   .** determined 
c480: 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45  by the SQLITE_DE
c490: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
c4a0: 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73   macro..*/.int s
c4b0: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75  qlite3BtreeSetAu
c4c0: 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  toVacuum(Btree *
c4d0: 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75  p, int autoVacuu
c4e0: 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  m){.#ifdef SQLIT
c4f0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
c500: 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  M.  return SQLIT
c510: 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73  E_READONLY;.#els
c520: 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  e.  BtShared *pB
c530: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
c540: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c550: 3b 0a 20 20 69 6e 74 20 61 76 20 3d 20 28 61 75  ;.  int av = (au
c560: 74 6f 56 61 63 75 75 6d 3f 31 3a 30 29 3b 0a 0a  toVacuum?1:0);..
c570: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
c580: 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42  ter(p);.  if( pB
c590: 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
c5a0: 20 26 26 20 61 76 21 3d 70 42 74 2d 3e 61 75 74   && av!=pBt->aut
c5b0: 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
c5c0: 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
c5d0: 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  NLY;.  }else{.  
c5e0: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
c5f0: 6d 20 3d 20 61 76 3b 0a 20 20 7d 0a 20 20 73 71  m = av;.  }.  sq
c600: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
c610: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
c620: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
c630: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
c640: 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76  e of the 'auto-v
c650: 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e  acuum' property.
c660: 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   If auto-vacuum 
c670: 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31  is .** enabled 1
c680: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
c690: 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e  herwise 0..*/.in
c6a0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
c6b0: 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
c6c0: 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51  e *p){.#ifdef SQ
c6d0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
c6e0: 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54  CUUM.  return BT
c6f0: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
c700: 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  ONE;.#else.  int
c710: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
c720: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
c730: 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70  c = (.    (!p->p
c740: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f  Bt->autoVacuum)?
c750: 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
c760: 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e  _NONE:.    (!p->
c770: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29  pBt->incrVacuum)
c780: 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
c790: 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45  M_FULL:.    BTRE
c7a0: 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43  E_AUTOVACUUM_INC
c7b0: 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  R.  );.  sqlite3
c7c0: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
c7d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
c7e0: 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  if.}.../*.** Get
c7f0: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
c800: 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61  pPage1 of the da
c810: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
c820: 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  is will.** also 
c830: 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f  acquire a readlo
c840: 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e  ck on that file.
c850: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
c860: 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
c870: 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65  success.  If the
c880: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a   file is not a.*
c890: 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  * well-formed da
c8a0: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
c8b0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c8c0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
c8d0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
c8e0: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
c8f0: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
c900: 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ed.  SQLITE_NOME
c910: 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  M.** is returned
c920: 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f   if we run out o
c930: 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74  f memory. .*/.st
c940: 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72  atic int lockBtr
c950: 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ee(BtShared *pBt
c960: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
c970: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
c980: 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20    int nPage;..  
c990: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
c9a0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
c9b0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
c9c0: 70 42 74 2d 3e 70 50 61 67 65 31 20 29 20 72 65  pBt->pPage1 ) re
c9d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c9e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
c9f0: 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
ca00: 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a  1, &pPage1, 0);.
ca10: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
ca20: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
ca30: 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63  ..  /* Do some c
ca40: 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20  hecking to help 
ca50: 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 20  insure the file 
ca60: 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79  we opened really
ca70: 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64   is.  ** a valid
ca80: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
ca90: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
caa0: 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
cab0: 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
cac0: 26 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  &nPage);.  if( r
cad0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
cae0: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
caf0: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 65  nit_failed;.  }e
cb00: 6c 73 65 20 69 66 28 20 6e 50 61 67 65 3e 30 20  lse if( nPage>0 
cb10: 29 7b 0a 20 20 20 20 69 6e 74 20 70 61 67 65 53  ){.    int pageS
cb20: 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 75 73 61  ize;.    int usa
cb30: 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20  bleSize;.    u8 
cb40: 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d  *page1 = pPage1-
cb50: 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d  >aData;.    rc =
cb60: 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
cb70: 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70      if( memcmp(p
cb80: 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64  age1, zMagicHead
cb90: 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20  er, 16)!=0 ){.  
cba0: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
cbb0: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
cbc0: 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  }.    if( page1[
cbd0: 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70  18]>1 ){.      p
cbe0: 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31  Bt->readOnly = 1
cbf0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
cc00: 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20  page1[19]>1 ){. 
cc10: 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
cc20: 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
cc30: 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d   }..    /* The m
cc40: 61 78 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20  aximum embedded 
cc50: 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  fraction must be
cc60: 20 65 78 61 63 74 6c 79 20 32 35 25 2e 20 20 41   exactly 25%.  A
cc70: 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d 0a 20  nd the minimum. 
cc80: 20 20 20 2a 2a 20 65 6d 62 65 64 64 65 64 20 66     ** embedded f
cc90: 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  raction must be 
cca0: 31 32 2e 35 25 20 66 6f 72 20 62 6f 74 68 20 6c  12.5% for both l
ccb0: 65 61 66 2d 64 61 74 61 20 61 6e 64 20 6e 6f 6e  eaf-data and non
ccc0: 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20 20 20  -leaf-data..    
ccd0: 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** The original 
cce0: 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74  design allowed t
ccf0: 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20  hese amounts to 
cd00: 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a  vary, but as of.
cd10: 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33      ** version 3
cd20: 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65  .6.0, we require
cd30: 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65   them to be fixe
cd40: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
cd50: 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b  ( memcmp(&page1[
cd60: 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30  21], "\100\040\0
cd70: 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20  40",3)!=0 ){.   
cd80: 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
cd90: 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
cda0: 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20  .    pageSize = 
cdb0: 67 65 74 32 62 79 74 65 28 26 70 61 67 65 31 5b  get2byte(&page1[
cdc0: 31 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 28  16]);.    if( ((
cdd0: 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65  pageSize-1)&page
cde0: 53 69 7a 65 29 21 3d 30 20 7c 7c 20 70 61 67 65  Size)!=0 || page
cdf0: 53 69 7a 65 3c 35 31 32 20 7c 7c 0a 20 20 20 20  Size<512 ||.    
ce00: 20 20 20 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f      (SQLITE_MAX_
ce10: 50 41 47 45 5f 53 49 5a 45 3c 33 32 37 36 38 20  PAGE_SIZE<32768 
ce20: 26 26 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  && pageSize>SQLI
ce30: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
ce40: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67  ).    ){.      g
ce50: 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
ce60: 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
ce70: 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69   assert( (pageSi
ce80: 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  ze & 7)==0 );.  
ce90: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
cea0: 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b  ageSize - page1[
ceb0: 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 61 67  20];.    if( pag
cec0: 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65  eSize!=pBt->page
ced0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
cee0: 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74   After reading t
cef0: 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
cf00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
cf10: 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69  suming a page si
cf20: 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42  ze.      ** of B
cf30: 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65  tShared.pageSize
cf40: 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76  , we have discov
cf50: 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61  ered that the pa
cf60: 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20  ge-size is.     
cf70: 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67   ** actually pag
cf80: 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68  eSize. Unlock th
cf90: 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76  e database, leav
cfa0: 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74  e pBt->pPage1 at
cfb0: 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61  .      ** zero a
cfc0: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
cfd0: 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  _OK. The caller 
cfe0: 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66  will call this f
cff0: 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  unction.      **
d000: 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20   again with the 
d010: 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a  correct page-siz
d020: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
d030: 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
d040: 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74  age1);.      pBt
d050: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
d060: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20  sableSize;.     
d070: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
d080: 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20   pageSize;.     
d090: 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
d0a0: 42 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Bt);.      sqlit
d0b0: 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
d0c0: 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
d0d0: 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  &pBt->pageSize);
d0e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
d0f0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
d100: 20 20 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a     if( usableSiz
d110: 65 3c 35 30 30 20 29 7b 0a 20 20 20 20 20 20 67  e<500 ){.      g
d120: 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
d130: 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
d140: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
d150: 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70   pageSize;.    p
d160: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
d170: 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66   usableSize;.#if
d180: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d190: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
d1a0: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
d1b0: 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67  = (get4byte(&pag
d1c0: 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a  e1[36 + 4*4])?1:
d1d0: 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63  0);.    pBt->inc
d1e0: 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  rVacuum = (get4b
d1f0: 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20  yte(&page1[36 + 
d200: 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64  7*4])?1:0);.#end
d210: 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78  if.  }..  /* max
d220: 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78  Local is the max
d230: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
d240: 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20  ayload to store 
d250: 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a  locally for.  **
d260: 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73   a cell.  Make s
d270: 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20  ure it is small 
d280: 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61  enough so that a
d290: 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75  t least minFanou
d2a0: 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e  t.  ** cells can
d2b0: 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65   will fit on one
d2c0: 20 70 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d   page.  We assum
d2d0: 65 20 61 20 31 30 2d 62 79 74 65 20 70 61 67 65  e a 10-byte page
d2e0: 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65   header..  ** Be
d2f0: 73 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61  sides the payloa
d300: 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74  d, the cell must
d310: 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20   store:.  **    
d320: 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20   2-byte pointer 
d330: 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a  to the cell.  **
d340: 20 20 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c       4-byte chil
d350: 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20  d pointer.  **  
d360: 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76     9-byte nKey v
d370: 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d  alue.  **     4-
d380: 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65  byte nData value
d390: 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
d3a0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   overflow page p
d3b0: 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61  ointer.  ** So a
d3c0: 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f   cell consists o
d3d0: 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 65  f a 2-byte poine
d3e0: 72 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63  r, a header whic
d3f0: 68 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a  h is as much as.
d400: 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f    ** 17 bytes lo
d410: 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73  ng, 0 to N bytes
d420: 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64   of payload, and
d430: 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62   an optional 4 b
d440: 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a  yte overflow.  *
d450: 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a  * page pointer..
d460: 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c    */.  pBt->maxL
d470: 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61  ocal = (pBt->usa
d480: 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32  bleSize-12)*64/2
d490: 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e  55 - 23;.  pBt->
d4a0: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d  minLocal = (pBt-
d4b0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
d4c0: 33 32 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70  32/255 - 23;.  p
d4d0: 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 70 42  Bt->maxLeaf = pB
d4e0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
d4f0: 33 35 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  35;.  pBt->minLe
d500: 61 66 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c  af = (pBt->usabl
d510: 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35  eSize-12)*32/255
d520: 20 2d 20 32 33 3b 0a 20 20 69 66 28 20 70 42 74   - 23;.  if( pBt
d530: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3e 70 42 74 2d 3e  ->minLocal>pBt->
d540: 6d 61 78 4c 6f 63 61 6c 20 7c 7c 20 70 42 74 2d  maxLocal || pBt-
d550: 3e 6d 61 78 4c 6f 63 61 6c 3c 30 20 29 7b 0a 20  >maxLocal<0 ){. 
d560: 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
d570: 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 20  it_failed;.  }. 
d580: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61   assert( pBt->ma
d590: 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58  xLeaf + 23 <= MX
d5a0: 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
d5b0: 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
d5c0: 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 72 65 74   = pPage1;.  ret
d5d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
d5e0: 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
d5f0: 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  d:.  releasePage
d600: 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d  (pPage1);.  pBt-
d610: 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72  >pPage1 = 0;.  r
d620: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
d630: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d640: 77 6f 72 6b 73 20 6c 69 6b 65 20 6c 6f 63 6b 42  works like lockB
d650: 74 72 65 65 28 29 20 65 78 63 65 70 74 20 74 68  tree() except th
d660: 61 74 20 69 74 20 61 6c 73 6f 20 69 6e 76 6f 6b  at it also invok
d670: 65 73 20 74 68 65 0a 2a 2a 20 62 75 73 79 20 63  es the.** busy c
d680: 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 72 65  allback if there
d690: 20 69 73 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74   is lock content
d6a0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
d6b0: 6e 74 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68  nt lockBtreeWith
d6c0: 52 65 74 72 79 28 42 74 72 65 65 20 2a 70 52 65  Retry(Btree *pRe
d6d0: 66 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  f){.  int rc = S
d6e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
d6f0: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
d700: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 52 65 66  eHoldsMutex(pRef
d710: 29 20 29 3b 0a 20 20 69 66 28 20 70 52 65 66 2d  ) );.  if( pRef-
d720: 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
d730: 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 75 38 20 69  NONE ){.    u8 i
d740: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70  nTransaction = p
d750: 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e  Ref->pBt->inTran
d760: 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20 62 74 72  saction;.    btr
d770: 65 65 49 6e 74 65 67 72 69 74 79 28 70 52 65 66  eeIntegrity(pRef
d780: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
d790: 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61  te3BtreeBeginTra
d7a0: 6e 73 28 70 52 65 66 2c 20 30 29 3b 0a 20 20 20  ns(pRef, 0);.   
d7b0: 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72   pRef->pBt->inTr
d7c0: 61 6e 73 61 63 74 69 6f 6e 20 3d 20 69 6e 54 72  ansaction = inTr
d7d0: 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20 70  ansaction;.    p
d7e0: 52 65 66 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54  Ref->inTrans = T
d7f0: 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 69  RANS_NONE;.    i
d800: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
d810: 20 29 7b 0a 20 20 20 20 20 20 70 52 65 66 2d 3e   ){.      pRef->
d820: 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
d830: 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  n--;.    }.    b
d840: 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 52  treeIntegrity(pR
d850: 65 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ef);.  }.  retur
d860: 6e 20 72 63 3b 0a 7d 0a 20 20 20 20 20 20 20 0a  n rc;.}.       .
d870: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  ./*.** If there 
d880: 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
d890: 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77  ng cursors and w
d8a0: 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65  e are not in the
d8b0: 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20   middle.** of a 
d8c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20  transaction but 
d8d0: 74 68 65 72 65 20 69 73 20 61 20 72 65 61 64 20  there is a read 
d8e0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
d8f0: 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  base, then.** th
d900: 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66  is routine unref
d910: 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  s the first page
d920: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
d930: 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20   file which .** 
d940: 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f  has the effect o
d950: 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20  f releasing the 
d960: 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  read lock..**.**
d970: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   If there are an
d980: 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75  y outstanding cu
d990: 72 73 6f 72 73 2c 20 74 68 69 73 20 72 6f 75 74  rsors, this rout
d9a0: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
d9b0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69  **.** If there i
d9c0: 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
d9d0: 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69  in progress, thi
d9e0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
d9f0: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
da00: 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65  void unlockBtree
da10: 49 66 55 6e 75 73 65 64 28 42 74 53 68 61 72 65  IfUnused(BtShare
da20: 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72  d *pBt){.  asser
da30: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
da40: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
da50: 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  ) );.  if( pBt->
da60: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
da70: 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74  RANS_NONE && pBt
da80: 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 20 26 26 20  ->pCursor==0 && 
da90: 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29  pBt->pPage1!=0 )
daa0: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
dab0: 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
dac0: 42 74 2d 3e 70 50 61 67 65 72 29 3e 3d 31 20 29  Bt->pPager)>=1 )
dad0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
dae0: 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
daf0: 74 61 20 29 3b 0a 23 69 66 20 30 0a 20 20 20 20  ta );.#if 0.    
db00: 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65    if( pBt->pPage
db10: 31 2d 3e 61 44 61 74 61 3d 3d 30 20 29 7b 0a 20  1->aData==0 ){. 
db20: 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
db30: 70 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 50 61  pPage = pBt->pPa
db40: 67 65 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61  ge1;.        pPa
db50: 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69  ge->aData = sqli
db60: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
db70: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
db80: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e  .        pPage->
db90: 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20  pBt = pBt;.     
dba0: 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d     pPage->pgno =
dbb0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   1;.      }.#end
dbc0: 69 66 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  if.      release
dbd0: 50 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31  Page(pBt->pPage1
dbe0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  );.    }.    pBt
dbf0: 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
dc00: 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20    pBt->inStmt = 
dc10: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
dc20: 43 72 65 61 74 65 20 61 20 6e 65 77 20 64 61 74  Create a new dat
dc30: 61 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c  abase by initial
dc40: 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  izing the first 
dc50: 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66  page of the.** f
dc60: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
dc70: 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42  nt newDatabase(B
dc80: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
dc90: 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20   MemPage *pP1;. 
dca0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
dcb0: 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  data;.  int rc;.
dcc0: 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20    int nPage;..  
dcd0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
dce0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
dcf0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
dd00: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
dd10: 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
dd20: 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 69  er, &nPage);.  i
dd30: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
dd40: 20 7c 7c 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20   || nPage>0 ){. 
dd50: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
dd60: 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70  }.  pP1 = pBt->p
dd70: 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28  Page1;.  assert(
dd80: 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74   pP1!=0 );.  dat
dd90: 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a  a = pP1->aData;.
dda0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
ddb0: 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44  gerWrite(pP1->pD
ddc0: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
ddd0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
dde0: 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61  memcpy(data, zMa
ddf0: 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f  gicHeader, sizeo
de00: 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29  f(zMagicHeader))
de10: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
de20: 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29  of(zMagicHeader)
de30: 3d 3d 31 36 20 29 3b 0a 20 20 70 75 74 32 62 79  ==16 );.  put2by
de40: 74 65 28 26 64 61 74 61 5b 31 36 5d 2c 20 70 42  te(&data[16], pB
de50: 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
de60: 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20  data[18] = 1;.  
de70: 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20  data[19] = 1;.  
de80: 64 61 74 61 5b 32 30 5d 20 3d 20 70 42 74 2d 3e  data[20] = pBt->
de90: 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e  pageSize - pBt->
dea0: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61  usableSize;.  da
deb0: 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64  ta[21] = 64;.  d
dec0: 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20  ata[22] = 32;.  
ded0: 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20  data[23] = 32;. 
dee0: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34   memset(&data[24
def0: 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20  ], 0, 100-24);. 
df00: 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50   zeroPage(pP1, P
df10: 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
df20: 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20  AF|PTF_LEAFDATA 
df30: 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65 53 69  );.  pBt->pageSi
df40: 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66  zeFixed = 1;.#if
df50: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
df60: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73  _AUTOVACUUM.  as
df70: 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
df80: 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d  acuum==1 || pBt-
df90: 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29  >autoVacuum==0 )
dfa0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
dfb0: 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c  >incrVacuum==1 |
dfc0: 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  | pBt->incrVacuu
dfd0: 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79  m==0 );.  put4by
dfe0: 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a  te(&data[36 + 4*
dff0: 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  4], pBt->autoVac
e000: 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  uum);.  put4byte
e010: 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d  (&data[36 + 7*4]
e020: 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  , pBt->incrVacuu
e030: 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  m);.#endif.  ret
e040: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
e050: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
e060: 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74  to start a new t
e070: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72  ransaction. A wr
e080: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite-transaction.
e090: 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66  ** is started if
e0a0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
e0b0: 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c  ment is nonzero,
e0c0: 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61   otherwise a rea
e0d0: 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  d-.** transactio
e0e0: 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e  n.  If the secon
e0f0: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20  d argument is 2 
e100: 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c  or more and excl
e110: 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  usive.** transac
e120: 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c  tion is started,
e130: 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f   meaning that no
e140: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
e150: 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
e160: 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
e170: 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74  ase.  A preexist
e180: 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ing transaction 
e190: 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70  may not be.** up
e1a0: 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73  graded to exclus
e1b0: 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ive by calling t
e1c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65  his routine a se
e1d0: 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a  cond time - the.
e1e0: 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66  ** exclusivity f
e1f0: 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66  lag only works f
e200: 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  or a new transac
e210: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72  tion..**.** A wr
e220: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
e230: 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20  must be started 
e240: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
e250: 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65  g any .** change
e260: 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
e270: 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20  e.  None of the 
e280: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
e290: 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b  es .** will work
e2a0: 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61   unless a transa
e2b0: 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
e2c0: 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20   first:.**.**   
e2d0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
e2e0: 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20  reateTable().** 
e2f0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
e300: 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a  eCreateIndex().*
e310: 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
e320: 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a  reeClearTable().
e330: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
e340: 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a  treeDropTable().
e350: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
e360: 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20  treeInsert().** 
e370: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
e380: 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20  eDelete().**    
e390: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70    sqlite3BtreeUp
e3a0: 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a  dateMeta().**.**
e3b0: 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61   If an initial a
e3c0: 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72  ttempt to acquir
e3d0: 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73  e the lock fails
e3e0: 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b   because of lock
e3f0: 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61   contention.** a
e400: 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
e410: 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75  was previously u
e420: 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e  nlocked, then in
e430: 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
e440: 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72  ndler.** if ther
e450: 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69  e is one.  But i
e460: 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76  f there was prev
e470: 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f  iously a read-lo
e480: 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e  ck, do not.** in
e490: 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
e4a0: 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74  ndler - just ret
e4b0: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
e4c0: 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73    SQLITE_BUSY is
e4d0: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68   .** returned wh
e4e0: 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  en there is alre
e4f0: 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
e500: 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  in order to avoi
e510: 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a  d a deadlock..**
e520: 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72  .** Suppose ther
e530: 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73  e are two proces
e540: 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20  ses A and B.  A 
e550: 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
e560: 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72  and B has.** a r
e570: 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42  eserved lock.  B
e580: 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
e590: 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  e to exclusive b
e5a0: 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65  ut is blocked be
e5b0: 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20  cause.** of A's 
e5c0: 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72  read lock.  A tr
e5d0: 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
e5e0: 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69  o reserved but i
e5f0: 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a  s blocked by B..
e600: 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74  ** One or the ot
e610: 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
e620: 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69  rocesses must gi
e630: 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20  ve way or there 
e640: 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f  can be.** no pro
e650: 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72  gress.  By retur
e660: 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59  ning SQLITE_BUSY
e670: 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e   and not invokin
e680: 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  g the busy callb
e690: 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c  ack.** when A al
e6a0: 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64  ready has a read
e6b0: 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72   lock, we encour
e6c0: 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70  age A to give up
e6d0: 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72   and let B.** pr
e6e0: 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  oceed..*/.int sq
e6f0: 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
e700: 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69  rans(Btree *p, i
e710: 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 42 74  nt wrflag){.  Bt
e720: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
e730: 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
e740: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73   SQLITE_OK;..  s
e750: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
e760: 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d  (p);.  pBt->db =
e770: 20 70 2d 3e 64 62 3b 0a 20 20 62 74 72 65 65 49   p->db;.  btreeI
e780: 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
e790: 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20  /* If the btree 
e7a0: 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
e7b0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
e7c0: 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73  n, or it.  ** is
e7d0: 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65   already in a re
e7e0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ad-transaction a
e7f0: 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  nd a read-transa
e800: 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65  ction.  ** is re
e810: 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73  quested, this is
e820: 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
e830: 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
e840: 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
e850: 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41  (p->inTrans==TRA
e860: 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c  NS_READ && !wrfl
e870: 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ag) ){.    goto 
e880: 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
e890: 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61  ..  /* Write tra
e8a0: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f  nsactions are no
e8b0: 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20  t possible on a 
e8c0: 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61  read-only databa
e8d0: 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  se */.  if( pBt-
e8e0: 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 66  >readOnly && wrf
e8f0: 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  lag ){.    rc = 
e900: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
e910: 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
e920: 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  begun;.  }..  /*
e930: 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61   If another data
e940: 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20  base handle has 
e950: 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61  already opened a
e960: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
e970: 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73  on .  ** on this
e980: 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74   shared-btree st
e990: 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65  ructure and a se
e9a0: 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73  cond write trans
e9b0: 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72  action is.  ** r
e9c0: 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e  equested, return
e9d0: 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20   SQLITE_BUSY..  
e9e0: 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  */.  if( pBt->in
e9f0: 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
ea00: 4e 53 5f 57 52 49 54 45 20 26 26 20 77 72 66 6c  NS_WRITE && wrfl
ea10: 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  ag ){.    rc = S
ea20: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
ea30: 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
ea40: 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
ea50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
ea60: 44 5f 43 41 43 48 45 0a 20 20 69 66 28 20 77 72  D_CACHE.  if( wr
ea70: 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 42 74  flag>1 ){.    Bt
ea80: 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20  Lock *pIter;.   
ea90: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
eaa0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
eab0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
eac0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
ead0: 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b  er->pBtree!=p ){
eae0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
eaf0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
eb00: 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
eb10: 67 75 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  gun;.      }.   
eb20: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
eb30: 20 64 6f 20 7b 0a 20 20 20 20 69 66 28 20 70 42   do {.    if( pB
eb40: 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a  t->pPage1==0 ){.
eb50: 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
eb60: 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65    rc = lockBtree
eb70: 28 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 77 68  (pBt);.      }wh
eb80: 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ile( pBt->pPage1
eb90: 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ==0 && rc==SQLIT
eba0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 7d 0a 0a 20  E_OK );.    }.. 
ebb0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
ebc0: 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29  E_OK && wrflag )
ebd0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  {.      if( pBt-
ebe0: 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
ebf0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
ec00: 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
ec10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ec20: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
ec30: 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67  rBegin(pBt->pPag
ec40: 65 31 2d 3e 70 44 62 50 61 67 65 2c 20 77 72 66  e1->pDbPage, wrf
ec50: 6c 61 67 3e 31 29 3b 0a 20 20 20 20 20 20 20 20  lag>1);.        
ec60: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
ec70: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
ec80: 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28  c = newDatabase(
ec90: 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pBt);.        }.
eca0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ecb0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
ecc0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
ecd0: 69 66 28 20 77 72 66 6c 61 67 20 29 20 70 42 74  if( wrflag ) pBt
ece0: 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
ecf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
ed00: 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
ed10: 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  ed(pBt);.    }. 
ed20: 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
ed30: 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d  ITE_BUSY && pBt-
ed40: 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
ed50: 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20  TRANS_NONE &&.  
ed60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
ed70: 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
ed80: 6e 64 6c 65 72 28 70 42 74 2c 20 30 29 20 29 3b  ndler(pBt, 0) );
ed90: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
eda0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
edb0: 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
edc0: 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  NS_NONE ){.     
edd0: 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
ede0: 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  on++;.    }.    
edf0: 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72  p->inTrans = (wr
ee00: 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45  flag?TRANS_WRITE
ee10: 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20  :TRANS_READ);.  
ee20: 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
ee30: 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  >pBt->inTransact
ee40: 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ion ){.      pBt
ee50: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
ee60: 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20  = p->inTrans;.  
ee70: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
ee80: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
ee90: 41 43 48 45 0a 20 20 20 20 69 66 28 20 77 72 66  ACHE.    if( wrf
eea0: 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 20 20 61  lag>1 ){.      a
eeb0: 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 45 78  ssert( !pBt->pEx
eec0: 63 6c 75 73 69 76 65 20 29 3b 0a 20 20 20 20 20  clusive );.     
eed0: 20 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65   pBt->pExclusive
eee0: 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = p;.    }.#end
eef0: 69 66 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62  if.  }...trans_b
ef00: 65 67 75 6e 3a 0a 20 20 62 74 72 65 65 49 6e 74  egun:.  btreeInt
ef10: 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c  egrity(p);.  sql
ef20: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
ef30: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
ef40: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
ef50: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
ef60: 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  M../*.** Set the
ef70: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
ef80: 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69  ries for all chi
ef90: 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50  ldren of page pP
efa0: 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a  age. Also, if.**
efb0: 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
efc0: 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74  cells that point
efd0: 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
efe0: 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e  es, set the poin
eff0: 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69  ter.** map entri
f000: 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  es for the overf
f010: 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65 6c  low pages as wel
f020: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
f030: 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
f040: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
f050: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
f060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f070: 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65         /* Counte
f080: 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
f090: 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
f0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
f0c0: 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50  cells in page pP
f0d0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
f0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
f100: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
f110: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
f120: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e  pPage->pBt;.  in
f130: 74 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70  t isInitOrig = p
f140: 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20  Page->isInit;.  
f150: 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67  Pgno pgno = pPag
f160: 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65  e->pgno;..  asse
f170: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
f180: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
f190: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
f1a0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
f1b0: 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20  InitPage(pPage, 
f1c0: 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 29 3b  pPage->pParent);
f1d0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
f1e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
f1f0: 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61   set_child_ptrma
f200: 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43  ps_out;.  }.  nC
f210: 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
f220: 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ll;..  for(i=0; 
f230: 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
f240: 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66     u8 *pCell = f
f250: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
f260: 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72  );..    rc = ptr
f270: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
f280: 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  age, pCell);.   
f290: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f2a0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
f2b0: 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61   set_child_ptrma
f2c0: 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ps_out;.    }.. 
f2d0: 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
f2e0: 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  eaf ){.      Pgn
f2f0: 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65  o childPgno = ge
f300: 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20  t4byte(pCell);. 
f310: 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
f320: 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
f330: 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
f340: 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69  , pgno);.      i
f350: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f360: 20 29 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c   ) goto set_chil
f370: 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20  d_ptrmaps_out;. 
f380: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
f390: 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
f3a0: 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67      Pgno childPg
f3b0: 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
f3c0: 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
f3d0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
f3e0: 3b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  ;.    rc = ptrma
f3f0: 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50  pPut(pBt, childP
f400: 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
f410: 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73  E, pgno);.  }..s
f420: 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73  et_child_ptrmaps
f430: 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69  _out:.  pPage->i
f440: 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72  sInit = isInitOr
f450: 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ig;.  return rc;
f460: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68  .}../*.** Somewh
f470: 65 72 65 20 6f 6e 20 70 50 61 67 65 2c 20 77 68  ere on pPage, wh
f480: 69 63 68 20 69 73 20 67 75 61 72 65 6e 74 65 65  ich is guarentee
f490: 64 20 74 6f 20 62 65 20 61 20 62 74 72 65 65 20  d to be a btree 
f4a0: 70 61 67 65 2c 20 6e 6f 74 20 61 6e 20 6f 76 65  page, not an ove
f4b0: 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 2c 20 69  rflow.** page, i
f4c0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70  s a pointer to p
f4d0: 61 67 65 20 69 46 72 6f 6d 2e 20 4d 6f 64 69 66  age iFrom. Modif
f4e0: 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73  y this pointer s
f4f0: 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73  o that it points
f500: 20 74 6f 0a 2a 2a 20 69 54 6f 2e 20 50 61 72 61   to.** iTo. Para
f510: 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73 63  meter eType desc
f520: 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20 6f  ribes the type o
f530: 66 20 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20  f pointer to be 
f540: 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 0a 2a 2a  modified, as .**
f550: 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20   follows:.**.** 
f560: 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20  PTRMAP_BTREE:   
f570: 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72    pPage is a btr
f580: 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
f590: 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
f5a0: 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20   child .**      
f5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67               pag
f5c0: 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  e of pPage..**.*
f5d0: 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  * PTRMAP_OVERFLO
f5e0: 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20 62  W1: pPage is a b
f5f0: 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
f600: 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
f610: 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20   an overflow.** 
f620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f630: 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74    page pointed t
f640: 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20  o by one of the 
f650: 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a  cells on pPage..
f660: 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45  **.** PTRMAP_OVE
f670: 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73  RFLOW2: pPage is
f680: 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67   an overflow-pag
f690: 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70  e. The pointer p
f6a0: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78  oints at the nex
f6b0: 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
f6c0: 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20         overflow 
f6d0: 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74  page in the list
f6e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f6f0: 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
f700: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
f710: 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67  , Pgno iFrom, Pg
f720: 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65  no iTo, u8 eType
f730: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
f740: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
f750: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
f760: 78 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70  x) );.  if( eTyp
f770: 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
f780: 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  OW2 ){.    /* Th
f790: 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77  e pointer is alw
f7a0: 61 79 73 20 74 68 65 20 66 69 72 73 74 20 34 20  ays the first 4 
f7b0: 62 79 74 65 73 20 6f 66 20 74 68 65 20 70 61 67  bytes of the pag
f7c0: 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  e in this case. 
f7d0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34   */.    if( get4
f7e0: 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74  byte(pPage->aDat
f7f0: 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  a)!=iFrom ){.   
f800: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f810: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
f820: 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74     }.    put4byt
f830: 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  e(pPage->aData, 
f840: 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  iTo);.  }else{. 
f850: 20 20 20 69 6e 74 20 69 73 49 6e 69 74 4f 72 69     int isInitOri
f860: 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  g = pPage->isIni
f870: 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  t;.    int i;.  
f880: 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20    int nCell;..  
f890: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e    sqlite3BtreeIn
f8a0: 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 30 29  itPage(pPage, 0)
f8b0: 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70 50  ;.    nCell = pP
f8c0: 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20  age->nCell;..   
f8d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
f8e0: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75  l; i++){.      u
f8f0: 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
f900: 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20  ell(pPage, i);. 
f910: 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
f920: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
f930: 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c 6c   ){.        Cell
f940: 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20  Info info;.     
f950: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
f960: 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
f970: 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
f980: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 6e  ;.        if( in
f990: 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  fo.iOverflow ){.
f9a0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 46            if( iF
f9b0: 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 26 70  rom==get4byte(&p
f9c0: 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
f9d0: 6c 6f 77 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  low]) ){.       
f9e0: 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
f9f0: 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
fa00: 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20  low], iTo);.    
fa10: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
fa20: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
fa30: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
fa40: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67 65  {.        if( ge
fa50: 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d 69  t4byte(pCell)==i
fa60: 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  From ){.        
fa70: 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c 6c    put4byte(pCell
fa80: 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
fa90: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
faa0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
fab0: 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d 6e  .  .    if( i==n
fac0: 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66  Cell ){.      if
fad0: 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
fae0: 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20 20  BTREE || .      
faf0: 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70 50      get4byte(&pP
fb00: 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
fb10: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 21  ->hdrOffset+8])!
fb20: 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20  =iFrom ){.      
fb30: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fb40: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
fb50: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34      }.      put4
fb60: 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
fb70: 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
fb80: 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20 20  set+8], iTo);.  
fb90: 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e    }..    pPage->
fba0: 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f  isInit = isInitO
fbb0: 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rig;.  }.  retur
fbc0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
fbd0: 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
fbe0: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 70 61  open database pa
fbf0: 67 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c 6f  ge pDbPage to lo
fc00: 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67 65  cation iFreePage
fc10: 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74 61   in the .** data
fc20: 62 61 73 65 2e 20 54 68 65 20 70 44 62 50 61 67  base. The pDbPag
fc30: 65 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d 61  e reference rema
fc40: 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2f 0a 73 74  ins valid..*/.st
fc50: 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61 74  atic int relocat
fc60: 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
fc70: 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
fc80: 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20 20    /* Btree */.  
fc90: 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67 65  MemPage *pDbPage
fca0: 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  ,        /* Open
fcb0: 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a 2f   page to move */
fcc0: 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20  .  u8 eType,    
fcd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
fce0: 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70 65  ointer map 'type
fcf0: 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62 50  ' entry for pDbP
fd00: 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50  age */.  Pgno iP
fd10: 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20 20  trPage,         
fd20: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
fd30: 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72 79   'page-no' entry
fd40: 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f 0a   for pDbPage */.
fd50: 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65    Pgno iFreePage
fd60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
fd70: 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d 6f  e location to mo
fd80: 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a 2f  ve pDbPage to */
fd90: 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
fda0: 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54 68  PtrPage;   /* Th
fdb0: 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e 74  e page that cont
fdc0: 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20 74  ains a pointer t
fdd0: 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50  o pDbPage */.  P
fde0: 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70 44  gno iDbPage = pD
fdf0: 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50  bPage->pgno;.  P
fe00: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
fe10: 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Bt->pPager;.  in
fe20: 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
fe30: 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f   eType==PTRMAP_O
fe40: 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79 70  VERFLOW2 || eTyp
fe50: 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
fe60: 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65 54  OW1 || .      eT
fe70: 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype==PTRMAP_BTRE
fe80: 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  E || eType==PTRM
fe90: 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20  AP_ROOTPAGE );. 
fea0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
feb0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
fec0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
fed0: 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70 42  ert( pDbPage->pB
fee0: 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a 20  t==pBt );..  /* 
fef0: 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50 61 67  Move page iDbPag
ff00: 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72 65  e from its curre
ff10: 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 70  nt location to p
ff20: 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65 65  age number iFree
ff30: 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45 28  Page */.  TRACE(
ff40: 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d 6f  ("AUTOVACUUM: Mo
ff50: 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65 20  ving %d to free 
ff60: 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61 67  page %d (ptr pag
ff70: 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e 22  e %d type %d)\n"
ff80: 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67 65  , .      iDbPage
ff90: 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50 74  , iFreePage, iPt
ffa0: 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b 0a  rPage, eType));.
ffb0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
ffc0: 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61 67  gerMovepage(pPag
ffd0: 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44 62  er, pDbPage->pDb
ffe0: 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 29  Page, iFreePage)
fff0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
10000 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
10010 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44  urn rc;.  }.  pD
10020 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46  bPage->pgno = iF
10030 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49  reePage;..  /* I
10040 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61 20  f pDbPage was a 
10050 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65 6e  btree-page, then
10060 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68 69   it may have chi
10070 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72 20  ld pages and/or 
10080 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20  cells.  ** that 
10090 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f  point to overflo
100a0 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f 69  w pages. The poi
100b0 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65 73  nter map entries
100c0 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a 20   for all these. 
100d0 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20 74   ** pages need t
100e0 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20 20  o be changed..  
100f0 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50 61  **.  ** If pDbPa
10100 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f  ge is an overflo
10110 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68 65  w page, then the
10120 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6d   first 4 bytes m
10130 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20  ay store a.  ** 
10140 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75 62  pointer to a sub
10150 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77  sequent overflow
10160 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20 69   page. If this i
10170 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e  s the case, then
10180 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65  .  ** the pointe
10190 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20 62  r map needs to b
101a0 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74 68  e updated for th
101b0 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65  e subsequent ove
101c0 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f  rflow page..  */
101d0 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54  .  if( eType==PT
101e0 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65 54  RMAP_BTREE || eT
101f0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype==PTRMAP_ROOT
10200 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20 3d  PAGE ){.    rc =
10210 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
10220 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
10230 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10240 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
10250 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   rc;.    }.  }el
10260 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78  se{.    Pgno nex
10270 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65  tOvfl = get4byte
10280 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61 29  (pDbPage->aData)
10290 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f 76  ;.    if( nextOv
102a0 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  fl!=0 ){.      r
102b0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
102c0 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52  t, nextOvfl, PTR
102d0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69  MAP_OVERFLOW2, i
102e0 46 72 65 65 50 61 67 65 29 3b 0a 20 20 20 20 20  FreePage);.     
102f0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10300 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
10310 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
10320 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
10330 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61 73   Fix the databas
10340 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67  e pointer on pag
10350 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74 20  e iPtrPage that 
10360 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50 61  pointed at iDbPa
10370 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  ge so.  ** that 
10380 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46 72  it points at iFr
10390 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69 78  eePage. Also fix
103a0 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
103b0 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20   entry for.  ** 
103c0 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20  iPtrPage..  */. 
103d0 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
103e0 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
103f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
10400 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
10410 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74 72   iPtrPage, &pPtr
10420 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Page, 0);.    if
10430 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10440 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
10450 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
10460 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
10470 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e 70  rite(pPtrPage->p
10480 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
10490 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
104a0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
104b0 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20  age(pPtrPage);. 
104c0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
104d0 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d      }.    rc = m
104e0 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72  odifyPagePointer
104f0 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50 61  (pPtrPage, iDbPa
10500 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65  ge, iFreePage, e
10510 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65 61  Type);.    relea
10520 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65 29  sePage(pPtrPage)
10530 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
10540 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10550 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
10560 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c 20  pBt, iFreePage, 
10570 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65 29  eType, iPtrPage)
10580 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
10590 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61 74  turn rc;.}..stat
105a0 69 63 20 69 6e 74 20 70 61 67 65 72 50 61 67 65  ic int pagerPage
105b0 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  count(Pager *pPa
105c0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
105d0 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20 20 72    int nPage;.  r
105e0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
105f0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
10600 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 72 65 74  , &nPage);.  ret
10610 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
10620 4f 4b 3f 6e 50 61 67 65 3a 2d 31 29 3b 0a 7d 0a  OK?nPage:-1);.}.
10630 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  ./* Forward decl
10640 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64  aration required
10650 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74   by incrVacuumSt
10660 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20  ep(). */.static 
10670 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  int allocateBtre
10680 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a  ePage(BtShared *
10690 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67  , MemPage **, Pg
106a0 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b  no *, Pgno, u8);
106b0 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20  ../*.** Perform 
106c0 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66  a single step of
106d0 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d   an incremental-
106e0 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65  vacuum. If succe
106f0 73 73 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e  ssful,.** return
10700 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74   SQLITE_OK. If t
10710 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20  here is no work 
10720 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65  to do (and there
10730 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e 74  fore no.** point
10740 20 69 6e 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   in calling this
10750 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29   function again)
10760 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
10770 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65  DONE..**.** More
10780 20 73 70 65 63 69 66 69 63 6c 79 2c 20 74 68 69   specificly, thi
10790 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d  s function attem
107a0 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69  pts to re-organi
107b0 7a 65 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62  ze the .** datab
107c0 61 73 65 20 73 6f 20 74 68 61 74 20 74 68 65 20  ase so that the 
107d0 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  last page of the
107e0 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20   file currently 
107f0 69 6e 20 75 73 65 0a 2a 2a 20 69 73 20 6e 6f 20  in use.** is no 
10800 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a  longer in use..*
10810 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 46 69 6e  *.** If the nFin
10820 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
10830 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 69 6d 70 6c  n-zero, the impl
10840 65 6d 65 6e 74 61 74 69 6f 6e 20 61 73 73 75 6d  ementation assum
10850 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63  es.** that the c
10860 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20  aller will keep 
10870 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75  calling incrVacu
10880 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 0a 2a  umStep() until.*
10890 2a 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  * it returns SQL
108a0 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 65  ITE_DONE or an e
108b0 72 72 6f 72 2c 20 61 6e 64 20 74 68 61 74 20 6e  rror, and that n
108c0 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20 6e 75  Fin is the.** nu
108d0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68  mber of pages th
108e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
108f0 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 66 74  will contain aft
10900 65 72 20 74 68 69 73 20 0a 2a 2a 20 70 72 6f 63  er this .** proc
10910 65 73 73 20 69 73 20 63 6f 6d 70 6c 65 74 65 2e  ess is complete.
10920 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
10930 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74  ncrVacuumStep(Bt
10940 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
10950 6f 20 6e 46 69 6e 29 7b 0a 20 20 50 67 6e 6f 20  o nFin){.  Pgno 
10960 69 4c 61 73 74 50 67 3b 20 20 20 20 20 20 20 20  iLastPg;        
10970 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 61 67       /* Last pag
10980 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
10990 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 72 65  e */.  Pgno nFre
109a0 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20  eList;          
109b0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
109c0 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65  ges still on the
109d0 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20   free-list */.. 
109e0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
109f0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
10a00 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 4c 61  >mutex) );.  iLa
10a10 73 74 50 67 20 3d 20 70 42 74 2d 3e 6e 54 72 75  stPg = pBt->nTru
10a20 6e 63 3b 0a 20 20 69 66 28 20 69 4c 61 73 74 50  nc;.  if( iLastP
10a30 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4c 61 73  g==0 ){.    iLas
10a40 74 50 67 20 3d 20 70 61 67 65 72 50 61 67 65 63  tPg = pagerPagec
10a50 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
10a60 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 50  );.  }..  if( !P
10a70 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
10a80 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c  , iLastPg) && iL
10a90 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42  astPg!=PENDING_B
10aa0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
10ab0 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
10ac0 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50   u8 eType;.    P
10ad0 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20  gno iPtrPage;.. 
10ae0 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67     nFreeList = g
10af0 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
10b00 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
10b10 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c  ;.    if( nFreeL
10b20 69 73 74 3d 3d 30 20 7c 7c 20 6e 46 69 6e 3d 3d  ist==0 || nFin==
10b30 69 4c 61 73 74 50 67 20 29 7b 0a 20 20 20 20 20  iLastPg ){.     
10b40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
10b50 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ONE;.    }..    
10b60 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70  rc = ptrmapGet(p
10b70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54  Bt, iLastPg, &eT
10b80 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b  ype, &iPtrPage);
10b90 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
10ba0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
10bb0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
10bc0 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d  .    if( eType==
10bd0 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
10be0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
10bf0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
10c00 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
10c10 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
10c20 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20  P_FREEPAGE ){.  
10c30 20 20 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20      if( nFin==0 
10c40 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ){.        /* Re
10c50 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66 72  move the page fr
10c60 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72 65  om the files fre
10c70 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20  e-list. This is 
10c80 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20 20  not required.   
10c90 20 20 20 20 20 2a 2a 20 69 66 20 6e 46 69 6e 20       ** if nFin 
10ca0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20  is non-zero. In 
10cb0 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 66  that case, the f
10cc0 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65  ree-list will be
10cd0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e  .        ** trun
10ce0 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66  cated to zero af
10cf0 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ter this functio
10d00 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74  n returns, so it
10d10 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20   doesn't .      
10d20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69    ** matter if i
10d30 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73  t still contains
10d40 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e   some garbage en
10d50 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  tries..        *
10d60 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  /.        Pgno i
10d70 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20  FreePg;.        
10d80 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67  MemPage *pFreePg
10d90 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  ;.        rc = a
10da0 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
10db0 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20  (pBt, &pFreePg, 
10dc0 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50  &iFreePg, iLastP
10dd0 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  g, 1);.        i
10de0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10df0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
10e00 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
10e10 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72   }.        asser
10e20 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73  t( iFreePg==iLas
10e30 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72  tPg );.        r
10e40 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
10e50 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  Pg);.      }.   
10e60 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
10e70 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20  Pgno iFreePg;   
10e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
10e90 65 78 20 6f 66 20 66 72 65 65 20 70 61 67 65 20  ex of free page 
10ea0 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20  to move pLastPg 
10eb0 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50  to */.      MemP
10ec0 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 0a 20  age *pLastPg;.. 
10ed0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
10ee0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
10ef0 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61  t, iLastPg, &pLa
10f00 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  stPg, 0);.      
10f10 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10f20 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
10f30 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
10f40 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 46 69  .      /* If nFi
10f50 6e 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20  n is zero, this 
10f60 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c  loop runs exactl
10f70 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20  y once and page 
10f80 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a  pLastPg.      **
10f90 20 69 73 20 73 77 61 70 70 65 64 20 77 69 74 68   is swapped with
10fa0 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20   the first free 
10fb0 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20  page pulled off 
10fc0 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20  the free list.. 
10fd0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
10fe0 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61   On the other ha
10ff0 6e 64 2c 20 69 66 20 6e 46 69 6e 20 69 73 20 67  nd, if nFin is g
11000 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f  reater than zero
11010 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20  , then keep.    
11020 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74    ** looping unt
11030 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c  il a free-page l
11040 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74 68  ocated within th
11050 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67  e first nFin pag
11060 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  es.      ** of t
11070 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64  he file is found
11080 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
11090 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65   do {.        Me
110a0 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
110b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
110c0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
110d0 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
110e0 46 72 65 65 50 67 2c 20 30 2c 20 30 29 3b 0a 20  FreePg, 0, 0);. 
110f0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
11100 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11110 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
11120 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
11130 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
11140 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
11150 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
11160 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
11170 77 68 69 6c 65 28 20 6e 46 69 6e 21 3d 30 20 26  while( nFin!=0 &
11180 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29  & iFreePg>nFin )
11190 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
111a0 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20  iFreePg<iLastPg 
111b0 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20  );.      .      
111c0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
111d0 72 57 72 69 74 65 28 70 4c 61 73 74 50 67 2d 3e  rWrite(pLastPg->
111e0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
111f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
11200 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
11210 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70  = relocatePage(p
11220 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79  Bt, pLastPg, eTy
11230 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46  pe, iPtrPage, iF
11240 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a  reePg);.      }.
11250 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
11260 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20  e(pLastPg);.    
11270 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11280 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
11290 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
112a0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  }.    }.  }..  p
112b0 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 69 4c 61  Bt->nTrunc = iLa
112c0 73 74 50 67 20 2d 20 31 3b 0a 20 20 77 68 69 6c  stPg - 1;.  whil
112d0 65 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d  e( pBt->nTrunc==
112e0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
112f0 45 28 70 42 74 29 7c 7c 50 54 52 4d 41 50 5f 49  E(pBt)||PTRMAP_I
11300 53 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d 3e  SPAGE(pBt, pBt->
11310 6e 54 72 75 6e 63 29 20 29 7b 0a 20 20 20 20 70  nTrunc) ){.    p
11320 42 74 2d 3e 6e 54 72 75 6e 63 2d 2d 3b 0a 20 20  Bt->nTrunc--;.  
11330 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
11340 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  E_OK;.}../*.** A
11350 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
11360 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 65  on must be opene
11370 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  d before calling
11380 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
11390 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20 61  ** It performs a
113a0 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20   single unit of 
113b0 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e 20  work towards an 
113c0 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75  incremental vacu
113d0 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  um..**.** If the
113e0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
113f0 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64 20  uum is finished 
11400 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
11410 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20  ion has run,.** 
11420 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20 72  SQLITE_DONE is r
11430 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 69  eturned. If it i
11440 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c 20  s not finished, 
11450 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63  but no error occ
11460 75 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  ured,.** SQLITE_
11470 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
11480 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c  Otherwise an SQL
11490 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  ite error code. 
114a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
114b0 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42  treeIncrVacuum(B
114c0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
114d0 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
114e0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
114f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
11500 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62  er(p);.  pBt->db
11510 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65   = p->db;.  asse
11520 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  rt( pBt->inTrans
11530 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52  action==TRANS_WR
11540 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e  ITE && p->inTran
11550 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  s==TRANS_WRITE )
11560 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75  ;.  if( !pBt->au
11570 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
11580 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45  rc = SQLITE_DONE
11590 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
115a0 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72  nvalidateAllOver
115b0 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a  flowCache(pBt);.
115c0 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63      rc = incrVac
115d0 75 75 6d 53 74 65 70 28 70 42 74 2c 20 30 29 3b  uumStep(pBt, 0);
115e0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
115f0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
11600 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11610 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11620 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72 20  is called prior 
11630 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  to sqlite3PagerC
11640 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72 61  ommit when a tra
11650 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  nsaction.** is c
11660 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e 20 61  ommited for an a
11670 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62  uto-vacuum datab
11680 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51  ase..**.** If SQ
11690 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
116a0 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72 75  ned, then *pnTru
116b0 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  nc is set to the
116c0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
116d0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
116e0 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65 20   file should be 
116f0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75 72  truncated to dur
11700 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70  ing the commit p
11710 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e  rocess. .** i.e.
11720 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
11730 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69 7a  s been reorganiz
11740 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79 20  ed so that only 
11750 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72 75  the first *pnTru
11760 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65 20  nc.** pages are 
11770 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  in use..*/.stati
11780 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  c int autoVacuum
11790 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64 20  Commit(BtShared 
117a0 2a 70 42 74 2c 20 50 67 6e 6f 20 2a 70 6e 54 72  *pBt, Pgno *pnTr
117b0 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  unc){.  int rc =
117c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61   SQLITE_OK;.  Pa
117d0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 42  ger *pPager = pB
117e0 74 2d 3e 70 50 61 67 65 72 3b 0a 23 69 66 6e 64  t->pPager;.#ifnd
117f0 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74 20  ef NDEBUG.  int 
11800 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61  nRef = sqlite3Pa
11810 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67  gerRefcount(pPag
11820 65 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  er);.#endif..  a
11830 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
11840 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
11850 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61 6c  utex) );.  inval
11860 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
11870 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61 73  Cache(pBt);.  as
11880 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56 61  sert(pBt->autoVa
11890 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70 42  cuum);.  if( !pB
118a0 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29 7b  t->incrVacuum ){
118b0 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20 3d  .    Pgno nFin =
118c0 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 42 74   0;..    if( pBt
118d0 2d 3e 6e 54 72 75 6e 63 3d 3d 30 20 29 7b 0a 20  ->nTrunc==0 ){. 
118e0 20 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65 3b       Pgno nFree;
118f0 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 74 72  .      Pgno nPtr
11900 6d 61 70 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  map;.      const
11910 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 42 74 2d   int pgsz = pBt-
11920 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20  >pageSize;.     
11930 20 69 6e 74 20 6e 4f 72 69 67 20 3d 20 70 61 67   int nOrig = pag
11940 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
11950 3e 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20  >pPager);..     
11960 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50 41   if( PTRMAP_ISPA
11970 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20 29  GE(pBt, nOrig) )
11980 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
11990 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
119a0 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20 20  BKPT;.      }.  
119b0 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3d 3d 50      if( nOrig==P
119c0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
119d0 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
119e0 20 6e 4f 72 69 67 2d 2d 3b 0a 20 20 20 20 20 20   nOrig--;.      
119f0 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d 20  }.      nFree = 
11a00 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
11a10 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
11a20 29 3b 0a 20 20 20 20 20 20 6e 50 74 72 6d 61 70  );.      nPtrmap
11a30 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67 2b   = (nFree-nOrig+
11a40 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
11a50 74 2c 20 6e 4f 72 69 67 29 2b 70 67 73 7a 2f 35  t, nOrig)+pgsz/5
11a60 29 2f 28 70 67 73 7a 2f 35 29 3b 0a 20 20 20 20  )/(pgsz/5);.    
11a70 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20 2d    nFin = nOrig -
11a80 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61 70   nFree - nPtrmap
11a90 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 72 69  ;.      if( nOri
11aa0 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  g>PENDING_BYTE_P
11ab0 41 47 45 28 70 42 74 29 20 26 26 20 6e 46 69 6e  AGE(pBt) && nFin
11ac0 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  <=PENDING_BYTE_P
11ad0 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
11ae0 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20      nFin--;.    
11af0 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28    }.      while(
11b00 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
11b10 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46 69  Bt, nFin) || nFi
11b20 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  n==PENDING_BYTE_
11b30 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
11b40 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20       nFin--;.   
11b50 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
11b60 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
11b70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
11b80 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65   = incrVacuumSte
11b90 70 28 70 42 74 2c 20 6e 46 69 6e 29 3b 0a 20 20  p(pBt, nFin);.  
11ba0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
11bb0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
11bc0 20 20 20 20 20 61 73 73 65 72 74 28 6e 46 69 6e       assert(nFin
11bd0 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 6e 54 72 75  ==0 || pBt->nTru
11be0 6e 63 3d 3d 30 20 7c 7c 20 6e 46 69 6e 3c 3d 70  nc==0 || nFin<=p
11bf0 42 74 2d 3e 6e 54 72 75 6e 63 29 3b 0a 20 20 20  Bt->nTrunc);.   
11c00 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
11c10 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  K;.      if( pBt
11c20 2d 3e 6e 54 72 75 6e 63 20 26 26 20 6e 46 69 6e  ->nTrunc && nFin
11c30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
11c40 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
11c50 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  te(pBt->pPage1->
11c60 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
11c70 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d    put4byte(&pBt-
11c80 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  >pPage1->aData[3
11c90 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  2], 0);.        
11ca0 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  put4byte(&pBt->p
11cb0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
11cc0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42  , 0);.        pB
11cd0 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 6e 46 69 6e  t->nTrunc = nFin
11ce0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11cf0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11d00 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
11d10 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
11d20 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ack(pPager);.   
11d30 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
11d40 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
11d50 20 20 20 2a 70 6e 54 72 75 6e 63 20 3d 20 70 42     *pnTrunc = pB
11d60 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20 20 20 70  t->nTrunc;.    p
11d70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 30 3b 0a  Bt->nTrunc = 0;.
11d80 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e 52    }.  assert( nR
11d90 65 66 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  ef==sqlite3Pager
11da0 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29  Refcount(pPager)
11db0 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   );.  return rc;
11dc0 0a 7d 0a 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  .}..#endif../*.*
11dd0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
11de0 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
11df0 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61  ase of a two-pha
11e00 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73  se commit.  This
11e10 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73   routine.** caus
11e20 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  es a rollback jo
11e30 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61  urnal to be crea
11e40 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20  ted (if it does 
11e50 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
11e60 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61  t).** and popula
11e70 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20  ted with enough 
11e80 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74  information so t
11e90 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c  hat if a power l
11ea0 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68  oss occurs.** th
11eb0 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  e database can b
11ec0 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  e restored to it
11ed0 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
11ee0 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   by playing back
11ef0 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  .** the journal.
11f00 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65    Then the conte
11f10 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nts of the journ
11f20 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f  al are flushed o
11f30 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73  ut to.** the dis
11f40 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f  k.  After the jo
11f50 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20  urnal is safely 
11f60 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68  on oxide, the ch
11f70 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20  anges to the.** 
11f80 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69  database are wri
11f90 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61  tten into the da
11fa0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
11fb0 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65  flushed to oxide
11fc0 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20  ..** At the end 
11fd0 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68  of this call, th
11fe0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
11ff0 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20  al still exists 
12000 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61  on the.** disk a
12010 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20  nd we are still 
12020 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b  holding all lock
12030 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61  s, so the transa
12040 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a  ction has not.**
12050 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65   committed.  See
12060 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
12070 6d 69 74 28 29 20 66 6f 72 20 74 68 65 20 73 65  mit() for the se
12080 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68  cond phase of th
12090 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63  e.** commit proc
120a0 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ess..**.** This 
120b0 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20  call is a no-op 
120c0 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  if no write-tran
120d0 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65  saction is curre
120e0 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70  ntly active on p
120f0 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  Bt..**.** Otherw
12100 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61  ise, sync the da
12110 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
12120 74 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a  the btree pBt. z
12130 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
12140 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  .** the name of 
12150 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
12160 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
12170 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
12180 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  o the.** individ
12190 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ual journal file
121a0 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e  , or is NULL, in
121b0 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74  dicating no mast
121c0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
121d0 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61  .** (single data
121e0 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
121f0 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  )..**.** When th
12200 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  is is called, th
12210 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
12220 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
12230 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65  have been.** cre
12240 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20  ated, populated 
12250 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61  with this journa
12260 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79  l pointer and sy
12270 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
12280 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73  .** Once this is
12290 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74   routine has ret
122a0 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20  urned, the only 
122b0 74 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74  thing required t
122c0 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20  o commit.** the 
122d0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
122e0 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62  n for this datab
122f0 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64  ase file is to d
12300 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
12310 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
12320 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
12330 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63  eOne(Btree *p, c
12340 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
12350 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
12360 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
12370 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
12380 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
12390 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
123a0 70 2d 3e 70 42 74 3b 0a 20 20 20 20 50 67 6e 6f  p->pBt;.    Pgno
123b0 20 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 20 20 20   nTrunc = 0;.   
123c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
123d0 65 72 28 70 29 3b 0a 20 20 20 20 70 42 74 2d 3e  er(p);.    pBt->
123e0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 23 69 66 6e  db = p->db;.#ifn
123f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
12400 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
12410 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
12420 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  um ){.      rc =
12430 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69   autoVacuumCommi
12440 74 28 70 42 74 2c 20 26 6e 54 72 75 6e 63 29 3b  t(pBt, &nTrunc);
12450 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d   .      if( rc!=
12460 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12470 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
12480 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
12490 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
124a0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
124b0 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  if.    rc = sqli
124c0 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
124d0 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67  aseOne(pBt->pPag
124e0 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72  er, zMaster, nTr
124f0 75 6e 63 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  unc, 0);.    sql
12500 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
12510 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
12520 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  rc;.}../*.** Com
12530 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
12540 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ion currently in
12550 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a   progress..**.**
12560 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d   This routine im
12570 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65 63  plements the sec
12580 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20 32  ond phase of a 2
12590 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20  -phase commit.  
125a0 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74  The.** sqlite3Bt
125b0 72 65 65 53 79 6e 63 28 29 20 72 6f 75 74 69 6e  reeSync() routin
125c0 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73 74  e does the first
125d0 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75 6c   phase and shoul
125e0 64 20 62 65 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20  d be invoked.** 
125f0 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67  prior to calling
12600 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 20   this routine.  
12610 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65 65  The sqlite3Btree
12620 53 79 6e 63 28 29 20 72 6f 75 74 69 6e 65 20 64  Sync() routine d
12630 69 64 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 77 6f  id.** all the wo
12640 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69 6e  rk of writing in
12650 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74 6f  formation out to
12660 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68 69   disk and flushi
12670 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  ng the.** conten
12680 74 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  ts so that they 
12690 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74 6f  are written onto
126a0 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74 65   the disk platte
126b0 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a 20  r.  All this.** 
126c0 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20 64  routine has to d
126d0 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20 74  o is delete or t
126e0 72 75 6e 63 61 74 65 20 74 68 65 20 72 6f 6c 6c  runcate the roll
126f0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  back journal.** 
12700 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74 68  (which causes th
12710 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f  e transaction to
12720 20 63 6f 6d 6d 69 74 29 20 61 6e 64 20 64 72 6f   commit) and dro
12730 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54  p locks..**.** T
12740 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
12750 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
12760 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
12770 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
12780 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
12790 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
127a0 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
127b0 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
127c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
127d0 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72 65  mitPhaseTwo(Btre
127e0 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65  e *p){.  BtShare
127f0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
12800 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
12810 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d  Enter(p);.  pBt-
12820 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 62  >db = p->db;.  b
12830 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29  treeIntegrity(p)
12840 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 68  ;..  /* If the h
12850 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69 74  andle has a writ
12860 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  e-transaction op
12870 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20 73  en, commit the s
12880 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20 20  hared-btrees .  
12890 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ** transaction a
128a0 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72 65  nd set the share
128b0 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53  d state to TRANS
128c0 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69 66  _READ..  */.  if
128d0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
128e0 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
128f0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73   int rc;.    ass
12900 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
12910 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
12920 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73 65  RITE );.    asse
12930 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61  rt( pBt->nTransa
12940 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 72  ction>0 );.    r
12950 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
12960 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 70  CommitPhaseTwo(p
12970 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
12980 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12990 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
129a0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
129b0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
129c0 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  c;.    }.    pBt
129d0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
129e0 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20  = TRANS_READ;.  
129f0 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20    pBt->inStmt = 
12a00 30 3b 0a 20 20 7d 0a 20 20 75 6e 6c 6f 63 6b 41  0;.  }.  unlockA
12a10 6c 6c 54 61 62 6c 65 73 28 70 29 3b 0a 0a 20 20  llTables(p);..  
12a20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65  /* If the handle
12a30 20 68 61 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66   has any kind of
12a40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65   transaction ope
12a50 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68 65  n, decrement the
12a60 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a   transaction.  *
12a70 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20 73  * count of the s
12a80 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66 20  hared btree. If 
12a90 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
12aa0 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 30 2c  count reaches 0,
12ab0 20 73 65 74 0a 20 20 2a 2a 20 74 68 65 20 73 68   set.  ** the sh
12ac0 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54 52  ared state to TR
12ad0 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75 6e  ANS_NONE. The un
12ae0 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
12af0 64 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77 0a 20  d() call below. 
12b00 20 2a 2a 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20   ** will unlock 
12b10 74 68 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f 0a  the pager..  */.
12b20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
12b30 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a  !=TRANS_NONE ){.
12b40 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61      pBt->nTransa
12b50 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66 28  ction--;.    if(
12b60 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61   0==pBt->nTransa
12b70 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70  ction ){.      p
12b80 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
12b90 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a  n = TRANS_NONE;.
12ba0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
12bb0 53 65 74 20 74 68 65 20 68 61 6e 64 6c 65 73 20  Set the handles 
12bc0 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
12bd0 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52 41  ion state to TRA
12be0 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f  NS_NONE and unlo
12bf0 63 6b 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  ck.  ** the page
12c00 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 63  r if this call c
12c10 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20 72  losed the only r
12c20 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61  ead or write tra
12c30 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20  nsaction..  */. 
12c40 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52   p->inTrans = TR
12c50 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 75 6e 6c 6f  ANS_NONE;.  unlo
12c60 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
12c70 70 42 74 29 3b 0a 0a 20 20 62 74 72 65 65 49 6e  pBt);..  btreeIn
12c80 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71  tegrity(p);.  sq
12c90 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
12ca0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
12cb0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
12cc0 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20   Do both phases 
12cd0 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a  of a commit..*/.
12ce0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
12cf0 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29  Commit(Btree *p)
12d00 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
12d10 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
12d20 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  p);.  rc = sqlit
12d30 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
12d40 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69  seOne(p, 0);.  i
12d50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12d60 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
12d70 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
12d80 68 61 73 65 54 77 6f 28 70 29 3b 0a 20 20 7d 0a  haseTwo(p);.  }.
12d90 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
12da0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
12db0 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20   rc;.}..#ifndef 
12dc0 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74  NDEBUG./*.** Ret
12dd0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
12de0 66 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20  f write-cursors 
12df0 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 68 61 6e  open on this han
12e00 64 6c 65 2e 20 54 68 69 73 20 69 73 20 66 6f 72  dle. This is for
12e10 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72   use.** in asser
12e20 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73 2c  t() expressions,
12e30 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20 63   so it is only c
12e40 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42 55  ompiled if NDEBU
12e50 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69  G is not.** defi
12e60 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  ned..**.** For t
12e70 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74  he purposes of t
12e80 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 77  his routine, a w
12e90 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20 61  rite-cursor is a
12ea0 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a  ny cursor that.*
12eb0 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20  * is capable of 
12ec0 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
12ed0 61 74 61 62 73 65 2e 20 20 54 68 61 74 20 6d 65  atabse.  That me
12ee0 61 6e 73 20 74 68 65 20 63 75 72 73 6f 72 20 77  ans the cursor w
12ef0 61 73 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 6c 79  as.** originally
12f00 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74   opened for writ
12f10 69 6e 67 20 61 6e 64 20 74 68 65 20 63 75 72 73  ing and the curs
12f20 6f 72 20 68 61 73 20 6e 6f 74 20 62 65 20 64 69  or has not be di
12f30 73 61 62 6c 65 64 0a 2a 2a 20 62 79 20 68 61 76  sabled.** by hav
12f40 69 6e 67 20 69 74 73 20 73 74 61 74 65 20 63 68  ing its state ch
12f50 61 6e 67 65 64 20 74 6f 20 43 55 52 53 4f 52 5f  anged to CURSOR_
12f60 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74 61 74 69 63  FAULT..*/.static
12f70 20 69 6e 74 20 63 6f 75 6e 74 57 72 69 74 65 43   int countWriteC
12f80 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64 20  ursors(BtShared 
12f90 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f  *pBt){.  BtCurso
12fa0 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72  r *pCur;.  int r
12fb0 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75 72   = 0;.  for(pCur
12fc0 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
12fd0 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e  Cur; pCur=pCur->
12fe0 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20  pNext){.    if( 
12ff0 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 26 26 20  pCur->wrFlag && 
13000 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55  pCur->eState!=CU
13010 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b  RSOR_FAULT ) r++
13020 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ; .  }.  return 
13030 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  r;.}.#endif../*.
13040 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
13050 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20 74  sets the state t
13060 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61  o CURSOR_FAULT a
13070 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20  nd the error.** 
13080 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20  code to errCode 
13090 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f 72  for every cursor
130a0 20 6f 6e 20 42 74 53 68 61 72 65 64 20 74 68 61   on BtShared tha
130b0 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65  t pBtree.** refe
130c0 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76  rences..**.** Ev
130d0 65 72 79 20 63 75 72 73 6f 72 20 69 73 20 74 72  ery cursor is tr
130e0 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67  ipped, including
130f0 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 62 65   cursors that be
13100 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68 65 72  long.** to other
13110 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
13120 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65  tions that happe
13130 6e 20 74 6f 20 62 65 20 73 68 61 72 69 6e 67 0a  n to be sharing.
13140 2a 2a 20 74 68 65 20 63 61 63 68 65 20 77 69 74  ** the cache wit
13150 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  h pBtree..**.** 
13160 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74  This routine get
13170 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
13180 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e  rollback occurs.
13190 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73 20  .** All cursors 
131a0 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63  using the same c
131b0 61 63 68 65 20 6d 75 73 74 20 62 65 20 74 72 69  ache must be tri
131c0 70 70 65 64 0a 2a 2a 20 74 6f 20 70 72 65 76 65  pped.** to preve
131d0 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20 74 72 79  nt them from try
131e0 69 6e 67 20 74 6f 20 75 73 65 20 74 68 65 20 62  ing to use the b
131f0 74 72 65 65 20 61 66 74 65 72 0a 2a 2a 20 74 68  tree after.** th
13200 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65  e rollback.  The
13210 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61   rollback may ha
13220 76 65 20 64 65 6c 65 74 65 64 20 74 61 62 6c 65  ve deleted table
13230 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64 20 72 6f  s.** or moved ro
13240 6f 74 20 70 61 67 65 73 2c 20 73 6f 20 69 74 20  ot pages, so it 
13250 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e  is not sufficien
13260 74 20 74 6f 0a 2a 2a 20 73 61 76 65 20 74 68 65  t to.** save the
13270 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63 75   state of the cu
13280 72 73 6f 72 2e 20 20 54 68 65 20 63 75 72 73 6f  rsor.  The curso
13290 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76  r must be.** inv
132a0 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69  alidated..*/.voi
132b0 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72  d sqlite3BtreeTr
132c0 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72  ipAllCursors(Btr
132d0 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20  ee *pBtree, int 
132e0 65 72 72 43 6f 64 65 29 7b 0a 20 20 42 74 43 75  errCode){.  BtCu
132f0 72 73 6f 72 20 2a 70 3b 0a 20 20 73 71 6c 69 74  rsor *p;.  sqlit
13300 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
13310 72 65 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42  ree);.  for(p=pB
13320 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73  tree->pBt->pCurs
13330 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  or; p; p=p->pNex
13340 74 29 7b 0a 20 20 20 20 63 6c 65 61 72 43 75 72  t){.    clearCur
13350 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a  sorPosition(p);.
13360 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20      p->eState = 
13370 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20  CURSOR_FAULT;.  
13380 20 20 70 2d 3e 73 6b 69 70 20 3d 20 65 72 72 43    p->skip = errC
13390 6f 64 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ode;.  }.  sqlit
133a0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
133b0 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ree);.}../*.** R
133c0 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61 6e  ollback the tran
133d0 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72  saction in progr
133e0 65 73 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f 72  ess.  All cursor
133f0 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76  s will be.** inv
13400 61 6c 69 64 65 64 20 62 79 20 74 68 69 73 20 6f  alided by this o
13410 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61  peration.  Any a
13420 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
13430 63 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20 77  cursor.** that w
13440 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20 62  as open at the b
13450 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73  eginning of this
13460 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c 20   operation will 
13470 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20  result.** in an 
13480 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  error..**.** Thi
13490 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74  s will release t
134a0 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e  he write lock on
134b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
134c0 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a  le.  If there.**
134d0 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63   are no active c
134e0 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20  ursors, it also 
134f0 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65 61  releases the rea
13500 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73  d lock..*/.int s
13510 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
13520 61 63 6b 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ack(Btree *p){. 
13530 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61   int rc;.  BtSha
13540 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
13550 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  t;.  MemPage *pP
13560 61 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74 65 33  age1;..  sqlite3
13570 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
13580 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62   pBt->db = p->db
13590 3b 0a 20 20 72 63 20 3d 20 73 61 76 65 41 6c 6c  ;.  rc = saveAll
135a0 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c 20  Cursors(pBt, 0, 
135b0 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0);.#ifndef SQLI
135c0 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
135d0 41 43 48 45 0a 20 20 69 66 28 20 72 63 21 3d 53  ACHE.  if( rc!=S
135e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
135f0 2f 2a 20 54 68 69 73 20 69 73 20 61 20 68 6f 72  /* This is a hor
13600 72 69 62 6c 65 20 73 69 74 75 61 74 69 6f 6e 2e  rible situation.
13610 20 41 6e 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63   An IO or malloc
13620 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  () error occured
13630 20 77 68 69 6c 73 74 0a 20 20 20 20 2a 2a 20 74   whilst.    ** t
13640 72 79 69 6e 67 20 74 6f 20 73 61 76 65 20 63 75  rying to save cu
13650 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 73 2e 20  rsor positions. 
13660 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
13670 74 6f 6d 61 74 69 63 20 72 6f 6c 6c 62 61 63 6b  tomatic rollback
13680 20 28 61 73 0a 20 20 20 20 2a 2a 20 74 68 65 20   (as.    ** the 
13690 72 65 73 75 6c 74 20 6f 66 20 61 20 63 6f 6e 73  result of a cons
136a0 74 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29  traint, malloc()
136b0 20 66 61 69 6c 75 72 65 20 6f 72 20 49 4f 20 65   failure or IO e
136c0 72 72 6f 72 29 20 74 68 65 6e 20 0a 20 20 20 20  rror) then .    
136d0 2a 2a 20 74 68 65 20 63 61 63 68 65 20 6d 61 79  ** the cache may
136e0 20 62 65 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69   be internally i
136f0 6e 63 6f 6e 73 69 73 74 65 6e 74 20 28 6e 6f 74  nconsistent (not
13700 20 63 6f 6e 74 61 69 6e 20 76 61 6c 69 64 20 74   contain valid t
13710 72 65 65 73 29 20 73 6f 0a 20 20 20 20 2a 2a 20  rees) so.    ** 
13720 77 65 20 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79  we cannot simply
13730 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
13740 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  r to the caller.
13750 20 49 6e 73 74 65 61 64 2c 20 61 62 6f 72 74 20   Instead, abort 
13760 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 71 75 65 72  .    ** all quer
13770 69 65 73 20 74 68 61 74 20 6d 61 79 20 62 65 20  ies that may be 
13780 75 73 69 6e 67 20 61 6e 79 20 6f 66 20 74 68 65  using any of the
13790 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 66 61   cursors that fa
137a0 69 6c 65 64 20 74 6f 20 73 61 76 65 2e 0a 20 20  iled to save..  
137b0 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
137c0 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72 73  BtreeTripAllCurs
137d0 6f 72 73 28 70 2c 20 72 63 29 3b 0a 20 20 7d 0a  ors(p, rc);.  }.
137e0 23 65 6e 64 69 66 0a 20 20 62 74 72 65 65 49 6e  #endif.  btreeIn
137f0 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 75 6e  tegrity(p);.  un
13800 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 70 29  lockAllTables(p)
13810 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  ;..  if( p->inTr
13820 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
13830 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
13840 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
13850 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
13860 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63  .    pBt->nTrunc
13870 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   = 0;.#endif..  
13880 20 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f    assert( TRANS_
13890 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72  WRITE==pBt->inTr
138a0 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20  ansaction );.   
138b0 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61   rc2 = sqlite3Pa
138c0 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d  gerRollback(pBt-
138d0 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  >pPager);.    if
138e0 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b  ( rc2!=SQLITE_OK
138f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
13900 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  c2;.    }..    /
13910 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d  * The rollback m
13920 61 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65  ay have destroye
13930 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44  d the pPage1->aD
13940 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20  ata value.  So. 
13950 20 20 20 2a 2a 20 63 61 6c 6c 20 73 71 6c 69 74     ** call sqlit
13960 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 29  e3BtreeGetPage()
13970 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e   on page 1 again
13980 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20   to make.    ** 
13990 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61  sure pPage1->aDa
139a0 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65 63  ta is set correc
139b0 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  tly. */.    if( 
139c0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
139d0 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61  age(pBt, 1, &pPa
139e0 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f  ge1, 0)==SQLITE_
139f0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
13a00 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
13a10 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
13a20 74 28 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72  t( countWriteCur
13a30 73 6f 72 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a  sors(pBt)==0 );.
13a40 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
13a50 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52  action = TRANS_R
13a60 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  EAD;.  }..  if( 
13a70 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
13a80 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 61 73  S_NONE ){.    as
13a90 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e  sert( pBt->nTran
13aa0 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20  saction>0 );.   
13ab0 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
13ac0 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d  on--;.    if( 0=
13ad0 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69  =pBt->nTransacti
13ae0 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  on ){.      pBt-
13af0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
13b00 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20   TRANS_NONE;.   
13b10 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 6e 54   }.  }..  p->inT
13b20 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  rans = TRANS_NON
13b30 45 3b 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74  E;.  pBt->inStmt
13b40 20 3d 20 30 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74   = 0;.  unlockBt
13b50 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
13b60 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  ;..  btreeIntegr
13b70 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ity(p);.  sqlite
13b80 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
13b90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13ba0 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73 74  /*.** Start a st
13bb0 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
13bc0 61 63 74 69 6f 6e 2e 20 20 54 68 65 20 73 75 62  action.  The sub
13bd0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e 0a  transaction can.
13be0 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64  ** can be rolled
13bf0 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65 6e   back independen
13c00 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  tly of the main 
13c10 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20  transaction..** 
13c20 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20 61  You must start a
13c30 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 66   transaction bef
13c40 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61 20 73  ore starting a s
13c50 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  ubtransaction..*
13c60 2a 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63  * The subtransac
13c70 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 75  tion is ended au
13c80 74 6f 6d 61 74 69 63 61 6c 6c 79 20 69 66 20 74  tomatically if t
13c90 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74  he main transact
13ca0 69 6f 6e 0a 2a 2a 20 63 6f 6d 6d 69 74 73 20 6f  ion.** commits o
13cb0 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a  r rolls back..**
13cc0 0a 2a 2a 20 4f 6e 6c 79 20 6f 6e 65 20 73 75 62  .** Only one sub
13cd0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
13ce0 62 65 20 61 63 74 69 76 65 20 61 74 20 61 20 74  be active at a t
13cf0 69 6d 65 2e 20 20 49 74 20 69 73 20 61 6e 20 65  ime.  It is an e
13d00 72 72 6f 72 20 74 6f 20 74 72 79 0a 2a 2a 20 74  rror to try.** t
13d10 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 73 75  o start a new su
13d20 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20  btransaction if 
13d30 61 6e 6f 74 68 65 72 20 73 75 62 74 72 61 6e 73  another subtrans
13d40 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64  action is alread
13d50 79 20 61 63 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  y active..**.** 
13d60 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  Statement subtra
13d70 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75 73  nsactions are us
13d80 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76 69  ed around indivi
13d90 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d 65  dual SQL stateme
13da0 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65 20  nts.** that are 
13db0 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e  contained within
13dc0 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49   a BEGIN...COMMI
13dd0 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20 63  T block.  If a c
13de0 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72 72  onstraint.** err
13df0 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e  or occurs within
13e00 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
13e10 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 74 68  the effect of th
13e20 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e 74  at one statement
13e30 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  .** can be rolle
13e40 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68  d back without h
13e50 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  aving to rollbac
13e60 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74 72 61  k the entire tra
13e70 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  nsaction..*/.int
13e80 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65 67   sqlite3BtreeBeg
13e90 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70 29  inStmt(Btree *p)
13ea0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
13eb0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
13ec0 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42  >pBt;.  sqlite3B
13ed0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
13ee0 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
13ef0 0a 20 20 69 66 28 20 28 70 2d 3e 69 6e 54 72 61  .  if( (p->inTra
13f00 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 29  ns!=TRANS_WRITE)
13f10 20 7c 7c 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20   || pBt->inStmt 
13f20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d  ){.    rc = pBt-
13f30 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49  >readOnly ? SQLI
13f40 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51  TE_READONLY : SQ
13f50 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65  LITE_ERROR;.  }e
13f60 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
13f70 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
13f80 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
13f90 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 42 74   );.    rc = pBt
13fa0 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c  ->readOnly ? SQL
13fb0 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65 33  ITE_OK : sqlite3
13fc0 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28 70  PagerStmtBegin(p
13fd0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
13fe0 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 31   pBt->inStmt = 1
13ff0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
14000 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
14010 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
14020 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20  *.** Commit the 
14030 73 74 61 74 6d 65 6e 74 20 73 75 62 74 72 61 6e  statment subtran
14040 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c  saction currentl
14050 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20  y in progress.  
14060 49 66 20 6e 6f 0a 2a 2a 20 73 75 62 74 72 61 6e  If no.** subtran
14070 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76  saction is activ
14080 65 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f 2d  e, this is a no-
14090 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  op..*/.int sqlit
140a0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74 6d  e3BtreeCommitStm
140b0 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  t(Btree *p){.  i
140c0 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65  nt rc;.  BtShare
140d0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
140e0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
140f0 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e  nter(p);.  pBt->
14100 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66  db = p->db;.  if
14110 28 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 26 26  ( pBt->inStmt &&
14120 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20   !pBt->readOnly 
14130 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
14140 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d  te3PagerStmtComm
14150 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  it(pBt->pPager);
14160 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
14170 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
14180 7d 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20  }.  pBt->inStmt 
14190 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  = 0;.  sqlite3Bt
141a0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
141b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
141c0 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20  ** Rollback the 
141d0 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
141e0 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
141f0 20 20 49 66 20 6e 6f 20 73 75 62 74 72 61 6e 73    If no subtrans
14200 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 63 74  action.** is act
14210 69 76 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ive this routine
14220 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
14230 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77  ** All cursors w
14240 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61 74  ill be invalidat
14250 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61  ed by this opera
14260 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d  tion.  Any attem
14270 70 74 0a 2a 2a 20 74 6f 20 75 73 65 20 61 20 63  pt.** to use a c
14280 75 72 73 6f 72 20 74 68 61 74 20 77 61 73 20 6f  ursor that was o
14290 70 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e  pen at the begin
142a0 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65  ning of this ope
142b0 72 61 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 72  ration.** will r
142c0 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72 6f  esult in an erro
142d0 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
142e0 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53 74  3BtreeRollbackSt
142f0 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  mt(Btree *p){.  
14300 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
14310 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  OK;.  BtShared *
14320 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
14330 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
14340 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20  r(p);.  pBt->db 
14350 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70  = p->db;.  if( p
14360 42 74 2d 3e 69 6e 53 74 6d 74 20 26 26 20 21 70  Bt->inStmt && !p
14370 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  Bt->readOnly ){.
14380 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14390 50 61 67 65 72 53 74 6d 74 52 6f 6c 6c 62 61 63  PagerStmtRollbac
143a0 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  k(pBt->pPager);.
143b0 20 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e      assert( coun
143c0 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 70 42  tWriteCursors(pB
143d0 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74  t)==0 );.    pBt
143e0 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
143f0 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
14400 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
14410 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
14420 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72  Create a new cur
14430 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72 65  sor for the BTre
14440 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20  e whose root is 
14450 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69  on the page.** i
14460 54 61 62 6c 65 2e 20 20 54 68 65 20 61 63 74 20  Table.  The act 
14470 6f 66 20 61 63 71 75 69 72 69 6e 67 20 61 20 63  of acquiring a c
14480 75 72 73 6f 72 20 67 65 74 73 20 61 20 72 65 61  ursor gets a rea
14490 64 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68  d lock on .** th
144a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
144b0 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67  .**.** If wrFlag
144c0 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ==0, then the cu
144d0 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65  rsor can only be
144e0 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e   used for readin
144f0 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d  g..** If wrFlag=
14500 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  =1, then the cur
14510 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64 20  sor can be used 
14520 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66  for reading or f
14530 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66  or.** writing if
14540 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e   other condition
14550 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72  s for writing ar
14560 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65  e also met.  The
14570 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f  se.** are the co
14580 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75  nditions that mu
14590 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64  st be met in ord
145a0 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74  er for writing t
145b0 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a  o.** be allowed:
145c0 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63  .**.** 1:  The c
145d0 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20  ursor must have 
145e0 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68  been opened with
145f0 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a   wrFlag==1.**.**
14600 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62   2:  Other datab
14610 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
14620 74 68 61 74 20 73 68 61 72 65 20 74 68 65 20 73  that share the s
14630 61 6d 65 20 70 61 67 65 72 20 63 61 63 68 65 0a  ame pager cache.
14640 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69 63 68  **     but which
14650 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20   are not in the 
14660 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44  READ_UNCOMMITTED
14670 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68   state may not h
14680 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f  ave.**     curso
14690 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46  rs open with wrF
146a0 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61  lag==0 on the sa
146b0 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72  me table.  Other
146c0 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20  wise.**     the 
146d0 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20  changes made by 
146e0 74 68 69 73 20 77 72 69 74 65 20 63 75 72 73 6f  this write curso
146f0 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62  r would be visib
14700 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65  le to.**     the
14710 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e   read cursors in
14720 20 74 68 65 20 6f 74 68 65 72 20 64 61 74 61 62   the other datab
14730 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
14740 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61  **.** 3:  The da
14750 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 77  tabase must be w
14760 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20  ritable (not on 
14770 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29  read-only media)
14780 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65  .**.** 4:  There
14790 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74 69   must be an acti
147a0 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ve transaction..
147b0 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e  **.** No checkin
147c0 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b  g is done to mak
147d0 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67 65  e sure that page
147e0 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69   iTable really i
147f0 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61  s the.** root pa
14800 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20  ge of a b-tree. 
14810 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74   If it is not, t
14820 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61  hen the cursor a
14830 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20  cquired.** will 
14840 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74  not work correct
14850 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ly..*/.static in
14860 74 20 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20  t btreeCursor(. 
14870 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20   Btree *p,      
14880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14890 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
148a0 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54  tree */.  int iT
148b0 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20  able,           
148c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148d0 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
148e0 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   table to open *
148f0 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20  /.  int wrFlag, 
14900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14910 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20             /* 1 
14920 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61 64  to write. 0 read
14930 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63  -only */.  struc
14940 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49  t KeyInfo *pKeyI
14950 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  nfo,            
14960 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74    /* First arg t
14970 6f 20 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e  o comparison fun
14980 63 74 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72  ction */.  BtCur
14990 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20 20  sor *pCur       
149a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
149b0 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e    /* Space for n
149c0 65 77 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a  ew cursor */.){.
149d0 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
149e0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
149f0 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  Bt;..  assert( s
14a00 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
14a10 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 69 66  Mutex(p) );.  if
14a20 28 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20  ( wrFlag ){.    
14a30 69 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  if( pBt->readOnl
14a40 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  y ){.      retur
14a50 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
14a60 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  Y;.    }.    if(
14a70 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28   checkReadLocks(
14a80 70 2c 20 69 54 61 62 6c 65 2c 20 30 2c 20 30 29  p, iTable, 0, 0)
14a90 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
14aa0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a   SQLITE_LOCKED;.
14ab0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
14ac0 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
14ad0 29 7b 0a 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b  ){.    rc = lock
14ae0 42 74 72 65 65 57 69 74 68 52 65 74 72 79 28 70  BtreeWithRetry(p
14af0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
14b00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14b10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
14b20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e   }.    if( pBt->
14b30 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 46 6c  readOnly && wrFl
14b40 61 67 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ag ){.      retu
14b50 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
14b60 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  LY;.    }.  }.  
14b70 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d  pCur->pgnoRoot =
14b80 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20   (Pgno)iTable;. 
14b90 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 31 20 26   if( iTable==1 &
14ba0 26 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  & pagerPagecount
14bb0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3d 3d 30  (pBt->pPager)==0
14bc0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
14bd0 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 20 20 67  ITE_EMPTY;.    g
14be0 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72 73 6f  oto create_curso
14bf0 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d  r_exception;.  }
14c00 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e  .  rc = getAndIn
14c10 69 74 50 61 67 65 28 70 42 74 2c 20 70 43 75 72  itPage(pBt, pCur
14c20 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75  ->pgnoRoot, &pCu
14c30 72 2d 3e 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  r->pPage, 0);.  
14c40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
14c50 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 72  K ){.    goto cr
14c60 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65  eate_cursor_exce
14c70 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ption;.  }..  /*
14c80 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68   Now that no oth
14c90 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63  er errors can oc
14ca0 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c  cur, finish fill
14cb0 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75 72  ing in the BtCur
14cc0 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c  sor.  ** variabl
14cd0 65 73 2c 20 6c 69 6e 6b 20 74 68 65 20 63 75 72  es, link the cur
14ce0 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53  sor into the BtS
14cf0 68 61 72 65 64 20 6c 69 73 74 20 61 6e 64 20 73  hared list and s
14d00 65 74 20 2a 70 70 43 75 72 20 28 74 68 65 0a 20  et *ppCur (the. 
14d10 20 2a 2a 20 6f 75 74 70 75 74 20 61 72 67 75 6d   ** output argum
14d20 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
14d30 74 69 6f 6e 29 2e 0a 20 20 2a 2f 0a 20 20 70 43  tion)..  */.  pC
14d40 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70  ur->pKeyInfo = p
14d50 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d  KeyInfo;.  pCur-
14d60 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70  >pBtree = p;.  p
14d70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  Cur->pBt = pBt;.
14d80 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d    pCur->wrFlag =
14d90 20 77 72 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d   wrFlag;.  pCur-
14da0 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 43  >pNext = pBt->pC
14db0 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70 43 75  ursor;.  if( pCu
14dc0 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  r->pNext ){.    
14dd0 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72  pCur->pNext->pPr
14de0 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20  ev = pCur;.  }. 
14df0 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20   pBt->pCursor = 
14e00 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53  pCur;.  pCur->eS
14e10 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
14e20 56 41 4c 49 44 3b 0a 0a 20 20 72 65 74 75 72 6e  VALID;..  return
14e30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 63 72 65   SQLITE_OK;..cre
14e40 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70  ate_cursor_excep
14e50 74 69 6f 6e 3a 0a 20 20 69 66 28 20 70 43 75 72  tion:.  if( pCur
14e60 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50   ){.    releaseP
14e70 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29  age(pCur->pPage)
14e80 3b 0a 20 20 7d 0a 20 20 75 6e 6c 6f 63 6b 42 74  ;.  }.  unlockBt
14e90 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
14ea0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
14eb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
14ec0 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65  eCursor(.  Btree
14ed0 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
14ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ef0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
14f00 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61  ree */.  int iTa
14f10 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ble,            
14f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f30 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67       /* Root pag
14f40 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70  e of table to op
14f50 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c  en */.  int wrFl
14f60 61 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ag,             
14f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f80 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74      /* 1 to writ
14f90 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a  e. 0 read-only *
14fa0 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e  /.  struct KeyIn
14fb0 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20  fo *pKeyInfo,   
14fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fd0 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
14fe0 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20  xCompare() */.  
14ff0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20  BtCursor *pCur  
15000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15010 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
15020 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20  rite new cursor 
15030 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
15040 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
15050 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
15060 2d 3e 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64  ->pBt->db = p->d
15070 62 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43  b;.  rc = btreeC
15080 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c  ursor(p, iTable,
15090 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66   wrFlag, pKeyInf
150a0 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73 71 6c 69  o, pCur);.  sqli
150b0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
150c0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
150d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
150e0 65 43 75 72 73 6f 72 53 69 7a 65 28 29 7b 0a 20  eCursorSize(){. 
150f0 20 72 65 74 75 72 6e 20 73 69 7a 65 6f 66 28 42   return sizeof(B
15100 74 43 75 72 73 6f 72 29 3b 0a 7d 0a 0a 0a 0a 2f  tCursor);.}..../
15110 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72  *.** Close a cur
15120 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c  sor.  The read l
15130 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
15140 61 73 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65  ase file is rele
15150 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65  ased.** when the
15160 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69 73 20   last cursor is 
15170 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  closed..*/.int s
15180 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65  qlite3BtreeClose
15190 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20  Cursor(BtCursor 
151a0 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20  *pCur){.  Btree 
151b0 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e  *pBtree = pCur->
151c0 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42  pBtree;.  if( pB
151d0 74 72 65 65 20 29 7b 0a 20 20 20 20 42 74 53 68  tree ){.    BtSh
151e0 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
151f0 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74  ->pBt;.    sqlit
15200 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74  e3BtreeEnter(pBt
15210 72 65 65 29 3b 0a 20 20 20 20 70 42 74 2d 3e 64  ree);.    pBt->d
15220 62 20 3d 20 70 42 74 72 65 65 2d 3e 64 62 3b 0a  b = pBtree->db;.
15230 20 20 20 20 63 6c 65 61 72 43 75 72 73 6f 72 50      clearCursorP
15240 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
15250 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50 72     if( pCur->pPr
15260 65 76 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72  ev ){.      pCur
15270 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d  ->pPrev->pNext =
15280 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20   pCur->pNext;.  
15290 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
152a0 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43  Bt->pCursor = pC
152b0 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ur->pNext;.    }
152c0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70  .    if( pCur->p
152d0 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70 43  Next ){.      pC
152e0 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76  ur->pNext->pPrev
152f0 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a   = pCur->pPrev;.
15300 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73      }.    releas
15310 65 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67  ePage(pCur->pPag
15320 65 29 3b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74  e);.    unlockBt
15330 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
15340 3b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  ;.    invalidate
15350 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43  OverflowCache(pC
15360 75 72 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69  ur);.    /* sqli
15370 74 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20  te3_free(pCur); 
15380 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  */.    sqlite3Bt
15390 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
153a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
153b0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
153c0 2a 2a 20 4d 61 6b 65 20 61 20 74 65 6d 70 6f 72  ** Make a tempor
153d0 61 72 79 20 63 75 72 73 6f 72 20 62 79 20 66 69  ary cursor by fi
153e0 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 66 69 65  lling in the fie
153f0 6c 64 73 20 6f 66 20 70 54 65 6d 70 43 75 72 2e  lds of pTempCur.
15400 0a 2a 2a 20 54 68 65 20 74 65 6d 70 6f 72 61 72  .** The temporar
15410 79 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  y cursor is not 
15420 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20 6c 69  on the cursor li
15430 73 74 20 66 6f 72 20 74 68 65 20 42 74 72 65 65  st for the Btree
15440 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
15450 33 42 74 72 65 65 47 65 74 54 65 6d 70 43 75 72  3BtreeGetTempCur
15460 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
15470 75 72 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 54  ur, BtCursor *pT
15480 65 6d 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72  empCur){.  asser
15490 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
154a0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 6d  tex(pCur) );.  m
154b0 65 6d 63 70 79 28 70 54 65 6d 70 43 75 72 2c 20  emcpy(pTempCur, 
154c0 70 43 75 72 2c 20 73 69 7a 65 6f 66 28 2a 70 43  pCur, sizeof(*pC
154d0 75 72 29 29 3b 0a 20 20 70 54 65 6d 70 43 75 72  ur));.  pTempCur
154e0 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70  ->pNext = 0;.  p
154f0 54 65 6d 70 43 75 72 2d 3e 70 50 72 65 76 20 3d  TempCur->pPrev =
15500 20 30 3b 0a 20 20 69 66 28 20 70 54 65 6d 70 43   0;.  if( pTempC
15510 75 72 2d 3e 70 50 61 67 65 20 29 7b 0a 20 20 20  ur->pPage ){.   
15520 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
15530 28 70 54 65 6d 70 43 75 72 2d 3e 70 50 61 67 65  (pTempCur->pPage
15540 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a  ->pDbPage);.  }.
15550 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
15560 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73  a temporary curs
15570 6f 72 20 73 75 63 68 20 61 73 20 77 61 73 20 6d  or such as was m
15580 61 64 65 20 62 79 20 74 68 65 20 43 72 65 61 74  ade by the Creat
15590 65 54 65 6d 70 6f 72 61 72 79 43 75 72 73 6f 72  eTemporaryCursor
155a0 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61  ().** function a
155b0 62 6f 76 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  bove..*/.void sq
155c0 6c 69 74 65 33 42 74 72 65 65 52 65 6c 65 61 73  lite3BtreeReleas
155d0 65 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75  eTempCursor(BtCu
155e0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
155f0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
15600 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
15610 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50 61  .  if( pCur->pPa
15620 67 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ge ){.    sqlite
15630 33 50 61 67 65 72 55 6e 72 65 66 28 70 43 75 72  3PagerUnref(pCur
15640 2d 3e 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  ->pPage->pDbPage
15650 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
15660 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74  Make sure the Bt
15670 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e  Cursor* given in
15680 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61   the argument ha
15690 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43  s a valid.** BtC
156a0 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63  ursor.info struc
156b0 74 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20  ture.  If it is 
156c0 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69  not already vali
156d0 64 2c 20 63 61 6c 6c 0a 2a 2a 20 73 71 6c 69 74  d, call.** sqlit
156e0 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
156f0 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e  () to fill it in
15700 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72  ..**.** BtCursor
15710 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65  .info is a cache
15720 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74   of the informat
15730 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65  ion in the curre
15740 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e  nt cell..** Usin
15750 67 20 74 68 69 73 20 63 61 63 68 65 20 72 65 64  g this cache red
15760 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  uces the number 
15770 6f 66 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  of calls to sqli
15780 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
15790 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d  l()..**.** 2007-
157a0 30 36 2d 32 35 3a 20 20 54 68 65 72 65 20 69 73  06-25:  There is
157b0 20 61 20 62 75 67 20 69 6e 20 73 6f 6d 65 20 76   a bug in some v
157c0 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56 43 20  ersions of MSVC 
157d0 74 68 61 74 20 63 61 75 73 65 20 74 68 65 0a 2a  that cause the.*
157e0 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 63 72  * compiler to cr
157f0 61 73 68 20 77 68 65 6e 20 67 65 74 43 65 6c 6c  ash when getCell
15800 49 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c 65 6d  Info() is implem
15810 65 6e 74 65 64 20 61 73 20 61 20 6d 61 63 72 6f  ented as a macro
15820 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72 65 20 69  ..** But there i
15830 73 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65 20  s a measureable 
15840 73 70 65 65 64 20 61 64 76 61 6e 74 61 67 65 20  speed advantage 
15850 74 6f 20 75 73 69 6e 67 20 74 68 65 20 6d 61 63  to using the mac
15860 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28 77 68  ro on gcc.** (wh
15870 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c 65 72  en less compiler
15880 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c   optimizations l
15890 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30 20 61  ike -Os or -O0 a
158a0 72 65 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a  re used and the.
158b0 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73 20 6e  ** compiler is n
158c0 6f 74 20 64 6f 69 6e 67 20 61 67 72 65 73 73 69  ot doing agressi
158d0 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20 53  ve inlining.)  S
158e0 6f 20 77 65 20 75 73 65 20 61 20 72 65 61 6c 20  o we use a real 
158f0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  function.** for 
15900 4d 53 56 43 20 61 6e 64 20 61 20 6d 61 63 72 6f  MSVC and a macro
15910 20 66 6f 72 20 65 76 65 72 79 74 68 69 6e 67 20   for everything 
15920 65 6c 73 65 2e 20 20 54 69 63 6b 65 74 20 23 32  else.  Ticket #2
15930 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  457..*/.#ifndef 
15940 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20  NDEBUG.  static 
15950 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49  void assertCellI
15960 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nfo(BtCursor *pC
15970 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66  ur){.    CellInf
15980 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 6d 65 6d 73  o info;.    mems
15990 65 74 28 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a  et(&info, 0, siz
159a0 65 6f 66 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20  eof(info));.    
159b0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
159c0 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67  eCell(pCur->pPag
159d0 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 26 69  e, pCur->idx, &i
159e0 6e 66 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  nfo);.    assert
159f0 28 20 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20  ( memcmp(&info, 
15a00 26 70 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a  &pCur->info, siz
15a10 65 6f 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b  eof(info))==0 );
15a20 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65  .  }.#else.  #de
15a30 66 69 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49  fine assertCellI
15a40 6e 66 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23 69  nfo(x).#endif.#i
15a50 66 64 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20  fdef _MSC_VER.  
15a60 2f 2a 20 55 73 65 20 61 20 72 65 61 6c 20 66 75  /* Use a real fu
15a70 6e 63 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74  nction in MSVC t
15a80 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75  o work around bu
15a90 67 73 20 69 6e 20 74 68 61 74 20 63 6f 6d 70 69  gs in that compi
15aa0 6c 65 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63  ler. */.  static
15ab0 20 76 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66   void getCellInf
15ac0 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
15ad0 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
15ae0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29  >info.nSize==0 )
15af0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
15b00 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
15b10 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2d  ur->pPage, pCur-
15b20 3e 69 64 78 2c 20 26 70 43 75 72 2d 3e 69 6e 66  >idx, &pCur->inf
15b30 6f 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  o);.      pCur->
15b40 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20  validNKey = 1;. 
15b50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
15b60 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70  assertCellInfo(p
15b70 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cur);.    }.  }.
15b80 23 65 6c 73 65 20 2f 2a 20 69 66 20 6e 6f 74 20  #else /* if not 
15b90 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a  _MSC_VER */.  /*
15ba0 20 55 73 65 20 61 20 6d 61 63 72 6f 20 69 6e 20   Use a macro in 
15bb0 61 6c 6c 20 6f 74 68 65 72 20 63 6f 6d 70 69 6c  all other compil
15bc0 65 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 20  ers so that the 
15bd0 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 6c 69  function is inli
15be0 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 67  ned */.#define g
15bf0 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
15c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
15c30 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66  .  if( pCur->inf
15c40 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20  o.nSize==0 ){   
15c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c70 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20 20 73           \.    s
15c80 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
15c90 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67 65  Cell(pCur->pPage
15ca0 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 26 70 43  , pCur->idx, &pC
15cb0 75 72 2d 3e 69 6e 66 6f 29 3b 20 20 20 20 20 20  ur->info);      
15cc0 20 20 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e 76     \.    pCur->v
15cd0 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 20 20 20  alidNKey = 1;   
15ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d00 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20               \. 
15d10 20 7d 65 6c 73 65 7b 20 20 20 20 20 20 20 20 20   }else{         
15d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d50 20 20 20 20 20 20 20 5c 0a 20 20 20 20 61 73 73         \.    ass
15d60 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  ertCellInfo(pCur
15d70 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
15d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15da0 20 5c 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a   \.  }.#endif /*
15db0 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a 0a 2f 2a   _MSC_VER */../*
15dc0 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20 74  .** Set *pSize t
15dd0 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
15de0 65 20 62 75 66 66 65 72 20 6e 65 65 64 65 64 20  e buffer needed 
15df0 74 6f 20 68 6f 6c 64 20 74 68 65 20 76 61 6c 75  to hold the valu
15e00 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20  e of.** the key 
15e10 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
15e20 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65 20 63  entry.  If the c
15e30 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69  ursor is not poi
15e40 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61 20 76 61  nting.** to a va
15e50 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70 53 69 7a  lid entry, *pSiz
15e60 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e 20 0a  e is set to 0. .
15e70 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74 61 62 6c  **.** For a tabl
15e80 65 20 77 69 74 68 20 74 68 65 20 49 4e 54 4b 45  e with the INTKE
15e90 59 20 66 6c 61 67 20 73 65 74 2c 20 74 68 69 73  Y flag set, this
15ea0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
15eb0 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69 74 73 65   the key.** itse
15ec0 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e 75 6d 62  lf, not the numb
15ed0 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
15ee0 68 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73  he key..*/.int s
15ef0 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
15f00 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ze(BtCursor *pCu
15f10 72 2c 20 69 36 34 20 2a 70 53 69 7a 65 29 7b 0a  r, i64 *pSize){.
15f20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
15f30 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
15f40 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
15f50 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43   rc = restoreOrC
15f60 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
15f70 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
15f80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
15f90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
15fa0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
15fb0 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75  R_INVALID || pCu
15fc0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
15fd0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69  R_VALID );.    i
15fe0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
15ff0 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
16000 29 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20  ){.      *pSize 
16010 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
16020 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66        getCellInf
16030 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a  o(pCur);.      *
16040 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e  pSize = pCur->in
16050 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20  fo.nKey;.    }. 
16060 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
16070 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53  }../*.** Set *pS
16080 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ize to the numbe
16090 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61  r of bytes of da
160a0 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20  ta in the entry 
160b0 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75  the.** cursor cu
160c0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
160d0 6f 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75 72  o.  Always retur
160e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  n SQLITE_OK..** 
160f0 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70  Failure is not p
16100 6f 73 73 69 62 6c 65 2e 20 20 49 66 20 74 68 65  ossible.  If the
16110 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 63   cursor is not c
16120 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e  urrently.** poin
16130 74 69 6e 67 20 74 6f 20 61 6e 20 65 6e 74 72 79  ting to an entry
16140 20 28 77 68 69 63 68 20 63 61 6e 20 68 61 70 70   (which can happ
16150 65 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  en, for example,
16160 20 69 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   if.** the datab
16170 61 73 65 20 69 73 20 65 6d 70 74 79 29 20 74 68  ase is empty) th
16180 65 6e 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74  en *pSize is set
16190 20 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71   to 0..*/.int sq
161a0 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 53 69  lite3BtreeDataSi
161b0 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ze(BtCursor *pCu
161c0 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a  r, u32 *pSize){.
161d0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
161e0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
161f0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
16200 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43   rc = restoreOrC
16210 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
16220 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
16230 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
16240 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
16250 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
16260 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75  R_INVALID || pCu
16270 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
16280 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69  R_VALID );.    i
16290 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
162a0 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
162b0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20  ){.      /* Not 
162c0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 76 61  pointing at a va
162d0 6c 69 64 20 65 6e 74 72 79 20 2d 20 73 65 74 20  lid entry - set 
162e0 2a 70 53 69 7a 65 20 74 6f 20 30 2e 20 2a 2f 0a  *pSize to 0. */.
162f0 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30        *pSize = 0
16300 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16310 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70     getCellInfo(p
16320 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69  Cur);.      *pSi
16330 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ze = pCur->info.
16340 6e 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d  nData;.    }.  }
16350 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
16360 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65  ./*.** Given the
16370 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
16380 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
16390 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
163a0 20 28 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f   (parameter.** o
163b0 76 66 6c 29 2c 20 74 68 69 73 20 66 75 6e 63 74  vfl), this funct
163c0 69 6f 6e 20 66 69 6e 64 73 20 74 68 65 20 70 61  ion finds the pa
163d0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
163e0 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
163f0 65 20 0a 2a 2a 20 6c 69 6e 6b 65 64 20 6c 69 73  e .** linked lis
16400 74 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61  t of overflow pa
16410 67 65 73 2e 20 49 66 20 70 6f 73 73 69 62 6c 65  ges. If possible
16420 2c 20 69 74 20 75 73 65 73 20 74 68 65 20 61 75  , it uses the au
16430 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 70 6f 69  to-vacuum.** poi
16440 6e 74 65 72 2d 6d 61 70 20 64 61 74 61 20 69 6e  nter-map data in
16450 73 74 65 61 64 20 6f 66 20 72 65 61 64 69 6e 67  stead of reading
16460 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
16470 70 61 67 65 20 6f 76 66 6c 20 74 6f 20 64 6f 20  page ovfl to do 
16480 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  so. .**.** If an
16490 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 61 6e   error occurs an
164a0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
164b0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  de is returned. 
164c0 4f 74 68 65 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a  Otherwise:.**.**
164d0 20 55 6e 6c 65 73 73 20 70 50 67 6e 6f 4e 65 78   Unless pPgnoNex
164e0 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 20 70  t is NULL, the p
164f0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
16500 65 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20  e next overflow 
16510 0a 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20  .** page in the 
16520 6c 69 6e 6b 65 64 20 6c 69 73 74 20 69 73 20 77  linked list is w
16530 72 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f  ritten to *pPgno
16540 4e 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76  Next. If page ov
16550 66 6c 0a 2a 2a 20 69 73 20 74 68 65 20 6c 61 73  fl.** is the las
16560 74 20 70 61 67 65 20 69 6e 20 69 74 73 20 6c 69  t page in its li
16570 6e 6b 65 64 20 6c 69 73 74 2c 20 2a 70 50 67 6e  nked list, *pPgn
16580 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f 20  oNext is set to 
16590 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  zero. .**.** If 
165a0 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55  ppPage is not NU
165b0 4c 4c 2c 20 2a 70 70 50 61 67 65 20 69 73 20 73  LL, *ppPage is s
165c0 65 74 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67  et to the MemPag
165d0 65 2a 20 68 61 6e 64 6c 65 0a 2a 2a 20 66 6f 72  e* handle.** for
165e0 20 70 61 67 65 20 6f 76 66 6c 2e 20 54 68 65 20   page ovfl. The 
165f0 75 6e 64 65 72 6c 79 69 6e 67 20 70 61 67 65 72  underlying pager
16600 20 70 61 67 65 20 6d 61 79 20 68 61 76 65 20 62   page may have b
16610 65 65 6e 20 72 65 71 75 65 73 74 65 64 0a 2a 2a  een requested.**
16620 20 77 69 74 68 20 74 68 65 20 6e 6f 43 6f 6e 74   with the noCont
16630 65 6e 74 20 66 6c 61 67 20 73 65 74 2c 20 73 6f  ent flag set, so
16640 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20 61   the page data a
16650 63 63 65 73 73 61 62 6c 65 20 76 69 61 0a 2a 2a  ccessable via.**
16660 20 74 68 69 73 20 68 61 6e 64 6c 65 20 6d 61 79   this handle may
16670 20 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e   not be trusted.
16680 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67  .*/.static int g
16690 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 0a  etOverflowPage(.
166a0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
166b0 20 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 2c 20 20   .  Pgno ovfl,  
166c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166d0 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67   /* Overflow pag
166e0 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  e */.  MemPage *
166f0 2a 70 70 50 61 67 65 2c 20 20 20 20 20 20 20 20  *ppPage,        
16700 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50      /* OUT: MemP
16710 61 67 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  age handle */.  
16720 50 67 6e 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 20  Pgno *pPgnoNext 
16730 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16740 4f 55 54 3a 20 4e 65 78 74 20 6f 76 65 72 66 6c  OUT: Next overfl
16750 6f 77 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a  ow page number *
16760 2f 0a 29 7b 0a 20 20 50 67 6e 6f 20 6e 65 78 74  /.){.  Pgno next
16770 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
16780 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
16790 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
167a0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 2f  t->mutex) );.  /
167b0 2a 20 4f 6e 65 20 6f 66 20 74 68 65 73 65 20 6d  * One of these m
167c0 75 73 74 20 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e  ust not be NULL.
167d0 20 4f 74 68 65 72 77 69 73 65 2c 20 77 68 79 20   Otherwise, why 
167e0 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
167f0 6f 6e 3f 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  on? */.  assert(
16800 70 70 50 61 67 65 20 7c 7c 20 70 50 67 6e 6f 4e  ppPage || pPgnoN
16810 65 78 74 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  ext);..  /* If p
16820 50 67 6e 6f 4e 65 78 74 20 69 73 20 4e 55 4c 4c  PgnoNext is NULL
16830 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
16840 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 61  tion is being ca
16850 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 0a 20  lled to obtain. 
16860 20 2a 2a 20 61 20 4d 65 6d 50 61 67 65 2a 20 72   ** a MemPage* r
16870 65 66 65 72 65 6e 63 65 20 6f 6e 6c 79 2e 20 4e  eference only. N
16880 6f 20 70 61 67 65 2d 64 61 74 61 20 69 73 20 72  o page-data is r
16890 65 71 75 69 72 65 64 20 69 6e 20 74 68 69 73 20  equired in this 
168a0 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  case..  */.  if(
168b0 20 21 70 50 67 6e 6f 4e 65 78 74 20 29 7b 0a 20   !pPgnoNext ){. 
168c0 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
168d0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
168e0 74 2c 20 6f 76 66 6c 2c 20 70 70 50 61 67 65 2c  t, ovfl, ppPage,
168f0 20 31 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65   1);.  }..#ifnde
16900 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
16910 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72  TOVACUUM.  /* Tr
16920 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65  y to find the ne
16930 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
16940 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69  verflow list usi
16950 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f  ng the.  ** auto
16960 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d  vacuum pointer-m
16970 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20  ap pages. Guess 
16980 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61  that the next pa
16990 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20  ge in .  ** the 
169a0 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73  overflow list is
169b0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76   page number (ov
169c0 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67  fl+1). If that g
169d0 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a  uess turns .  **
169e0 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67   out to be wrong
169f0 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c  , fall back to l
16a00 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  oading the data 
16a10 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75  of page .  ** nu
16a20 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74  mber ovfl to det
16a30 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20  ermine the next 
16a40 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a  page number..  *
16a50 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  /.  if( pBt->aut
16a60 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  oVacuum ){.    P
16a70 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67  gno pgno;.    Pg
16a80 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c  no iGuess = ovfl
16a90 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65  +1;.    u8 eType
16aa0 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54  ;..    while( PT
16ab0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
16ac0 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65   iGuess) || iGue
16ad0 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ss==PENDING_BYTE
16ae0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
16af0 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20      iGuess++;.  
16b00 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75    }..    if( iGu
16b10 65 73 73 3c 3d 70 61 67 65 72 50 61 67 65 63 6f  ess<=pagerPageco
16b20 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
16b30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
16b40 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 69 47  trmapGet(pBt, iG
16b50 75 65 73 73 2c 20 26 65 54 79 70 65 2c 20 26 70  uess, &eType, &p
16b60 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
16b70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16b80 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
16b90 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
16ba0 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
16bb0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20 26 26  MAP_OVERFLOW2 &&
16bc0 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20   pgno==ovfl ){. 
16bd0 20 20 20 20 20 20 20 6e 65 78 74 20 3d 20 69 47         next = iG
16be0 75 65 73 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20  uess;.      }.  
16bf0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a    }.  }.#endif..
16c00 20 20 69 66 28 20 6e 65 78 74 3d 3d 30 20 7c 7c    if( next==0 ||
16c10 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 4d   ppPage ){.    M
16c20 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
16c30 30 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  0;..    rc = sql
16c40 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
16c50 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61  (pBt, ovfl, &pPa
16c60 67 65 2c 20 6e 65 78 74 21 3d 30 29 3b 0a 20 20  ge, next!=0);.  
16c70 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51 4c    assert(rc==SQL
16c80 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 3d  ITE_OK || pPage=
16c90 3d 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78  =0);.    if( nex
16ca0 74 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49  t==0 && rc==SQLI
16cb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6e  TE_OK ){.      n
16cc0 65 78 74 20 3d 20 67 65 74 34 62 79 74 65 28 70  ext = get4byte(p
16cd0 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
16ce0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 70 50    }..    if( ppP
16cf0 61 67 65 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  age ){.      *pp
16d00 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20  Page = pPage;.  
16d10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
16d20 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
16d30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  );.    }.  }.  *
16d40 70 50 67 6e 6f 4e 65 78 74 20 3d 20 6e 65 78 74  pPgnoNext = next
16d50 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
16d60 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61  }../*.** Copy da
16d70 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72  ta from a buffer
16d80 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66   to a page, or f
16d90 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20  rom a page to a 
16da0 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50  buffer..**.** pP
16db0 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e  ayload is a poin
16dc0 74 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72  ter to data stor
16dd0 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70  ed on database p
16de0 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20  age pDbPage..** 
16df0 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20  If argument eOp 
16e00 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e  is false, then n
16e10 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61  Byte bytes of da
16e20 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a  ta are copied.**
16e30 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74   from pPayload t
16e40 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  o the buffer poi
16e50 6e 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e  nted at by pBuf.
16e60 20 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c   If eOp is true,
16e70 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33  .** then sqlite3
16e80 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20  PagerWrite() is 
16e90 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67  called on pDbPag
16ea0 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65  e and nByte byte
16eb0 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65  s.** of data are
16ec0 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65   copied from the
16ed0 20 62 75 66 66 65 72 20 70 42 75 66 20 74 6f 20   buffer pBuf to 
16ee0 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20  pPayload..**.** 
16ef0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
16f00 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
16f10 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65  , otherwise an e
16f20 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  rror code..*/.st
16f30 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79  atic int copyPay
16f40 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50  load(.  void *pP
16f50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20  ayload,         
16f60 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
16f70 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76  page data */.  v
16f80 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20  oid *pBuf,      
16f90 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
16fa0 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f  ter to buffer */
16fb0 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20  .  int nByte,   
16fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16fd0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
16fe0 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74  to copy */.  int
16ff0 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20   eOp,           
17000 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63         /* 0 -> c
17010 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31  opy from page, 1
17020 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65   -> copy to page
17030 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44   */.  DbPage *pD
17040 62 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20  bPage           
17050 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69  /* Page containi
17060 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29  ng pPayload */.)
17070 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20  {.  if( eOp ){. 
17080 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
17090 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70  from buffer to p
170a0 61 67 65 20 28 61 20 77 72 69 74 65 20 6f 70 65  age (a write ope
170b0 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69  ration) */.    i
170c0 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  nt rc = sqlite3P
170d0 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67  agerWrite(pDbPag
170e0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  e);.    if( rc!=
170f0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17100 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
17110 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70    }.    memcpy(p
17120 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e  Payload, pBuf, n
17130 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Byte);.  }else{.
17140 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61      /* Copy data
17150 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75   from page to bu
17160 66 66 65 72 20 28 61 20 72 65 61 64 20 6f 70 65  ffer (a read ope
17170 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d  ration) */.    m
17180 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61 79  emcpy(pBuf, pPay
17190 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20  load, nByte);.  
171a0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
171b0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
171c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
171d0 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20  used to read or 
171e0 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61  overwrite payloa
171f0 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  d information.**
17200 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74   for the entry t
17210 68 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72  hat the pCur cur
17220 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
17230 74 6f 2e 20 49 66 20 74 68 65 20 65 4f 70 0a 2a  to. If the eOp.*
17240 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  * parameter is 0
17250 2c 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64  , this is a read
17260 20 6f 70 65 72 61 74 69 6f 6e 20 28 64 61 74 61   operation (data
17270 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20   copied into.** 
17280 62 75 66 66 65 72 20 70 42 75 66 29 2e 20 49 66  buffer pBuf). If
17290 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c   it is non-zero,
172a0 20 61 20 77 72 69 74 65 20 28 64 61 74 61 20 63   a write (data c
172b0 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75  opied from.** bu
172c0 66 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a  ffer pBuf)..**.*
172d0 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d  * A total of "am
172e0 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61  t" bytes are rea
172f0 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67  d or written beg
17300 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65  inning at "offse
17310 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72  t"..** Data is r
17320 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74  ead to or from t
17330 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a  he buffer pBuf..
17340 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
17350 6e 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65  ne does not make
17360 20 61 20 64 69 73 74 69 6e 63 74 69 6f 6e 20 62   a distinction b
17370 65 74 77 65 65 6e 20 6b 65 79 20 61 6e 64 20 64  etween key and d
17380 61 74 61 2e 0a 2a 2a 20 49 74 20 6a 75 73 74 20  ata..** It just 
17390 72 65 61 64 73 20 6f 72 20 77 72 69 74 65 73 20  reads or writes 
173a0 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 70  bytes from the p
173b0 61 79 6c 6f 61 64 20 61 72 65 61 2e 20 20 44 61  ayload area.  Da
173c0 74 61 20 6d 69 67 68 74 20 0a 2a 2a 20 61 70 70  ta might .** app
173d0 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ear on the main 
173e0 70 61 67 65 20 6f 72 20 62 65 20 73 63 61 74 74  page or be scatt
173f0 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74  ered out on mult
17400 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 0a 2a  iple overflow .*
17410 2a 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  * pages..**.** I
17420 66 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69  f the BtCursor.i
17430 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
17440 66 6c 61 67 20 69 73 20 73 65 74 2c 20 61 6e 64  flag is set, and
17450 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
17460 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65  cursor entry use
17470 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76  s one or more ov
17480 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68  erflow pages, th
17490 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  is function.** a
174a0 6c 6c 6f 63 61 74 65 73 20 73 70 61 63 65 20 66  llocates space f
174b0 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f  or and lazily po
174c0 70 6c 75 61 74 65 73 20 74 68 65 20 6f 76 65 72  pluates the over
174d0 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 0a  flow page-list .
174e0 2a 2a 20 63 61 63 68 65 20 61 72 72 61 79 20 28  ** cache array (
174f0 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c  BtCursor.aOverfl
17500 6f 77 29 2e 20 53 75 62 73 65 71 75 65 6e 74 20  ow). Subsequent 
17510 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73 0a 2a  calls use this.*
17520 2a 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20  * cache to make 
17530 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73  seeking to the s
17540 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 6d  upplied offset m
17550 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a  ore efficient..*
17560 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65  *.** Once an ove
17570 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
17580 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61  cache has been a
17590 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79  llocated, it may
175a0 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74   be.** invalidat
175b0 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72  ed if some other
175c0 20 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74   cursor writes t
175d0 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  o the same table
175e0 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63  , or if.** the c
175f0 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74  ursor is moved t
17600 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f  o a different ro
17610 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c  w. Additionally,
17620 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a   in auto-vacuum.
17630 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c  ** mode, the fol
17640 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61  lowing events ma
17650 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20  y invalidate an 
17660 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
17670 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20  st cache..**.** 
17680 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74    * An increment
17690 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20  al vacuum,.**   
176a0 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75  * A commit in au
176b0 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22  to_vacuum="full"
176c0 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72   mode,.**   * Cr
176d0 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28  eating a table (
176e0 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69  may require movi
176f0 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  ng an overflow p
17700 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  age)..*/.static 
17710 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61  int accessPayloa
17720 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  d(.  BtCursor *p
17730 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72  Cur,      /* Cur
17740 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  sor pointing to 
17750 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72  entry to read fr
17760 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73  om */.  int offs
17770 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  et,          /* 
17780 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68  Begin reading th
17790 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c  is far into payl
177a0 6f 61 64 20 2a 2f 0a 20 20 69 6e 74 20 61 6d 74  oad */.  int amt
177b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
177c0 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20   Read this many 
177d0 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67  bytes */.  unsig
177e0 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20  ned char *pBuf, 
177f0 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74  /* Write the byt
17800 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66  es into this buf
17810 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 73 6b  fer */ .  int sk
17820 69 70 4b 65 79 2c 20 20 20 20 20 20 20 20 20 2f  ipKey,         /
17830 2a 20 6f 66 66 73 65 74 20 62 65 67 69 6e 73 20  * offset begins 
17840 61 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20  at data if this 
17850 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74  is true */.  int
17860 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20   eOp            
17870 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61    /* zero to rea
17880 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77  d. non-zero to w
17890 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e  rite. */.){.  un
178a0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
178b0 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20  yload;.  int rc 
178c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
178d0 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69  32 nKey;.  int i
178e0 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61  Idx = 0;.  MemPa
178f0 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
17900 2d 3e 70 50 61 67 65 3b 20 20 20 20 20 2f 2a 20  ->pPage;     /* 
17910 42 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75  Btree page of cu
17920 72 72 65 6e 74 20 63 75 72 73 6f 72 20 65 6e 74  rrent cursor ent
17930 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ry */.  BtShared
17940 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20   *pBt;          
17950 20 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65           /* Btre
17960 65 20 74 68 69 73 20 63 75 72 73 6f 72 20 62 65  e this cursor be
17970 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61  longs to */..  a
17980 73 73 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a  ssert( pPage );.
17990 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
179a0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
179b0 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
179c0 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26  ( pCur->idx>=0 &
179d0 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67  & pCur->idx<pPag
179e0 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
179f0 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 30 20  sert( offset>=0 
17a00 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
17a10 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
17a20 75 72 29 20 29 3b 0a 0a 20 20 67 65 74 43 65 6c  ur) );..  getCel
17a30 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61  lInfo(pCur);.  a
17a40 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e  Payload = pCur->
17a50 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70 43 75  info.pCell + pCu
17a60 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b  r->info.nHeader;
17a70 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50 61 67 65  .  nKey = (pPage
17a80 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20 3a 20 70  ->intKey ? 0 : p
17a90 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b  Cur->info.nKey);
17aa0 0a 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20  ..  if( skipKey 
17ab0 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2b 3d  ){.    offset +=
17ac0 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66 28   nKey;.  }.  if(
17ad0 20 6f 66 66 73 65 74 2b 61 6d 74 20 3e 20 6e 4b   offset+amt > nK
17ae0 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44  ey+pCur->info.nD
17af0 61 74 61 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72  ata ){.    /* Tr
17b00 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72 20  ying to read or 
17b10 77 72 69 74 65 20 70 61 73 74 20 74 68 65 20 65  write past the e
17b20 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 20 69  nd of the data i
17b30 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  s an error */.  
17b40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17b50 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ERROR;.  }..  /*
17b60 20 43 68 65 63 6b 20 69 66 20 64 61 74 61 20 6d   Check if data m
17b70 75 73 74 20 62 65 20 72 65 61 64 2f 77 72 69 74  ust be read/writ
17b80 74 65 6e 20 74 6f 2f 66 72 6f 6d 20 74 68 65 20  ten to/from the 
17b90 62 74 72 65 65 20 70 61 67 65 20 69 74 73 65 6c  btree page itsel
17ba0 66 2e 20 2a 2f 0a 20 20 69 66 28 20 6f 66 66 73  f. */.  if( offs
17bb0 65 74 3c 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et<pCur->info.nL
17bc0 6f 63 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  ocal ){.    int 
17bd0 61 20 3d 20 61 6d 74 3b 0a 20 20 20 20 69 66 28  a = amt;.    if(
17be0 20 61 2b 6f 66 66 73 65 74 3e 70 43 75 72 2d 3e   a+offset>pCur->
17bf0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
17c00 20 20 20 20 20 61 20 3d 20 70 43 75 72 2d 3e 69       a = pCur->i
17c10 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66  nfo.nLocal - off
17c20 73 65 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  set;.    }.    r
17c30 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64 28  c = copyPayload(
17c40 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74  &aPayload[offset
17c50 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c  ], pBuf, a, eOp,
17c60 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29   pPage->pDbPage)
17c70 3b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30  ;.    offset = 0
17c80 3b 0a 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b  ;.    pBuf += a;
17c90 0a 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20  .    amt -= a;. 
17ca0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 66 66 73   }else{.    offs
17cb0 65 74 20 2d 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  et -= pCur->info
17cc0 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20  .nLocal;.  }..  
17cd0 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b  pBt = pCur->pBt;
17ce0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
17cf0 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b  E_OK && amt>0 ){
17d00 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 6f  .    const int o
17d10 76 66 6c 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  vflSize = pBt->u
17d20 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 20 20  sableSize - 4;  
17d30 2f 2a 20 42 79 74 65 73 20 63 6f 6e 74 65 6e 74  /* Bytes content
17d40 20 70 65 72 20 6f 76 66 6c 20 70 61 67 65 20 2a   per ovfl page *
17d50 2f 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 50  /.    Pgno nextP
17d60 61 67 65 3b 0a 0a 20 20 20 20 6e 65 78 74 50 61  age;..    nextPa
17d70 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  ge = get4byte(&a
17d80 50 61 79 6c 6f 61 64 5b 70 43 75 72 2d 3e 69 6e  Payload[pCur->in
17d90 66 6f 2e 6e 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69  fo.nLocal]);..#i
17da0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17db0 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 2f  T_INCRBLOB.    /
17dc0 2a 20 49 66 20 74 68 65 20 69 73 49 6e 63 72 62  * If the isIncrb
17dd0 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69  lobHandle flag i
17de0 73 20 73 65 74 20 61 6e 64 20 74 68 65 20 42 74  s set and the Bt
17df0 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77  Cursor.aOverflow
17e00 5b 5d 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e 6f  [].    ** has no
17e10 74 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  t been allocated
17e20 2c 20 61 6c 6c 6f 63 61 74 65 20 69 74 20 6e 6f  , allocate it no
17e30 77 2e 20 54 68 65 20 61 72 72 61 79 20 69 73 20  w. The array is 
17e40 73 69 7a 65 64 20 61 74 0a 20 20 20 20 2a 2a 20  sized at.    ** 
17e50 6f 6e 65 20 65 6e 74 72 79 20 66 6f 72 20 65 61  one entry for ea
17e60 63 68 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ch overflow page
17e70 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   in the overflow
17e80 20 63 68 61 69 6e 2e 20 54 68 65 0a 20 20 20 20   chain. The.    
17e90 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ** page number o
17ea0 66 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  f the first over
17eb0 66 6c 6f 77 20 70 61 67 65 20 69 73 20 73 74 6f  flow page is sto
17ec0 72 65 64 20 69 6e 20 61 4f 76 65 72 66 6c 6f 77  red in aOverflow
17ed0 5b 30 5d 2c 0a 20 20 20 20 2a 2a 20 65 74 63 2e  [0],.    ** etc.
17ee0 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 69 6e   A value of 0 in
17ef0 20 74 68 65 20 61 4f 76 65 72 66 6c 6f 77 5b 5d   the aOverflow[]
17f00 20 61 72 72 61 79 20 6d 65 61 6e 73 20 22 6e 6f   array means "no
17f10 74 20 79 65 74 20 6b 6e 6f 77 6e 22 0a 20 20 20  t yet known".   
17f20 20 2a 2a 20 28 74 68 65 20 63 61 63 68 65 20 69   ** (the cache i
17f30 73 20 6c 61 7a 69 6c 79 20 70 6f 70 75 6c 61 74  s lazily populat
17f40 65 64 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ed)..    */.    
17f50 69 66 28 20 70 43 75 72 2d 3e 69 73 49 6e 63 72  if( pCur->isIncr
17f60 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 21 70  blobHandle && !p
17f70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29  Cur->aOverflow )
17f80 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 76 66  {.      int nOvf
17f90 6c 20 3d 20 28 70 43 75 72 2d 3e 69 6e 66 6f 2e  l = (pCur->info.
17fa0 6e 50 61 79 6c 6f 61 64 2d 70 43 75 72 2d 3e 69  nPayload-pCur->i
17fb0 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53  nfo.nLocal+ovflS
17fc0 69 7a 65 2d 31 29 2f 6f 76 66 6c 53 69 7a 65 3b  ize-1)/ovflSize;
17fd0 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76  .      pCur->aOv
17fe0 65 72 66 6c 6f 77 20 3d 20 28 50 67 6e 6f 20 2a  erflow = (Pgno *
17ff0 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
18000 72 6f 28 73 69 7a 65 6f 66 28 50 67 6e 6f 29 2a  ro(sizeof(Pgno)*
18010 6e 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 69 66  nOvfl);.      if
18020 28 20 6e 4f 76 66 6c 20 26 26 20 21 70 43 75 72  ( nOvfl && !pCur
18030 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->aOverflow ){. 
18040 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
18050 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
18060 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
18070 49 66 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  If the overflow 
18080 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
18090 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74  has been allocat
180a0 65 64 20 61 6e 64 20 74 68 65 0a 20 20 20 20 2a  ed and the.    *
180b0 2a 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  * entry for the 
180c0 66 69 72 73 74 20 72 65 71 75 69 72 65 64 20 6f  first required o
180d0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
180e0 76 61 6c 69 64 2c 20 73 6b 69 70 0a 20 20 20 20  valid, skip.    
180f0 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 69  ** directly to i
18100 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
18110 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  ( pCur->aOverflo
18120 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72  w && pCur->aOver
18130 66 6c 6f 77 5b 6f 66 66 73 65 74 2f 6f 76 66 6c  flow[offset/ovfl
18140 53 69 7a 65 5d 20 29 7b 0a 20 20 20 20 20 20 69  Size] ){.      i
18150 49 64 78 20 3d 20 28 6f 66 66 73 65 74 2f 6f 76  Idx = (offset/ov
18160 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 6e  flSize);.      n
18170 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d 3e  extPage = pCur->
18180 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3b  aOverflow[iIdx];
18190 0a 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20  .      offset = 
181a0 28 6f 66 66 73 65 74 25 6f 76 66 6c 53 69 7a 65  (offset%ovflSize
181b0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
181c0 0a 20 20 20 20 66 6f 72 28 20 3b 20 72 63 3d 3d  .    for( ; rc==
181d0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
181e0 3e 30 20 26 26 20 6e 65 78 74 50 61 67 65 3b 20  >0 && nextPage; 
181f0 69 49 64 78 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65  iIdx++){..#ifnde
18200 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
18210 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 2f 2a 20  CRBLOB.      /* 
18220 49 66 20 72 65 71 75 69 72 65 64 2c 20 70 6f 70  If required, pop
18230 75 6c 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c  ulate the overfl
18240 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ow page-list cac
18250 68 65 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  he. */.      if(
18260 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
18270 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
18280 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65 72 66  rt(!pCur->aOverf
18290 6c 6f 77 5b 69 49 64 78 5d 20 7c 7c 20 70 43 75  low[iIdx] || pCu
182a0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
182b0 78 5d 3d 3d 6e 65 78 74 50 61 67 65 29 3b 0a 20  x]==nextPage);. 
182c0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 61 4f 76         pCur->aOv
182d0 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 3d 20 6e  erflow[iIdx] = n
182e0 65 78 74 50 61 67 65 3b 0a 20 20 20 20 20 20 7d  extPage;.      }
182f0 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20 69  .#endif..      i
18300 66 28 20 6f 66 66 73 65 74 3e 3d 6f 76 66 6c 53  f( offset>=ovflS
18310 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ize ){.        /
18320 2a 20 54 68 65 20 6f 6e 6c 79 20 72 65 61 73 6f  * The only reaso
18330 6e 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70  n to read this p
18340 61 67 65 20 69 73 20 74 6f 20 6f 62 74 61 69 6e  age is to obtain
18350 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   the page.      
18360 20 20 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20    ** number for 
18370 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e  the next page in
18380 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68   the overflow ch
18390 61 69 6e 2e 20 54 68 65 20 70 61 67 65 0a 20 20  ain. The page.  
183a0 20 20 20 20 20 20 2a 2a 20 64 61 74 61 20 69 73        ** data is
183b0 20 6e 6f 74 20 72 65 71 75 69 72 65 64 2e 20 53   not required. S
183c0 6f 20 66 69 72 73 74 20 74 72 79 20 74 6f 20 6c  o first try to l
183d0 6f 6f 6b 75 70 20 74 68 65 20 6f 76 65 72 66 6c  ookup the overfl
183e0 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ow.        ** pa
183f0 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2c 20 69  ge-list cache, i
18400 66 20 61 6e 79 2c 20 74 68 65 6e 20 66 61 6c 6c  f any, then fall
18410 20 62 61 63 6b 20 74 6f 20 74 68 65 20 67 65 74   back to the get
18420 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 29 0a 20  OverflowPage(). 
18430 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
18440 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23  on..        */.#
18450 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18460 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20  IT_INCRBLOB.    
18470 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
18480 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d  verflow && pCur-
18490 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b  >aOverflow[iIdx+
184a0 31 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  1] ){.          
184b0 6e 65 78 74 50 61 67 65 20 3d 20 70 43 75 72 2d  nextPage = pCur-
184c0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 2b  >aOverflow[iIdx+
184d0 31 5d 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  1];.        } el
184e0 73 65 20 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  se .#endif.     
184f0 20 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76 65       rc = getOve
18500 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20 6e  rflowPage(pBt, n
18510 65 78 74 50 61 67 65 2c 20 30 2c 20 26 6e 65 78  extPage, 0, &nex
18520 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  tPage);.        
18530 6f 66 66 73 65 74 20 2d 3d 20 6f 76 66 6c 53 69  offset -= ovflSi
18540 7a 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ze;.      }else{
18550 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 65 64  .        /* Need
18560 20 74 6f 20 72 65 61 64 20 74 68 69 73 20 70 61   to read this pa
18570 67 65 20 70 72 6f 70 65 72 6c 79 2e 20 49 74 20  ge properly. It 
18580 63 6f 6e 74 61 69 6e 73 20 73 6f 6d 65 20 6f 66  contains some of
18590 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
185a0 72 61 6e 67 65 20 6f 66 20 64 61 74 61 20 74 68  range of data th
185b0 61 74 20 69 73 20 62 65 69 6e 67 20 72 65 61 64  at is being read
185c0 20 28 65 4f 70 3d 3d 30 29 20 6f 72 20 77 72 69   (eOp==0) or wri
185d0 74 74 65 6e 20 28 65 4f 70 21 3d 30 29 2e 0a 20  tten (eOp!=0).. 
185e0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
185f0 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
18600 65 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  e;.        int a
18610 20 3d 20 61 6d 74 3b 0a 20 20 20 20 20 20 20 20   = amt;.        
18620 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
18630 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
18640 2c 20 6e 65 78 74 50 61 67 65 2c 20 26 70 44 62  , nextPage, &pDb
18650 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
18660 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
18670 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 50   ){.          aP
18680 61 79 6c 6f 61 64 20 3d 20 73 71 6c 69 74 65 33  ayload = sqlite3
18690 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
186a0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
186b0 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
186c0 62 79 74 65 28 61 50 61 79 6c 6f 61 64 29 3b 0a  byte(aPayload);.
186d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 20            if( a 
186e0 2b 20 6f 66 66 73 65 74 20 3e 20 6f 76 66 6c 53  + offset > ovflS
186f0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
18700 20 20 20 61 20 3d 20 6f 76 66 6c 53 69 7a 65 20     a = ovflSize 
18710 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20 20 20 20  - offset;.      
18720 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
18730 72 63 20 3d 20 63 6f 70 79 50 61 79 6c 6f 61 64  rc = copyPayload
18740 28 26 61 50 61 79 6c 6f 61 64 5b 6f 66 66 73 65  (&aPayload[offse
18750 74 2b 34 5d 2c 20 70 42 75 66 2c 20 61 2c 20 65  t+4], pBuf, a, e
18760 4f 70 2c 20 70 44 62 50 61 67 65 29 3b 0a 20 20  Op, pDbPage);.  
18770 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
18780 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
18790 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 66  e);.          of
187a0 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  fset = 0;.      
187b0 20 20 20 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20      amt -= a;.  
187c0 20 20 20 20 20 20 20 20 70 42 75 66 20 2b 3d 20          pBuf += 
187d0 61 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  a;.        }.   
187e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
187f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18800 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a  _OK && amt>0 ){.
18810 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18820 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
18830 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
18840 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
18850 61 72 74 20 6f 66 20 74 68 65 20 6b 65 79 20 61  art of the key a
18860 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63  ssociated with c
18870 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61  ursor pCur.  Exa
18880 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79  ctly.** "amt" by
18890 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  tes will be tran
188a0 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66  sfered into pBuf
188b0 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65  [].  The transfe
188c0 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22  r.** begins at "
188d0 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52  offset"..**.** R
188e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
188f0 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
18900 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
18910 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20  nything goes.** 
18920 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72  wrong.  An error
18930 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
18940 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20  "offset+amt" is 
18950 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74  larger than.** t
18960 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79  he available pay
18970 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  load..*/.int sql
18980 69 74 65 33 42 74 72 65 65 4b 65 79 28 42 74 43  ite3BtreeKey(BtC
18990 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
189a0 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
189b0 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
189c0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
189d0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
189e0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
189f0 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c  rc = restoreOrCl
18a00 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
18a10 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
18a20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18a30 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
18a40 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
18a50 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73  _VALID );.    as
18a60 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
18a70 65 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  e!=0 );.    if( 
18a80 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74  pCur->pPage->int
18a90 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74  Key ){.      ret
18aa0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
18ab0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
18ac0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
18ad0 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d  >pPage->intKey==
18ae0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
18af0 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26   pCur->idx>=0 &&
18b00 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d   pCur->idx<pCur-
18b10 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  >pPage->nCell );
18b20 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73  .    rc = access
18b30 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66  Payload(pCur, of
18b40 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e 73 69  fset, amt, (unsi
18b50 67 6e 65 64 20 63 68 61 72 2a 29 70 42 75 66 2c  gned char*)pBuf,
18b60 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65   0, 0);.  }.  re
18b70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18b80 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74  * Read part of t
18b90 68 65 20 64 61 74 61 20 61 73 73 6f 63 69 61 74  he data associat
18ba0 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70  ed with cursor p
18bb0 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a  Cur.  Exactly.**
18bc0 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c   "amt" bytes wil
18bd0 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20  l be transfered 
18be0 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68  into pBuf[].  Th
18bf0 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65  e transfer.** be
18c00 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22  gins at "offset"
18c10 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
18c20 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
18c30 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
18c40 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
18c50 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20   goes.** wrong. 
18c60 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   An error is ret
18c70 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74  urned if "offset
18c80 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20  +amt" is larger 
18c90 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69  than.** the avai
18ca0 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a  lable payload..*
18cb0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
18cc0 65 65 44 61 74 61 28 42 74 43 75 72 73 6f 72 20  eeData(BtCursor 
18cd0 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65  *pCur, u32 offse
18ce0 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64  t, u32 amt, void
18cf0 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72   *pBuf){.  int r
18d00 63 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  c;..#ifndef SQLI
18d10 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
18d20 0a 20 20 69 66 20 28 20 70 43 75 72 2d 3e 65 53  .  if ( pCur->eS
18d30 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
18d40 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75  ALID ){.    retu
18d50 72 6e 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b  rn SQLITE_ABORT;
18d60 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 61  .  }.#endif..  a
18d70 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
18d80 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
18d90 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f  .  rc = restoreO
18da0 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
18db0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
18dc0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18dd0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
18de0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
18df0 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20  SOR_VALID );.   
18e00 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
18e10 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 20 20 61  Page!=0 );.    a
18e20 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78  ssert( pCur->idx
18e30 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78  >=0 && pCur->idx
18e40 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43  <pCur->pPage->nC
18e50 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ell );.    rc = 
18e60 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
18e70 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
18e80 20 70 42 75 66 2c 20 31 2c 20 30 29 3b 0a 20 20   pBuf, 1, 0);.  
18e90 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
18ea0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
18eb0 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 79 6c   pointer to payl
18ec0 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  oad information 
18ed0 66 72 6f 6d 20 74 68 65 20 65 6e 74 72 79 20 74  from the entry t
18ee0 68 61 74 20 74 68 65 20 0a 2a 2a 20 70 43 75 72  hat the .** pCur
18ef0 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
18f00 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 70 6f 69  ing to.  The poi
18f10 6e 74 65 72 20 69 73 20 74 6f 20 74 68 65 20 62  nter is to the b
18f20 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74  eginning of.** t
18f30 68 65 20 6b 65 79 20 69 66 20 73 6b 69 70 4b 65  he key if skipKe
18f40 79 3d 3d 30 20 61 6e 64 20 69 74 20 70 6f 69 6e  y==0 and it poin
18f50 74 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  ts to the beginn
18f60 69 6e 67 20 6f 66 20 64 61 74 61 20 69 66 0a 2a  ing of data if.*
18f70 2a 20 73 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54  * skipKey==1.  T
18f80 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
18f90 65 73 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  es of available 
18fa0 6b 65 79 2f 64 61 74 61 20 69 73 20 77 72 69 74  key/data is writ
18fb0 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d  ten.** into *pAm
18fc0 74 2e 20 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c  t.  If *pAmt==0,
18fd0 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
18fe0 72 65 74 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f  returned will no
18ff0 74 20 62 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20  t be.** a valid 
19000 70 6f 69 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  pointer..**.** T
19010 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61  his routine is a
19020 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
19030 20 49 74 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f   It is common fo
19040 72 20 74 68 65 20 65 6e 74 69 72 65 20 6b 65 79  r the entire key
19050 0a 2a 2a 20 61 6e 64 20 64 61 74 61 20 74 6f 20  .** and data to 
19060 66 69 74 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c  fit on the local
19070 20 70 61 67 65 20 61 6e 64 20 66 6f 72 20 74 68   page and for th
19080 65 72 65 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65  ere to be no ove
19090 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20  rflow.** pages. 
190a0 20 57 68 65 6e 20 74 68 61 74 20 69 73 20 73 6f   When that is so
190b0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63  , this routine c
190c0 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 61 63  an be used to ac
190d0 63 65 73 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20  cess the.** key 
190e0 61 6e 64 20 64 61 74 61 20 77 69 74 68 6f 75 74  and data without
190f0 20 6d 61 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20   making a copy. 
19100 20 49 66 20 74 68 65 20 6b 65 79 20 61 6e 64 2f   If the key and/
19110 6f 72 20 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a  or data spills.*
19120 2a 20 6f 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20  * onto overflow 
19130 70 61 67 65 73 2c 20 74 68 65 6e 20 61 63 63 65  pages, then acce
19140 73 73 50 61 79 6c 6f 61 64 28 29 20 6d 75 73 74  ssPayload() must
19150 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 61 73   be used to reas
19160 73 65 6d 62 6c 79 0a 2a 2a 20 74 68 65 20 6b 65  sembly.** the ke
19170 79 2f 64 61 74 61 20 61 6e 64 20 63 6f 70 79 20  y/data and copy 
19180 69 74 20 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c  it into a preall
19190 6f 63 61 74 65 64 20 62 75 66 66 65 72 2e 0a 2a  ocated buffer..*
191a0 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
191b0 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 69   returned by thi
191c0 73 20 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20  s routine looks 
191d0 64 69 72 65 63 74 6c 79 20 69 6e 74 6f 20 74 68  directly into th
191e0 65 20 63 61 63 68 65 64 0a 2a 2a 20 70 61 67 65  e cached.** page
191f0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
19200 2e 20 20 54 68 65 20 64 61 74 61 20 6d 69 67 68  .  The data migh
19210 74 20 63 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65  t change or move
19220 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a   the next time.*
19230 2a 20 61 6e 79 20 62 74 72 65 65 20 72 6f 75 74  * any btree rout
19240 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  ine is called..*
19250 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75  /.static const u
19260 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 66 65  nsigned char *fe
19270 74 63 68 50 61 79 6c 6f 61 64 28 0a 20 20 42 74  tchPayload(.  Bt
19280 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
19290 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69     /* Cursor poi
192a0 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74  nting to entry t
192b0 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20  o read from */. 
192c0 20 69 6e 74 20 2a 70 41 6d 74 2c 20 20 20 20 20   int *pAmt,     
192d0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
192e0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61  he number of ava
192f0 69 6c 61 62 6c 65 20 62 79 74 65 73 20 68 65 72  ilable bytes her
19300 65 20 2a 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b  e */.  int skipK
19310 65 79 20 20 20 20 20 20 20 20 20 20 2f 2a 20 72  ey          /* r
19320 65 61 64 20 62 65 67 69 6e 6e 69 6e 67 20 61 74  ead beginning at
19330 20 64 61 74 61 20 69 66 20 74 68 69 73 20 69 73   data if this is
19340 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e   true */.){.  un
19350 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61  signed char *aPa
19360 79 6c 6f 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65  yload;.  MemPage
19370 20 2a 70 50 61 67 65 3b 0a 20 20 75 33 32 20 6e   *pPage;.  u32 n
19380 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4c 6f 63 61  Key;.  int nLoca
19390 6c 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  l;..  assert( pC
193a0 75 72 21 3d 30 20 26 26 20 70 43 75 72 2d 3e 70  ur!=0 && pCur->p
193b0 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  Page!=0 );.  ass
193c0 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
193d0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
193e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
193f0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
19400 75 72 29 20 29 3b 0a 20 20 70 50 61 67 65 20 3d  ur) );.  pPage =
19410 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
19420 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64  assert( pCur->id
19430 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64  x>=0 && pCur->id
19440 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x<pPage->nCell )
19450 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  ;.  getCellInfo(
19460 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61  pCur);.  aPayloa
19470 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70  d = pCur->info.p
19480 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f 61 64  Cell;.  aPayload
19490 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e   += pCur->info.n
194a0 48 65 61 64 65 72 3b 0a 20 20 69 66 28 20 70 50  Header;.  if( pP
194b0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
194c0 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d     nKey = 0;.  }
194d0 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79 20 3d  else{.    nKey =
194e0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
194f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 6b 69 70  ;.  }.  if( skip
19500 4b 65 79 20 29 7b 0a 20 20 20 20 61 50 61 79 6c  Key ){.    aPayl
19510 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20  oad += nKey;.   
19520 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e   nLocal = pCur->
19530 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b  info.nLocal - nK
19540 65 79 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ey;.  }else{.   
19550 20 6e 4c 6f 63 61 6c 20 3d 20 70 43 75 72 2d 3e   nLocal = pCur->
19560 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20  info.nLocal;.   
19570 20 69 66 28 20 6e 4c 6f 63 61 6c 3e 6e 4b 65 79   if( nLocal>nKey
19580 20 29 7b 0a 20 20 20 20 20 20 6e 4c 6f 63 61 6c   ){.      nLocal
19590 20 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20   = nKey;.    }. 
195a0 20 7d 0a 20 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f   }.  *pAmt = nLo
195b0 63 61 6c 3b 0a 20 20 72 65 74 75 72 6e 20 61 50  cal;.  return aP
195c0 61 79 6c 6f 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ayload;.}.../*.*
195d0 2a 20 46 6f 72 20 74 68 65 20 65 6e 74 72 79 20  * For the entry 
195e0 74 68 61 74 20 63 75 72 73 6f 72 20 70 43 75 72  that cursor pCur
195f0 20 69 73 20 70 6f 69 6e 74 20 74 6f 2c 20 72 65   is point to, re
19600 74 75 72 6e 20 61 73 0a 2a 2a 20 6d 61 6e 79 20  turn as.** many 
19610 62 79 74 65 73 20 6f 66 20 74 68 65 20 6b 65 79  bytes of the key
19620 20 6f 72 20 64 61 74 61 20 61 73 20 61 72 65 20   or data as are 
19630 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74 68 65  available on the
19640 20 6c 6f 63 61 6c 0a 2a 2a 20 62 2d 74 72 65 65   local.** b-tree
19650 20 70 61 67 65 2e 20 20 57 72 69 74 65 20 74 68   page.  Write th
19660 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69  e number of avai
19670 6c 61 62 6c 65 20 62 79 74 65 73 20 69 6e 74 6f  lable bytes into
19680 20 2a 70 41 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68   *pAmt..**.** Th
19690 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
196a0 65 64 20 69 73 20 65 70 68 65 6d 65 72 61 6c 2e  ed is ephemeral.
196b0 20 20 54 68 65 20 6b 65 79 2f 64 61 74 61 20 6d    The key/data m
196c0 61 79 20 6d 6f 76 65 0a 2a 2a 20 6f 72 20 62 65  ay move.** or be
196d0 20 64 65 73 74 72 6f 79 65 64 20 6f 6e 20 74 68   destroyed on th
196e0 65 20 6e 65 78 74 20 63 61 6c 6c 20 74 6f 20 61  e next call to a
196f0 6e 79 20 42 74 72 65 65 20 72 6f 75 74 69 6e 65  ny Btree routine
19700 2c 0a 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 63  ,.** including c
19710 61 6c 6c 73 20 66 72 6f 6d 20 6f 74 68 65 72 20  alls from other 
19720 74 68 72 65 61 64 73 20 61 67 61 69 6e 73 74 20  threads against 
19730 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 2e 0a  the same cache..
19740 2a 2a 20 48 65 6e 63 65 2c 20 61 20 6d 75 74 65  ** Hence, a mute
19750 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61 72 65  x on the BtShare
19760 64 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64  d should be held
19770 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
19780 67 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  g.** this routin
19790 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 72  e..**.** These r
197a0 6f 75 74 69 6e 65 73 20 69 73 20 75 73 65 64 20  outines is used 
197b0 74 6f 20 67 65 74 20 71 75 69 63 6b 20 61 63 63  to get quick acc
197c0 65 73 73 20 74 6f 20 6b 65 79 20 61 6e 64 20 64  ess to key and d
197d0 61 74 61 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f  ata.** in the co
197e0 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
197f0 6e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  no overflow page
19800 73 20 61 72 65 20 75 73 65 64 2e 0a 2a 2f 0a 63  s are used..*/.c
19810 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74  onst void *sqlit
19820 65 33 42 74 72 65 65 4b 65 79 46 65 74 63 68 28  e3BtreeKeyFetch(
19830 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
19840 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73  int *pAmt){.  as
19850 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
19860 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
19870 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
19880 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
19890 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
198a0 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66 65 74 63  const void*)fetc
198b0 68 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 70  hPayload(pCur, p
198c0 41 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Amt, 0);.  }.  r
198d0 65 74 75 72 6e 20 30 3b 0a 7d 0a 63 6f 6e 73 74  eturn 0;.}.const
198e0 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74   void *sqlite3Bt
198f0 72 65 65 44 61 74 61 46 65 74 63 68 28 42 74 43  reeDataFetch(BtC
19900 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
19910 20 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73 65 72   *pAmt){.  asser
19920 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
19930 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69  tex(pCur) );.  i
19940 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
19950 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
19960 0a 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e  .    return (con
19970 73 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61  st void*)fetchPa
19980 79 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74  yload(pCur, pAmt
19990 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 1);.  }.  retu
199a0 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn 0;.}.../*.** 
199b0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
199c0 64 6f 77 6e 20 74 6f 20 61 20 6e 65 77 20 63 68  down to a new ch
199d0 69 6c 64 20 70 61 67 65 2e 20 20 54 68 65 20 6e  ild page.  The n
199e0 65 77 50 67 6e 6f 20 61 72 67 75 6d 65 6e 74 20  ewPgno argument 
199f0 69 73 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 6e  is the.** page n
19a00 75 6d 62 65 72 20 6f 66 20 74 68 65 20 63 68 69  umber of the chi
19a10 6c 64 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  ld page to move 
19a20 74 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  to..*/.static in
19a30 74 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 42 74  t moveToChild(Bt
19a40 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33  Cursor *pCur, u3
19a50 32 20 6e 65 77 50 67 6e 6f 29 7b 0a 20 20 69 6e  2 newPgno){.  in
19a60 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20  t rc;.  MemPage 
19a70 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20 4d 65 6d  *pNewPage;.  Mem
19a80 50 61 67 65 20 2a 70 4f 6c 64 50 61 67 65 3b 0a  Page *pOldPage;.
19a90 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
19aa0 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 0a 20 20  = pCur->pBt;..  
19ab0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
19ac0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
19ad0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
19ae0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
19af0 5f 56 41 4c 49 44 20 29 3b 0a 20 20 72 63 20 3d  _VALID );.  rc =
19b00 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28   getAndInitPage(
19b10 70 42 74 2c 20 6e 65 77 50 67 6e 6f 2c 20 26 70  pBt, newPgno, &p
19b20 4e 65 77 50 61 67 65 2c 20 70 43 75 72 2d 3e 70  NewPage, pCur->p
19b30 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
19b40 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70  ) return rc;.  p
19b50 4e 65 77 50 61 67 65 2d 3e 69 64 78 50 61 72 65  NewPage->idxPare
19b60 6e 74 20 3d 20 70 43 75 72 2d 3e 69 64 78 3b 0a  nt = pCur->idx;.
19b70 20 20 70 4f 6c 64 50 61 67 65 20 3d 20 70 43 75    pOldPage = pCu
19b80 72 2d 3e 70 50 61 67 65 3b 0a 20 20 70 4f 6c 64  r->pPage;.  pOld
19b90 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d  Page->idxShift =
19ba0 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67   0;.  releasePag
19bb0 65 28 70 4f 6c 64 50 61 67 65 29 3b 0a 20 20 70  e(pOldPage);.  p
19bc0 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 4e 65  Cur->pPage = pNe
19bd0 77 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 69  wPage;.  pCur->i
19be0 64 78 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  dx = 0;.  pCur->
19bf0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
19c00 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
19c10 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 4e 65  y = 0;.  if( pNe
19c20 77 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 31 20 29  wPage->nCell<1 )
19c30 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
19c40 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
19c50 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
19c60 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
19c70 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
19c80 66 20 74 68 65 20 70 61 67 65 20 69 73 20 74 68  f the page is th
19c90 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 6f  e virtual root o
19ca0 66 20 69 74 73 20 74 61 62 6c 65 2e 0a 2a 2a 0a  f its table..**.
19cb0 2a 2a 20 54 68 65 20 76 69 72 74 75 61 6c 20 72  ** The virtual r
19cc0 6f 6f 74 20 70 61 67 65 20 69 73 20 74 68 65 20  oot page is the 
19cd0 72 6f 6f 74 20 70 61 67 65 20 66 6f 72 20 6d 6f  root page for mo
19ce0 73 74 20 74 61 62 6c 65 73 2e 20 20 42 75 74 0a  st tables.  But.
19cf0 2a 2a 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  ** for the table
19d00 20 72 6f 6f 74 65 64 20 6f 6e 20 70 61 67 65 20   rooted on page 
19d10 31 2c 20 73 6f 6d 65 74 69 6d 65 20 74 68 65 20  1, sometime the 
19d20 72 65 61 6c 20 72 6f 6f 74 20 70 61 67 65 0a 2a  real root page.*
19d30 2a 20 69 73 20 65 6d 70 74 79 20 65 78 63 65 70  * is empty excep
19d40 74 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d  t for the right-
19d50 70 6f 69 6e 74 65 72 2e 20 20 49 6e 20 73 75 63  pointer.  In suc
19d60 68 20 63 61 73 65 73 20 74 68 65 0a 2a 2a 20 76  h cases the.** v
19d70 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
19d80 20 69 73 20 74 68 65 20 70 61 67 65 20 74 68 61   is the page tha
19d90 74 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e  t the right-poin
19da0 74 65 72 20 6f 66 20 70 61 67 65 0a 2a 2a 20 31  ter of page.** 1
19db0 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
19dc0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
19dd0 74 72 65 65 49 73 52 6f 6f 74 50 61 67 65 28 4d  treeIsRootPage(M
19de0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
19df0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
19e00 6e 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  nt;..  assert( s
19e10 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
19e20 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
19e30 74 65 78 29 20 29 3b 0a 20 20 70 50 61 72 65 6e  tex) );.  pParen
19e40 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65  t = pPage->pPare
19e50 6e 74 3b 0a 20 20 69 66 28 20 70 50 61 72 65 6e  nt;.  if( pParen
19e60 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  t==0 ) return 1;
19e70 0a 20 20 69 66 28 20 70 50 61 72 65 6e 74 2d 3e  .  if( pParent->
19e80 70 67 6e 6f 3e 31 20 29 20 72 65 74 75 72 6e 20  pgno>1 ) return 
19e90 30 3b 0a 20 20 69 66 28 20 67 65 74 32 62 79 74  0;.  if( get2byt
19ea0 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
19eb0 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
19ec0 66 73 65 74 2b 33 5d 29 3d 3d 30 20 29 20 72 65  fset+3])==0 ) re
19ed0 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e  turn 1;.  return
19ee0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76   0;.}../*.** Mov
19ef0 65 20 74 68 65 20 63 75 72 73 6f 72 20 75 70 20  e the cursor up 
19f00 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  to the parent pa
19f10 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e  ge..**.** pCur->
19f20 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 74 68  idx is set to th
19f30 65 20 63 65 6c 6c 20 69 6e 64 65 78 20 74 68 61  e cell index tha
19f40 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 70  t contains the p
19f50 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
19f60 20 70 61 67 65 20 77 65 20 61 72 65 20 63 6f 6d   page we are com
19f70 69 6e 67 20 66 72 6f 6d 2e 20 20 49 66 20 77 65  ing from.  If we
19f80 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
19f90 20 74 68 65 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f   the.** right-mo
19fa0 73 74 20 63 68 69 6c 64 20 70 61 67 65 20 74 68  st child page th
19fb0 65 6e 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20  en pCur->idx is 
19fc0 73 65 74 20 74 6f 20 6f 6e 65 20 6d 6f 72 65 20  set to one more 
19fd0 74 68 61 6e 0a 2a 2a 20 74 68 65 20 6c 61 72 67  than.** the larg
19fe0 65 73 74 20 63 65 6c 6c 20 69 6e 64 65 78 2e 0a  est cell index..
19ff0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42  */.void sqlite3B
1a000 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74  treeMoveToParent
1a010 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1a020 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
1a030 72 65 6e 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20  rent;.  MemPage 
1a040 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 69 64  *pPage;.  int id
1a050 78 50 61 72 65 6e 74 3b 0a 0a 20 20 61 73 73 65  xParent;..  asse
1a060 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1a070 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1a080 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1a090 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1a0a0 49 44 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20  ID );.  pPage = 
1a0b0 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61  pCur->pPage;.  a
1a0c0 73 73 65 72 74 28 20 70 50 61 67 65 21 3d 30 20  ssert( pPage!=0 
1a0d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 73 71  );.  assert( !sq
1a0e0 6c 69 74 65 33 42 74 72 65 65 49 73 52 6f 6f 74  lite3BtreeIsRoot
1a0f0 50 61 67 65 28 70 50 61 67 65 29 20 29 3b 0a 20  Page(pPage) );. 
1a100 20 70 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65   pParent = pPage
1a110 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 61 73 73  ->pParent;.  ass
1a120 65 72 74 28 20 70 50 61 72 65 6e 74 21 3d 30 20  ert( pParent!=0 
1a130 29 3b 0a 20 20 69 64 78 50 61 72 65 6e 74 20 3d  );.  idxParent =
1a140 20 70 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e   pPage->idxParen
1a150 74 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  t;.  sqlite3Page
1a160 72 52 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44  rRef(pParent->pD
1a170 62 50 61 67 65 29 3b 0a 20 20 72 65 6c 65 61 73  bPage);.  releas
1a180 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
1a190 70 43 75 72 2d 3e 70 50 61 67 65 20 3d 20 70 50  pCur->pPage = pP
1a1a0 61 72 65 6e 74 3b 0a 20 20 70 43 75 72 2d 3e 69  arent;.  pCur->i
1a1b0 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
1a1c0 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
1a1d0 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
1a1e0 70 50 61 72 65 6e 74 2d 3e 69 64 78 53 68 69 66  pParent->idxShif
1a1f0 74 3d 3d 30 20 29 3b 0a 20 20 70 43 75 72 2d 3e  t==0 );.  pCur->
1a200 69 64 78 20 3d 20 69 64 78 50 61 72 65 6e 74 3b  idx = idxParent;
1a210 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  .}../*.** Move t
1a220 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
1a230 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2f 0a 73 74   root page.*/.st
1a240 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
1a250 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  oot(BtCursor *pC
1a260 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
1a270 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 20  pRoot;.  int rc 
1a280 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42  = SQLITE_OK;.  B
1a290 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e  tree *p = pCur->
1a2a0 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72  pBtree;.  BtShar
1a2b0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
1a2c0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
1a2d0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1a2e0 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
1a2f0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20   CURSOR_INVALID 
1a300 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  < CURSOR_REQUIRE
1a310 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  SEEK );.  assert
1a320 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 20  ( CURSOR_VALID  
1a330 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52   < CURSOR_REQUIR
1a340 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65 72  ESEEK );.  asser
1a350 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  t( CURSOR_FAULT 
1a360 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51 55 49    > CURSOR_REQUI
1a370 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66 28 20  RESEEK );.  if( 
1a380 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55  pCur->eState>=CU
1a390 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
1a3a0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72   ){.    if( pCur
1a3b0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1a3c0 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 20 20  _FAULT ){.      
1a3d0 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69  return pCur->ski
1a3e0 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6c 65  p;.    }.    cle
1a3f0 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
1a400 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20 20 70 52  (pCur);.  }.  pR
1a410 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  oot = pCur->pPag
1a420 65 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74 20 26  e;.  if( pRoot &
1a430 26 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70  & pRoot->pgno==p
1a440 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 7b  Cur->pgnoRoot ){
1a450 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 52 6f  .    assert( pRo
1a460 6f 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ot->isInit );.  
1a470 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 0a  }else{.    if( .
1a480 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21        SQLITE_OK!
1a490 3d 28 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69  =(rc = getAndIni
1a4a0 74 50 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d  tPage(pBt, pCur-
1a4b0 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f  >pgnoRoot, &pRoo
1a4c0 74 2c 20 30 29 29 0a 20 20 20 20 29 7b 0a 20 20  t, 0)).    ){.  
1a4d0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
1a4e0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
1a4f0 44 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  D;.      return 
1a500 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  rc;.    }.    re
1a510 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
1a520 70 50 61 67 65 29 3b 0a 20 20 20 20 70 43 75 72  pPage);.    pCur
1a530 2d 3e 70 50 61 67 65 20 3d 20 70 52 6f 6f 74 3b  ->pPage = pRoot;
1a540 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 69 64 78  .  }.  pCur->idx
1a550 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e   = 0;.  pCur->in
1a560 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1a570 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30  pCur->atLast = 0
1a580 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e  ;.  pCur->validN
1a590 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Key = 0;.  if( p
1a5a0 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26  Root->nCell==0 &
1a5b0 26 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29  & !pRoot->leaf )
1a5c0 7b 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61  {.    Pgno subpa
1a5d0 67 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ge;.    assert( 
1a5e0 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29  pRoot->pgno==1 )
1a5f0 3b 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d 20  ;.    subpage = 
1a600 67 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d  get4byte(&pRoot-
1a610 3e 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64  >aData[pRoot->hd
1a620 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
1a630 20 61 73 73 65 72 74 28 20 73 75 62 70 61 67 65   assert( subpage
1a640 3e 30 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  >0 );.    pCur->
1a650 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
1a660 56 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20  VALID;.    rc = 
1a670 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
1a680 2c 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 0a  , subpage);.  }.
1a690 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
1a6a0 20 28 28 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e   ((pCur->pPage->
1a6b0 6e 43 65 6c 6c 3e 30 29 3f 43 55 52 53 4f 52 5f  nCell>0)?CURSOR_
1a6c0 56 41 4c 49 44 3a 43 55 52 53 4f 52 5f 49 4e 56  VALID:CURSOR_INV
1a6d0 41 4c 49 44 29 3b 0a 20 20 72 65 74 75 72 6e 20  ALID);.  return 
1a6e0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76  rc;.}../*.** Mov
1a6f0 65 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77  e the cursor dow
1a700 6e 20 74 6f 20 74 68 65 20 6c 65 66 74 2d 6d 6f  n to the left-mo
1a710 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
1a720 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 65 6e 74  neath the.** ent
1a730 72 79 20 74 6f 20 77 68 69 63 68 20 69 74 20 69  ry to which it i
1a740 73 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e  s currently poin
1a750 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ting..**.** The 
1a760 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20 69  left-most leaf i
1a770 73 20 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74  s the one with t
1a780 68 65 20 73 6d 61 6c 6c 65 73 74 20 6b 65 79 20  he smallest key 
1a790 2d 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69  - the first.** i
1a7a0 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
1a7b0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
1a7c0 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28   moveToLeftmost(
1a7d0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1a7e0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20  .  Pgno pgno;.  
1a7f0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1a800 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  OK;.  MemPage *p
1a810 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
1a820 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1a830 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1a840 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1a850 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1a860 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  );.  while( rc==
1a870 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28 70  SQLITE_OK && !(p
1a880 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
1a890 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  ge)->leaf ){.   
1a8a0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
1a8b0 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  dx>=0 && pCur->i
1a8c0 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
1a8d0 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  );.    pgno = ge
1a8e0 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
1a8f0 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
1a900 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ));.    rc = mov
1a910 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
1a920 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
1a930 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1a940 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1a950 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68  down to the righ
1a960 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
1a970 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
1a980 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69   page to which i
1a990 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
1a9a0 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65  ointing.  Notice
1a9b0 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a   the difference.
1a9c0 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54  ** between moveT
1a9d0 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20  oLeftmost() and 
1a9e0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
1a9f0 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  ).  moveToLeftmo
1aa00 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
1aa10 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72  e left-most entr
1aa20 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65  y beneath the *e
1aa30 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f  ntry* whereas mo
1aa40 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a  veToRightmost().
1aa50 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67  ** finds the rig
1aa60 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ht-most entry be
1aa70 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a  neath the *page*
1aa80 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68  ..**.** The righ
1aa90 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20  t-most entry is 
1aaa0 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
1aab0 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74   largest key - t
1aac0 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69  he last.** key i
1aad0 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
1aae0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
1aaf0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
1ab00 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1ab10 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
1ab20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1ab30 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
1ab40 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
1ab50 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1ab60 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1ab70 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1ab80 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1ab90 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   );.  while( rc=
1aba0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28  =SQLITE_OK && !(
1abb0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
1abc0 61 67 65 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  age)->leaf ){.  
1abd0 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74    pgno = get4byt
1abe0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
1abf0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
1ac00 2b 38 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  +8]);.    pCur->
1ac10 69 64 78 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  idx = pPage->nCe
1ac20 6c 6c 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ll;.    rc = mov
1ac30 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
1ac40 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  gno);.  }.  if( 
1ac50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1ac60 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d  .    pCur->idx =
1ac70 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20   pPage->nCell - 
1ac80 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66  1;.    pCur->inf
1ac90 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
1aca0 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
1acb0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
1acc0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1acd0 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
1ace0 73 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74  sor to the first
1acf0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61   entry in the ta
1ad00 62 6c 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  ble.  Return SQL
1ad10 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
1ad20 63 65 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73  cess.  Set *pRes
1ad30 20 74 6f 20 30 20 69 66 20 74 68 65 20 63 75 72   to 0 if the cur
1ad40 73 6f 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69  sor actually poi
1ad50 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67  nts to something
1ad60 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73  .** or set *pRes
1ad70 20 74 6f 20 31 20 69 66 20 74 68 65 20 74 61 62   to 1 if the tab
1ad80 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  le is empty..*/.
1ad90 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1ada0 46 69 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a  First(BtCursor *
1adb0 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
1adc0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  {.  int rc;..  a
1add0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1ade0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1adf0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1ae00 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
1ae10 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
1ae20 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
1ae30 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
1ae40 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
1ae50 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
1ae60 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1ae70 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
1ae80 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1ae90 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
1aea0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 2a  ll==0 );.      *
1aeb0 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
1aec0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1aed0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1aee0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70   assert( pCur->p
1aef0 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b  Page->nCell>0 );
1af00 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30  .      *pRes = 0
1af10 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
1af20 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
1af30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
1af40 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
1af50 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1af60 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
1af70 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  y in the table. 
1af80 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
1af90 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e  K.** on success.
1afa0 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30    Set *pRes to 0
1afb0 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61   if the cursor a
1afc0 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74  ctually points t
1afd0 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f  o something.** o
1afe0 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31  r set *pRes to 1
1aff0 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
1b000 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
1b010 71 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28  qlite3BtreeLast(
1b020 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1b030 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
1b040 74 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74  t rc;. .  assert
1b050 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1b060 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1b070 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1b080 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70  tex_held(pCur->p
1b090 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78  Btree->db->mutex
1b0a0 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65  ) );.  rc = move
1b0b0 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
1b0c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1b0d0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52  K ){.    if( CUR
1b0e0 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
1b0f0 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
1b100 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1b110 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30  >pPage->nCell==0
1b120 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
1b130 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
1b140 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
1b150 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1b160 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
1b170 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
1b180 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69     rc = moveToRi
1b190 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  ghtmost(pCur);. 
1b1a0 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f       getCellInfo
1b1b0 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 43  (pCur);.      pC
1b1c0 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 72 63 3d  ur->atLast = rc=
1b1d0 3d 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20  =SQLITE_OK;.    
1b1e0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1b1f0 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68  c;.}../* Move th
1b200 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61 74  e cursor so that
1b210 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e   it points to an
1b220 20 65 6e 74 72 79 20 6e 65 61 72 20 74 68 65 20   entry near the 
1b230 6b 65 79 20 0a 2a 2a 20 73 70 65 63 69 66 69 65  key .** specifie
1b240 64 20 62 79 20 70 4b 65 79 2f 6e 4b 65 79 2f 70  d by pKey/nKey/p
1b250 55 6e 4b 65 79 2e 20 52 65 74 75 72 6e 20 61 20  UnKey. Return a 
1b260 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a  success code..**
1b270 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74  .** For INTKEY t
1b280 61 62 6c 65 73 2c 20 6f 6e 6c 79 20 74 68 65 20  ables, only the 
1b290 6e 4b 65 79 20 70 61 72 61 6d 65 74 65 72 20 69  nKey parameter i
1b2a0 73 20 75 73 65 64 2e 20 20 70 4b 65 79 20 0a 2a  s used.  pKey .*
1b2b0 2a 20 61 6e 64 20 70 55 6e 4b 65 79 20 6d 75 73  * and pUnKey mus
1b2c0 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46 6f 72 20  t be NULL.  For 
1b2d0 69 6e 64 65 78 20 74 61 62 6c 65 73 2c 20 65 69  index tables, ei
1b2e0 74 68 65 72 20 70 55 6e 4b 65 79 0a 2a 2a 20 6d  ther pUnKey.** m
1b2f0 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 6b  ust point to a k
1b300 65 79 20 74 68 61 74 20 68 61 73 20 61 6c 72 65  ey that has alre
1b310 61 64 79 20 62 65 65 6e 20 75 6e 70 61 63 6b 65  ady been unpacke
1b320 64 2c 20 6f 72 20 65 6c 73 65 0a 2a 2a 20 70 4b  d, or else.** pK
1b330 65 79 2f 6e 4b 65 79 20 64 65 73 63 72 69 62 65  ey/nKey describe
1b340 73 20 61 20 62 6c 6f 62 20 63 6f 6e 74 61 69 6e  s a blob contain
1b350 69 6e 67 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a  ing the key..**.
1b360 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d  ** If an exact m
1b370 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e  atch is not foun
1b380 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  d, then the curs
1b390 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20  or is always.** 
1b3a0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
1b3b0 20 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69   a leaf page whi
1b3c0 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68  ch would hold th
1b3d0 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a  e entry if it.**
1b3e0 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20   were present.  
1b3f0 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74  The cursor might
1b400 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74   point to an ent
1b410 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a  ry that comes.**
1b420 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72   before or after
1b430 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20   the key..**.** 
1b440 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f  The result of co
1b450 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20  mparing the key 
1b460 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74  with the entry t
1b470 6f 20 77 68 69 63 68 20 74 68 65 0a 2a 2a 20 63  o which the.** c
1b480 75 72 73 6f 72 20 69 73 20 77 72 69 74 74 65 6e  ursor is written
1b490 20 74 6f 20 2a 70 52 65 73 20 69 66 20 70 52 65   to *pRes if pRe
1b4a0 73 21 3d 4e 55 4c 4c 2e 20 20 54 68 65 20 6d 65  s!=NULL.  The me
1b4b0 61 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 69 73  aning of.** this
1b4c0 20 76 61 6c 75 65 20 69 73 20 61 73 20 66 6f 6c   value is as fol
1b4d0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
1b4e0 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68 65  *pRes<0      The
1b4f0 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
1b500 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
1b510 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
1b520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
1b530 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 4b   smaller than pK
1b540 65 79 20 6f 72 20 69 66 20 74 68 65 20 74 61 62  ey or if the tab
1b550 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20  le is empty.**  
1b560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b570 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69  and the cursor i
1b580 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74  s therefore left
1b590 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e   point to nothin
1b5a0 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  g..**.**     *pR
1b5b0 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75  es==0     The cu
1b5c0 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
1b5d0 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
1b5e0 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
1b5f0 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74             exact
1b600 6c 79 20 6d 61 74 63 68 65 73 20 70 4b 65 79 2e  ly matches pKey.
1b610 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
1b620 3e 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  >0      The curs
1b630 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
1b640 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
1b650 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
1b660 20 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67           is larg
1b670 65 72 20 74 68 61 6e 20 70 4b 65 79 2e 0a 2a 2a  er than pKey..**
1b680 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1b690 74 72 65 65 4d 6f 76 65 74 6f 28 0a 20 20 42 74  treeMoveto(.  Bt
1b6a0 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
1b6b0 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75 72 73       /* The curs
1b6c0 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64 20 2a  or to be moved *
1b6d0 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
1b6e0 70 4b 65 79 2c 20 20 20 20 20 20 2f 2a 20 54 68  pKey,      /* Th
1b6f0 65 20 6b 65 79 20 63 6f 6e 74 65 6e 74 20 66 6f  e key content fo
1b700 72 20 69 6e 64 69 63 65 73 2e 20 20 4e 6f 74 20  r indices.  Not 
1b710 75 73 65 64 20 62 79 20 74 61 62 6c 65 73 20 2a  used by tables *
1b720 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
1b730 72 64 20 2a 70 55 6e 4b 65 79 2c 2f 2a 20 55 6e  rd *pUnKey,/* Un
1b740 70 61 63 6b 65 64 20 76 65 72 73 69 6f 6e 20 6f  packed version o
1b750 66 20 70 4b 65 79 20 2a 2f 0a 20 20 69 36 34 20  f pKey */.  i64 
1b760 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
1b770 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 70 4b     /* Size of pK
1b780 65 79 2e 20 20 4f 72 20 74 68 65 20 6b 65 79 20  ey.  Or the key 
1b790 66 6f 72 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  for tables */.  
1b7a0 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20 20  int biasRight,  
1b7b0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 72 75         /* If tru
1b7c0 65 2c 20 62 69 61 73 20 74 68 65 20 73 65 61 72  e, bias the sear
1b7d0 63 68 20 74 6f 20 74 68 65 20 68 69 67 68 20 65  ch to the high e
1b7e0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65  nd */.  int *pRe
1b7f0 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  s              /
1b800 2a 20 53 65 61 72 63 68 20 72 65 73 75 6c 74 20  * Search result 
1b810 66 6c 61 67 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  flag */.){.  int
1b820 20 72 63 3b 0a 20 20 63 68 61 72 20 61 53 70 61   rc;.  char aSpa
1b830 63 65 5b 32 30 30 5d 3b 0a 0a 20 20 61 73 73 65  ce[200];..  asse
1b840 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1b850 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1b860 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1b870 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
1b880 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
1b890 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ex) );..  /* If 
1b8a0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
1b8b0 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64  ready positioned
1b8c0 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65   at the point we
1b8d0 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a   are trying.  **
1b8e0 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65   to move to, the
1b8f0 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69  n just return wi
1b900 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20  thout doing any 
1b910 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43  work */.  if( pC
1b920 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1b930 4f 52 5f 56 41 4c 49 44 20 26 26 20 70 43 75 72  OR_VALID && pCur
1b940 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 26 26 20 70  ->validNKey && p
1b950 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b  Cur->pPage->intK
1b960 65 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  ey ){.    if( pC
1b970 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e  ur->info.nKey==n
1b980 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  Key ){.      *pR
1b990 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  es = 0;.      re
1b9a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1b9b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43      }.    if( pC
1b9c0 75 72 2d 3e 61 74 4c 61 73 74 20 26 26 20 70 43  ur->atLast && pC
1b9d0 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 6e 4b  ur->info.nKey<nK
1b9e0 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  ey ){.      *pRe
1b9f0 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65  s = -1;.      re
1ba00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1ba10 20 20 20 20 7d 0a 20 20 7d 0a 0a 0a 20 20 72 63      }.  }...  rc
1ba20 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
1ba30 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
1ba40 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1ba50 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
1ba60 75 72 2d 3e 70 50 61 67 65 20 29 3b 0a 20 20 61  ur->pPage );.  a
1ba70 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
1ba80 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
1ba90 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1baa0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
1bab0 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
1bac0 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  -1;.    assert( 
1bad0 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65  pCur->pPage->nCe
1bae0 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74  ll==0 );.    ret
1baf0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1bb00 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70   }.  if( pCur->p
1bb10 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a  Page->intKey ){.
1bb20 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 67 69      /* We are gi
1bb30 76 65 6e 20 61 6e 20 53 51 4c 20 74 61 62 6c 65  ven an SQL table
1bb40 20 74 6f 20 73 65 61 72 63 68 2e 20 20 54 68 65   to search.  The
1bb50 20 6b 65 79 20 69 73 20 74 68 65 20 69 6e 74 65   key is the inte
1bb60 67 65 72 0a 20 20 20 20 2a 2a 20 72 6f 77 69 64  ger.    ** rowid
1bb70 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 6e 4b   contained in nK
1bb80 65 79 2e 20 20 70 4b 65 79 20 61 6e 64 20 70 55  ey.  pKey and pU
1bb90 6e 4b 65 79 20 73 68 6f 75 6c 64 20 62 6f 74 68  nKey should both
1bba0 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20   be NULL */.    
1bbb0 61 73 73 65 72 74 28 20 70 55 6e 4b 65 79 3d 3d  assert( pUnKey==
1bbc0 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
1bbd0 20 70 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 7d 65   pKey==0 );.  }e
1bbe0 6c 73 65 20 69 66 28 20 70 55 6e 4b 65 79 3d 3d  lse if( pUnKey==
1bbf0 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 65 20 61  0 ){.    /* We a
1bc00 72 65 20 74 6f 20 73 65 61 72 63 68 20 61 6e 20  re to search an 
1bc10 53 51 4c 20 69 6e 64 65 78 20 75 73 69 6e 67 20  SQL index using 
1bc20 61 20 6b 65 79 20 65 6e 63 6f 64 65 64 20 61 73  a key encoded as
1bc30 20 61 20 62 6c 6f 62 2e 0a 20 20 20 20 2a 2a 20   a blob..    ** 
1bc40 54 68 65 20 62 6c 6f 62 20 69 73 20 66 6f 75 6e  The blob is foun
1bc50 64 20 61 74 20 70 4b 65 79 20 61 6e 64 20 69 73  d at pKey and is
1bc60 20 6e 4b 65 79 20 62 79 74 65 73 20 69 6e 20 6c   nKey bytes in l
1bc70 65 6e 67 74 68 2e 20 20 55 6e 70 61 63 6b 0a 20  ength.  Unpack. 
1bc80 20 20 20 2a 2a 20 74 68 69 73 20 6b 65 79 20 73     ** this key s
1bc90 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 75 73  o that we can us
1bca0 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 61 73 73  e it. */.    ass
1bcb0 65 72 74 28 20 70 4b 65 79 21 3d 30 20 29 3b 0a  ert( pKey!=0 );.
1bcc0 20 20 20 20 70 55 6e 4b 65 79 20 3d 20 73 71 6c      pUnKey = sql
1bcd0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
1bce0 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49  pack(pCur->pKeyI
1bcf0 6e 66 6f 2c 20 6e 4b 65 79 2c 20 70 4b 65 79 2c  nfo, nKey, pKey,
1bd00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1bd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd20 20 20 20 20 61 53 70 61 63 65 2c 20 73 69 7a 65      aSpace, size
1bd30 6f 66 28 61 53 70 61 63 65 29 29 3b 0a 20 20 20  of(aSpace));.   
1bd40 20 69 66 28 20 70 55 6e 4b 65 79 3d 3d 30 20 29   if( pUnKey==0 )
1bd50 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
1bd60 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  OMEM;.  }else{. 
1bd70 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74 6f 20     /* We are to 
1bd80 73 65 61 72 63 68 20 61 6e 20 53 51 4c 20 69 6e  search an SQL in
1bd90 64 65 78 20 75 73 69 6e 67 20 61 20 6b 65 79 20  dex using a key 
1bda0 74 68 61 74 20 69 73 20 61 6c 72 65 61 64 79 20  that is already 
1bdb0 75 6e 70 61 63 6b 65 64 0a 20 20 20 20 2a 2a 20  unpacked.    ** 
1bdc0 61 6e 64 20 68 61 6e 64 65 64 20 74 6f 20 75 73  and handed to us
1bdd0 20 69 6e 20 70 55 6e 4b 65 79 2e 20 2a 2f 0a 20   in pUnKey. */. 
1bde0 20 20 20 61 73 73 65 72 74 28 20 70 4b 65 79 3d     assert( pKey=
1bdf0 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  =0 );.  }.  for(
1be00 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77 72  ;;){.    int lwr
1be10 2c 20 75 70 72 3b 0a 20 20 20 20 50 67 6e 6f 20  , upr;.    Pgno 
1be20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d 50  chldPg;.    MemP
1be30 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
1be40 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 69 6e  r->pPage;.    in
1be50 74 20 63 20 3d 20 2d 31 3b 20 20 2f 2a 20 70 52  t c = -1;  /* pR
1be60 65 73 20 72 65 74 75 72 6e 20 69 66 20 74 61 62  es return if tab
1be70 6c 65 20 69 73 20 65 6d 70 74 79 20 6d 75 73 74  le is empty must
1be80 20 62 65 20 2d 31 20 2a 2f 0a 20 20 20 20 6c 77   be -1 */.    lw
1be90 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d  r = 0;.    upr =
1bea0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b   pPage->nCell-1;
1beb0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
1bec0 3e 69 6e 74 4b 65 79 20 26 26 20 70 55 6e 4b 65  >intKey && pUnKe
1bed0 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  y==0 ){.      rc
1bee0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
1bef0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f  T_BKPT;.      go
1bf00 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
1bf10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1bf20 62 69 61 73 52 69 67 68 74 20 29 7b 0a 20 20 20  biasRight ){.   
1bf30 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 75     pCur->idx = u
1bf40 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  pr;.    }else{. 
1bf50 20 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d       pCur->idx =
1bf60 20 28 75 70 72 2b 6c 77 72 29 2f 32 3b 0a 20 20   (upr+lwr)/2;.  
1bf70 20 20 7d 0a 20 20 20 20 69 66 28 20 6c 77 72 3c    }.    if( lwr<
1bf80 3d 75 70 72 20 29 20 66 6f 72 28 3b 3b 29 7b 0a  =upr ) for(;;){.
1bf90 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 65 6c        void *pCel
1bfa0 6c 4b 65 79 3b 0a 20 20 20 20 20 20 69 36 34 20  lKey;.      i64 
1bfb0 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20  nCellKey;.      
1bfc0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1bfd0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 43 75 72   = 0;.      pCur
1bfe0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b  ->validNKey = 1;
1bff0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
1c000 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
1c010 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20      u8 *pCell;. 
1c020 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66         pCell = f
1c030 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
1c040 43 75 72 2d 3e 69 64 78 29 20 2b 20 70 50 61 67  Cur->idx) + pPag
1c050 65 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 3b  e->childPtrSize;
1c060 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
1c070 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20  ge->hasData ){. 
1c080 20 20 20 20 20 20 20 20 20 75 33 32 20 64 75 6d           u32 dum
1c090 6d 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 43  my;.          pC
1c0a0 65 6c 6c 20 2b 3d 20 67 65 74 56 61 72 69 6e 74  ell += getVarint
1c0b0 33 32 28 70 43 65 6c 6c 2c 20 64 75 6d 6d 79 29  32(pCell, dummy)
1c0c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c0d0 20 20 20 20 67 65 74 56 61 72 69 6e 74 28 70 43      getVarint(pC
1c0e0 65 6c 6c 2c 20 28 75 36 34 2a 29 26 6e 43 65 6c  ell, (u64*)&nCel
1c0f0 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 69  lKey);.        i
1c100 66 28 20 6e 43 65 6c 6c 4b 65 79 3d 3d 6e 4b 65  f( nCellKey==nKe
1c110 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  y ){.          c
1c120 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
1c130 6c 73 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79  lse if( nCellKey
1c140 3c 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  <nKey ){.       
1c150 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20     c = -1;.     
1c160 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c170 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
1c180 6c 4b 65 79 3e 6e 4b 65 79 20 29 3b 0a 20 20 20  lKey>nKey );.   
1c190 20 20 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20         c = +1;. 
1c1a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1c1b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
1c1c0 74 20 61 76 61 69 6c 61 62 6c 65 3b 0a 20 20 20  t available;.   
1c1d0 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20       pCellKey = 
1c1e0 28 76 6f 69 64 20 2a 29 66 65 74 63 68 50 61 79  (void *)fetchPay
1c1f0 6c 6f 61 64 28 70 43 75 72 2c 20 26 61 76 61 69  load(pCur, &avai
1c200 6c 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  lable, 0);.     
1c210 20 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 70 43     nCellKey = pC
1c220 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
1c230 20 20 20 20 20 20 20 69 66 28 20 61 76 61 69 6c         if( avail
1c240 61 62 6c 65 3e 3d 6e 43 65 6c 6c 4b 65 79 20 29  able>=nCellKey )
1c250 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  {.          c = 
1c260 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1c270 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 4b 65  dCompare(nCellKe
1c280 79 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 55 6e  y, pCellKey, pUn
1c290 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  Key);.        }e
1c2a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70  lse{.          p
1c2b0 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74 65  CellKey = sqlite
1c2c0 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 4b 65  3Malloc( nCellKe
1c2d0 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  y );.          i
1c2e0 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29  f( pCellKey==0 )
1c2f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
1c300 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1c310 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
1c320 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
1c330 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1c340 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1c350 74 65 33 42 74 72 65 65 4b 65 79 28 70 43 75 72  te3BtreeKey(pCur
1c360 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20 28  , 0, nCellKey, (
1c370 76 6f 69 64 20 2a 29 70 43 65 6c 6c 4b 65 79 29  void *)pCellKey)
1c380 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  ;.          c = 
1c390 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1c3a0 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 4b 65  dCompare(nCellKe
1c3b0 79 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 55 6e  y, pCellKey, pUn
1c3c0 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Key);.          
1c3d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 65  sqlite3_free(pCe
1c3e0 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  llKey);.        
1c3f0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
1c400 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
1c410 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1c420 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
1c430 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
1c440 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65  >info.nKey = nCe
1c450 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 69  llKey;.        i
1c460 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61  f( pPage->leafDa
1c470 74 61 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  ta && !pPage->le
1c480 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
1c490 6c 77 72 20 3d 20 70 43 75 72 2d 3e 69 64 78 3b  lwr = pCur->idx;
1c4a0 0a 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d  .          upr =
1c4b0 20 6c 77 72 20 2d 20 31 3b 0a 20 20 20 20 20 20   lwr - 1;.      
1c4c0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1c4d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c4e0 20 20 20 20 69 66 28 20 70 52 65 73 20 29 20 2a      if( pRes ) *
1c4f0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
1c500 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1c510 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  OK;.          go
1c520 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
1c530 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c540 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3c    }.      if( c<
1c550 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c 77 72  0 ){.        lwr
1c560 20 3d 20 70 43 75 72 2d 3e 69 64 78 2b 31 3b 0a   = pCur->idx+1;.
1c570 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c580 20 20 20 20 20 75 70 72 20 3d 20 70 43 75 72 2d       upr = pCur-
1c590 3e 69 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a  >idx-1;.      }.
1c5a0 20 20 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70        if( lwr>up
1c5b0 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  r ){.        pCu
1c5c0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e  r->info.nKey = n
1c5d0 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
1c5e0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1c5f0 20 20 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20        pCur->idx 
1c600 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 0a 20  = (lwr+upr)/2;. 
1c610 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1c620 20 6c 77 72 3d 3d 75 70 72 2b 31 20 29 3b 0a 20   lwr==upr+1 );. 
1c630 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1c640 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20  ->isInit );.    
1c650 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
1c660 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20  ){.      chldPg 
1c670 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
1c680 66 28 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e  f( lwr>=pPage->n
1c690 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68  Cell ){.      ch
1c6a0 6c 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28  ldPg = get4byte(
1c6b0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
1c6c0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
1c6d0 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
1c6e0 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65       chldPg = ge
1c6f0 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28  t4byte(findCell(
1c700 70 50 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20  pPage, lwr));.  
1c710 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 6c 64    }.    if( chld
1c720 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  Pg==0 ){.      a
1c730 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78  ssert( pCur->idx
1c740 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78  >=0 && pCur->idx
1c750 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43  <pCur->pPage->nC
1c760 65 6c 6c 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ell );.      if(
1c770 20 70 52 65 73 20 29 20 2a 70 52 65 73 20 3d 20   pRes ) *pRes = 
1c780 63 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  c;.      rc = SQ
1c790 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 67  LITE_OK;.      g
1c7a0 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
1c7b0 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75  h;.    }.    pCu
1c7c0 72 2d 3e 69 64 78 20 3d 20 6c 77 72 3b 0a 20 20  r->idx = lwr;.  
1c7d0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
1c7e0 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72  ze = 0;.    pCur
1c7f0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
1c800 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
1c810 43 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64  Child(pCur, chld
1c820 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  Pg);.    if( rc 
1c830 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69  ) goto moveto_fi
1c840 6e 69 73 68 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f  nish;.  }.moveto
1c850 5f 66 69 6e 69 73 68 3a 0a 20 20 69 66 28 20 70  _finish:.  if( p
1c860 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  Key ){.    /* If
1c870 20 77 65 20 63 72 65 61 74 65 64 20 6f 75 72 20   we created our 
1c880 6f 77 6e 20 75 6e 70 61 63 6b 65 64 20 6b 65 79  own unpacked key
1c890 20 61 74 20 74 68 65 20 74 6f 70 20 6f 66 20 74   at the top of t
1c8a0 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  his.    ** proce
1c8b0 64 75 72 65 2c 20 74 68 65 6e 20 64 65 73 74 72  dure, then destr
1c8c0 6f 79 20 74 68 61 74 20 6b 65 79 20 62 65 66 6f  oy that key befo
1c8d0 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 2a 2f  re returning. */
1c8e0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1c8f0 44 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65  DeleteUnpackedRe
1c900 63 6f 72 64 28 70 55 6e 4b 65 79 29 3b 0a 20 20  cord(pUnKey);.  
1c910 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1c920 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
1c930 54 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73  TRUE if the curs
1c940 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  or is not pointi
1c950 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f  ng at an entry o
1c960 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  f the table..**.
1c970 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20  ** TRUE will be 
1c980 72 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61  returned after a
1c990 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
1c9a0 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65  BtreeNext() move
1c9b0 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61  s.** past the la
1c9c0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
1c9d0 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33  table or sqlite3
1c9e0 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65  BtreePrev() move
1c9f0 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69  s past.** the fi
1ca00 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45  rst entry.  TRUE
1ca10 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
1ca20 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  d if the table i
1ca30 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
1ca40 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28  sqlite3BtreeEof(
1ca50 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1ca60 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74  .  /* TODO: What
1ca70 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
1ca80 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55  s in CURSOR_REQU
1ca90 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20  IRESEEK but all 
1caa0 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20  table entries.  
1cab0 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c  ** have been del
1cac0 65 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77  eted? This API w
1cad0 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e  ill need to chan
1cae0 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  ge to return an 
1caf0 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20  error code.  ** 
1cb00 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62  as well as the b
1cb10 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61  oolean result va
1cb20 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  lue..  */.  retu
1cb30 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44  rn (CURSOR_VALID
1cb40 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b  !=pCur->eState);
1cb50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1cb60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
1cb70 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20  nnection handle 
1cb80 66 6f 72 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f  for a cursor..*/
1cb90 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65  .sqlite3 *sqlite
1cba0 33 42 74 72 65 65 43 75 72 73 6f 72 44 62 28 63  3BtreeCursorDb(c
1cbb0 6f 6e 73 74 20 42 74 43 75 72 73 6f 72 20 2a 70  onst BtCursor *p
1cbc0 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
1cbd0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1cbe0 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
1cbf0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
1cc00 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 70 42   return pCur->pB
1cc10 74 72 65 65 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a  tree->db;.}../*.
1cc20 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63  ** Advance the c
1cc30 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78  ursor to the nex
1cc40 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
1cc50 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20  atabase.  If.** 
1cc60 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20  successful then 
1cc70 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66  set *pRes=0.  If
1cc80 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
1cc90 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  as already point
1cca0 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20  ing to the last 
1ccb0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
1ccc0 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20  abase before.** 
1ccd0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
1cce0 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65   called, then se
1ccf0 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e  t *pRes=1..*/.in
1cd00 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  t sqlite3BtreeNe
1cd10 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  xt(BtCursor *pCu
1cd20 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
1cd30 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61   int rc;.  MemPa
1cd40 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73  ge *pPage;..  as
1cd50 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1cd60 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1cd70 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72    rc = restoreOr
1cd80 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  ClearCursorPosit
1cd90 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
1cda0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1cdb0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
1cdc0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
1cdd0 52 65 73 21 3d 30 20 29 3b 0a 20 20 70 50 61 67  Res!=0 );.  pPag
1cde0 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
1cdf0 0a 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e  .  if( CURSOR_IN
1ce00 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
1ce10 61 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  ate ){.    *pRes
1ce20 20 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 1;.    return
1ce30 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1ce40 20 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70    if( pCur->skip
1ce50 3e 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e  >0 ){.    pCur->
1ce60 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70  skip = 0;.    *p
1ce70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74  Res = 0;.    ret
1ce80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1ce90 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20   }.  pCur->skip 
1cea0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
1ceb0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
1cec0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1ced0 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  >idx<pPage->nCel
1cee0 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 64  l );..  pCur->id
1cef0 78 2b 2b 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  x++;.  pCur->inf
1cf00 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
1cf10 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
1cf20 20 30 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   0;.  if( pCur->
1cf30 69 64 78 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  idx>=pPage->nCel
1cf40 6c 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  l ){.    if( !pP
1cf50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1cf60 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
1cf70 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79  ild(pCur, get4by
1cf80 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
1cf90 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
1cfa0 74 2b 38 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  t+8]));.      if
1cfb0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1cfc0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76  ;.      rc = mov
1cfd0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72  eToLeftmost(pCur
1cfe0 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
1cff0 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
1d000 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64   rc;.    }.    d
1d010 6f 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  o{.      if( sql
1d020 69 74 65 33 42 74 72 65 65 49 73 52 6f 6f 74 50  ite3BtreeIsRootP
1d030 61 67 65 28 70 50 61 67 65 29 20 29 7b 0a 20 20  age(pPage) ){.  
1d040 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
1d050 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65  .        pCur->e
1d060 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49  State = CURSOR_I
1d070 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20  NVALID;.        
1d080 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1d090 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1d0a0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
1d0b0 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
1d0c0 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43        pPage = pC
1d0d0 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d  ur->pPage;.    }
1d0e0 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69 64 78  while( pCur->idx
1d0f0 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  >=pPage->nCell )
1d100 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b  ;.    *pRes = 0;
1d110 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
1d120 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20  leafData ){.    
1d130 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1d140 72 65 65 4e 65 78 74 28 70 43 75 72 2c 20 70 52  reeNext(pCur, pR
1d150 65 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  es);.    }else{.
1d160 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1d170 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  E_OK;.    }.    
1d180 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
1d190 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 69 66   *pRes = 0;.  if
1d1a0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
1d1b0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1d1c0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20  TE_OK;.  }.  rc 
1d1d0 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  = moveToLeftmost
1d1e0 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75 72 6e  (pCur);.  return
1d1f0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53   rc;.}.../*.** S
1d200 74 65 70 20 74 68 65 20 63 75 72 73 6f 72 20 74  tep the cursor t
1d210 6f 20 74 68 65 20 62 61 63 6b 20 74 6f 20 74 68  o the back to th
1d220 65 20 70 72 65 76 69 6f 75 73 20 65 6e 74 72 79  e previous entry
1d230 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
1d240 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73  .  If.** success
1d250 66 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52  ful then set *pR
1d260 65 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75  es=0.  If the cu
1d270 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65  rsor.** was alre
1d280 61 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  ady pointing to 
1d290 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20  the first entry 
1d2a0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1d2b0 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72  before.** this r
1d2c0 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
1d2d0 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  d, then set *pRe
1d2e0 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  s=1..*/.int sqli
1d2f0 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75 73  te3BtreePrevious
1d300 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
1d310 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69   int *pRes){.  i
1d320 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20 70 67  nt rc;.  Pgno pg
1d330 6e 6f 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  no;.  MemPage *p
1d340 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
1d350 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1d360 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
1d370 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  = restoreOrClear
1d380 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
1d390 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  Cur);.  if( rc!=
1d3a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d3b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1d3c0 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20 3d    pCur->atLast =
1d3d0 20 30 3b 0a 20 20 69 66 28 20 43 55 52 53 4f 52   0;.  if( CURSOR
1d3e0 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e  _INVALID==pCur->
1d3f0 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a 70  eState ){.    *p
1d400 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  Res = 1;.    ret
1d410 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1d420 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 73   }.  if( pCur->s
1d430 6b 69 70 3c 30 20 29 7b 0a 20 20 20 20 70 43 75  kip<0 ){.    pCu
1d440 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20 20  r->skip = 0;.   
1d450 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
1d460 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1d470 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73 6b  ;.  }.  pCur->sk
1d480 69 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67 65  ip = 0;..  pPage
1d490 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a   = pCur->pPage;.
1d4a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
1d4b0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
1d4c0 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d  ert( pCur->idx>=
1d4d0 30 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  0 );.  if( !pPag
1d4e0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70  e->leaf ){.    p
1d4f0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 20  gno = get4byte( 
1d500 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
1d510 70 43 75 72 2d 3e 69 64 78 29 20 29 3b 0a 20 20  pCur->idx) );.  
1d520 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
1d530 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a  ld(pCur, pgno);.
1d540 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1d550 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1d560 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f     }.    rc = mo
1d570 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43  veToRightmost(pC
1d580 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ur);.  }else{.  
1d590 20 20 77 68 69 6c 65 28 20 70 43 75 72 2d 3e 69    while( pCur->i
1d5a0 64 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  dx==0 ){.      i
1d5b0 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
1d5c0 73 52 6f 6f 74 50 61 67 65 28 70 50 61 67 65 29  sRootPage(pPage)
1d5d0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72   ){.        pCur
1d5e0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
1d5f0 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
1d600 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
1d610 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1d620 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
1d630 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
1d640 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 70  eeMoveToParent(p
1d650 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  Cur);.      pPag
1d660 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
1d670 0a 20 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d  .    }.    pCur-
1d680 3e 69 64 78 2d 2d 3b 0a 20 20 20 20 70 43 75 72  >idx--;.    pCur
1d690 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
1d6a0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69  ;.    pCur->vali
1d6b0 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 69  dNKey = 0;.    i
1d6c0 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61  f( pPage->leafDa
1d6d0 74 61 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  ta && !pPage->le
1d6e0 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
1d6f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
1d700 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73  vious(pCur, pRes
1d710 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1d720 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1d730 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
1d740 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 65 74  *pRes = 0;.  ret
1d750 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1d760 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
1d770 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61  page from the da
1d780 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
1d790 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  ** The new page 
1d7a0 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  is marked as dir
1d7b0 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77  ty.  (In other w
1d7c0 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67  ords, sqlite3Pag
1d7d0 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73  erWrite().** has
1d7e0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
1d7f0 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20  lled on the new 
1d800 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20  page.)  The new 
1d810 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a  page has also.**
1d820 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64   been referenced
1d830 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67   and the calling
1d840 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70   routine is resp
1d850 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c  onsible for call
1d860 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  ing.** sqlite3Pa
1d870 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68  gerUnref() on th
1d880 65 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20  e new page when 
1d890 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a  it is done..**.*
1d8a0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
1d8b0 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
1d8c0 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72  ss.  Any other r
1d8d0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69  eturn value indi
1d8e0 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f  cates.** an erro
1d8f0 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20  r.  *ppPage and 
1d900 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66  *pPgno are undef
1d910 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e  ined in the even
1d920 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  t of an error..*
1d930 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20  * Do not invoke 
1d940 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1d950 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69  f() on *ppPage i
1d960 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65  f an error is re
1d970 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
1d980 20 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61   the "nearby" pa
1d990 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30  rameter is not 0
1d9a0 2c 20 74 68 65 6e 20 61 20 28 66 65 65 62 6c 65  , then a (feeble
1d9b0 29 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65  ) effort is made
1d9c0 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61   to .** locate a
1d9d0 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74   page close to t
1d9e0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22  he page number "
1d9f0 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73 20 63  nearby".  This c
1da00 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e  an be used in an
1da10 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b  .** attempt to k
1da20 65 65 70 20 72 65 6c 61 74 65 64 20 70 61 67 65  eep related page
1da30 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20  s close to each 
1da40 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64 61 74  other in the dat
1da50 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77  abase file,.** w
1da60 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e  hich in turn can
1da70 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20 61   make database a
1da80 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a  ccess faster..**
1da90 0a 2a 2a 20 49 66 20 74 68 65 20 22 65 78 61 63  .** If the "exac
1daa0 74 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  t" parameter is 
1dab0 6e 6f 74 20 30 2c 20 61 6e 64 20 74 68 65 20 70  not 0, and the p
1dac0 61 67 65 2d 6e 75 6d 62 65 72 20 6e 65 61 72 62  age-number nearb
1dad0 79 20 65 78 69 73 74 73 20 0a 2a 2a 20 61 6e 79  y exists .** any
1dae0 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65  where on the fre
1daf0 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20  e-list, then it 
1db00 69 73 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f  is guarenteed to
1db10 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68   be returned. Th
1db20 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73  is.** is only us
1db30 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ed by auto-vacuu
1db40 6d 20 64 61 74 61 62 61 73 65 73 20 77 68 65 6e  m databases when
1db50 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65   allocating a ne
1db60 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  w table..*/.stat
1db70 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42  ic int allocateB
1db80 74 72 65 65 50 61 67 65 28 0a 20 20 42 74 53 68  treePage(.  BtSh
1db90 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65  ared *pBt, .  Me
1dba0 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
1dbb0 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20  .  Pgno *pPgno, 
1dbc0 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a  .  Pgno nearby,.
1dbd0 20 20 75 38 20 65 78 61 63 74 0a 29 7b 0a 20 20    u8 exact.){.  
1dbe0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
1dbf0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
1dc00 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   n;     /* Numbe
1dc10 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
1dc20 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
1dc30 69 6e 74 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75  int k;     /* Nu
1dc40 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f  mber of leaves o
1dc50 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74  n the trunk of t
1dc60 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
1dc70 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
1dc80 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
1dc90 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b  *pPrevTrunk = 0;
1dca0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
1dcb0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1dcc0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
1dcd0 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
1dce0 61 67 65 31 3b 0a 20 20 6e 20 3d 20 67 65 74 34  age1;.  n = get4
1dcf0 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
1dd00 61 74 61 5b 33 36 5d 29 3b 0a 20 20 69 66 28 20  ata[36]);.  if( 
1dd10 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  n>0 ){.    /* Th
1dd20 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e  ere are pages on
1dd30 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
1dd40 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f  Reuse one of tho
1dd50 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20  se pages. */.   
1dd60 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20   Pgno iTrunk;.  
1dd70 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20    u8 searchList 
1dd80 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66  = 0; /* If the f
1dd90 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65  ree-list must be
1dda0 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e   searched for 'n
1ddb0 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20  earby' */.    . 
1ddc0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 27 65 78     /* If the 'ex
1ddd0 61 63 74 27 20 70 61 72 61 6d 65 74 65 72 20 77  act' parameter w
1dde0 61 73 20 74 72 75 65 20 61 6e 64 20 61 20 71 75  as true and a qu
1ddf0 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74  ery of the point
1de00 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68  er-map.    ** sh
1de10 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ows that the pag
1de20 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f  e 'nearby' is so
1de30 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66  mewhere on the f
1de40 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20  ree-list, then. 
1de50 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65     ** the entire
1de60 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65  -list will be se
1de70 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20  arched for that 
1de80 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  page..    */.#if
1de90 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1dea0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1deb0 69 66 28 20 65 78 61 63 74 20 26 26 20 6e 65 61  if( exact && nea
1dec0 72 62 79 3c 3d 70 61 67 65 72 50 61 67 65 63 6f  rby<=pagerPageco
1ded0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
1dee0 20 29 7b 0a 20 20 20 20 20 20 75 38 20 65 54 79   ){.      u8 eTy
1def0 70 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  pe;.      assert
1df00 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20 20  ( nearby>0 );.  
1df10 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
1df20 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a 20  >autoVacuum );. 
1df30 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
1df40 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79 2c  Get(pBt, nearby,
1df50 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20 20   &eType, 0);.   
1df60 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1df70 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 69 66 28  rn rc;.      if(
1df80 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
1df90 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
1dfa0 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20     searchList = 
1dfb0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
1dfc0 20 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72 62 79   *pPgno = nearby
1dfd0 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
1dfe0 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74      /* Decrement
1dff0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 63   the free-list c
1e000 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20 69  ount by 1. Set i
1e010 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e 64  Trunk to the ind
1e020 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a  ex of the.    **
1e030 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73 74   first free-list
1e040 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50 72   trunk page. iPr
1e050 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74 69  evTrunk is initi
1e060 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a 20  ally 1..    */. 
1e070 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1e080 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31  agerWrite(pPage1
1e090 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1e0a0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1e0b0 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74 65  rc;.    put4byte
1e0c0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1e0d0 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20 20  36], n-1);..    
1e0e0 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74 68  /* The code with
1e0f0 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73 20  in this loop is 
1e100 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69 66  run only once if
1e110 20 74 68 65 20 27 73 65 61 72 63 68 4c 69 73 74   the 'searchList
1e120 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 2a  ' variable.    *
1e130 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20 4f  * is not true. O
1e140 74 68 65 72 77 69 73 65 2c 20 69 74 20 72 75 6e  therwise, it run
1e150 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20  s once for each 
1e160 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74 68  trunk-page on th
1e170 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c 69  e.    ** free-li
1e180 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61 67  st until the pag
1e190 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c 6f  e 'nearby' is lo
1e1a0 63 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  cated..    */.  
1e1b0 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50 72    do {.      pPr
1e1c0 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e 6b  evTrunk = pTrunk
1e1d0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72 65  ;.      if( pPre
1e1e0 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20  vTrunk ){.      
1e1f0 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
1e200 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  yte(&pPrevTrunk-
1e210 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20  >aData[0]);.    
1e220 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1e230 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79   iTrunk = get4by
1e240 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
1e250 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d 0a  a[32]);.      }.
1e260 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1e270 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
1e280 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54 72  Bt, iTrunk, &pTr
1e290 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  unk, 0);.      i
1e2a0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
1e2b0 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
1e2c0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
1e2d0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
1e2e0 20 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d 20     }..      k = 
1e2f0 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
1e300 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20  ->aData[4]);.   
1e310 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20 21     if( k==0 && !
1e320 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20 20  searchList ){.  
1e330 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
1e340 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65 73  nk has no leaves
1e350 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69 73   and the list is
1e360 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72 63   not being searc
1e370 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a  hed. .        **
1e380 20 53 6f 20 65 78 74 72 61 63 74 20 74 68 65 20   So extract the 
1e390 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65 6c  trunk page itsel
1e3a0 66 20 61 6e 64 20 75 73 65 20 69 74 20 61 73 20  f and use it as 
1e3b0 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20 20  the newly .     
1e3c0 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20     ** allocated 
1e3d0 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  page */.        
1e3e0 61 73 73 65 72 74 28 20 70 50 72 65 76 54 72 75  assert( pPrevTru
1e3f0 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  nk==0 );.       
1e400 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1e410 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
1e420 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1e430 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1e440 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
1e450 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
1e460 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e470 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b  *pPgno = iTrunk;
1e480 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
1e490 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1e4a0 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  2], &pTrunk->aDa
1e4b0 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
1e4c0 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72     *ppPage = pTr
1e4d0 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54 72  unk;.        pTr
1e4e0 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
1e4f0 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
1e500 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64  E: %d trunk - %d
1e510 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74   free pages left
1e520 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31  \n", *pPgno, n-1
1e530 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ));.      }else 
1e540 69 66 28 20 6b 3e 70 42 74 2d 3e 75 73 61 62 6c  if( k>pBt->usabl
1e550 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20  eSize/4 - 8 ){. 
1e560 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
1e570 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20 72  of k is out of r
1e580 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65 20  ange.  Database 
1e590 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20 20  corruption */.  
1e5a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1e5b0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1e5c0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1e5d0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
1e5e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1e5f0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1e600 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
1e610 65 61 72 63 68 4c 69 73 74 20 26 26 20 6e 65 61  earchList && nea
1e620 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a 20  rby==iTrunk ){. 
1e630 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 69         /* The li
1e640 73 74 20 69 73 20 62 65 69 6e 67 20 73 65 61 72  st is being sear
1e650 63 68 65 64 20 61 6e 64 20 74 68 69 73 20 74 72  ched and this tr
1e660 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65 20  unk page is the 
1e670 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
1e680 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65 67  to allocate, reg
1e690 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
1e6a0 65 72 20 69 74 20 68 61 73 20 6c 65 61 76 65 73  er it has leaves
1e6b0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1e6c0 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50       assert( *pP
1e6d0 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a 20  gno==iTrunk );. 
1e6e0 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d         *ppPage =
1e6f0 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   pTrunk;.       
1e700 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
1e710 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1e720 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1e730 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
1e740 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1e750 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
1e760 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
1e770 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
1e780 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 30          if( k==0
1e790 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
1e7a0 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29 7b  ( !pPrevTrunk ){
1e7b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
1e7c0 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44 61  cpy(&pPage1->aDa
1e7d0 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d  ta[32], &pTrunk-
1e7e0 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
1e7f0 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
1e800 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63              memc
1e810 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e  py(&pPrevTrunk->
1e820 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e  aData[0], &pTrun
1e830 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
1e840 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1e850 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e860 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72 75        /* The tru
1e870 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71 75 69  nk page is requi
1e880 72 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65  red by the calle
1e890 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69 6e  r but it contain
1e8a0 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  s .          ** 
1e8b0 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65 65  pointers to free
1e8c0 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54 68  -list leaves. Th
1e8d0 65 20 66 69 72 73 74 20 6c 65 61 66 20 62 65 63  e first leaf bec
1e8e0 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20 20  omes a trunk.   
1e8f0 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69         ** page i
1e900 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 20  n this case..   
1e910 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
1e920 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
1e930 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20  wTrunk;.        
1e940 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e 6b    Pgno iNewTrunk
1e950 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54 72   = get4byte(&pTr
1e960 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b 0a  unk->aData[8]);.
1e970 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1e980 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
1e990 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75 6e  ge(pBt, iNewTrun
1e9a0 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20 30  k, &pNewTrunk, 0
1e9b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1e9c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1e9d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  {.            go
1e9e0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
1e9f0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20  page;.          
1ea00 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
1ea10 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1ea20 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70 44  te(pNewTrunk->pD
1ea30 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
1ea40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ea50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1ea60 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1ea70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
1ea80 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1ea90 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
1eaa0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1eab0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65       memcpy(&pNe
1eac0 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  wTrunk->aData[0]
1ead0 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
1eae0 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
1eaf0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 4e 65     put4byte(&pNe
1eb00 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  wTrunk->aData[4]
1eb10 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  , k-1);.        
1eb20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72    memcpy(&pNewTr
1eb30 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26  unk->aData[8], &
1eb40 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31 32  pTrunk->aData[12
1eb50 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20 20  ], (k-1)*4);.   
1eb60 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
1eb70 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20  ge(pNewTrunk);. 
1eb80 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50           if( !pP
1eb90 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20  revTrunk ){.    
1eba0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
1ebb0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1ebc0 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b  32], iNewTrunk);
1ebd0 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
1ebe0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
1ebf0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1ec00 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b 2d  rite(pPrevTrunk-
1ec10 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1ec20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
1ec30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 67  .              g
1ec40 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
1ec50 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
1ec60 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1ec70 20 70 75 74 34 62 79 74 65 28 26 70 50 72 65 76   put4byte(&pPrev
1ec80 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
1ec90 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20   iNewTrunk);.   
1eca0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ecb0 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e   }.        pTrun
1ecc0 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54  k = 0;.        T
1ecd0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
1ece0 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66   %d trunk - %d f
1ecf0 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e  ree pages left\n
1ed00 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29  ", *pPgno, n-1))
1ed10 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d  ;.#endif.      }
1ed20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
1ed30 20 45 78 74 72 61 63 74 20 61 20 6c 65 61 66 20   Extract a leaf 
1ed40 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20 2a  from the trunk *
1ed50 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 6c  /.        int cl
1ed60 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20 50  osest;.        P
1ed70 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20 20  gno iPage;.     
1ed80 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
1ed90 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e 6b   *aData = pTrunk
1eda0 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20 20  ->aData;.       
1edb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1edc0 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
1edd0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1ede0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1edf0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
1ee00 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
1ee10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1ee20 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b 0a  if( nearby>0 ){.
1ee30 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 2c            int i,
1ee40 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20   dist;.         
1ee50 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20   closest = 0;.  
1ee60 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 67          dist = g
1ee70 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38  et4byte(&aData[8
1ee80 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20  ]) - nearby;.   
1ee90 20 20 20 20 20 20 20 69 66 28 20 64 69 73 74 3c         if( dist<
1eea0 30 20 29 20 64 69 73 74 20 3d 20 2d 64 69 73 74  0 ) dist = -dist
1eeb0 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
1eec0 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a  i=1; i<k; i++){.
1eed0 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
1eee0 64 32 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  d2 = get4byte(&a
1eef0 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e  Data[8+i*4]) - n
1ef00 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20  earby;.         
1ef10 20 20 20 69 66 28 20 64 32 3c 30 20 29 20 64 32     if( d2<0 ) d2
1ef20 20 3d 20 2d 64 32 3b 0a 20 20 20 20 20 20 20 20   = -d2;.        
1ef30 20 20 20 20 69 66 28 20 64 32 3c 64 69 73 74 20      if( d2<dist 
1ef40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
1ef50 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20 20   closest = i;.  
1ef60 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73 74              dist
1ef70 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20 20   = d2;.         
1ef80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
1ef90 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1efa0 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73            closes
1efb0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
1efc0 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67 65 20  ..        iPage 
1efd0 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74  = get4byte(&aDat
1efe0 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29 3b  a[8+closest*4]);
1eff0 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73 65  .        if( !se
1f000 61 72 63 68 4c 69 73 74 20 7c 7c 20 69 50 61 67  archList || iPag
1f010 65 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20 20  e==nearby ){.   
1f020 20 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65         int nPage
1f030 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67  ;.          *pPg
1f040 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20  no = iPage;.    
1f050 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 70 61        nPage = pa
1f060 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
1f070 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  ->pPager);.     
1f080 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3e       if( *pPgno>
1f090 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  nPage ){.       
1f0a0 20 20 20 20 20 2f 2a 20 46 72 65 65 20 70 61 67       /* Free pag
1f0b0 65 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f 66  e off the end of
1f0c0 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20   the file */.   
1f0d0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1f0e0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1f0f0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  T;.            g
1f100 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
1f110 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
1f120 20 7d 0a 20 20 20 20 20 20 20 20 20 20 54 52 41   }.          TRA
1f130 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
1f140 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f 66  d was leaf %d of
1f150 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64 22   %d on trunk %d"
1f160 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1f170 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72 65    ": %d more fre
1f180 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20 20  e pages\n",.    
1f190 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 50               *pP
1f1a0 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c 20  gno, closest+1, 
1f1b0 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c  k, pTrunk->pgno,
1f1c0 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20 20   n-1));.        
1f1d0 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b 2d    if( closest<k-
1f1e0 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
1f1f0 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b 38   memcpy(&aData[8
1f200 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61 44  +closest*4], &aD
1f210 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a  ata[4+k*4], 4);.
1f220 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1f230 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
1f240 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a  aData[4], k-1);.
1f250 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1f260 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
1f270 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
1f280 70 70 50 61 67 65 2c 20 31 29 3b 0a 20 20 20 20  ppPage, 1);.    
1f290 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1f2a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f2b0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
1f2c0 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  gerDontRollback(
1f2d0 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
1f2e0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
1f2f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1f300 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67 65  erWrite((*ppPage
1f310 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  )->pDbPage);.   
1f320 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1f330 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1f340 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65              rele
1f350 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65 29  asePage(*ppPage)
1f360 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
1f370 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1f380 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73 74        searchList
1f390 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
1f3a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
1f3b0 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76 54  leasePage(pPrevT
1f3c0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72  runk);.      pPr
1f3d0 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20  evTrunk = 0;.   
1f3e0 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c   }while( searchL
1f3f0 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ist );.  }else{.
1f400 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65      /* There are
1f410 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65   no pages on the
1f420 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 63 72   freelist, so cr
1f430 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  eate a new page 
1f440 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e  at the.    ** en
1f450 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f  d of the file */
1f460 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d  .    int nPage =
1f470 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
1f480 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
1f490 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 50 61 67 65    *pPgno = nPage
1f4a0 20 2b 20 31 3b 0a 0a 23 69 66 6e 64 65 66 20 53   + 1;..#ifndef S
1f4b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1f4c0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
1f4d0 74 2d 3e 6e 54 72 75 6e 63 20 29 7b 0a 20 20 20  t->nTrunc ){.   
1f4e0 20 20 20 2f 2a 20 41 6e 20 69 6e 63 72 2d 76 61     /* An incr-va
1f4f0 63 75 75 6d 20 68 61 73 20 61 6c 72 65 61 64 79  cuum has already
1f500 20 72 75 6e 20 77 69 74 68 69 6e 20 74 68 69 73   run within this
1f510 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53 6f   transaction. So
1f520 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70 61   the.      ** pa
1f530 67 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 69  ge to allocate i
1f540 73 20 6e 6f 74 20 66 72 6f 6d 20 74 68 65 20 70  s not from the p
1f550 68 79 73 69 63 61 6c 20 65 6e 64 20 6f 66 20 74  hysical end of t
1f560 68 65 20 66 69 6c 65 2c 20 62 75 74 0a 20 20 20  he file, but.   
1f570 20 20 20 2a 2a 20 61 74 20 70 42 74 2d 3e 6e 54     ** at pBt->nT
1f580 72 75 6e 63 2e 20 0a 20 20 20 20 20 20 2a 2f 0a  runc. .      */.
1f590 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 70        *pPgno = p
1f5a0 42 74 2d 3e 6e 54 72 75 6e 63 2b 31 3b 0a 20 20  Bt->nTrunc+1;.  
1f5b0 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d      if( *pPgno==
1f5c0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1f5d0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
1f5e0 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20    (*pPgno)++;.  
1f5f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1f600 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
1f610 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49 53  uum && PTRMAP_IS
1f620 50 41 47 45 28 70 42 74 2c 20 2a 70 50 67 6e 6f  PAGE(pBt, *pPgno
1f630 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
1f640 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20 74   *pPgno refers t
1f650 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  o a pointer-map 
1f660 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20 74  page, allocate t
1f670 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20 20  wo new pages.   
1f680 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e 64     ** at the end
1f690 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 73   of the file ins
1f6a0 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68 65  tead of one. The
1f6b0 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65 64   first allocated
1f6c0 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
1f6d0 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f 69  ecomes a new poi
1f6e0 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 74  nter-map page, t
1f6f0 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73 65  he second is use
1f700 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
1f710 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1f720 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
1f730 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66  : %d from end of
1f740 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d 6d   file (pointer-m
1f750 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 2a 70 50  ap page)\n", *pP
1f760 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 61 73 73  gno));.      ass
1f770 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e  ert( *pPgno!=PEN
1f780 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
1f790 42 74 29 20 29 3b 0a 20 20 20 20 20 20 28 2a 70  Bt) );.      (*p
1f7a0 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 20 69  Pgno)++;.      i
1f7b0 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49  f( *pPgno==PENDI
1f7c0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
1f7d0 29 20 29 7b 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b  ) ){ (*pPgno)++;
1f7e0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
1f7f0 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 29 7b 0a   pBt->nTrunc ){.
1f800 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e        pBt->nTrun
1f810 63 20 3d 20 2a 70 50 67 6e 6f 3b 0a 20 20 20 20  c = *pPgno;.    
1f820 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 61 73  }.#endif..    as
1f830 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45  sert( *pPgno!=PE
1f840 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1f850 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  pBt) );.    rc =
1f860 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1f870 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f  Page(pBt, *pPgno
1f880 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  , ppPage, 0);.  
1f890 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1f8a0 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73  n rc;.    rc = s
1f8b0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1f8c0 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
1f8d0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
1f8e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1f8f0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
1f900 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  (*ppPage);.    }
1f910 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c  .    TRACE(("ALL
1f920 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65  OCATE: %d from e
1f930 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20 2a  nd of file\n", *
1f940 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20  pPgno));.  }..  
1f950 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
1f960 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
1f970 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f 61  E(pBt) );..end_a
1f980 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20 20  llocate_page:.  
1f990 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
1f9a0 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61  nk);.  releasePa
1f9b0 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a  ge(pPrevTrunk);.
1f9c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1f9d0 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 70 61 67 65  /*.** Add a page
1f9e0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1f9f0 20 66 69 6c 65 20 74 6f 20 74 68 65 20 66 72 65   file to the fre
1fa00 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c  elist..**.** sql
1fa10 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29  ite3PagerUnref()
1fa20 20 69 73 20 4e 4f 54 20 63 61 6c 6c 65 64 20 66   is NOT called f
1fa30 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61  or pPage..*/.sta
1fa40 74 69 63 20 69 6e 74 20 66 72 65 65 50 61 67 65  tic int freePage
1fa50 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
1fa60 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
1fa70 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
1fa80 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1fa90 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  1 = pBt->pPage1;
1faa0 0a 20 20 69 6e 74 20 72 63 2c 20 6e 2c 20 6b 3b  .  int rc, n, k;
1fab0 0a 0a 20 20 2f 2a 20 50 72 65 70 61 72 65 20 74  ..  /* Prepare t
1fac0 68 65 20 70 61 67 65 20 66 6f 72 20 66 72 65 65  he page for free
1fad0 69 6e 67 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ing */.  assert(
1fae0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
1faf0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
1fb00 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
1fb10 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3e  rt( pPage->pgno>
1fb20 31 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 73  1 );.  pPage->is
1fb30 49 6e 69 74 20 3d 20 30 3b 0a 20 20 72 65 6c 65  Init = 0;.  rele
1fb40 61 73 65 50 61 67 65 28 70 50 61 67 65 2d 3e 70  asePage(pPage->p
1fb50 50 61 72 65 6e 74 29 3b 0a 20 20 70 50 61 67 65  Parent);.  pPage
1fb60 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a 0a  ->pParent = 0;..
1fb70 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
1fb80 68 65 20 66 72 65 65 20 70 61 67 65 20 63 6f 75  he free page cou
1fb90 6e 74 20 6f 6e 20 70 50 61 67 65 31 20 2a 2f 0a  nt on pPage1 */.
1fba0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1fbb0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 31 2d  gerWrite(pPage1-
1fbc0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
1fbd0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
1fbe0 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65 28  .  n = get4byte(
1fbf0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1fc00 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  6]);.  put4byte(
1fc10 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1fc20 36 5d 2c 20 6e 2b 31 29 3b 0a 0a 23 69 66 64 65  6], n+1);..#ifde
1fc30 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
1fc40 44 45 4c 45 54 45 0a 20 20 2f 2a 20 49 66 20 74  DELETE.  /* If t
1fc50 68 65 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45  he SQLITE_SECURE
1fc60 5f 44 45 4c 45 54 45 20 63 6f 6d 70 69 6c 65 2d  _DELETE compile-
1fc70 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69 73 20 65  time option is e
1fc80 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a 20 20 2a  nabled, then.  *
1fc90 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c 79 20 6f  * always fully o
1fca0 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64  verwrite deleted
1fcb0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74   information wit
1fcc0 68 20 7a 65 72 6f 73 2e 0a 20 20 2a 2f 0a 20 20  h zeros..  */.  
1fcd0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
1fce0 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
1fcf0 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
1fd00 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1fd10 6d 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44  memset(pPage->aD
1fd20 61 74 61 2c 20 30 2c 20 70 50 61 67 65 2d 3e 70  ata, 0, pPage->p
1fd30 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23  Bt->pageSize);.#
1fd40 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
1fd50 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1fd60 41 43 55 55 4d 0a 20 20 2f 2a 20 49 66 20 74 68  ACUUM.  /* If th
1fd70 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
1fd80 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
1fd90 20 77 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20   write an entry 
1fda0 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  in the pointer-m
1fdb0 61 70 0a 20 20 2a 2a 20 74 6f 20 69 6e 64 69 63  ap.  ** to indic
1fdc0 61 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67  ate that the pag
1fdd0 65 20 69 73 20 66 72 65 65 2e 0a 20 20 2a 2f 0a  e is free..  */.
1fde0 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
1fdf0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  acuum ){.    rc 
1fe00 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
1fe10 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 50 54   pPage->pgno, PT
1fe20 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30  RMAP_FREEPAGE, 0
1fe30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1fe40 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23  return rc;.  }.#
1fe50 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e 3d 3d  endif..  if( n==
1fe60 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  0 ){.    /* This
1fe70 20 69 73 20 74 68 65 20 66 69 72 73 74 20 66 72   is the first fr
1fe80 65 65 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 72  ee page */.    r
1fe90 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1fea0 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
1feb0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1fec0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1fed0 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d     memset(pPage-
1fee0 3e 61 44 61 74 61 2c 20 30 2c 20 38 29 3b 0a 20  >aData, 0, 8);. 
1fef0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
1ff00 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
1ff10 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
1ff20 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
1ff30 41 47 45 3a 20 25 64 20 66 69 72 73 74 5c 6e 22  AGE: %d first\n"
1ff40 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b  , pPage->pgno));
1ff50 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1ff60 20 4f 74 68 65 72 20 66 72 65 65 20 70 61 67 65   Other free page
1ff70 73 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e  s already exist.
1ff80 20 20 52 65 74 72 69 76 65 20 74 68 65 20 66 69    Retrive the fi
1ff90 72 73 74 20 74 72 75 6e 6b 20 70 61 67 65 0a 20  rst trunk page. 
1ffa0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 72 65     ** of the fre
1ffb0 65 6c 69 73 74 20 61 6e 64 20 66 69 6e 64 20 6f  elist and find o
1ffc0 75 74 20 68 6f 77 20 6d 61 6e 79 20 6c 65 61 76  ut how many leav
1ffd0 65 73 20 69 74 20 68 61 73 2e 20 2a 2f 0a 20 20  es it has. */.  
1ffe0 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
1fff0 6b 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  k;.    rc = sqli
20000 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
20010 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 26 70  pBt, get4byte(&p
20020 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
20030 29 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a  ), &pTrunk, 0);.
20040 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
20050 75 72 6e 20 72 63 3b 0a 20 20 20 20 6b 20 3d 20  urn rc;.    k = 
20060 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b  get4byte(&pTrunk
20070 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20  ->aData[4]);.   
20080 20 69 66 28 20 6b 3e 3d 70 42 74 2d 3e 75 73 61   if( k>=pBt->usa
20090 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 29 7b  bleSize/4 - 8 ){
200a0 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72  .      /* The tr
200b0 75 6e 6b 20 69 73 20 66 75 6c 6c 2e 20 20 54 75  unk is full.  Tu
200c0 72 6e 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  rn the page bein
200d0 67 20 66 72 65 65 64 20 69 6e 74 6f 20 61 20 6e  g freed into a n
200e0 65 77 0a 20 20 20 20 20 20 2a 2a 20 74 72 75 6e  ew.      ** trun
200f0 6b 20 70 61 67 65 20 77 69 74 68 20 6e 6f 20 6c  k page with no l
20100 65 61 76 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20  eaves. */.      
20110 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
20120 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
20130 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
20140 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20150 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  ){.        put4b
20160 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
20170 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 3b  , pTrunk->pgno);
20180 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
20190 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
201a0 34 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  4], 0);.        
201b0 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
201c0 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 70 50 61  ->aData[32], pPa
201d0 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  ge->pgno);.     
201e0 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d     TRACE(("FREE-
201f0 50 41 47 45 3a 20 25 64 20 6e 65 77 20 74 72 75  PAGE: %d new tru
20200 6e 6b 20 70 61 67 65 20 72 65 70 6c 61 63 69 6e  nk page replacin
20210 67 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  g %d\n",.       
20220 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e           pPage->
20230 70 67 6e 6f 2c 20 70 54 72 75 6e 6b 2d 3e 70 67  pgno, pTrunk->pg
20240 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  no));.      }.  
20250 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3c 30 20    }else if( k<0 
20260 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
20270 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20  LITE_CORRUPT;.  
20280 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
20290 2a 20 41 64 64 20 74 68 65 20 6e 65 77 6c 79 20  * Add the newly 
202a0 66 72 65 65 64 20 70 61 67 65 20 61 73 20 61 20  freed page as a 
202b0 6c 65 61 66 20 6f 6e 20 74 68 65 20 63 75 72 72  leaf on the curr
202c0 65 6e 74 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20  ent trunk */.   
202d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
202e0 61 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b  agerWrite(pTrunk
202f0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
20300 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20310 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
20320 75 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  ut4byte(&pTrunk-
20330 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2b 31 29 3b  >aData[4], k+1);
20340 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74  .        put4byt
20350 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
20360 5b 38 2b 6b 2a 34 5d 2c 20 70 50 61 67 65 2d 3e  [8+k*4], pPage->
20370 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66 20 53  pgno);.#ifndef S
20380 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
20390 45 54 45 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ETE.        sqli
203a0 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
203b0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
203c0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
203d0 7d 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  }.      TRACE(("
203e0 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6c 65  FREE-PAGE: %d le
203f0 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70 61 67 65  af on trunk page
20400 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d 3e 70 67   %d\n",pPage->pg
20410 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29  no,pTrunk->pgno)
20420 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 6c  );.    }.    rel
20430 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29  easePage(pTrunk)
20440 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
20450 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65  c;.}../*.** Free
20460 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61   any overflow pa
20470 67 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  ges associated w
20480 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 43 65  ith the given Ce
20490 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ll..*/.static in
204a0 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d 65 6d 50  t clearCell(MemP
204b0 61 67 65 20 2a 70 50 61 67 65 2c 20 75 6e 73 69  age *pPage, unsi
204c0 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
204d0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
204e0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
204f0 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
20500 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c 50 67 6e  ;.  Pgno ovflPgn
20510 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  o;.  int rc;.  i
20520 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 69 6e 74 20  nt nOvfl;.  int 
20530 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 0a 20  ovflPageSize;.. 
20540 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
20550 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
20560 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
20570 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
20580 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
20590 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
205a0 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f  );.  if( info.iO
205b0 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20  verflow==0 ){.  
205c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
205d0 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76 65 72 66  OK;  /* No overf
205e0 6c 6f 77 20 70 61 67 65 73 2e 20 52 65 74 75 72  low pages. Retur
205f0 6e 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20  n without doing 
20600 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a  anything */.  }.
20610 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20 67 65 74    ovflPgno = get
20620 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
20630 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20  o.iOverflow]);. 
20640 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 3d 20   ovflPageSize = 
20650 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
20660 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20 3d 20 28  - 4;.  nOvfl = (
20670 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 2d 20  info.nPayload - 
20680 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76  info.nLocal + ov
20690 66 6c 50 61 67 65 53 69 7a 65 20 2d 20 31 29 2f  flPageSize - 1)/
206a0 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b 0a 20 20  ovflPageSize;.  
206b0 61 73 73 65 72 74 28 20 6f 76 66 6c 50 67 6e 6f  assert( ovflPgno
206c0 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29  ==0 || nOvfl>0 )
206d0 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f 76 66 6c  ;.  while( nOvfl
206e0 2d 2d 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  -- ){.    MemPag
206f0 65 20 2a 70 4f 76 66 6c 3b 0a 20 20 20 20 69 66  e *pOvfl;.    if
20700 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c  ( ovflPgno==0 ||
20710 20 6f 76 66 6c 50 67 6e 6f 3e 70 61 67 65 72 50   ovflPgno>pagerP
20720 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
20730 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
20740 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
20750 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
20760 0a 0a 20 20 20 20 72 63 20 3d 20 67 65 74 4f 76  ..    rc = getOv
20770 65 72 66 6c 6f 77 50 61 67 65 28 70 42 74 2c 20  erflowPage(pBt, 
20780 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f 76 66 6c  ovflPgno, &pOvfl
20790 2c 20 28 6e 4f 76 66 6c 3d 3d 30 29 3f 30 3a 26  , (nOvfl==0)?0:&
207a0 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20 20 20 69  ovflPgno);.    i
207b0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
207c0 63 3b 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65  c;.    rc = free
207d0 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20  Page(pOvfl);.   
207e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
207f0 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62 50 61 67  ef(pOvfl->pDbPag
20800 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
20810 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
20820 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20830 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
20840 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65 71  ate the byte seq
20850 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65  uence used to re
20860 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f  present a cell o
20870 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20  n page pPage.** 
20880 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20 62  and write that b
20890 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74  yte sequence int
208a0 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72  o pCell[].  Over
208b0 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a  flow pages are.*
208c0 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  * allocated and 
208d0 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63  filled in as nec
208e0 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c  essary.  The cal
208f0 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a  ling procedure.*
20900 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
20910 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65   for making sure
20920 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
20930 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
20940 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c  ated.** for pCel
20950 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  l[]..**.** Note 
20960 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20  that pCell does 
20970 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65  not necessary ne
20980 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  ed to point to t
20990 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  he pPage->aData.
209a0 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20  ** area.  pCell 
209b0 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73  might point to s
209c0 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74  ome temporary st
209d0 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c  orage.  The cell
209e0 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73   will.** be cons
209f0 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73 20  tructed in this 
20a00 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74  temporary area t
20a10 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  hen copied into 
20a20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
20a30 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  later..*/.static
20a40 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28   int fillInCell(
20a50 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
20a60 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
20a70 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
20a80 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
20a90 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  cell */.  unsign
20aa0 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20  ed char *pCell, 
20ab0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
20ac0 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
20ad0 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74   cell */.  const
20ae0 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34   void *pKey, i64
20af0 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65   nKey,    /* The
20b00 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   key */.  const 
20b10 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74 20  void *pData,int 
20b20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65 20  nData,   /* The 
20b30 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a  data */.  int nZ
20b40 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  ero,            
20b50 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
20b60 61 20 7a 65 72 6f 20 62 79 74 65 73 20 74 6f 20  a zero bytes to 
20b70 61 70 70 65 6e 64 20 74 6f 20 70 44 61 74 61 20  append to pData 
20b80 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65  */.  int *pnSize
20b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ba0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c      /* Write cel
20bb0 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29  l size here */.)
20bc0 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64  {.  int nPayload
20bd0 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53  ;.  const u8 *pS
20be0 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20  rc;.  int nSrc, 
20bf0 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70 61  n, rc;.  int spa
20c00 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67  ceLeft;.  MemPag
20c10 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  e *pOvfl = 0;.  
20c20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65  MemPage *pToRele
20c30 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67  ase = 0;.  unsig
20c40 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72  ned char *pPrior
20c50 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
20c60 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42  r *pPayload;.  B
20c70 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
20c80 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e  Page->pBt;.  Pgn
20c90 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a  o pgnoOvfl = 0;.
20ca0 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 20    int nHeader;. 
20cb0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
20cc0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
20cd0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
20ce0 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
20cf0 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69   );..  /* Fill i
20d00 6e 20 74 68 65 20 68 65 61 64 65 72 2e 20 2a 2f  n the header. */
20d10 0a 20 20 6e 48 65 61 64 65 72 20 3d 20 30 3b 0a  .  nHeader = 0;.
20d20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
20d30 61 66 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  af ){.    nHeade
20d40 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20 20 69 66  r += 4;.  }.  if
20d50 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74 61  ( pPage->hasData
20d60 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20   ){.    nHeader 
20d70 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70 43  += putVarint(&pC
20d80 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 6e 44  ell[nHeader], nD
20d90 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65  ata+nZero);.  }e
20da0 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74 61 20 3d  lse{.    nData =
20db0 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a   nZero = 0;.  }.
20dc0 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
20dd0 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
20de0 65 61 64 65 72 5d 2c 20 2a 28 75 36 34 2a 29 26  eader], *(u64*)&
20df0 6e 4b 65 79 29 3b 0a 20 20 73 71 6c 69 74 65 33  nKey);.  sqlite3
20e00 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
20e10 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20  r(pPage, pCell, 
20e20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73 65 72 74  &info);.  assert
20e30 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3d 3d  ( info.nHeader==
20e40 6e 48 65 61 64 65 72 20 29 3b 0a 20 20 61 73 73  nHeader );.  ass
20e50 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  ert( info.nKey==
20e60 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74  nKey );.  assert
20e70 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d 3d 6e 44  ( info.nData==nD
20e80 61 74 61 2b 6e 5a 65 72 6f 20 29 3b 0a 20 20 0a  ata+nZero );.  .
20e90 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
20ea0 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50   payload */.  nP
20eb0 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b  ayload = nData +
20ec0 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50   nZero;.  if( pP
20ed0 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
20ee0 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b     pSrc = pData;
20ef0 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74  .    nSrc = nDat
20f00 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30  a;.    nData = 0
20f10 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e  ;.  }else{.    n
20f20 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b  Payload += nKey;
20f30 0a 20 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79  .    pSrc = pKey
20f40 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 4b 65  ;.    nSrc = nKe
20f50 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69 7a 65  y;.  }.  *pnSize
20f60 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20   = info.nSize;. 
20f70 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69 6e 66   spaceLeft = inf
20f80 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50 61 79  o.nLocal;.  pPay
20f90 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b 6e 48  load = &pCell[nH
20fa0 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69 6f 72  eader];.  pPrior
20fb0 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69   = &pCell[info.i
20fc0 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68  Overflow];..  wh
20fd0 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e 30 20  ile( nPayload>0 
20fe0 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61 63 65  ){.    if( space
20ff0 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Left==0 ){.     
21000 20 69 6e 74 20 69 73 45 78 61 63 74 20 3d 20 30   int isExact = 0
21010 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
21020 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
21030 0a 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  .      Pgno pgno
21040 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66  Ptrmap = pgnoOvf
21050 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70  l; /* Overflow p
21060 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  age pointer-map 
21070 65 6e 74 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  entry page */.  
21080 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
21090 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
210a0 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20     do{.         
210b0 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20   pgnoOvfl++;.   
210c0 20 20 20 20 20 7d 20 77 68 69 6c 65 28 20 0a 20       } while( . 
210d0 20 20 20 20 20 20 20 20 20 50 54 52 4d 41 50 5f           PTRMAP_
210e0 49 53 50 41 47 45 28 70 42 74 2c 20 70 67 6e 6f  ISPAGE(pBt, pgno
210f0 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66  Ovfl) || pgnoOvf
21100 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  l==PENDING_BYTE_
21110 50 41 47 45 28 70 42 74 29 20 0a 20 20 20 20 20  PAGE(pBt) .     
21120 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66     );.        if
21130 28 20 70 67 6e 6f 4f 76 66 6c 3e 31 20 29 7b 0a  ( pgnoOvfl>1 ){.
21140 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 73 45            /* isE
21150 78 61 63 74 20 3d 20 31 3b 20 2a 2f 0a 20 20 20  xact = 1; */.   
21160 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
21170 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d  endif.      rc =
21180 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
21190 67 65 28 70 42 74 2c 20 26 70 4f 76 66 6c 2c 20  ge(pBt, &pOvfl, 
211a0 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f  &pgnoOvfl, pgnoO
211b0 76 66 6c 2c 20 69 73 45 78 61 63 74 29 3b 0a 23  vfl, isExact);.#
211c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
211d0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
211e0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61      /* If the da
211f0 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
21200 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 61 6e 64  auto-vacuum, and
21210 20 74 68 65 20 73 65 63 6f 6e 64 20 6f 72 20 73   the second or s
21220 75 62 73 65 71 75 65 6e 74 0a 20 20 20 20 20 20  ubsequent.      
21230 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
21240 20 69 73 20 62 65 69 6e 67 20 61 6c 6c 6f 63 61   is being alloca
21250 74 65 64 2c 20 61 64 64 20 61 6e 20 65 6e 74 72  ted, add an entr
21260 79 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  y to the pointer
21270 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a 20 66 6f  -map.      ** fo
21280 72 20 74 68 61 74 20 70 61 67 65 20 6e 6f 77 2e  r that page now.
21290 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20   .      **.     
212a0 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   ** If this is t
212b0 68 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f  he first overflo
212c0 77 20 70 61 67 65 2c 20 74 68 65 6e 20 77 72 69  w page, then wri
212d0 74 65 20 61 20 70 61 72 74 69 61 6c 20 65 6e 74  te a partial ent
212e0 72 79 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ry .      ** to 
212f0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 2e  the pointer-map.
21300 20 49 66 20 77 65 20 77 72 69 74 65 20 6e 6f 74   If we write not
21310 68 69 6e 67 20 74 6f 20 74 68 69 73 20 70 6f 69  hing to this poi
21320 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20  nter-map slot,. 
21330 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65       ** then the
21340 20 6f 70 74 69 6d 69 73 74 69 63 20 6f 76 65 72   optimistic over
21350 66 6c 6f 77 20 63 68 61 69 6e 20 70 72 6f 63 65  flow chain proce
21360 73 73 69 6e 67 20 69 6e 20 63 6c 65 61 72 43 65  ssing in clearCe
21370 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a 20 6d 61  ll().      ** ma
21380 79 20 6d 69 73 69 6e 74 65 72 70 72 65 74 20 74  y misinterpret t
21390 68 65 20 75 6e 69 6e 69 74 69 61 6c 69 73 65 64  he uninitialised
213a0 20 76 61 6c 75 65 73 20 61 6e 64 20 64 65 6c 65   values and dele
213b0 74 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  te the.      ** 
213c0 77 72 6f 6e 67 20 70 61 67 65 73 20 66 72 6f 6d  wrong pages from
213d0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
213e0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
213f0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
21400 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  m && rc==SQLITE_
21410 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  OK ){.        u8
21420 20 65 54 79 70 65 20 3d 20 28 70 67 6e 6f 50 74   eType = (pgnoPt
21430 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f 56 45 52  rmap?PTRMAP_OVER
21440 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f 4f 56 45  FLOW2:PTRMAP_OVE
21450 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20 20 20 20  RFLOW1);.       
21460 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
21470 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 65  pBt, pgnoOvfl, e
21480 54 79 70 65 2c 20 70 67 6e 6f 50 74 72 6d 61 70  Type, pgnoPtrmap
21490 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
214a0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  c ){.          r
214b0 65 6c 65 61 73 65 50 61 67 65 28 70 4f 76 66 6c  eleasePage(pOvfl
214c0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
214d0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
214e0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
214f0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
21500 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
21510 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
21520 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75        }.      pu
21530 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c 20 70  t4byte(pPrior, p
21540 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20  gnoOvfl);.      
21550 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
21560 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 70  elease);.      p
21570 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f 76 66  ToRelease = pOvf
21580 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f 72 20  l;.      pPrior 
21590 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61 3b 0a  = pOvfl->aData;.
215a0 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
215b0 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20 20 20  Prior, 0);.     
215c0 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 4f 76   pPayload = &pOv
215d0 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a 20 20  fl->aData[4];.  
215e0 20 20 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20      spaceLeft = 
215f0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
21600 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e  - 4;.    }.    n
21610 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20   = nPayload;.   
21620 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65 66 74   if( n>spaceLeft
21630 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65 66 74   ) n = spaceLeft
21640 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30  ;.    if( nSrc>0
21650 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e   ){.      if( n>
21660 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b  nSrc ) n = nSrc;
21670 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21680 53 72 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d  Src );.      mem
21690 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53  cpy(pPayload, pS
216a0 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73  rc, n);.    }els
216b0 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  e{.      memset(
216c0 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b  pPayload, 0, n);
216d0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c  .    }.    nPayl
216e0 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50  oad -= n;.    pP
216f0 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20  ayload += n;.   
21700 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20   pSrc += n;.    
21710 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73  nSrc -= n;.    s
21720 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20  paceLeft -= n;. 
21730 20 20 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 29     if( nSrc==0 )
21740 7b 0a 20 20 20 20 20 20 6e 53 72 63 20 3d 20 6e  {.      nSrc = n
21750 44 61 74 61 3b 0a 20 20 20 20 20 20 70 53 72 63  Data;.      pSrc
21760 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a   = pData;.    }.
21770 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
21780 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20  e(pToRelease);. 
21790 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
217a0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
217b0 67 65 20 74 68 65 20 4d 65 6d 50 61 67 65 2e 70  ge the MemPage.p
217c0 50 61 72 65 6e 74 20 70 6f 69 6e 74 65 72 20 6f  Parent pointer o
217d0 6e 20 74 68 65 20 70 61 67 65 20 77 68 6f 73 65  n the page whose
217e0 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 67 69   number is.** gi
217f0 76 65 6e 20 69 6e 20 74 68 65 20 73 65 63 6f 6e  ven in the secon
21800 64 20 61 72 67 75 6d 65 6e 74 20 73 6f 20 74 68  d argument so th
21810 61 74 20 4d 65 6d 50 61 67 65 2e 70 50 61 72 65  at MemPage.pPare
21820 6e 74 20 68 6f 6c 64 73 20 74 68 65 0a 2a 2a 20  nt holds the.** 
21830 70 6f 69 6e 74 65 72 20 69 6e 20 74 68 65 20 74  pointer in the t
21840 68 69 72 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  hird argument..*
21850 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 70  /.static int rep
21860 61 72 65 6e 74 50 61 67 65 28 42 74 53 68 61 72  arentPage(BtShar
21870 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70 67  ed *pBt, Pgno pg
21880 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65  no, MemPage *pNe
21890 77 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 64 78  wParent, int idx
218a0 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  ){.  MemPage *pT
218b0 68 69 73 3b 0a 20 20 44 62 50 61 67 65 20 2a 70  his;.  DbPage *p
218c0 44 62 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72  DbPage;..  asser
218d0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
218e0 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
218f0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
21900 4e 65 77 50 61 72 65 6e 74 21 3d 30 20 29 3b 0a  NewParent!=0 );.
21910 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20 29 20    if( pgno==0 ) 
21920 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
21930 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
21940 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20  >pPager!=0 );.  
21950 70 44 62 50 61 67 65 20 3d 20 73 71 6c 69 74 65  pDbPage = sqlite
21960 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 70 42 74  3PagerLookup(pBt
21970 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  ->pPager, pgno);
21980 0a 20 20 69 66 28 20 70 44 62 50 61 67 65 20 29  .  if( pDbPage )
21990 7b 0a 20 20 20 20 70 54 68 69 73 20 3d 20 28 4d  {.    pThis = (M
219a0 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33  emPage *)sqlite3
219b0 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44  PagerGetExtra(pD
219c0 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
219d0 70 54 68 69 73 2d 3e 69 73 49 6e 69 74 20 29 7b  pThis->isInit ){
219e0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
219f0 54 68 69 73 2d 3e 61 44 61 74 61 3d 3d 73 71 6c  This->aData==sql
21a00 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
21a10 28 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  (pDbPage) );.   
21a20 20 20 20 69 66 28 20 70 54 68 69 73 2d 3e 70 50     if( pThis->pP
21a30 61 72 65 6e 74 21 3d 70 4e 65 77 50 61 72 65 6e  arent!=pNewParen
21a40 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  t ){.        if(
21a50 20 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 20   pThis->pParent 
21a60 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  ) sqlite3PagerUn
21a70 72 65 66 28 70 54 68 69 73 2d 3e 70 50 61 72 65  ref(pThis->pPare
21a80 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nt->pDbPage);.  
21a90 20 20 20 20 20 20 70 54 68 69 73 2d 3e 70 50 61        pThis->pPa
21aa0 72 65 6e 74 20 3d 20 70 4e 65 77 50 61 72 65 6e  rent = pNewParen
21ab0 74 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  t;.        sqlit
21ac0 65 33 50 61 67 65 72 52 65 66 28 70 4e 65 77 50  e3PagerRef(pNewP
21ad0 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b  arent->pDbPage);
21ae0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
21af0 54 68 69 73 2d 3e 69 64 78 50 61 72 65 6e 74 20  This->idxParent 
21b00 3d 20 69 64 78 3b 0a 20 20 20 20 7d 0a 20 20 20  = idx;.    }.   
21b10 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
21b20 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 7d  ef(pDbPage);.  }
21b30 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
21b40 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
21b50 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
21b60 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 65  Vacuum ){.    re
21b70 74 75 72 6e 20 70 74 72 6d 61 70 50 75 74 28 70  turn ptrmapPut(p
21b80 42 74 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50  Bt, pgno, PTRMAP
21b90 5f 42 54 52 45 45 2c 20 70 4e 65 77 50 61 72 65  _BTREE, pNewPare
21ba0 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a 23  nt->pgno);.  }.#
21bb0 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
21bc0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f  QLITE_OK;.}..../
21bd0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
21be0 70 50 61 72 65 6e 74 20 70 6f 69 6e 74 65 72 20  pParent pointer 
21bf0 6f 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  of all children 
21c00 6f 66 20 70 50 61 67 65 20 74 6f 20 70 6f 69 6e  of pPage to poin
21c10 74 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 70 50 61  t back.** to pPa
21c20 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68  ge..**.** In oth
21c30 65 72 20 77 6f 72 64 73 2c 20 66 6f 72 20 65 76  er words, for ev
21c40 65 72 79 20 63 68 69 6c 64 20 6f 66 20 70 50 61  ery child of pPa
21c50 67 65 2c 20 69 6e 76 6f 6b 65 20 72 65 70 61 72  ge, invoke repar
21c60 65 6e 74 50 61 67 65 28 29 0a 2a 2a 20 74 6f 20  entPage().** to 
21c70 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 65  make sure that e
21c80 61 63 68 20 63 68 69 6c 64 20 6b 6e 6f 77 73 20  ach child knows 
21c90 74 68 61 74 20 70 50 61 67 65 20 69 73 20 69 74  that pPage is it
21ca0 73 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  s parent..**.** 
21cb0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74  This routine get
21cc0 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 79  s called after y
21cd0 6f 75 20 6d 65 6d 63 70 79 28 29 20 6f 6e 65 20  ou memcpy() one 
21ce0 70 61 67 65 20 69 6e 74 6f 0a 2a 2a 20 61 6e 6f  page into.** ano
21cf0 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ther..*/.static 
21d00 69 6e 74 20 72 65 70 61 72 65 6e 74 43 68 69 6c  int reparentChil
21d10 64 50 61 67 65 73 28 4d 65 6d 50 61 67 65 20 2a  dPages(MemPage *
21d20 70 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b  pPage){.  int i;
21d30 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
21d40 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
21d50 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
21d60 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  _OK;..  assert( 
21d70 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
21d80 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
21d90 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
21da0 50 61 67 65 2d 3e 6c 65 61 66 20 29 20 72 65 74  Page->leaf ) ret
21db0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
21dc0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
21dd0 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ge->nCell; i++){
21de0 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
21df0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
21e00 20 69 29 3b 0a 20 20 20 20 72 63 20 3d 20 72 65   i);.    rc = re
21e10 70 61 72 65 6e 74 50 61 67 65 28 70 42 74 2c 20  parentPage(pBt, 
21e20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c  get4byte(pCell),
21e30 20 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20   pPage, i);.    
21e40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
21e50 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
21e60 20 7d 0a 20 20 72 63 20 3d 20 72 65 70 61 72 65   }.  rc = repare
21e70 6e 74 50 61 67 65 28 70 42 74 2c 20 67 65 74 34  ntPage(pBt, get4
21e80 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
21e90 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
21ea0 73 65 74 2b 38 5d 29 2c 20 0a 20 20 20 20 20 20  set+8]), .      
21eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
21ec0 61 67 65 2c 20 69 29 3b 0a 20 20 70 50 61 67 65  age, i);.  pPage
21ed0 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a  ->idxShift = 0;.
21ee0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
21ef0 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
21f00 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20   i-th cell from 
21f10 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75  pPage.  This rou
21f20 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50 61  tine effects pPa
21f30 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20  ge only..** The 
21f40 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20  cell content is 
21f50 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65 61  not freed or dea
21f60 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73  llocated.  It is
21f70 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a   assumed that.**
21f80 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
21f90 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65  t has been copie
21fa0 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65  d someplace else
21fb0 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
21fc0 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20  just.** removes 
21fd0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  the reference to
21fe0 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70   the cell from p
21ff0 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22  Page..**.** "sz"
22000 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d   must be the num
22010 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
22020 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61  the cell..*/.sta
22030 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c  tic void dropCel
22040 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
22050 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73  , int idx, int s
22060 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  z){.  int i;    
22070 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
22080 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70  unter */.  int p
22090 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  c;         /* Of
220a0 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e  fset to cell con
220b0 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69  tent of cell bei
220c0 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20  ng deleted */.  
220d0 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
220e0 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  /* pPage->aData 
220f0 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20  */.  u8 *ptr;   
22100 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
22110 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e  move bytes aroun
22120 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20  d within data[] 
22130 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  */..  assert( id
22140 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67  x>=0 && idx<pPag
22150 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
22160 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69  sert( sz==cellSi
22170 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20 29  ze(pPage, idx) )
22180 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
22190 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
221a0 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
221b0 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
221c0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
221d0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
221e0 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61  mutex) );.  data
221f0 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
22200 0a 20 20 70 74 72 20 3d 20 26 64 61 74 61 5b 70  .  ptr = &data[p
22210 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
22220 20 2b 20 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20   + 2*idx];.  pc 
22230 3d 20 67 65 74 32 62 79 74 65 28 70 74 72 29 3b  = get2byte(ptr);
22240 0a 20 20 61 73 73 65 72 74 28 20 70 63 3e 31 30  .  assert( pc>10
22250 20 26 26 20 70 63 2b 73 7a 3c 3d 70 50 61 67 65   && pc+sz<=pPage
22260 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
22270 65 20 29 3b 0a 20 20 66 72 65 65 53 70 61 63 65  e );.  freeSpace
22280 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b  (pPage, pc, sz);
22290 0a 20 20 66 6f 72 28 69 3d 69 64 78 2b 31 3b 20  .  for(i=idx+1; 
222a0 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
222b0 69 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b 0a 20 20  i++, ptr+=2){.  
222c0 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 32    ptr[0] = ptr[2
222d0 5d 3b 0a 20 20 20 20 70 74 72 5b 31 5d 20 3d 20  ];.    ptr[1] = 
222e0 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20 20 70 50  ptr[3];.  }.  pP
222f0 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20  age->nCell--;.  
22300 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
22310 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
22320 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  3], pPage->nCell
22330 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
22340 65 20 2b 3d 20 32 3b 0a 20 20 70 50 61 67 65 2d  e += 2;.  pPage-
22350 3e 69 64 78 53 68 69 66 74 20 3d 20 31 3b 0a 7d  >idxShift = 1;.}
22360 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61  ../*.** Insert a
22370 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61   new cell on pPa
22380 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78  ge at cell index
22390 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69   "i".  pCell poi
223a0 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f  nts to the.** co
223b0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c  ntent of the cel
223c0 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  l..**.** If the 
223d0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c  cell content wil
223e0 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67  l fit on the pag
223f0 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20 74  e, then put it t
22400 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20  here.  If it.** 
22410 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68  will not fit, th
22420 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f  en make a copy o
22430 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
22440 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66  nt into pTemp if
22450 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74  .** pTemp is not
22460 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65   null.  Regardle
22470 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c  ss of pTemp, all
22480 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72  ocate a new entr
22490 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61  y.** in pPage->a
224a0 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20  Ovfl[] and make 
224b0 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  it point to the 
224c0 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69  cell content (ei
224d0 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70  ther.** in pTemp
224e0 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   or the original
224f0 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f   pCell) and also
22500 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65   record its inde
22510 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e  x. .** Allocatin
22520 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e  g a new entry in
22530 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20   pPage->aCell[] 
22540 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a  implies that .**
22550 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
22560 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  w is incremented
22570 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70  ..**.** If nSkip
22580 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
22590 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74  en do not copy t
225a0 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62  he first nSkip b
225b0 79 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63  ytes of the.** c
225c0 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  ell. The caller 
225d0 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74  will overwrite t
225e0 68 65 6d 20 61 66 74 65 72 20 74 68 69 73 20 66  hem after this f
225f0 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
22600 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20   If.** nSkip is 
22610 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70  non-zero, then p
22620 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69  Cell may not poi
22630 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64  nt to an invalid
22640 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
22650 20 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b   .** (but pCell+
22660 6e 53 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20  nSkip is always 
22670 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69  valid)..*/.stati
22680 63 20 69 6e 74 20 69 6e 73 65 72 74 43 65 6c 6c  c int insertCell
22690 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
226a0 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e  ge,   /* Page in
226b0 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20  to which we are 
226c0 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  copying */.  int
226d0 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f   i,            /
226e0 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d  * New cell becom
226f0 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c  es the i-th cell
22700 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
22710 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20    u8 *pCell,    
22720 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f      /* Content o
22730 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a  f the new cell *
22740 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20  /.  int sz,     
22750 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
22760 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65  f content in pCe
22770 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d  ll */.  u8 *pTem
22780 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d  p,        /* Tem
22790 70 20 73 74 6f 72 61 67 65 20 73 70 61 63 65 20  p storage space 
227a0 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65  for pCell, if ne
227b0 65 64 65 64 20 2a 2f 0a 20 20 75 38 20 6e 53 6b  eded */.  u8 nSk
227c0 69 70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  ip          /* D
227d0 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20  o not write the 
227e0 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65  first nSkip byte
227f0 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f  s of the cell */
22800 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 3b 20 20  .){.  int idx;  
22810 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65          /* Where
22820 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65   to write new ce
22830 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61  ll content in da
22840 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b  ta[] */.  int j;
22850 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
22860 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
22870 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20   int top;       
22880 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
22890 20 6f 66 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20   of content for 
228a0 61 6e 79 20 63 65 6c 6c 20 69 6e 20 64 61 74 61  any cell in data
228b0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b  [] */.  int end;
228c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
228d0 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
228e0 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74   last cell point
228f0 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  er in data[] */.
22900 20 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20    int ins;      
22910 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20      /* Index in 
22920 64 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77  data[] where new
22930 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73   cell pointer is
22940 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69   inserted */.  i
22950 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
22960 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20   /* Offset into 
22970 64 61 74 61 5b 5d 20 6f 66 20 74 68 65 20 70 61  data[] of the pa
22980 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ge header */.  i
22990 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20  nt cellOffset;  
229a0 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66   /* Address of f
229b0 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  irst cell pointe
229c0 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  r in data[] */. 
229d0 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
229e0 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e     /* The conten
229f0 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70  t of the whole p
22a00 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72  age */.  u8 *ptr
22a10 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73  ;          /* Us
22a20 65 64 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e  ed for moving in
22a30 66 6f 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64  formation around
22a40 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20   in data[] */.. 
22a50 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26   assert( i>=0 &&
22a60 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c   i<=pPage->nCell
22a70 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f  +pPage->nOverflo
22a80 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  w );.  assert( s
22a90 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  z==cellSizePtr(p
22aa0 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 29 3b 0a  Page, pCell) );.
22ab0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
22ac0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
22ad0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
22ae0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
22af0 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b  nOverflow || sz+
22b00 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29  2>pPage->nFree )
22b10 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d 70 20  {.    if( pTemp 
22b20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
22b30 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70 43 65  pTemp+nSkip, pCe
22b40 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b  ll+nSkip, sz-nSk
22b50 69 70 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c  ip);.      pCell
22b60 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 7d 0a   = pTemp;.    }.
22b70 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d 3e 6e      j = pPage->n
22b80 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20  Overflow++;.    
22b90 61 73 73 65 72 74 28 20 6a 3c 73 69 7a 65 6f 66  assert( j<sizeof
22ba0 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 29 2f 73  (pPage->aOvfl)/s
22bb0 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76  izeof(pPage->aOv
22bc0 66 6c 5b 30 5d 29 20 29 3b 0a 20 20 20 20 70 50  fl[0]) );.    pP
22bd0 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43  age->aOvfl[j].pC
22be0 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 20  ell = pCell;.   
22bf0 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d   pPage->aOvfl[j]
22c00 2e 69 64 78 20 3d 20 69 3b 0a 20 20 20 20 70 50  .idx = i;.    pP
22c10 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a  age->nFree = 0;.
22c20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
22c30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
22c40 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
22c50 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
22c60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
22c70 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
22c80 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  c;.    }.    ass
22c90 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
22ca0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
22cb0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
22cc0 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65      data = pPage
22cd0 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 68 64 72  ->aData;.    hdr
22ce0 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
22cf0 73 65 74 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67  set;.    top = g
22d00 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
22d10 72 2b 35 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 4f  r+5]);.    cellO
22d20 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63  ffset = pPage->c
22d30 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65  ellOffset;.    e
22d40 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  nd = cellOffset 
22d50 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  + 2*pPage->nCell
22d60 20 2b 20 32 3b 0a 20 20 20 20 69 6e 73 20 3d 20   + 2;.    ins = 
22d70 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69  cellOffset + 2*i
22d80 3b 0a 20 20 20 20 69 66 28 20 65 6e 64 20 3e 20  ;.    if( end > 
22d90 74 6f 70 20 2d 20 73 7a 20 29 7b 0a 20 20 20 20  top - sz ){.    
22da0 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e    rc = defragmen
22db0 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
22dc0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
22dd0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
22de0 63 3b 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 67  c;.      top = g
22df0 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
22e00 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 61 73 73  r+5]);.      ass
22e10 65 72 74 28 20 65 6e 64 20 2b 20 73 7a 20 3c 3d  ert( end + sz <=
22e20 20 74 6f 70 20 29 3b 0a 20 20 20 20 7d 0a 20 20   top );.    }.  
22e30 20 20 69 64 78 20 3d 20 61 6c 6c 6f 63 61 74 65    idx = allocate
22e40 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a 29  Space(pPage, sz)
22e50 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64  ;.    assert( id
22e60 78 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  x>0 );.    asser
22e70 74 28 20 65 6e 64 20 3c 3d 20 67 65 74 32 62 79  t( end <= get2by
22e80 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
22e90 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e   );.    pPage->n
22ea0 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67  Cell++;.    pPag
22eb0 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 3b 0a 20  e->nFree -= 2;. 
22ec0 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
22ed0 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c  idx+nSkip], pCel
22ee0 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69  l+nSkip, sz-nSki
22ef0 70 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 65 6e  p);.    for(j=en
22f00 64 2d 32 2c 20 70 74 72 3d 26 64 61 74 61 5b 6a  d-2, ptr=&data[j
22f10 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d 3d 32 2c 20  ]; j>ins; j-=2, 
22f20 70 74 72 2d 3d 32 29 7b 0a 20 20 20 20 20 20 70  ptr-=2){.      p
22f30 74 72 5b 30 5d 20 3d 20 70 74 72 5b 2d 32 5d 3b  tr[0] = ptr[-2];
22f40 0a 20 20 20 20 20 20 70 74 72 5b 31 5d 20 3d 20  .      ptr[1] = 
22f50 70 74 72 5b 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20  ptr[-1];.    }. 
22f60 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
22f70 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20  a[ins], idx);.  
22f80 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
22f90 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e  [hdr+3], pPage->
22fa0 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70 50 61 67  nCell);.    pPag
22fb0 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 31 3b  e->idxShift = 1;
22fc0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
22fd0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
22fe0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70      if( pPage->p
22ff0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
23000 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63  {.      /* The c
23010 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ell may contain 
23020 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
23030 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 20 49  overflow page. I
23040 66 20 73 6f 2c 20 77 72 69 74 65 0a 20 20 20 20  f so, write.    
23050 20 20 2a 2a 20 74 68 65 20 65 6e 74 72 79 20 66    ** the entry f
23060 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
23070 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 6f  page into the po
23080 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20 20 20 20  inter map..     
23090 20 2a 2f 0a 20 20 20 20 20 20 43 65 6c 6c 49 6e   */.      CellIn
230a0 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 73  fo info;.      s
230b0 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
230c0 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
230d0 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
230e0 20 20 20 20 61 73 73 65 72 74 28 20 28 69 6e 66      assert( (inf
230f0 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e  o.nData+(pPage->
23100 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b  intKey?0:info.nK
23110 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c  ey))==info.nPayl
23120 6f 61 64 20 29 3b 0a 20 20 20 20 20 20 69 66 28  oad );.      if(
23130 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50   (info.nData+(pP
23140 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e  age->intKey?0:in
23150 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e  fo.nKey))>info.n
23160 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 20  Local ){.       
23170 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d   Pgno pgnoOvfl =
23180 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c   get4byte(&pCell
23190 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
231a0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
231b0 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d  ptrmapPut(pPage-
231c0 3e 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20  >pBt, pgnoOvfl, 
231d0 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
231e0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
231f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
23200 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
23210 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
23220 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
23230 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
23240 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  _OK;.}../*.** Ad
23250 64 20 61 20 6c 69 73 74 20 6f 66 20 63 65 6c 6c  d a list of cell
23260 73 20 74 6f 20 61 20 70 61 67 65 2e 20 20 54 68  s to a page.  Th
23270 65 20 70 61 67 65 20 73 68 6f 75 6c 64 20 62 65  e page should be
23280 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d 70 74 79   initially empty
23290 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c 73 20 61  ..** The cells a
232a0 72 65 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  re guaranteed to
232b0 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65   fit on the page
232c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
232d0 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 0a 20   assemblePage(. 
232e0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
232f0 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74     /* The page t
23300 6f 20 62 65 20 61 73 73 65 6d 62 6c 69 65 64 20  o be assemblied 
23310 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 2c 20  */.  int nCell, 
23320 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 75         /* The nu
23330 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 74 6f  mber of cells to
23340 20 61 64 64 20 74 6f 20 74 68 69 73 20 70 61 67   add to this pag
23350 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
23360 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ll,      /* Poin
23370 74 65 72 73 20 74 6f 20 63 65 6c 6c 20 62 6f 64  ters to cell bod
23380 69 65 73 20 2a 2f 0a 20 20 75 31 36 20 2a 61 53  ies */.  u16 *aS
23390 69 7a 65 20 20 20 20 20 20 20 20 2f 2a 20 53 69  ize        /* Si
233a0 7a 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 73  zes of the cells
233b0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20   */.){.  int i; 
233c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
233d0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
233e0 69 6e 74 20 74 6f 74 61 6c 53 69 7a 65 3b 20 20  int totalSize;  
233f0 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
23400 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a  of all cells */.
23410 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
23420 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
23430 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20  page header */. 
23440 20 69 6e 74 20 63 65 6c 6c 70 74 72 3b 20 20 20   int cellptr;   
23450 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
23460 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f 69 6e 74   next cell point
23470 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  er */.  int cell
23480 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20 41 64 64  body;     /* Add
23490 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c  ress of next cel
234a0 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75 38 20 2a  l body */.  u8 *
234b0 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a  data;         /*
234c0 20 44 61 74 61 20 66 6f 72 20 74 68 65 20 70 61   Data for the pa
234d0 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ge */..  assert(
234e0 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
234f0 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  w==0 );.  assert
23500 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
23510 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
23520 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 6f 74  >mutex) );.  tot
23530 61 6c 53 69 7a 65 20 3d 20 30 3b 0a 20 20 66 6f  alSize = 0;.  fo
23540 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  r(i=0; i<nCell; 
23550 69 2b 2b 29 7b 0a 20 20 20 20 74 6f 74 61 6c 53  i++){.    totalS
23560 69 7a 65 20 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b  ize += aSize[i];
23570 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 74  .  }.  assert( t
23580 6f 74 61 6c 53 69 7a 65 2b 32 2a 6e 43 65 6c 6c  otalSize+2*nCell
23590 3c 3d 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 29  <=pPage->nFree )
235a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
235b0 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20  e->nCell==0 );. 
235c0 20 63 65 6c 6c 70 74 72 20 3d 20 70 50 61 67 65   cellptr = pPage
235d0 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
235e0 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
235f0 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
23600 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
23610 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
23620 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a  hdr+3], nCell);.
23630 20 20 69 66 28 20 6e 43 65 6c 6c 20 29 7b 0a 20    if( nCell ){. 
23640 20 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20 61 6c     cellbody = al
23650 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67  locateSpace(pPag
23660 65 2c 20 74 6f 74 61 6c 53 69 7a 65 29 3b 0a 20  e, totalSize);. 
23670 20 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c 62     assert( cellb
23680 6f 64 79 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  ody>0 );.    ass
23690 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65  ert( pPage->nFre
236a0 65 20 3e 3d 20 32 2a 6e 43 65 6c 6c 20 29 3b 0a  e >= 2*nCell );.
236b0 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65      pPage->nFree
236c0 20 2d 3d 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 20   -= 2*nCell;.   
236d0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
236e0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70  l; i++){.      p
236f0 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 63 65  ut2byte(&data[ce
23700 6c 6c 70 74 72 5d 2c 20 63 65 6c 6c 62 6f 64 79  llptr], cellbody
23710 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
23720 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c  &data[cellbody],
23730 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61 53 69 7a   apCell[i], aSiz
23740 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 63 65 6c  e[i]);.      cel
23750 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20 20  lptr += 2;.     
23760 20 63 65 6c 6c 62 6f 64 79 20 2b 3d 20 61 53 69   cellbody += aSi
23770 7a 65 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  ze[i];.    }.   
23780 20 61 73 73 65 72 74 28 20 63 65 6c 6c 62 6f 64   assert( cellbod
23790 79 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  y==pPage->pBt->u
237a0 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 7d  sableSize );.  }
237b0 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  .  pPage->nCell 
237c0 3d 20 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  = nCell;.}../*.*
237d0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
237e0 70 61 72 61 6d 65 74 65 72 73 20 64 65 74 65 72  parameters deter
237f0 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79 20 61 64  mine how many ad
23800 6a 61 63 65 6e 74 20 70 61 67 65 73 20 67 65 74  jacent pages get
23810 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20   involved.** in 
23820 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72  a balancing oper
23830 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73 20 74 68  ation.  NN is th
23840 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67  e number of neig
23850 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20  hbors on either 
23860 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68 65 20 70  side.** of the p
23870 61 67 65 20 74 68 61 74 20 70 61 72 74 69 63 69  age that partici
23880 70 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61  pate in the bala
23890 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 2e  ncing operation.
238a0 20 20 4e 42 20 69 73 20 74 68 65 0a 2a 2a 20 74    NB is the.** t
238b0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
238c0 61 67 65 73 20 74 68 61 74 20 70 61 72 74 69 63  ages that partic
238d0 69 70 61 74 65 2c 20 69 6e 63 6c 75 64 69 6e 67  ipate, including
238e0 20 74 68 65 20 74 61 72 67 65 74 20 70 61 67 65   the target page
238f0 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68   and.** NN neigh
23900 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
23910 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  ide..**.** The m
23920 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20 6f 66 20  inimum value of 
23930 4e 4e 20 69 73 20 31 20 28 6f 66 20 63 6f 75 72  NN is 1 (of cour
23940 73 65 29 2e 20 20 49 6e 63 72 65 61 73 69 6e 67  se).  Increasing
23950 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a 2a 20 28   NN above 1.** (
23960 74 6f 20 32 20 6f 72 20 33 29 20 67 69 76 65 73  to 2 or 3) gives
23970 20 61 20 6d 6f 64 65 73 74 20 69 6d 70 72 6f 76   a modest improv
23980 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45 43 54 20  ement in SELECT 
23990 61 6e 64 20 44 45 4c 45 54 45 20 70 65 72 66 6f  and DELETE perfo
239a0 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20 65 78 63  rmance.** in exc
239b0 68 61 6e 67 65 20 66 6f 72 20 61 20 6c 61 72 67  hange for a larg
239c0 65 72 20 64 65 67 72 61 64 61 74 69 6f 6e 20 69  er degradation i
239d0 6e 20 49 4e 53 45 52 54 20 61 6e 64 20 55 50 44  n INSERT and UPD
239e0 41 54 45 20 70 65 72 66 6f 72 6d 61 6e 63 65 2e  ATE performance.
239f0 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f 66  .** The value of
23a00 20 4e 4e 20 61 70 70 65 61 72 73 20 74 6f 20 67   NN appears to g
23a10 69 76 65 20 74 68 65 20 62 65 73 74 20 72 65 73  ive the best res
23a20 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f  ults overall..*/
23a30 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31 20 20 20  .#define NN 1   
23a40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
23a50 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72 73  ber of neighbors
23a60 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 20   on either side 
23a70 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23 64 65 66  of pPage */.#def
23a80 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b 31 29 20  ine NB (NN*2+1) 
23a90 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 70 61       /* Total pa
23aa0 67 65 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20  ges involved in 
23ab0 74 68 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a  the balance */..
23ac0 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
23ad0 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69  ence */.static i
23ae0 6e 74 20 62 61 6c 61 6e 63 65 28 4d 65 6d 50 61  nt balance(MemPa
23af0 67 65 2a 2c 20 69 6e 74 29 3b 0a 0a 23 69 66 6e  ge*, int);..#ifn
23b00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
23b10 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a  QUICKBALANCE./*.
23b20 2a 2a 20 54 68 69 73 20 76 65 72 73 69 6f 6e 20  ** This version 
23b30 6f 66 20 62 61 6c 61 6e 63 65 28 29 20 68 61 6e  of balance() han
23b40 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  dles the common 
23b50 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65  special case whe
23b60 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65 6e 74 72  re.** a new entr
23b70 79 20 69 73 20 62 65 69 6e 67 20 69 6e 73 65 72  y is being inser
23b80 74 65 64 20 6f 6e 20 74 68 65 20 65 78 74 72 65  ted on the extre
23b90 6d 65 20 72 69 67 68 74 2d 65 6e 64 20 6f 66 20  me right-end of 
23ba0 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20 69 6e 20  the.** tree, in 
23bb0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 77 68 65  other words, whe
23bc0 6e 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  n the new entry 
23bd0 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
23be0 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e 74 72 79  largest.** entry
23bf0 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a   in the tree..**
23c00 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 74  .** Instead of t
23c10 72 79 69 6e 67 20 62 61 6c 61 6e 63 65 20 74 68  rying balance th
23c20 65 20 33 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c  e 3 right-most l
23c30 65 61 66 20 70 61 67 65 73 2c 20 6a 75 73 74 20  eaf pages, just 
23c40 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20 70 61 67  add.** a new pag
23c50 65 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 68  e to the right-h
23c60 61 6e 64 20 73 69 64 65 20 61 6e 64 20 70 75 74  and side and put
23c70 20 74 68 65 20 6f 6e 65 20 6e 65 77 20 65 6e 74   the one new ent
23c80 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74 20 70 61  ry in.** that pa
23c90 67 65 2e 20 20 54 68 69 73 20 6c 65 61 76 65 73  ge.  This leaves
23ca0 20 74 68 65 20 72 69 67 68 74 20 73 69 64 65 20   the right side 
23cb0 6f 66 20 74 68 65 20 74 72 65 65 20 73 6f 6d 65  of the tree some
23cc0 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63  what.** unbalanc
23cd0 65 64 2e 20 20 42 75 74 20 6f 64 64 73 20 61 72  ed.  But odds ar
23ce0 65 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62  e that we will b
23cf0 65 20 69 6e 73 65 72 74 69 6e 67 20 6e 65 77 20  e inserting new 
23d00 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74 20 74 68  entries.** at th
23d10 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66 74 65 72  e end soon after
23d20 77 61 72 64 73 20 73 6f 20 74 68 65 20 6e 65 61  wards so the nea
23d30 72 6c 79 20 65 6d 70 74 79 20 70 61 67 65 20 77  rly empty page w
23d40 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66  ill quickly.** f
23d50 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61 76 65 72  ill up.  On aver
23d60 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65  age..**.** pPage
23d70 20 69 73 20 74 68 65 20 6c 65 61 66 20 70 61 67   is the leaf pag
23d80 65 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72  e which is the r
23d90 69 67 68 74 2d 6d 6f 73 74 20 70 61 67 65 20 69  ight-most page i
23da0 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a 2a 20 70  n the tree..** p
23db0 50 61 72 65 6e 74 20 69 73 20 69 74 73 20 70 61  Parent is its pa
23dc0 72 65 6e 74 2e 20 20 70 50 61 67 65 20 6d 75 73  rent.  pPage mus
23dd0 74 20 68 61 76 65 20 61 20 73 69 6e 67 6c 65 20  t have a single 
23de0 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72 79 0a 2a  overflow entry.*
23df0 2a 20 77 68 69 63 68 20 69 73 20 61 6c 73 6f 20  * which is also 
23e00 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  the right-most e
23e10 6e 74 72 79 20 6f 6e 20 74 68 65 20 70 61 67 65  ntry on the page
23e20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23e30 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 4d 65  balance_quick(Me
23e40 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 4d 65  mPage *pPage, Me
23e50 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 29 7b  mPage *pParent){
23e60 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d  .  int rc;.  Mem
23e70 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 50 67  Page *pNew;.  Pg
23e80 6e 6f 20 70 67 6e 6f 4e 65 77 3b 0a 20 20 75 38  no pgnoNew;.  u8
23e90 20 2a 70 43 65 6c 6c 3b 0a 20 20 75 31 36 20 73   *pCell;.  u16 s
23ea0 7a 43 65 6c 6c 3b 0a 20 20 43 65 6c 6c 49 6e 66  zCell;.  CellInf
23eb0 6f 20 69 6e 66 6f 3b 0a 20 20 42 74 53 68 61 72  o info;.  BtShar
23ec0 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d  ed *pBt = pPage-
23ed0 3e 70 42 74 3b 0a 20 20 69 6e 74 20 70 61 72 65  >pBt;.  int pare
23ee0 6e 74 49 64 78 20 3d 20 70 50 61 72 65 6e 74 2d  ntIdx = pParent-
23ef0 3e 6e 43 65 6c 6c 3b 20 20 20 2f 2a 20 70 50 61  >nCell;   /* pPa
23f00 72 65 6e 74 20 6e 65 77 20 64 69 76 69 64 65 72  rent new divider
23f10 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a 2f 0a 20   cell index */. 
23f20 20 69 6e 74 20 70 61 72 65 6e 74 53 69 7a 65 3b   int parentSize;
23f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f40 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6e 65     /* Size of ne
23f50 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a  w divider cell *
23f60 2f 0a 20 20 75 38 20 70 61 72 65 6e 74 43 65 6c  /.  u8 parentCel
23f70 6c 5b 36 34 5d 3b 20 20 20 20 20 20 20 20 20 20  l[64];          
23f80 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
23f90 6f 72 20 74 68 65 20 6e 65 77 20 64 69 76 69 64  or the new divid
23fa0 65 72 20 63 65 6c 6c 20 2a 2f 0a 0a 20 20 61 73  er cell */..  as
23fb0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
23fc0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
23fd0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  pBt->mutex) );..
23fe0 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20    /* Allocate a 
23ff0 6e 65 77 20 70 61 67 65 2e 20 49 6e 73 65 72 74  new page. Insert
24000 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
24010 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 0a 20 20  ll from pPage.  
24020 2a 2a 20 69 6e 74 6f 20 69 74 2e 20 54 68 65 6e  ** into it. Then
24030 20 72 65 6d 6f 76 65 20 74 68 65 20 6f 76 65 72   remove the over
24040 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70  flow cell from p
24050 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  Page..  */.  rc 
24060 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
24070 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20  age(pBt, &pNew, 
24080 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20 30 29 3b  &pgnoNew, 0, 0);
24090 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
240a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
240b0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43 65  rn rc;.  }.  pCe
240c0 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61 4f 76 66  ll = pPage->aOvf
240d0 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20 20 73 7a  l[0].pCell;.  sz
240e0 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69 7a 65 50  Cell = cellSizeP
240f0 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
24100 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65  ;.  zeroPage(pNe
24110 77 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  w, pPage->aData[
24120 30 5d 29 3b 0a 20 20 61 73 73 65 6d 62 6c 65 50  0]);.  assembleP
24130 61 67 65 28 70 4e 65 77 2c 20 31 2c 20 26 70 43  age(pNew, 1, &pC
24140 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 20  ell, &szCell);. 
24150 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
24160 77 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 53 65 74  w = 0;..  /* Set
24170 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 74   the parent of t
24180 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74  he newly allocat
24190 65 64 20 70 61 67 65 20 74 6f 20 70 50 61 72 65  ed page to pPare
241a0 6e 74 2e 20 2a 2f 0a 20 20 70 4e 65 77 2d 3e 70  nt. */.  pNew->p
241b0 50 61 72 65 6e 74 20 3d 20 70 50 61 72 65 6e 74  Parent = pParent
241c0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
241d0 52 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  Ref(pParent->pDb
241e0 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 20 70 50 61  Page);..  /* pPa
241f0 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ge is currently 
24200 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
24210 6f 66 20 70 50 61 72 65 6e 74 2e 20 43 68 61 6e  of pParent. Chan
24220 67 65 20 74 68 69 73 0a 20 20 2a 2a 20 73 6f 20  ge this.  ** so 
24230 74 68 61 74 20 74 68 65 20 72 69 67 68 74 2d 63  that the right-c
24240 68 69 6c 64 20 69 73 20 74 68 65 20 6e 65 77 20  hild is the new 
24250 70 61 67 65 20 61 6c 6c 6f 63 61 74 65 64 20 61  page allocated a
24260 62 6f 76 65 20 61 6e 64 0a 20 20 2a 2a 20 70 50  bove and.  ** pP
24270 61 67 65 20 69 73 20 74 68 65 20 6e 65 78 74 2d  age is the next-
24280 74 6f 2d 72 69 67 68 74 20 63 68 69 6c 64 2e 20  to-right child. 
24290 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
242a0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pPage->nCell>0 )
242b0 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64  ;.  pCell = find
242c0 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 50 61 67  Cell(pPage, pPag
242d0 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a 20 20 73  e->nCell-1);.  s
242e0 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
242f0 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
24300 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
24310 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65 6c 6c 28  rc = fillInCell(
24320 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74 43  pParent, parentC
24330 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65  ell, 0, info.nKe
24340 79 2c 20 30 2c 20 30 2c 20 30 2c 20 26 70 61 72  y, 0, 0, 0, &par
24350 65 6e 74 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  entSize);.  if( 
24360 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
24370 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
24380 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 61    }.  assert( pa
24390 72 65 6e 74 53 69 7a 65 3c 36 34 20 29 3b 0a 20  rentSize<64 );. 
243a0 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c   rc = insertCell
243b0 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65 6e 74  (pParent, parent
243c0 49 64 78 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c  Idx, parentCell,
243d0 20 70 61 72 65 6e 74 53 69 7a 65 2c 20 30 2c 20   parentSize, 0, 
243e0 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  4);.  if( rc!=SQ
243f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
24400 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
24410 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65  put4byte(findOve
24420 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e  rflowCell(pParen
24430 74 2c 70 61 72 65 6e 74 49 64 78 29 2c 20 70 50  t,parentIdx), pP
24440 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 70 75  age->pgno);.  pu
24450 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
24460 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
24470 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67  hdrOffset+8], pg
24480 6e 6f 4e 65 77 29 3b 0a 0a 23 69 66 6e 64 65 66  noNew);..#ifndef
24490 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
244a0 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 49 66 20  OVACUUM.  /* If 
244b0 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d  this is an auto-
244c0 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c  vacuum database,
244d0 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e   update the poin
244e0 74 65 72 20 6d 61 70 0a 20 20 2a 2a 20 77 69 74  ter map.  ** wit
244f0 68 20 65 6e 74 72 69 65 73 20 66 6f 72 20 74 68  h entries for th
24500 65 20 6e 65 77 20 70 61 67 65 2c 20 61 6e 64 20  e new page, and 
24510 61 6e 79 20 70 6f 69 6e 74 65 72 20 66 72 6f 6d  any pointer from
24520 20 74 68 65 20 0a 20 20 2a 2a 20 63 65 6c 6c 20   the .  ** cell 
24530 6f 6e 20 74 68 65 20 70 61 67 65 20 74 6f 20 61  on the page to a
24540 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  n overflow page.
24550 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
24560 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
24570 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
24580 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20  t(pBt, pgnoNew, 
24590 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50  PTRMAP_BTREE, pP
245a0 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  arent->pgno);.  
245b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
245c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
245d0 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28  = ptrmapPutOvfl(
245e0 70 4e 65 77 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  pNew, 0);.    }.
245f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
24600 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
24610 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 29  eleasePage(pNew)
24620 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
24630 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  c;.    }.  }.#en
24640 64 69 66 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73  dif..  /* Releas
24650 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  e the reference 
24660 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67 65 20  to the new page 
24670 61 6e 64 20 62 61 6c 61 6e 63 65 20 74 68 65 20  and balance the 
24680 70 61 72 65 6e 74 20 70 61 67 65 2c 0a 20 20 2a  parent page,.  *
24690 2a 20 69 6e 20 63 61 73 65 20 74 68 65 20 64 69  * in case the di
246a0 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 73 65 72  vider cell inser
246b0 74 65 64 20 63 61 75 73 65 64 20 69 74 20 74 6f  ted caused it to
246c0 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c   become overfull
246d0 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65 61 73 65  ..  */.  release
246e0 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 72 65  Page(pNew);.  re
246f0 74 75 72 6e 20 62 61 6c 61 6e 63 65 28 70 50 61  turn balance(pPa
24700 72 65 6e 74 2c 20 30 29 3b 0a 7d 0a 23 65 6e 64  rent, 0);.}.#end
24710 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
24720 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a  T_QUICKBALANCE *
24730 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  /../*.** This ro
24740 75 74 69 6e 65 20 72 65 64 69 73 74 72 69 62 75  utine redistribu
24750 74 65 73 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61  tes Cells on pPa
24760 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 4e 2a  ge and up to NN*
24770 32 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 6f 66  2 siblings.** of
24780 20 70 50 61 67 65 20 73 6f 20 74 68 61 74 20 61   pPage so that a
24790 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 61 62  ll pages have ab
247a0 6f 75 74 20 74 68 65 20 73 61 6d 65 20 61 6d 6f  out the same amo
247b0 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61 63  unt of free spac
247c0 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79 20 4e 4e  e..** Usually NN
247d0 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74   siblings on eit
247e0 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67  her side of pPag
247f0 65 20 69 73 20 75 73 65 64 20 69 6e 20 74 68 65  e is used in the
24800 20 62 61 6c 61 6e 63 69 6e 67 2c 0a 2a 2a 20 74   balancing,.** t
24810 68 6f 75 67 68 20 6d 6f 72 65 20 73 69 62 6c 69  hough more sibli
24820 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65 20 66  ngs might come f
24830 72 6f 6d 20 6f 6e 65 20 73 69 64 65 20 69 66 20  rom one side if 
24840 70 50 61 67 65 20 69 73 20 74 68 65 20 66 69 72  pPage is the fir
24850 73 74 0a 2a 2a 20 6f 72 20 6c 61 73 74 20 63 68  st.** or last ch
24860 69 6c 64 20 6f 66 20 69 74 73 20 70 61 72 65 6e  ild of its paren
24870 74 2e 20 20 49 66 20 70 50 61 67 65 20 68 61 73  t.  If pPage has
24880 20 66 65 77 65 72 20 74 68 61 6e 20 32 2a 4e 4e   fewer than 2*NN
24890 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 28 73 6f   siblings.** (so
248a0 6d 65 74 68 69 6e 67 20 77 68 69 63 68 20 63 61  mething which ca
248b0 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
248c0 20 70 50 61 67 65 20 69 73 20 74 68 65 20 72 6f   pPage is the ro
248d0 6f 74 20 70 61 67 65 20 6f 72 20 61 20 0a 2a 2a  ot page or a .**
248e0 20 63 68 69 6c 64 20 6f 66 20 72 6f 6f 74 29 20   child of root) 
248f0 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62  then all availab
24900 6c 65 20 73 69 62 6c 69 6e 67 73 20 70 61 72 74  le siblings part
24910 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62  icipate in the b
24920 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  alancing..**.** 
24930 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  The number of si
24940 62 6c 69 6e 67 73 20 6f 66 20 70 50 61 67 65 20  blings of pPage 
24950 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65 61 73  might be increas
24960 65 64 20 6f 72 20 64 65 63 72 65 61 73 65 64 20  ed or decreased 
24970 62 79 20 6f 6e 65 20 6f 72 0a 2a 2a 20 74 77 6f  by one or.** two
24980 20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f   in an effort to
24990 20 6b 65 65 70 20 70 61 67 65 73 20 6e 65 61 72   keep pages near
249a0 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20  ly full but not 
249b0 6f 76 65 72 20 66 75 6c 6c 2e 20 54 68 65 20 72  over full. The r
249c0 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 73  oot page.** is s
249d0 70 65 63 69 61 6c 20 61 6e 64 20 69 73 20 61 6c  pecial and is al
249e0 6c 6f 77 65 64 20 74 6f 20 62 65 20 6e 65 61 72  lowed to be near
249f0 6c 79 20 65 6d 70 74 79 2e 20 49 66 20 70 50 61  ly empty. If pPa
24a00 67 65 20 69 73 20 0a 2a 2a 20 74 68 65 20 72 6f  ge is .** the ro
24a10 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ot page, then th
24a20 65 20 64 65 70 74 68 20 6f 66 20 74 68 65 20 74  e depth of the t
24a30 72 65 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63  ree might be inc
24a40 72 65 61 73 65 64 0a 2a 2a 20 6f 72 20 64 65 63  reased.** or dec
24a50 72 65 61 73 65 64 20 62 79 20 6f 6e 65 2c 20 61  reased by one, a
24a60 73 20 6e 65 63 65 73 73 61 72 79 2c 20 74 6f 20  s necessary, to 
24a70 6b 65 65 70 20 74 68 65 20 72 6f 6f 74 20 70 61  keep the root pa
24a80 67 65 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a  ge from being.**
24a90 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 63 6f 6d   overfull or com
24aa0 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a 2a  pletely empty..*
24ab0 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77  *.** Note that w
24ac0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
24ad0 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65   is called, some
24ae0 20 6f 66 20 74 68 65 20 43 65 6c 6c 73 20 6f 6e   of the Cells on
24af0 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20   pPage.** might 
24b00 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20  not actually be 
24b10 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65 2d  stored in pPage-
24b20 3e 61 44 61 74 61 5b 5d 2e 20 20 54 68 69 73 20  >aData[].  This 
24b30 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66  can happen.** if
24b40 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 76 65   the page is ove
24b50 72 66 75 6c 6c 2e 20 20 50 61 72 74 20 6f 66 20  rfull.  Part of 
24b60 74 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  the job of this 
24b70 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 0a 2a 2a  routine is to.**
24b80 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 43   make sure all C
24b90 65 6c 6c 73 20 66 6f 72 20 70 50 61 67 65 20 6f  ells for pPage o
24ba0 6e 63 65 20 61 67 61 69 6e 20 66 69 74 20 69 6e  nce again fit in
24bb0 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e   pPage->aData[].
24bc0 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f  .**.** In the co
24bd0 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e  urse of balancin
24be0 67 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 6f  g the siblings o
24bf0 66 20 70 50 61 67 65 2c 20 74 68 65 20 70 61 72  f pPage, the par
24c00 65 6e 74 20 6f 66 20 70 50 61 67 65 0a 2a 2a 20  ent of pPage.** 
24c10 6d 69 67 68 74 20 62 65 63 6f 6d 65 20 6f 76 65  might become ove
24c20 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75  rfull or underfu
24c30 6c 6c 2e 20 20 49 66 20 74 68 61 74 20 68 61 70  ll.  If that hap
24c40 70 65 6e 73 2c 20 74 68 65 6e 20 74 68 69 73 20  pens, then this 
24c50 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
24c60 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
24c70 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 2e 0a   on the parent..
24c80 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f  **.** If this ro
24c90 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f 72 20  utine fails for 
24ca0 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d  any reason, it m
24cb0 69 67 68 74 20 6c 65 61 76 65 20 74 68 65 20 64  ight leave the d
24cc0 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20  atabase.** in a 
24cd0 63 6f 72 72 75 70 74 65 64 20 73 74 61 74 65 2e  corrupted state.
24ce0 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75    So if this rou
24cf0 74 69 6e 65 20 66 61 69 6c 73 2c 20 74 68 65 20  tine fails, the 
24d00 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 0a  database should.
24d10 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ** be rolled bac
24d20 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
24d30 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
24d40 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
24d50 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
24d60 72 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  rent;           
24d70 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 20 6f   /* The parent o
24d80 66 20 70 50 61 67 65 20 2a 2f 0a 20 20 42 74 53  f pPage */.  BtS
24d90 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
24da0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
24db0 20 77 68 6f 6c 65 20 64 61 74 61 62 61 73 65 20   whole database 
24dc0 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d  */.  int nCell =
24dd0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
24de0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
24df0 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
24e00 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65   */.  int nMaxCe
24e10 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  lls = 0;        
24e20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20     /* Allocated 
24e30 73 69 7a 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20  size of apCell, 
24e40 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a  szCell, aFrom. *
24e50 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b 20 20 20  /.  int nOld;   
24e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e70 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
24e80 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a  ges in apOld[] *
24e90 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20  /.  int nNew;   
24ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24eb0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
24ec0 67 65 73 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a  ges in apNew[] *
24ed0 2f 0a 20 20 69 6e 74 20 6e 44 69 76 3b 20 20 20  /.  int nDiv;   
24ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ef0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
24f00 6c 6c 73 20 69 6e 20 61 70 44 69 76 5b 5d 20 2a  lls in apDiv[] *
24f10 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b  /.  int i, j, k;
24f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f30 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
24f40 73 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 3b 20  s */.  int idx; 
24f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f60 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
24f70 70 50 61 67 65 20 69 6e 20 70 50 61 72 65 6e 74  pPage in pParent
24f80 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69  ->aCell[] */.  i
24f90 6e 74 20 6e 78 44 69 76 3b 20 20 20 20 20 20 20  nt nxDiv;       
24fa0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
24fb0 65 78 74 20 64 69 76 69 64 65 72 20 73 6c 6f 74  ext divider slot
24fc0 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65   in pParent->aCe
24fd0 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ll[] */.  int rc
24fe0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24ff0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65         /* The re
25000 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
25010 6e 74 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  nt leafCorrectio
25020 6e 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 34  n;          /* 4
25030 20 69 66 20 70 50 61 67 65 20 69 73 20 61 20 6c   if pPage is a l
25040 65 61 66 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a  eaf.  0 if not *
25050 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44 61 74 61  /.  int leafData
25060 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25070 20 2f 2a 20 54 72 75 65 20 69 66 20 70 50 61 67   /* True if pPag
25080 65 20 69 73 20 61 20 6c 65 61 66 20 6f 66 20 61  e is a leaf of a
25090 20 4c 45 41 46 44 41 54 41 20 74 72 65 65 20 2a   LEAFDATA tree *
250a0 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 70  /.  int usableSp
250b0 61 63 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ace;            
250c0 20 2f 2a 20 42 79 74 65 73 20 69 6e 20 70 50 61   /* Bytes in pPa
250d0 67 65 20 62 65 79 6f 6e 64 20 74 68 65 20 68 65  ge beyond the he
250e0 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61  ader */.  int pa
250f0 67 65 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20  geFlags;        
25100 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20         /* Value 
25110 6f 66 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  of pPage->aData[
25120 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74  0] */.  int subt
25130 6f 74 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  otal;           
25140 20 20 20 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c       /* Subtotal
25150 20 6f 66 20 62 79 74 65 73 20 69 6e 20 63 65 6c   of bytes in cel
25160 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a  ls on one page *
25170 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65 31 20  /.  int iSpace1 
25180 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
25190 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64   /* First unused
251a0 20 62 79 74 65 20 6f 66 20 61 53 70 61 63 65 31   byte of aSpace1
251b0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61  [] */.  int iSpa
251c0 63 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ce2 = 0;        
251d0 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e       /* First un
251e0 75 73 65 64 20 62 79 74 65 20 6f 66 20 61 53 70  used byte of aSp
251f0 61 63 65 32 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  ace2[] */.  int 
25200 73 7a 53 63 72 61 74 63 68 3b 20 20 20 20 20 20  szScratch;      
25210 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
25220 20 6f 66 20 73 63 72 61 74 63 68 20 6d 65 6d 6f   of scratch memo
25230 72 79 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a  ry requested */.
25240 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64    MemPage *apOld
25250 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 2f  [NB];          /
25260 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74  * pPage and up t
25270 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a  o two siblings *
25280 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 6c 64  /.  Pgno pgnoOld
25290 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20  [NB];           
252a0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 73   /* Page numbers
252b0 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
252c0 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 4d  n apOld[] */.  M
252d0 65 6d 50 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e  emPage *apCopy[N
252e0 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 50  B];         /* P
252f0 72 69 76 61 74 65 20 63 6f 70 69 65 73 20 6f 66  rivate copies of
25300 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a   apOld[] pages *
25310 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e  /.  MemPage *apN
25320 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
25330 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75 70   /* pPage and up
25340 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e 67 73 20   to NB siblings 
25350 61 66 74 65 72 20 62 61 6c 61 6e 63 69 6e 67 20  after balancing 
25360 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65  */.  Pgno pgnoNe
25370 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20  w[NB+2];        
25380 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
25390 73 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  s for each page 
253a0 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20  in apNew[] */.  
253b0 75 38 20 2a 61 70 44 69 76 5b 4e 42 5d 3b 20 20  u8 *apDiv[NB];  
253c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
253d0 44 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e  Divider cells in
253e0 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e   pParent */.  in
253f0 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20  t cntNew[NB+2]; 
25400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
25410 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f  dex in aCell[] o
25420 66 20 63 65 6c 6c 20 61 66 74 65 72 20 69 2d 74  f cell after i-t
25430 68 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  h page */.  int 
25440 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  szNew[NB+2];    
25450 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62           /* Comb
25460 69 6e 65 64 20 73 69 7a 65 20 6f 66 20 63 65 6c  ined size of cel
25470 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68  ls place on i-th
25480 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
25490 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20  apCell = 0;     
254a0 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63          /* All c
254b0 65 6c 6c 73 20 62 65 67 69 6e 20 62 61 6c 61 6e  ells begin balan
254c0 63 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a  ced */.  u16 *sz
254d0 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
254e0 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73        /* Local s
254f0 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73  ize of all cells
25500 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a   in apCell[] */.
25510 20 20 75 38 20 2a 61 43 6f 70 79 5b 4e 42 5d 3b    u8 *aCopy[NB];
25520 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
25530 65 20 66 6f 72 20 68 6f 6c 64 69 6e 67 20 64 61  e for holding da
25540 74 61 20 6f 66 20 61 70 43 6f 70 79 5b 5d 20 2a  ta of apCopy[] *
25550 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65 31 3b  /.  u8 *aSpace1;
25560 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70             /* Sp
25570 61 63 65 20 66 6f 72 20 63 6f 70 69 65 73 20 6f  ace for copies o
25580 66 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73  f dividers cells
25590 20 62 65 66 6f 72 65 20 62 61 6c 61 6e 63 65 20   before balance 
255a0 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63 65 32  */.  u8 *aSpace2
255b0 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 53   = 0;       /* S
255c0 70 61 63 65 20 66 6f 72 20 6f 76 65 72 66 6c 6f  pace for overflo
255d0 77 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73  w dividers cells
255e0 20 61 66 74 65 72 20 62 61 6c 61 6e 63 65 20 2a   after balance *
255f0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
25600 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
25610 0a 20 20 75 38 20 2a 61 46 72 6f 6d 20 3d 20 30  .  u8 *aFrom = 0
25620 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65  ;.#endif..  asse
25630 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
25640 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
25650 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  t->mutex) );..  
25660 2f 2a 20 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68  /* .  ** Find th
25670 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20  e parent page.. 
25680 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
25690 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
256a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
256b0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
256c0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
256d0 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72   || pPage->nOver
256e0 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 70 42 74  flow==1 );.  pBt
256f0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
25700 20 70 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65   pParent = pPage
25710 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 61 73 73  ->pParent;.  ass
25720 65 72 74 28 20 70 50 61 72 65 6e 74 20 29 3b 0a  ert( pParent );.
25730 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
25740 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  =(rc = sqlite3Pa
25750 67 65 72 57 72 69 74 65 28 70 50 61 72 65 6e 74  gerWrite(pParent
25760 2d 3e 70 44 62 50 61 67 65 29 29 20 29 7b 0a 20  ->pDbPage)) ){. 
25770 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
25780 7d 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41  }.  TRACE(("BALA
25790 4e 43 45 3a 20 62 65 67 69 6e 20 70 61 67 65 20  NCE: begin page 
257a0 25 64 20 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e  %d child of %d\n
257b0 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  ", pPage->pgno, 
257c0 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b  pParent->pgno));
257d0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
257e0 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e  _OMIT_QUICKBALAN
257f0 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 20 73  CE.  /*.  ** A s
25800 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20 49 66  pecial case:  If
25810 20 61 20 6e 65 77 20 65 6e 74 72 79 20 68 61 73   a new entry has
25820 20 6a 75 73 74 20 62 65 65 6e 20 69 6e 73 65 72   just been inser
25830 74 65 64 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20  ted into a.  ** 
25840 74 61 62 6c 65 20 28 74 68 61 74 20 69 73 2c 20  table (that is, 
25850 61 20 62 74 72 65 65 20 77 69 74 68 20 69 6e 74  a btree with int
25860 65 67 65 72 20 6b 65 79 73 20 61 6e 64 20 61 6c  eger keys and al
25870 6c 20 64 61 74 61 20 61 74 20 74 68 65 20 6c 65  l data at the le
25880 61 76 65 73 29 0a 20 20 2a 2a 20 61 6e 64 20 74  aves).  ** and t
25890 68 65 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20  he new entry is 
258a0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  the right-most e
258b0 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65 65  ntry in the tree
258c0 20 28 69 74 20 68 61 73 20 74 68 65 0a 20 20 2a   (it has the.  *
258d0 2a 20 6c 61 72 67 65 73 74 20 6b 65 79 29 20 74  * largest key) t
258e0 68 65 6e 20 75 73 65 20 74 68 65 20 73 70 65 63  hen use the spec
258f0 69 61 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  ial balance_quic
25900 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 0a  k() routine for.
25910 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 2e 20    ** balancing. 
25920 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29   balance_quick()
25930 20 69 73 20 6d 75 63 68 20 66 61 73 74 65 72 20   is much faster 
25940 61 6e 64 20 72 65 73 75 6c 74 73 20 69 6e 20 61  and results in a
25950 20 74 69 67 68 74 65 72 0a 20 20 2a 2a 20 70 61   tighter.  ** pa
25960 63 6b 69 6e 67 20 6f 66 20 64 61 74 61 20 69 6e  cking of data in
25970 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
25980 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
25990 67 65 2d 3e 6c 65 61 66 20 26 26 0a 20 20 20 20  ge->leaf &&.    
259a0 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
259b0 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  &&.      pPage->
259c0 6c 65 61 66 44 61 74 61 20 26 26 0a 20 20 20 20  leafData &&.    
259d0 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c    pPage->nOverfl
259e0 6f 77 3d 3d 31 20 26 26 0a 20 20 20 20 20 20 70  ow==1 &&.      p
259f0 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69  Page->aOvfl[0].i
25a00 64 78 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  dx==pPage->nCell
25a10 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d   &&.      pPage-
25a20 3e 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d  >pParent->pgno!=
25a30 31 20 26 26 0a 20 20 20 20 20 20 67 65 74 34 62  1 &&.      get4b
25a40 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
25a50 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
25a60 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 70 50 61 67  Offset+8])==pPag
25a70 65 2d 3e 70 67 6e 6f 0a 20 20 29 7b 0a 20 20 20  e->pgno.  ){.   
25a80 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 4f 44 4f 3a   /*.    ** TODO:
25a90 20 43 68 65 63 6b 20 74 68 65 20 73 69 62 6c 69   Check the sibli
25aa0 6e 67 73 20 74 6f 20 74 68 65 20 6c 65 66 74 20  ngs to the left 
25ab0 6f 66 20 70 50 61 67 65 2e 20 49 74 20 6d 61 79  of pPage. It may
25ac0 20 62 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20   be that.    ** 
25ad0 74 68 65 79 20 61 72 65 20 6e 6f 74 20 66 75 6c  they are not ful
25ae0 6c 20 61 6e 64 20 6e 6f 20 6e 65 77 20 70 61 67  l and no new pag
25af0 65 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20  e is required.. 
25b00 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e     */.    return
25b10 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 70   balance_quick(p
25b20 50 61 67 65 2c 20 70 50 61 72 65 6e 74 29 3b 0a  Page, pParent);.
25b30 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
25b40 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
25b50 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
25b60 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
25b70 61 67 65 29 29 20 29 7b 0a 20 20 20 20 72 65 74  age)) ){.    ret
25b80 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
25b90 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20  *.  ** Find the 
25ba0 63 65 6c 6c 20 69 6e 20 74 68 65 20 70 61 72 65  cell in the pare
25bb0 6e 74 20 70 61 67 65 20 77 68 6f 73 65 20 6c 65  nt page whose le
25bc0 66 74 20 63 68 69 6c 64 20 70 6f 69 6e 74 73 20  ft child points 
25bd0 62 61 63 6b 0a 20 20 2a 2a 20 74 6f 20 70 50 61  back.  ** to pPa
25be0 67 65 2e 20 20 54 68 65 20 22 69 64 78 22 20 76  ge.  The "idx" v
25bf0 61 72 69 61 62 6c 65 20 69 73 20 74 68 65 20 69  ariable is the i
25c00 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63 65 6c  ndex of that cel
25c10 6c 2e 20 20 49 66 20 70 50 61 67 65 0a 20 20 2a  l.  If pPage.  *
25c20 2a 20 69 73 20 74 68 65 20 72 69 67 68 74 6d 6f  * is the rightmo
25c30 73 74 20 63 68 69 6c 64 20 6f 66 20 70 50 61 72  st child of pPar
25c40 65 6e 74 20 74 68 65 6e 20 73 65 74 20 69 64 78  ent then set idx
25c50 20 74 6f 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65   to pParent->nCe
25c60 6c 6c 20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ll .  */.  if( p
25c70 50 61 72 65 6e 74 2d 3e 69 64 78 53 68 69 66 74  Parent->idxShift
25c80 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e   ){.    Pgno pgn
25c90 6f 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 70 50  o;.    pgno = pP
25ca0 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61  age->pgno;.    a
25cb0 73 73 65 72 74 28 20 70 67 6e 6f 3d 3d 73 71 6c  ssert( pgno==sql
25cc0 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
25cd0 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ber(pPage->pDbPa
25ce0 67 65 29 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  ge) );.    for(i
25cf0 64 78 3d 30 3b 20 69 64 78 3c 70 50 61 72 65 6e  dx=0; idx<pParen
25d00 74 2d 3e 6e 43 65 6c 6c 3b 20 69 64 78 2b 2b 29  t->nCell; idx++)
25d10 7b 0a 20 20 20 20 20 20 69 66 28 20 67 65 74 34  {.      if( get4
25d20 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
25d30 61 72 65 6e 74 2c 20 69 64 78 29 29 3d 3d 70 67  arent, idx))==pg
25d40 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  no ){.        br
25d50 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
25d60 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 69   }.    assert( i
25d70 64 78 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  dx<pParent->nCel
25d80 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 7c  l.             |
25d90 7c 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72  | get4byte(&pPar
25da0 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
25db0 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
25dc0 29 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 7d 65 6c  )==pgno );.  }el
25dd0 73 65 7b 0a 20 20 20 20 69 64 78 20 3d 20 70 50  se{.    idx = pP
25de0 61 67 65 2d 3e 69 64 78 50 61 72 65 6e 74 3b 0a  age->idxParent;.
25df0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49    }..  /*.  ** I
25e00 6e 69 74 69 61 6c 69 7a 65 20 76 61 72 69 61 62  nitialize variab
25e10 6c 65 73 20 73 6f 20 74 68 61 74 20 69 74 20 77  les so that it w
25e20 69 6c 6c 20 62 65 20 73 61 66 65 20 74 6f 20 6a  ill be safe to j
25e30 75 6d 70 0a 20 20 2a 2a 20 64 69 72 65 63 74 6c  ump.  ** directl
25e40 79 20 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  y to balance_cle
25e50 61 6e 75 70 20 61 74 20 61 6e 79 20 6d 6f 6d 65  anup at any mome
25e60 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 4f 6c 64 20  nt..  */.  nOld 
25e70 3d 20 6e 4e 65 77 20 3d 20 30 3b 0a 20 20 73 71  = nNew = 0;.  sq
25e80 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50  lite3PagerRef(pP
25e90 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b  arent->pDbPage);
25ea0 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
25eb0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74   sibling pages t
25ec0 6f 20 70 50 61 67 65 20 61 6e 64 20 74 68 65 20  o pPage and the 
25ed0 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74  cells in pParent
25ee0 20 74 68 61 74 20 64 69 76 69 64 65 0a 20 20 2a   that divide.  *
25ef0 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 73 2e 20  * the siblings. 
25f00 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d   An attempt is m
25f10 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20 73  ade to find NN s
25f20 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74 68 65  iblings on eithe
25f30 72 0a 20 20 2a 2a 20 73 69 64 65 20 6f 66 20 70  r.  ** side of p
25f40 50 61 67 65 2e 20 20 4d 6f 72 65 20 73 69 62 6c  Page.  More sibl
25f50 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e 20 66  ings are taken f
25f60 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68 6f  rom one side, ho
25f70 77 65 76 65 72 2c 20 69 66 0a 20 20 2a 2a 20 70  wever, if.  ** p
25f80 50 61 67 65 20 74 68 65 72 65 20 61 72 65 20 66  Page there are f
25f90 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73 69 62  ewer than NN sib
25fa0 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74 68  lings on the oth
25fb0 65 72 20 73 69 64 65 2e 20 20 49 66 20 70 50 61  er side.  If pPa
25fc0 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42  rent.  ** has NB
25fd0 20 6f 72 20 66 65 77 65 72 20 63 68 69 6c 64 72   or fewer childr
25fe0 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c  en then all chil
25ff0 64 72 65 6e 20 6f 66 20 70 50 61 72 65 6e 74 20  dren of pParent 
26000 61 72 65 20 74 61 6b 65 6e 2e 0a 20 20 2a 2f 0a  are taken..  */.
26010 20 20 6e 78 44 69 76 20 3d 20 69 64 78 20 2d 20    nxDiv = idx - 
26020 4e 4e 3b 0a 20 20 69 66 28 20 6e 78 44 69 76 20  NN;.  if( nxDiv 
26030 2b 20 4e 42 20 3e 20 70 50 61 72 65 6e 74 2d 3e  + NB > pParent->
26040 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 6e 78 44  nCell ){.    nxD
26050 69 76 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 43  iv = pParent->nC
26060 65 6c 6c 20 2d 20 4e 42 20 2b 20 31 3b 0a 20 20  ell - NB + 1;.  
26070 7d 0a 20 20 69 66 28 20 6e 78 44 69 76 3c 30 20  }.  if( nxDiv<0 
26080 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 30  ){.    nxDiv = 0
26090 3b 0a 20 20 7d 0a 20 20 6e 44 69 76 20 3d 20 30  ;.  }.  nDiv = 0
260a0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6b 3d 6e  ;.  for(i=0, k=n
260b0 78 44 69 76 3b 20 69 3c 4e 42 3b 20 69 2b 2b 2c  xDiv; i<NB; i++,
260c0 20 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6b   k++){.    if( k
260d0 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  <pParent->nCell 
260e0 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69  ){.      apDiv[i
260f0 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  ] = findCell(pPa
26100 72 65 6e 74 2c 20 6b 29 3b 0a 20 20 20 20 20 20  rent, k);.      
26110 6e 44 69 76 2b 2b 3b 0a 20 20 20 20 20 20 61 73  nDiv++;.      as
26120 73 65 72 74 28 20 21 70 50 61 72 65 6e 74 2d 3e  sert( !pParent->
26130 6c 65 61 66 20 29 3b 0a 20 20 20 20 20 20 70 67  leaf );.      pg
26140 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34 62  noOld[i] = get4b
26150 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20  yte(apDiv[i]);. 
26160 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3d 3d     }else if( k==
26170 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
26180 7b 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b  {.      pgnoOld[
26190 69 5d 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  i] = get4byte(&p
261a0 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
261b0 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
261c0 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  +8]);.    }else{
261d0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
261e0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 67 65 74    }.    rc = get
261f0 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
26200 20 70 67 6e 6f 4f 6c 64 5b 69 5d 2c 20 26 61 70   pgnoOld[i], &ap
26210 4f 6c 64 5b 69 5d 2c 20 70 50 61 72 65 6e 74 29  Old[i], pParent)
26220 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
26230 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
26240 6e 75 70 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69  nup;.    apOld[i
26250 5d 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 6b  ]->idxParent = k
26260 3b 0a 20 20 20 20 61 70 43 6f 70 79 5b 69 5d 20  ;.    apCopy[i] 
26270 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
26280 20 69 3d 3d 6e 4f 6c 64 20 29 3b 0a 20 20 20 20   i==nOld );.    
26290 6e 4f 6c 64 2b 2b 3b 0a 20 20 20 20 6e 4d 61 78  nOld++;.    nMax
262a0 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c 64  Cells += 1+apOld
262b0 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64  [i]->nCell+apOld
262c0 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a  [i]->nOverflow;.
262d0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e    }..  /* Make n
262e0 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69  MaxCells a multi
262f0 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f 72 64 65  ple of 4 in orde
26300 72 20 74 6f 20 70 72 65 73 65 72 76 65 20 38 2d  r to preserve 8-
26310 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d  byte.  ** alignm
26320 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c  ent */.  nMaxCel
26330 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20  ls = (nMaxCells 
26340 2b 20 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20  + 3)&~3;..  /*. 
26350 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61   ** Allocate spa
26360 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74  ce for memory st
26370 72 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20  ructures.  */.  
26380 73 7a 53 63 72 61 74 63 68 20 3d 0a 20 20 20 20  szScratch =.    
26390 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a     nMaxCells*siz
263a0 65 6f 66 28 75 38 2a 29 20 20 20 20 20 20 20 20  eof(u8*)        
263b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
263c0 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20  * apCell */.    
263d0 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a   + nMaxCells*siz
263e0 65 6f 66 28 75 31 36 29 20 20 20 20 20 20 20 20  eof(u16)        
263f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26400 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20  * szCell */.    
26410 20 2b 20 28 52 4f 55 4e 44 38 28 73 69 7a 65 6f   + (ROUND8(sizeo
26420 66 28 4d 65 6d 50 61 67 65 29 29 2b 70 42 74 2d  f(MemPage))+pBt-
26430 3e 70 61 67 65 53 69 7a 65 29 2a 4e 42 20 20 2f  >pageSize)*NB  /
26440 2a 20 61 43 6f 70 79 20 2a 2f 0a 20 20 20 20 20  * aCopy */.     
26450 2b 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  + pBt->pageSize 
26460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26480 20 61 53 70 61 63 65 31 20 2a 2f 0a 20 20 20 20   aSpace1 */.    
26490 20 2b 20 28 49 53 41 55 54 4f 56 41 43 55 55 4d   + (ISAUTOVACUUM
264a0 20 3f 20 6e 4d 61 78 43 65 6c 6c 73 20 3a 20 30   ? nMaxCells : 0
264b0 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
264c0 2a 20 61 46 72 6f 6d 20 2a 2f 0a 20 20 61 70 43  * aFrom */.  apC
264d0 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53 63 72  ell = sqlite3Scr
264e0 61 74 63 68 4d 61 6c 6c 6f 63 28 20 73 7a 53 63  atchMalloc( szSc
264f0 72 61 74 63 68 20 29 3b 20 0a 20 20 69 66 28 20  ratch ); .  if( 
26500 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  apCell==0 ){.   
26510 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
26520 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c  EM;.    goto bal
26530 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
26540 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31  }.  szCell = (u1
26550 36 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43  6*)&apCell[nMaxC
26560 65 6c 6c 73 5d 3b 0a 20 20 61 43 6f 70 79 5b 30  ells];.  aCopy[0
26570 5d 20 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c  ] = (u8*)&szCell
26580 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61  [nMaxCells];.  a
26590 73 73 65 72 74 28 20 28 28 61 43 6f 70 79 5b 30  ssert( ((aCopy[0
265a0 5d 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29  ] - (u8*)apCell)
265b0 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38   & 7)==0 ); /* 8
265c0 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20  -byte alignment 
265d0 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 66 6f  required */.  fo
265e0 72 28 69 3d 31 3b 20 69 3c 4e 42 3b 20 69 2b 2b  r(i=1; i<NB; i++
265f0 29 7b 0a 20 20 20 20 61 43 6f 70 79 5b 69 5d 20  ){.    aCopy[i] 
26600 3d 20 26 61 43 6f 70 79 5b 69 2d 31 5d 5b 70 42  = &aCopy[i-1][pB
26610 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f 55 4e  t->pageSize+ROUN
26620 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67  D8(sizeof(MemPag
26630 65 29 29 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  e))];.    assert
26640 28 20 28 28 61 43 6f 70 79 5b 69 5d 20 2d 20 28  ( ((aCopy[i] - (
26650 75 38 2a 29 61 70 43 65 6c 6c 29 20 26 20 37 29  u8*)apCell) & 7)
26660 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65  ==0 ); /* 8-byte
26670 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69   alignment requi
26680 72 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 61 53 70  red */.  }.  aSp
26690 61 63 65 31 20 3d 20 26 61 43 6f 70 79 5b 4e 42  ace1 = &aCopy[NB
266a0 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  -1][pBt->pageSiz
266b0 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28  e+ROUND8(sizeof(
266c0 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20 20 61 73  MemPage))];.  as
266d0 73 65 72 74 28 20 28 28 61 53 70 61 63 65 31 20  sert( ((aSpace1 
266e0 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29 20 26  - (u8*)apCell) &
266f0 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62   7)==0 ); /* 8-b
26700 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65  yte alignment re
26710 71 75 69 72 65 64 20 2a 2f 0a 23 69 66 6e 64 65  quired */.#ifnde
26720 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
26730 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20 70  TOVACUUM.  if( p
26740 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
26750 7b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 26 61  {.    aFrom = &a
26760 53 70 61 63 65 31 5b 70 42 74 2d 3e 70 61 67 65  Space1[pBt->page
26770 53 69 7a 65 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69  Size];.  }.#endi
26780 66 0a 20 20 61 53 70 61 63 65 32 20 3d 20 73 71  f.  aSpace2 = sq
26790 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28  lite3PageMalloc(
267a0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
267b0 20 20 69 66 28 20 61 53 70 61 63 65 32 3d 3d 30    if( aSpace2==0
267c0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
267d0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67  ITE_NOMEM;.    g
267e0 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
267f0 6e 75 70 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  nup;.  }.  .  /*
26800 0a 20 20 2a 2a 20 4d 61 6b 65 20 63 6f 70 69 65  .  ** Make copie
26810 73 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 6e 74  s of the content
26820 20 6f 66 20 70 50 61 67 65 20 61 6e 64 20 69 74   of pPage and it
26830 73 20 73 69 62 6c 69 6e 67 73 20 69 6e 74 6f 20  s siblings into 
26840 61 4f 6c 64 5b 5d 2e 0a 20 20 2a 2a 20 54 68 65  aOld[]..  ** The
26850 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 66 75   rest of this fu
26860 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75 73 65 20  nction will use 
26870 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 63 6f  data from the co
26880 70 69 65 73 20 72 61 74 68 65 72 0a 20 20 2a 2a  pies rather.  **
26890 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e   that the origin
268a0 61 6c 20 70 61 67 65 73 20 73 69 6e 63 65 20 74  al pages since t
268b0 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
268c0 73 20 77 69 6c 6c 20 62 65 20 69 6e 20 74 68 65  s will be in the
268d0 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 6f 66  .  ** process of
268e0 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74   being overwritt
268f0 65 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  en..  */.  for(i
26900 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29  =0; i<nOld; i++)
26910 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
26920 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 28   = apCopy[i] = (
26930 4d 65 6d 50 61 67 65 2a 29 61 43 6f 70 79 5b 69  MemPage*)aCopy[i
26940 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2c  ];.    memcpy(p,
26950 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f   apOld[i], sizeo
26960 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a 20 20 20  f(MemPage));.   
26970 20 70 2d 3e 61 44 61 74 61 20 3d 20 28 76 6f 69   p->aData = (voi
26980 64 2a 29 26 70 5b 31 5d 3b 0a 20 20 20 20 6d 65  d*)&p[1];.    me
26990 6d 63 70 79 28 70 2d 3e 61 44 61 74 61 2c 20 61  mcpy(p->aData, a
269a0 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74 61 2c 20  pOld[i]->aData, 
269b0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
269c0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c    }..  /*.  ** L
269d0 6f 61 64 20 70 6f 69 6e 74 65 72 73 20 74 6f 20  oad pointers to 
269e0 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 73 69 62  all cells on sib
269f0 6c 69 6e 67 20 70 61 67 65 73 20 61 6e 64 20 74  ling pages and t
26a00 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73  he divider cells
26a10 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6c  .  ** into the l
26a20 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d 20 61 72  ocal apCell[] ar
26a30 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f 70 69 65  ray.  Make copie
26a40 73 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72  s of the divider
26a50 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f   cells.  ** into
26a60 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
26a70 66 6f 72 6d 20 61 53 70 61 63 65 31 5b 5d 20 61  form aSpace1[] a
26a80 6e 64 20 72 65 6d 6f 76 65 20 74 68 65 20 74 68  nd remove the th
26a90 65 20 64 69 76 69 64 65 72 20 43 65 6c 6c 73 0a  e divider Cells.
26aa0 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61 72 65 6e    ** from pParen
26ab0 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  t..  **.  ** If 
26ac0 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65  the siblings are
26ad0 20 6f 6e 20 6c 65 61 66 20 70 61 67 65 73 2c 20   on leaf pages, 
26ae0 74 68 65 6e 20 74 68 65 20 63 68 69 6c 64 20 70  then the child p
26af0 6f 69 6e 74 65 72 73 20 6f 66 20 74 68 65 0a 20  ointers of the. 
26b00 20 2a 2a 20 64 69 76 69 64 65 72 20 63 65 6c 6c   ** divider cell
26b10 73 20 61 72 65 20 73 74 72 69 70 70 65 64 20 66  s are stripped f
26b20 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73 20 62 65  rom the cells be
26b30 66 6f 72 65 20 74 68 65 79 20 61 72 65 20 63 6f  fore they are co
26b40 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74 6f 20 61  pied.  ** into a
26b50 53 70 61 63 65 31 5b 5d 2e 20 20 49 6e 20 74 68  Space1[].  In th
26b60 69 73 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c  is way, all cell
26b70 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 72  s in apCell[] ar
26b80 65 20 77 69 74 68 6f 75 74 0a 20 20 2a 2a 20 63  e without.  ** c
26b90 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20  hild pointers.  
26ba0 49 66 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  If siblings are 
26bb0 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74 68 65 6e  not leaves, then
26bc0 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a 20 20 2a   all cell in.  *
26bd0 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75  * apCell[] inclu
26be0 64 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  de child pointer
26bf0 73 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20  s.  Either way, 
26c00 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43  all cells in apC
26c10 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72 65 20 61  ell[].  ** are a
26c20 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  like..  **.  ** 
26c30 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3a 20  leafCorrection: 
26c40 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20 61   4 if pPage is a
26c50 20 6c 65 61 66 2e 20 20 30 20 69 66 20 70 50 61   leaf.  0 if pPa
26c60 67 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66  ge is not a leaf
26c70 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20 6c 65 61  ..  **       lea
26c80 66 44 61 74 61 3a 20 20 31 20 69 66 20 70 50 61  fData:  1 if pPa
26c90 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b 64 61 74  ge holds key+dat
26ca0 61 20 61 6e 64 20 70 50 61 72 65 6e 74 20 68 6f  a and pParent ho
26cb0 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20  lds only keys.. 
26cc0 20 2a 2f 0a 20 20 6e 43 65 6c 6c 20 3d 20 30 3b   */.  nCell = 0;
26cd0 0a 20 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  .  leafCorrectio
26ce0 6e 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66 2a  n = pPage->leaf*
26cf0 34 3b 0a 20 20 6c 65 61 66 44 61 74 61 20 3d 20  4;.  leafData = 
26d00 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20  pPage->leafData 
26d10 26 26 20 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a  && pPage->leaf;.
26d20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c    for(i=0; i<nOl
26d30 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d  d; i++){.    Mem
26d40 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20 61 70 43  Page *pOld = apC
26d50 6f 70 79 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20  opy[i];.    int 
26d60 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43  limit = pOld->nC
26d70 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  ell+pOld->nOverf
26d80 6c 6f 77 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30  low;.    for(j=0
26d90 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b  ; j<limit; j++){
26da0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e  .      assert( n
26db0 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  Cell<nMaxCells )
26dc0 3b 0a 20 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e  ;.      apCell[n
26dd0 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f 76 65 72  Cell] = findOver
26de0 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a  flowCell(pOld, j
26df0 29 3b 0a 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  );.      szCell[
26e00 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a  nCell] = cellSiz
26e10 65 50 74 72 28 70 4f 6c 64 2c 20 61 70 43 65 6c  ePtr(pOld, apCel
26e20 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 23 69 66 6e 64  l[nCell]);.#ifnd
26e30 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
26e40 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
26e50 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
26e60 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69  uum ){.        i
26e70 6e 74 20 61 3b 0a 20 20 20 20 20 20 20 20 61 46  nt a;.        aF
26e80 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 69 3b 0a  rom[nCell] = i;.
26e90 20 20 20 20 20 20 20 20 66 6f 72 28 61 3d 30 3b          for(a=0;
26ea0 20 61 3c 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c   a<pOld->nOverfl
26eb0 6f 77 3b 20 61 2b 2b 29 7b 0a 20 20 20 20 20 20  ow; a++){.      
26ec0 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 61 4f      if( pOld->aO
26ed0 76 66 6c 5b 61 5d 2e 70 43 65 6c 6c 3d 3d 61 70  vfl[a].pCell==ap
26ee0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 29 7b 0a 20  Cell[nCell] ){. 
26ef0 20 20 20 20 20 20 20 20 20 20 20 61 46 72 6f 6d             aFrom
26f00 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a  [nCell] = 0xFF;.
26f10 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
26f20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
26f30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
26f40 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 43  .#endif.      nC
26f50 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ell++;.    }.   
26f60 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 29 7b   if( i<nOld-1 ){
26f70 0a 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20  .      u16 sz = 
26f80 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72  cellSizePtr(pPar
26f90 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a  ent, apDiv[i]);.
26fa0 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44 61        if( leafDa
26fb0 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ta ){.        /*
26fc0 20 57 69 74 68 20 74 68 65 20 4c 45 41 46 44 41   With the LEAFDA
26fd0 54 41 20 66 6c 61 67 2c 20 70 50 61 72 65 6e 74  TA flag, pParent
26fe0 20 63 65 6c 6c 73 20 68 6f 6c 64 20 6f 6e 6c 79   cells hold only
26ff0 20 49 4e 54 4b 45 59 73 20 74 68 61 74 0a 20 20   INTKEYs that.  
27000 20 20 20 20 20 20 2a 2a 20 61 72 65 20 64 75 70        ** are dup
27010 6c 69 63 61 74 65 73 20 6f 66 20 6b 65 79 73 20  licates of keys 
27020 6f 6e 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  on the child pag
27030 65 73 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20  es.  We need to 
27040 72 65 6d 6f 76 65 0a 20 20 20 20 20 20 20 20 2a  remove.        *
27050 2a 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  * the divider ce
27060 6c 6c 73 20 66 72 6f 6d 20 70 50 61 72 65 6e 74  lls from pParent
27070 2c 20 62 75 74 20 74 68 65 20 64 69 76 69 64 65  , but the divide
27080 72 73 20 63 65 6c 6c 73 20 61 72 65 20 6e 6f 74  rs cells are not
27090 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65  .        ** adde
270a0 64 20 74 6f 20 61 70 43 65 6c 6c 5b 5d 20 62 65  d to apCell[] be
270b0 63 61 75 73 65 20 74 68 65 79 20 61 72 65 20 64  cause they are d
270c0 75 70 6c 69 63 61 74 65 73 20 6f 66 20 63 68 69  uplicates of chi
270d0 6c 64 20 63 65 6c 6c 73 2e 0a 20 20 20 20 20 20  ld cells..      
270e0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 64 72 6f    */.        dro
270f0 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e  pCell(pParent, n
27100 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20  xDiv, sz);.     
27110 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
27120 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20  u8 *pTemp;.     
27130 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
27140 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
27150 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
27160 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ll] = sz;.      
27170 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63    pTemp = &aSpac
27180 65 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20 20  e1[iSpace1];.   
27190 20 20 20 20 20 69 53 70 61 63 65 31 20 2b 3d 20       iSpace1 += 
271a0 73 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  sz;.        asse
271b0 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67  rt( sz<=pBt->pag
271c0 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20  eSize/4 );.     
271d0 20 20 20 61 73 73 65 72 74 28 20 69 53 70 61 63     assert( iSpac
271e0 65 31 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  e1<=pBt->pageSiz
271f0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  e );.        mem
27200 63 70 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76  cpy(pTemp, apDiv
27210 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20  [i], sz);.      
27220 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    apCell[nCell] 
27230 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72  = pTemp+leafCorr
27240 65 63 74 69 6f 6e 3b 0a 23 69 66 6e 64 65 66 20  ection;.#ifndef 
27250 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
27260 56 41 43 55 55 4d 0a 20 20 20 20 20 20 20 20 69  VACUUM.        i
27270 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
27280 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  um ){.          
27290 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30  aFrom[nCell] = 0
272a0 78 46 46 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  xFF;.        }.#
272b0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 64 72  endif.        dr
272c0 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  opCell(pParent, 
272d0 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20  nxDiv, sz);.    
272e0 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c      szCell[nCell
272f0 5d 20 2d 3d 20 6c 65 61 66 43 6f 72 72 65 63 74  ] -= leafCorrect
27300 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ion;.        ass
27310 65 72 74 28 20 67 65 74 34 62 79 74 65 28 70 54  ert( get4byte(pT
27320 65 6d 70 29 3d 3d 70 67 6e 6f 4f 6c 64 5b 69 5d  emp)==pgnoOld[i]
27330 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
27340 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20  !pOld->leaf ){. 
27350 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
27360 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d   leafCorrection=
27370 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
27380 2f 2a 20 54 68 65 20 72 69 67 68 74 20 70 6f 69  /* The right poi
27390 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c  nter of the chil
273a0 64 20 70 61 67 65 20 70 4f 6c 64 20 62 65 63 6f  d page pOld beco
273b0 6d 65 73 20 74 68 65 20 6c 65 66 74 0a 20 20 20  mes the left.   
273c0 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65         ** pointe
273d0 72 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72  r of the divider
273e0 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20   cell */.       
273f0 20 20 20 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c     memcpy(apCell
27400 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e  [nCell], &pOld->
27410 61 44 61 74 61 5b 70 4f 6c 64 2d 3e 68 64 72 4f  aData[pOld->hdrO
27420 66 66 73 65 74 2b 38 5d 2c 20 34 29 3b 0a 20 20  ffset+8], 4);.  
27430 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
27440 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
27450 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34  eafCorrection==4
27460 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
27470 28 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c  ( szCell[nCell]<
27480 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4 ){.           
27490 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77   /* Do not allow
274a0 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d 61 6c 6c   any cells small
274b0 65 72 20 74 68 61 6e 20 34 20 62 79 74 65 73 2e  er than 4 bytes.
274c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
274d0 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
274e0 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  4;.          }. 
274f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
27500 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20   nCell++;.      
27510 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
27520 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75  *.  ** Figure ou
27530 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
27540 70 61 67 65 73 20 6e 65 65 64 65 64 20 74 6f 20  pages needed to 
27550 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20 63  hold all nCell c
27560 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72 65  ells..  ** Store
27570 20 74 68 69 73 20 6e 75 6d 62 65 72 20 69 6e 20   this number in 
27580 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70 75  "k".  Also compu
27590 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63 68  te szNew[] which
275a0 20 69 73 20 74 68 65 20 74 6f 74 61 6c 0a 20 20   is the total.  
275b0 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63  ** size of all c
275c0 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74 68  ells on the i-th
275d0 20 70 61 67 65 20 61 6e 64 20 63 6e 74 4e 65 77   page and cntNew
275e0 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65 20  [] which is the 
275f0 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61 70  index.  ** in ap
27600 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63 65  Cell[] of the ce
27610 6c 6c 20 74 68 61 74 20 64 69 76 69 64 65 73 20  ll that divides 
27620 70 61 67 65 20 69 20 66 72 6f 6d 20 70 61 67 65  page i from page
27630 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e 74   i+1.  .  ** cnt
27640 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65 71  New[k] should eq
27650 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a  ual nCell..  **.
27660 20 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d 70    ** Values comp
27670 75 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f  uted by this blo
27680 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ck:.  **.  **   
27690 20 20 20 20 20 20 20 20 6b 3a 20 54 68 65 20 74          k: The t
276a0 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
276b0 69 62 6c 69 6e 67 20 70 61 67 65 73 0a 20 20 2a  ibling pages.  *
276c0 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20 53  *    szNew[i]: S
276d0 70 61 63 65 64 20 75 73 65 64 20 6f 6e 20 74 68  paced used on th
276e0 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70  e i-th sibling p
276f0 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74 4e  age..  **   cntN
27700 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e 20  ew[i]: Index in 
27710 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43  apCell[] and szC
27720 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66 69  ell[] for the fi
27730 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a  rst cell to.  **
27740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
27750 65 20 72 69 67 68 74 20 6f 66 20 74 68 65 20 69  e right of the i
27760 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65  -th sibling page
27770 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53 70 61  ..  ** usableSpa
27780 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79  ce: Number of by
27790 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 76 61  tes of space ava
277a0 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68 20 73  ilable on each s
277b0 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20  ibling..  ** .  
277c0 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70 61 63 65  */.  usableSpace
277d0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
277e0 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61 66 43 6f  ze - 12 + leafCo
277f0 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72 28  rrection;.  for(
27800 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20  subtotal=k=i=0; 
27810 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
27820 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4d 61     assert( i<nMa
27830 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73 75  xCells );.    su
27840 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c  btotal += szCell
27850 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66 28  [i] + 2;.    if(
27860 20 73 75 62 74 6f 74 61 6c 20 3e 20 75 73 61 62   subtotal > usab
27870 6c 65 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20  leSpace ){.     
27880 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74   szNew[k] = subt
27890 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d  otal - szCell[i]
278a0 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 6b  ;.      cntNew[k
278b0 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28  ] = i;.      if(
278c0 20 6c 65 61 66 44 61 74 61 20 29 7b 20 69 2d 2d   leafData ){ i--
278d0 3b 20 7d 0a 20 20 20 20 20 20 73 75 62 74 6f 74  ; }.      subtot
278e0 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b 2b  al = 0;.      k+
278f0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  +;.    }.  }.  s
27900 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74  zNew[k] = subtot
27910 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20  al;.  cntNew[k] 
27920 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a  = nCell;.  k++;.
27930 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70  .  /*.  ** The p
27940 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64 20  acking computed 
27950 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  by the previous 
27960 62 6c 6f 63 6b 20 69 73 20 62 69 61 73 65 64 20  block is biased 
27970 74 6f 77 61 72 64 20 74 68 65 20 73 69 62 6c 69  toward the sibli
27980 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ngs.  ** on the 
27990 6c 65 66 74 20 73 69 64 65 2e 20 20 54 68 65 20  left side.  The 
279a0 6c 65 66 74 20 73 69 62 6c 69 6e 67 73 20 61 72  left siblings ar
279b0 65 20 61 6c 77 61 79 73 20 6e 65 61 72 6c 79 20  e always nearly 
279c0 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a  full, while the.
279d0 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20    ** right-most 
279e0 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65  sibling might be
279f0 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 20   nearly empty.  
27a00 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  This block of co
27a10 64 65 20 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a  de attempts.  **
27a20 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 70   to adjust the p
27a30 61 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e  acking of siblin
27a40 67 73 20 74 6f 20 67 65 74 20 61 20 62 65 74 74  gs to get a bett
27a50 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a  er balance..  **
27a60 0a 20 20 2a 2a 20 54 68 69 73 20 61 64 6a 75 73  .  ** This adjus
27a70 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20 74 68  tment is more th
27a80 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  an an optimizati
27a90 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b 69 6e 67  on.  The packing
27aa0 20 61 62 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a   above might.  *
27ab0 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f 66 20 62  * be so out of b
27ac0 61 6c 61 6e 63 65 20 61 73 20 74 6f 20 62 65 20  alance as to be 
27ad0 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65 78  illegal.  For ex
27ae0 61 6d 70 6c 65 2c 20 74 68 65 20 72 69 67 68 74  ample, the right
27af0 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69  -most.  ** sibli
27b00 6e 67 20 6d 69 67 68 74 20 62 65 20 63 6f 6d 70  ng might be comp
27b10 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 20 54  letely empty.  T
27b20 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69  his adjustment i
27b30 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a  s not optional..
27b40 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31    */.  for(i=k-1
27b50 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20  ; i>0; i--){.   
27b60 20 69 6e 74 20 73 7a 52 69 67 68 74 20 3d 20 73   int szRight = s
27b70 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a  zNew[i];  /* Siz
27b80 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20  e of sibling on 
27b90 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20  the right */.   
27ba0 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a   int szLeft = sz
27bb0 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a  New[i-1]; /* Siz
27bc0 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20  e of sibling on 
27bd0 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20  the left */.    
27be0 69 6e 74 20 72 3b 20 20 20 20 20 20 20 20 20 20  int r;          
27bf0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
27c00 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20  right-most cell 
27c10 69 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 20  in left sibling 
27c20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20 20 20  */.    int d;   
27c30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
27c40 64 65 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c  dex of first cel
27c50 6c 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  l to the left of
27c60 20 72 69 67 68 74 20 73 69 62 6c 69 6e 67 20 2a   right sibling *
27c70 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e 65  /..    r = cntNe
27c80 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20  w[i-1] - 1;.    
27c90 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66  d = r + 1 - leaf
27ca0 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74  Data;.    assert
27cb0 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( d<nMaxCells );
27cc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 3c 6e  .    assert( r<n
27cd0 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
27ce0 77 68 69 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d  while( szRight==
27cf0 30 20 7c 7c 20 73 7a 52 69 67 68 74 2b 73 7a 43  0 || szRight+szC
27d00 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74  ell[d]+2<=szLeft
27d10 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20 29  -(szCell[r]+2) )
27d20 7b 0a 20 20 20 20 20 20 73 7a 52 69 67 68 74 20  {.      szRight 
27d30 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32  += szCell[d] + 2
27d40 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66 74 20 2d  ;.      szLeft -
27d50 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b  = szCell[r] + 2;
27d60 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d  .      cntNew[i-
27d70 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20  1]--;.      r = 
27d80 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b  cntNew[i-1] - 1;
27d90 0a 20 20 20 20 20 20 64 20 3d 20 72 20 2b 20 31  .      d = r + 1
27da0 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20   - leafData;.   
27db0 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20   }.    szNew[i] 
27dc0 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20 20 20 73  = szRight;.    s
27dd0 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65  zNew[i-1] = szLe
27de0 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69  ft;.  }..  /* Ei
27df0 74 68 65 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e  ther we found on
27e00 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20  e or more cells 
27e10 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f  (cntnew[0])>0) o
27e20 72 20 77 65 20 61 72 65 20 74 68 65 0a 20 20 2a  r we are the.  *
27e30 2a 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  * a virtual root
27e40 20 70 61 67 65 2e 20 20 41 20 76 69 72 74 75 61   page.  A virtua
27e50 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77  l root page is w
27e60 68 65 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f  hen the real roo
27e70 74 0a 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70  t.  ** page is p
27e80 61 67 65 20 31 20 61 6e 64 20 77 65 20 61 72 65  age 1 and we are
27e90 20 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20   the only child 
27ea0 6f 66 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  of that page..  
27eb0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74  */.  assert( cnt
27ec0 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61  New[0]>0 || (pPa
27ed0 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26  rent->pgno==1 &&
27ee0 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d   pParent->nCell=
27ef0 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  =0) );..  /*.  *
27f00 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77  * Allocate k new
27f10 20 70 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f   pages.  Reuse o
27f20 6c 64 20 70 61 67 65 73 20 77 68 65 72 65 20 70  ld pages where p
27f30 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  ossible..  */.  
27f40 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
27f50 67 6e 6f 3e 31 20 29 3b 0a 20 20 70 61 67 65 46  gno>1 );.  pageF
27f60 6c 61 67 73 20 3d 20 70 50 61 67 65 2d 3e 61 44  lags = pPage->aD
27f70 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d  ata[0];.  for(i=
27f80 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<k; i++){.  
27f90 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b    MemPage *pNew;
27fa0 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20  .    if( i<nOld 
27fb0 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  ){.      pNew = 
27fc0 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64  apNew[i] = apOld
27fd0 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e  [i];.      pgnoN
27fe0 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4f 6c 64 5b  ew[i] = pgnoOld[
27ff0 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b  i];.      apOld[
28000 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  i] = 0;.      rc
28010 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
28020 72 69 74 65 28 70 4e 65 77 2d 3e 70 44 62 50 61  rite(pNew->pDbPa
28030 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b  ge);.      nNew+
28040 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  +;.      if( rc 
28050 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
28060 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73  leanup;.    }els
28070 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
28080 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 63   i>0 );.      rc
28090 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
280a0 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c  Page(pBt, &pNew,
280b0 20 26 70 67 6e 6f 4e 65 77 5b 69 5d 2c 20 70 67   &pgnoNew[i], pg
280c0 6e 6f 4e 65 77 5b 69 2d 31 5d 2c 20 30 29 3b 0a  noNew[i-1], 0);.
280d0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
280e0 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
280f0 6e 75 70 3b 0a 20 20 20 20 20 20 61 70 4e 65 77  nup;.      apNew
28100 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  [i] = pNew;.    
28110 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 7d 0a    nNew++;.    }.
28120 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65      zeroPage(pNe
28130 77 2c 20 70 61 67 65 46 6c 61 67 73 29 3b 0a 20  w, pageFlags);. 
28140 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e   }..  /* Free an
28150 79 20 6f 6c 64 20 70 61 67 65 73 20 74 68 61 74  y old pages that
28160 20 77 65 72 65 20 6e 6f 74 20 72 65 75 73 65 64   were not reused
28170 20 61 73 20 6e 65 77 20 70 61 67 65 73 2e 0a 20   as new pages.. 
28180 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e   */.  while( i<n
28190 4f 6c 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  Old ){.    rc = 
281a0 66 72 65 65 50 61 67 65 28 61 70 4f 6c 64 5b 69  freePage(apOld[i
281b0 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  ]);.    if( rc )
281c0 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
281d0 65 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c 65 61  eanup;.    relea
281e0 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29  sePage(apOld[i])
281f0 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d  ;.    apOld[i] =
28200 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d   0;.    i++;.  }
28210 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74 20  ..  /*.  ** Put 
28220 74 68 65 20 6e 65 77 20 70 61 67 65 73 20 69 6e  the new pages in
28230 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72   accending order
28240 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 74 6f  .  This helps to
28250 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74 72 69  .  ** keep entri
28260 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66  es in the disk f
28270 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 73 6f 20  ile in order so 
28280 74 68 61 74 20 61 20 73 63 61 6e 0a 20 20 2a 2a  that a scan.  **
28290 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   of the table is
282a0 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74   a linear scan t
282b0 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c 65 2e  hrough the file.
282c0 20 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e 20 74    That.  ** in t
282d0 75 72 6e 20 68 65 6c 70 73 20 74 68 65 20 6f 70  urn helps the op
282e0 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 74  erating system t
282f0 6f 20 64 65 6c 69 76 65 72 20 70 61 67 65 73 0a  o deliver pages.
28300 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 69    ** from the di
28310 73 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c 79 2e  sk more rapidly.
28320 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28  .  **.  ** An O(
28330 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e 20 73  n^2) insertion s
28340 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 20 69 73  ort algorithm is
28350 20 75 73 65 64 2c 20 62 75 74 20 73 69 6e 63 65   used, but since
28360 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76 65 72  .  ** n is never
28370 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20 28 61   more than NB (a
28380 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e 74 29   small constant)
28390 2c 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 20 20  , that should.  
283a0 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62  ** not be a prob
283b0 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  lem..  **.  ** W
283c0 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73 20  hen NB==3, this 
283d0 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  one optimization
283e0 20 6d 61 6b 65 73 20 74 68 65 20 64 61 74 61 62   makes the datab
283f0 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74 20 32  ase.  ** about 2
28400 35 25 20 66 61 73 74 65 72 20 66 6f 72 20 6c 61  5% faster for la
28410 72 67 65 20 69 6e 73 65 72 74 69 6f 6e 73 20 61  rge insertions a
28420 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a 20 20  nd deletions..  
28430 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
28440 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  k-1; i++){.    i
28450 6e 74 20 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65  nt minV = pgnoNe
28460 77 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6d 69  w[i];.    int mi
28470 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28  nI = i;.    for(
28480 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29  j=i+1; j<k; j++)
28490 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f  {.      if( pgno
284a0 4e 65 77 5b 6a 5d 3c 28 75 6e 73 69 67 6e 65 64  New[j]<(unsigned
284b0 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20 20 20  )minV ){.       
284c0 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20   minI = j;.     
284d0 20 20 20 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65     minV = pgnoNe
284e0 77 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  w[j];.      }.  
284f0 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e 49    }.    if( minI
28500 3e 69 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  >i ){.      int 
28510 74 3b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  t;.      MemPage
28520 20 2a 70 54 3b 0a 20 20 20 20 20 20 74 20 3d 20   *pT;.      t = 
28530 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20  pgnoNew[i];.    
28540 20 20 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b    pT = apNew[i];
28550 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69  .      pgnoNew[i
28560 5d 20 3d 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49  ] = pgnoNew[minI
28570 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69  ];.      apNew[i
28580 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b  ] = apNew[minI];
28590 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 6d  .      pgnoNew[m
285a0 69 6e 49 5d 20 3d 20 74 3b 0a 20 20 20 20 20 20  inI] = t;.      
285b0 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54  apNew[minI] = pT
285c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52  ;.    }.  }.  TR
285d0 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f  ACE(("BALANCE: o
285e0 6c 64 3a 20 25 64 20 25 64 20 25 64 20 20 6e 65  ld: %d %d %d  ne
285f0 77 3a 20 25 64 28 25 64 29 20 25 64 28 25 64 29  w: %d(%d) %d(%d)
28600 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25   %d(%d) %d(%d) %
28610 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 70 67  d(%d)\n",.    pg
28620 6e 6f 4f 6c 64 5b 30 5d 2c 20 0a 20 20 20 20 6e  noOld[0], .    n
28630 4f 6c 64 3e 3d 32 20 3f 20 70 67 6e 6f 4f 6c 64  Old>=2 ? pgnoOld
28640 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c  [1] : 0,.    nOl
28650 64 3e 3d 33 20 3f 20 70 67 6e 6f 4f 6c 64 5b 32  d>=3 ? pgnoOld[2
28660 5d 20 3a 20 30 2c 0a 20 20 20 20 70 67 6e 6f 4e  ] : 0,.    pgnoN
28670 65 77 5b 30 5d 2c 20 73 7a 4e 65 77 5b 30 5d 2c  ew[0], szNew[0],
28680 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 70  .    nNew>=2 ? p
28690 67 6e 6f 4e 65 77 5b 31 5d 20 3a 20 30 2c 20 6e  gnoNew[1] : 0, n
286a0 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31  New>=2 ? szNew[1
286b0 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e  ] : 0,.    nNew>
286c0 3d 33 20 3f 20 70 67 6e 6f 4e 65 77 5b 32 5d 20  =3 ? pgnoNew[2] 
286d0 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73  : 0, nNew>=3 ? s
286e0 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20  zNew[2] : 0,.   
286f0 20 6e 4e 65 77 3e 3d 34 20 3f 20 70 67 6e 6f 4e   nNew>=4 ? pgnoN
28700 65 77 5b 33 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e  ew[3] : 0, nNew>
28710 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20  =4 ? szNew[3] : 
28720 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f  0,.    nNew>=5 ?
28730 20 70 67 6e 6f 4e 65 77 5b 34 5d 20 3a 20 30 2c   pgnoNew[4] : 0,
28740 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77   nNew>=5 ? szNew
28750 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 2f 2a  [4] : 0));..  /*
28760 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73  .  ** Evenly dis
28770 74 72 69 62 75 74 65 20 74 68 65 20 64 61 74 61  tribute the data
28780 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72   in apCell[] acr
28790 6f 73 73 20 74 68 65 20 6e 65 77 20 70 61 67 65  oss the new page
287a0 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20 64  s..  ** Insert d
287b0 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74  ivider cells int
287c0 6f 20 70 50 61 72 65 6e 74 20 61 73 20 6e 65 63  o pParent as nec
287d0 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a  essary..  */.  j
287e0 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
287f0 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20   i<nNew; i++){. 
28800 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74     /* Assemble t
28810 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70  he new sibling p
28820 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50  age. */.    MemP
28830 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65  age *pNew = apNe
28840 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74  w[i];.    assert
28850 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( j<nMaxCells );
28860 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
28870 77 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 4e 65 77  w->pgno==pgnoNew
28880 5b 69 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 6d  [i] );.    assem
28890 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 63 6e  blePage(pNew, cn
288a0 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65  tNew[i]-j, &apCe
288b0 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a  ll[j], &szCell[j
288c0 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
288d0 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c  pNew->nCell>0 ||
288e0 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74   (nNew==1 && cnt
288f0 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20  New[0]==0) );.  
28900 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
28910 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
28920 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
28930 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
28940 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
28950 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  s an auto-vacuum
28960 20 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74   database, updat
28970 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  e the pointer ma
28980 70 20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a  p entries.    **
28990 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 74   that point to t
289a0 68 65 20 73 69 62 6c 69 6e 67 73 20 74 68 61 74  he siblings that
289b0 20 77 65 72 65 20 72 65 61 72 72 61 6e 67 65 64   were rearranged
289c0 2e 20 54 68 65 73 65 20 63 61 6e 20 62 65 3a 20  . These can be: 
289d0 6c 65 66 74 0a 20 20 20 20 2a 2a 20 63 68 69 6c  left.    ** chil
289e0 64 72 65 6e 20 6f 66 20 63 65 6c 6c 73 2c 20 74  dren of cells, t
289f0 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f  he right-child o
28a00 66 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20 6f  f the page, or o
28a10 76 65 72 66 6c 6f 77 20 70 61 67 65 73 0a 20 20  verflow pages.  
28a20 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20    ** pointed to 
28a30 62 79 20 63 65 6c 6c 73 2e 0a 20 20 20 20 2a 2f  by cells..    */
28a40 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75  .    if( pBt->au
28a50 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
28a60 20 20 66 6f 72 28 6b 3d 6a 3b 20 6b 3c 63 6e 74    for(k=j; k<cnt
28a70 4e 65 77 5b 69 5d 3b 20 6b 2b 2b 29 7b 0a 20 20  New[i]; k++){.  
28a80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c        assert( k<
28a90 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
28aa0 20 20 20 20 20 69 66 28 20 61 46 72 6f 6d 5b 6b       if( aFrom[k
28ab0 5d 3d 3d 30 78 46 46 20 7c 7c 20 61 70 43 6f 70  ]==0xFF || apCop
28ac0 79 5b 61 46 72 6f 6d 5b 6b 5d 5d 2d 3e 70 67 6e  y[aFrom[k]]->pgn
28ad0 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b  o!=pNew->pgno ){
28ae0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
28af0 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 4e  ptrmapPutOvfl(pN
28b00 65 77 2c 20 6b 2d 6a 29 3b 0a 20 20 20 20 20 20  ew, k-j);.      
28b10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
28b20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
28b30 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63       goto balanc
28b40 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
28b50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
28b60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
28b70 65 6e 64 69 66 0a 0a 20 20 20 20 6a 20 3d 20 63  endif..    j = c
28b80 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f  ntNew[i];..    /
28b90 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67  * If the sibling
28ba0 20 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20   page assembled 
28bb0 61 62 6f 76 65 20 77 61 73 20 6e 6f 74 20 74 68  above was not th
28bc0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62  e right-most sib
28bd0 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73  ling,.    ** ins
28be0 65 72 74 20 61 20 64 69 76 69 64 65 72 20 63 65  ert a divider ce
28bf0 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65  ll into the pare
28c00 6e 74 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  nt page..    */.
28c10 20 20 20 20 69 66 28 20 69 3c 6e 4e 65 77 2d 31      if( i<nNew-1
28c20 20 26 26 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20   && j<nCell ){. 
28c30 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a       u8 *pCell;.
28c40 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b        u8 *pTemp;
28c50 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a  .      int sz;..
28c60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c        assert( j<
28c70 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
28c80 20 20 20 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c     pCell = apCel
28c90 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d  l[j];.      sz =
28ca0 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61   szCell[j] + lea
28cb0 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20  fCorrection;.   
28cc0 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61     pTemp = &aSpa
28cd0 63 65 32 5b 69 53 70 61 63 65 32 5d 3b 0a 20 20  ce2[iSpace2];.  
28ce0 20 20 20 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c      if( !pNew->l
28cf0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  eaf ){.        m
28d00 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e 61 44 61  emcpy(&pNew->aDa
28d10 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29  ta[8], pCell, 4)
28d20 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
28d30 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20  ( leafData ){.  
28d40 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
28d50 74 72 65 65 20 69 73 20 61 20 6c 65 61 66 2d 64  tree is a leaf-d
28d60 61 74 61 20 74 72 65 65 2c 20 61 6e 64 20 74 68  ata tree, and th
28d70 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6c  e siblings are l
28d80 65 61 76 65 73 2c 20 0a 20 20 20 20 20 20 20 20  eaves, .        
28d90 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  ** then there is
28da0 20 6e 6f 20 64 69 76 69 64 65 72 20 63 65 6c 6c   no divider cell
28db0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e   in apCell[]. In
28dc0 73 74 65 61 64 2c 20 74 68 65 20 64 69 76 69 64  stead, the divid
28dd0 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  er .        ** c
28de0 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
28df0 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  the integer key 
28e00 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  for the right-mo
28e10 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20  st cell of .    
28e20 20 20 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69      ** the sibli
28e30 6e 67 2d 70 61 67 65 20 61 73 73 65 6d 62 6c 65  ng-page assemble
28e40 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20  d above only..  
28e50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
28e60 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
28e70 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20          j--;.   
28e80 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
28e90 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 4e  eParseCellPtr(pN
28ea0 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26  ew, apCell[j], &
28eb0 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70  info);.        p
28ec0 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20  Cell = pTemp;.  
28ed0 20 20 20 20 20 20 66 69 6c 6c 49 6e 43 65 6c 6c        fillInCell
28ee0 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 2c  (pParent, pCell,
28ef0 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30   0, info.nKey, 0
28f00 2c 20 30 2c 20 30 2c 20 26 73 7a 29 3b 0a 20 20  , 0, 0, &sz);.  
28f10 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 30 3b        pTemp = 0;
28f20 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
28f30 20 20 20 20 20 20 70 43 65 6c 6c 20 2d 3d 20 34        pCell -= 4
28f40 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 62 73  ;.        /* Obs
28f50 63 75 72 65 20 63 61 73 65 20 66 6f 72 20 6e 6f  cure case for no
28f60 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65  n-leaf-data tree
28f70 73 3a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 61  s: If the cell a
28f80 74 20 70 43 65 6c 6c 20 77 61 73 0a 20 20 20 20  t pCell was.    
28f90 20 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c      ** previousl
28fa0 79 20 73 74 6f 72 65 64 20 6f 6e 20 61 20 6c 65  y stored on a le
28fb0 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20 69 74 73  af node, and its
28fc0 20 72 65 70 6f 72 74 65 64 20 73 69 7a 65 20 77   reported size w
28fd0 61 73 20 34 0a 20 20 20 20 20 20 20 20 2a 2a 20  as 4.        ** 
28fe0 62 79 74 65 73 2c 20 74 68 65 6e 20 69 74 20 6d  bytes, then it m
28ff0 61 79 20 61 63 74 75 61 6c 6c 79 20 62 65 20 73  ay actually be s
29000 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 69 73  maller than this
29010 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 73 65   .        ** (se
29020 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  e sqlite3BtreePa
29030 72 73 65 43 65 6c 6c 50 74 72 28 29 2c 20 34 20  rseCellPtr(), 4 
29040 62 79 74 65 73 20 69 73 20 74 68 65 20 6d 69 6e  bytes is the min
29050 69 6d 75 6d 20 73 69 7a 65 20 6f 66 0a 20 20 20  imum size of.   
29060 20 20 20 20 20 2a 2a 20 61 6e 79 20 63 65 6c 6c       ** any cell
29070 29 2e 20 42 75 74 20 69 74 20 69 73 20 69 6d 70  ). But it is imp
29080 6f 72 74 61 6e 74 20 74 6f 20 70 61 73 73 20 74  ortant to pass t
29090 68 65 20 63 6f 72 72 65 63 74 20 73 69 7a 65 20  he correct size 
290a0 74 6f 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  to .        ** i
290b0 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20 73 6f 20  nsertCell(), so 
290c0 72 65 70 61 72 73 65 20 74 68 65 20 63 65 6c 6c  reparse the cell
290d0 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a 2a   now..        **
290e0 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  .        ** Note
290f0 20 74 68 61 74 20 74 68 69 73 20 63 61 6e 20 6e   that this can n
29100 65 76 65 72 20 68 61 70 70 65 6e 20 69 6e 20 61  ever happen in a
29110 6e 20 53 51 4c 69 74 65 20 64 61 74 61 20 66 69  n SQLite data fi
29120 6c 65 2c 20 61 73 20 61 6c 6c 0a 20 20 20 20 20  le, as all.     
29130 20 20 20 2a 2a 20 63 65 6c 6c 73 20 61 72 65 20     ** cells are 
29140 61 74 20 6c 65 61 73 74 20 34 20 62 79 74 65 73  at least 4 bytes
29150 2e 20 49 74 20 6f 6e 6c 79 20 68 61 70 70 65 6e  . It only happen
29160 73 20 69 6e 20 62 2d 74 72 65 65 73 20 75 73 65  s in b-trees use
29170 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  d.        ** to 
29180 65 76 61 6c 75 61 74 65 20 22 49 4e 20 28 53 45  evaluate "IN (SE
29190 4c 45 43 54 20 2e 2e 2e 29 22 20 61 6e 64 20 73  LECT ...)" and s
291a0 69 6d 69 6c 61 72 20 63 6c 61 75 73 65 73 2e 0a  imilar clauses..
291b0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
291c0 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d     if( szCell[j]
291d0 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==4 ){.         
291e0 20 61 73 73 65 72 74 28 6c 65 61 66 43 6f 72 72   assert(leafCorr
291f0 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20  ection==4);.    
29200 20 20 20 20 20 20 73 7a 20 3d 20 63 65 6c 6c 53        sz = cellS
29210 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20  izePtr(pParent, 
29220 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20  pCell);.        
29230 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
29240 69 53 70 61 63 65 32 20 2b 3d 20 73 7a 3b 0a 20  iSpace2 += sz;. 
29250 20 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c       assert( sz<
29260 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34  =pBt->pageSize/4
29270 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
29280 28 20 69 53 70 61 63 65 32 3c 3d 70 42 74 2d 3e  ( iSpace2<=pBt->
29290 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  pageSize );.    
292a0 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c    rc = insertCel
292b0 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76  l(pParent, nxDiv
292c0 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20 70 54 65  , pCell, sz, pTe
292d0 6d 70 2c 20 34 29 3b 0a 20 20 20 20 20 20 69 66  mp, 4);.      if
292e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
292f0 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
29300 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 70 75  leanup;.      pu
29310 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66  t4byte(findOverf
29320 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  lowCell(pParent,
29330 6e 78 44 69 76 29 2c 20 70 4e 65 77 2d 3e 70 67  nxDiv), pNew->pg
29340 6e 6f 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  no);.#ifndef SQL
29350 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
29360 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
29370 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 2d  this is an auto-
29380 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2c  vacuum database,
29390 20 61 6e 64 20 6e 6f 74 20 61 20 6c 65 61 66 2d   and not a leaf-
293a0 64 61 74 61 20 74 72 65 65 2c 0a 20 20 20 20 20  data tree,.     
293b0 20 2a 2a 20 74 68 65 6e 20 75 70 64 61 74 65 20   ** then update 
293c0 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  the pointer map 
293d0 77 69 74 68 20 61 6e 20 65 6e 74 72 79 20 66 6f  with an entry fo
293e0 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  r the overflow p
293f0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  age.      ** tha
29400 74 20 74 68 65 20 63 65 6c 6c 20 6a 75 73 74 20  t the cell just 
29410 69 6e 73 65 72 74 65 64 20 70 6f 69 6e 74 73 20  inserted points 
29420 74 6f 20 28 69 66 20 61 6e 79 29 2e 0a 20 20 20  to (if any)..   
29430 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
29440 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
29450 26 26 20 21 6c 65 61 66 44 61 74 61 20 29 7b 0a  && !leafData ){.
29460 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
29470 6d 61 70 50 75 74 4f 76 66 6c 28 70 50 61 72 65  mapPutOvfl(pPare
29480 6e 74 2c 20 6e 78 44 69 76 29 3b 0a 20 20 20 20  nt, nxDiv);.    
29490 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
294a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
294b0 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
294c0 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20  cleanup;.       
294d0 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
294e0 66 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20  f.      j++;.   
294f0 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20 20     nxDiv++;.    
29500 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
29510 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  j==nCell );.  as
29520 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a  sert( nOld>0 );.
29530 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30    assert( nNew>0
29540 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67 65 46   );.  if( (pageF
29550 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41 46 29  lags & PTF_LEAF)
29560 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  ==0 ){.    memcp
29570 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d  y(&apNew[nNew-1]
29580 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26 61 70 43  ->aData[8], &apC
29590 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61  opy[nOld-1]->aDa
295a0 74 61 5b 38 5d 2c 20 34 29 3b 0a 20 20 7d 0a 20  ta[8], 4);.  }. 
295b0 20 69 66 28 20 6e 78 44 69 76 3d 3d 70 50 61 72   if( nxDiv==pPar
295c0 65 6e 74 2d 3e 6e 43 65 6c 6c 2b 70 50 61 72 65  ent->nCell+pPare
295d0 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b  nt->nOverflow ){
295e0 0a 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d 6f  .    /* Right-mo
295f0 73 74 20 73 69 62 6c 69 6e 67 20 69 73 20 74 68  st sibling is th
29600 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69  e right-most chi
29610 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 20 2a 2f  ld of pParent */
29620 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70  .    put4byte(&p
29630 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
29640 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
29650 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65  +8], pgnoNew[nNe
29660 77 2d 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  w-1]);.  }else{.
29670 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d 6f 73      /* Right-mos
29680 74 20 73 69 62 6c 69 6e 67 20 69 73 20 74 68 65  t sibling is the
29690 20 6c 65 66 74 20 63 68 69 6c 64 20 6f 66 20 74   left child of t
296a0 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
296b0 6e 20 70 50 61 72 65 6e 74 0a 20 20 20 20 2a 2a  n pParent.    **
296c0 20 70 61 73 74 20 74 68 65 20 72 69 67 68 74 2d   past the right-
296d0 6d 6f 73 74 20 64 69 76 69 64 65 72 20 65 6e 74  most divider ent
296e0 72 79 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79  ry */.    put4by
296f0 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  te(findOverflowC
29700 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44  ell(pParent, nxD
29710 69 76 29 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65  iv), pgnoNew[nNe
29720 77 2d 31 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  w-1]);.  }..  /*
29730 0a 20 20 2a 2a 20 52 65 70 61 72 65 6e 74 20 63  .  ** Reparent c
29740 68 69 6c 64 72 65 6e 20 6f 66 20 61 6c 6c 20 63  hildren of all c
29750 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ells..  */.  for
29760 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b  (i=0; i<nNew; i+
29770 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 70  +){.    rc = rep
29780 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28  arentChildPages(
29790 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 20 20 69  apNew[i]);.    i
297a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
297b0 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
297c0 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 72  cleanup;.  }.  r
297d0 63 20 3d 20 72 65 70 61 72 65 6e 74 43 68 69 6c  c = reparentChil
297e0 64 50 61 67 65 73 28 70 50 61 72 65 6e 74 29 3b  dPages(pParent);
297f0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
29800 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61  E_OK ) goto bala
29810 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 0a 20 20  nce_cleanup;..  
29820 2f 2a 0a 20 20 2a 2a 20 42 61 6c 61 6e 63 65 20  /*.  ** Balance 
29830 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e  the parent page.
29840 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20    Note that the 
29850 63 75 72 72 65 6e 74 20 70 61 67 65 20 28 70 50  current page (pP
29860 61 67 65 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20  age) might.  ** 
29870 68 61 76 65 20 62 65 65 6e 20 61 64 64 65 64 20  have been added 
29880 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  to the freelist 
29890 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 20 6c  so it might no l
298a0 6f 6e 67 65 72 20 62 65 20 69 6e 69 74 69 61 6c  onger be initial
298b0 69 7a 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20 74  ized..  ** But t
298c0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 20 77  he parent page w
298d0 69 6c 6c 20 61 6c 77 61 79 73 20 62 65 20 69 6e  ill always be in
298e0 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a  itialized..  */.
298f0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
29900 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 73  t->isInit );.  s
29910 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65  qlite3ScratchFre
29920 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 61 70 43  e(apCell);.  apC
29930 65 6c 6c 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  ell = 0;.  rc = 
29940 62 61 6c 61 6e 63 65 28 70 50 61 72 65 6e 74 2c  balance(pParent,
29950 20 30 29 3b 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a   0);.  .  /*.  *
29960 2a 20 43 6c 65 61 6e 75 70 20 62 65 66 6f 72 65  * Cleanup before
29970 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f   returning..  */
29980 0a 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70  .balance_cleanup
29990 3a 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46  :.  sqlite3PageF
299a0 72 65 65 28 61 53 70 61 63 65 32 29 3b 0a 20 20  ree(aSpace2);.  
299b0 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72  sqlite3ScratchFr
299c0 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20 66 6f  ee(apCell);.  fo
299d0 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69  r(i=0; i<nOld; i
299e0 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  ++){.    release
299f0 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a  Page(apOld[i]);.
29a00 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69    }.  for(i=0; i
29a10 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nNew; i++){.   
29a20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61 70 4e   releasePage(apN
29a30 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 72 65  ew[i]);.  }.  re
29a40 6c 65 61 73 65 50 61 67 65 28 70 50 61 72 65 6e  leasePage(pParen
29a50 74 29 3b 0a 20 20 54 52 41 43 45 28 28 22 42 41  t);.  TRACE(("BA
29a60 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68 65 64 20  LANCE: finished 
29a70 77 69 74 68 20 25 64 3a 20 6f 6c 64 3d 25 64 20  with %d: old=%d 
29a80 6e 65 77 3d 25 64 20 63 65 6c 6c 73 3d 25 64 5c  new=%d cells=%d\
29a90 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 50  n",.          pP
29aa0 61 67 65 2d 3e 70 67 6e 6f 2c 20 6e 4f 6c 64 2c  age->pgno, nOld,
29ab0 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a   nNew, nCell));.
29ac0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
29ad0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
29ae0 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72  ne is called for
29af0 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f   the root page o
29b00 66 20 61 20 62 74 72 65 65 20 77 68 65 6e 20 74  f a btree when t
29b10 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20  he root.** page 
29b20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c  contains no cell
29b30 73 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f  s.  This is an o
29b40 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 6d 61  pportunity to ma
29b50 6b 65 20 74 68 65 20 74 72 65 65 0a 2a 2a 20 73  ke the tree.** s
29b60 68 61 6c 6c 6f 77 65 72 20 62 79 20 6f 6e 65 20  hallower by one 
29b70 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63  level..*/.static
29b80 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 73 68 61   int balance_sha
29b90 6c 6c 6f 77 65 72 28 4d 65 6d 50 61 67 65 20 2a  llower(MemPage *
29ba0 70 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  pPage){.  MemPag
29bb0 65 20 2a 70 43 68 69 6c 64 3b 20 20 20 20 20 20  e *pChild;      
29bc0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e         /* The on
29bd0 6c 79 20 63 68 69 6c 64 20 70 61 67 65 20 6f 66  ly child page of
29be0 20 70 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f   pPage */.  Pgno
29bf0 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20   pgnoChild;     
29c00 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
29c10 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 43 68 69   number for pChi
29c20 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ld */.  int rc =
29c30 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
29c40 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
29c50 6f 64 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63  ode from subproc
29c60 65 64 75 72 65 73 20 2a 2f 0a 20 20 42 74 53 68  edures */.  BtSh
29c70 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20  ared *pBt;      
29c80 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
29c90 68 65 20 6d 61 69 6e 20 42 54 72 65 65 20 73 74  he main BTree st
29ca0 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 69 6e 74  ructure */.  int
29cb0 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 3b 20   mxCellPerPage; 
29cc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
29cd0 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63  imum number of c
29ce0 65 6c 6c 73 20 70 65 72 20 70 61 67 65 20 2a 2f  ells per page */
29cf0 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 3b 20  .  u8 **apCell; 
29d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d10 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20 66 72 6f  /* All cells fro
29d20 6d 20 70 61 67 65 73 20 62 65 69 6e 67 20 62 61  m pages being ba
29d30 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20  lanced */.  u16 
29d40 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  *szCell;        
29d50 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
29d60 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65  l size of all ce
29d70 6c 6c 73 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  lls */..  assert
29d80 28 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  ( pPage->pParent
29d90 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
29da0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30   pPage->nCell==0
29db0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
29dc0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
29dd0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
29de0 65 78 29 20 29 3b 0a 20 20 70 42 74 20 3d 20 70  ex) );.  pBt = p
29df0 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 6d 78 43  Page->pBt;.  mxC
29e00 65 6c 6c 50 65 72 50 61 67 65 20 3d 20 4d 58 5f  ellPerPage = MX_
29e10 43 45 4c 4c 28 70 42 74 29 3b 0a 20 20 61 70 43  CELL(pBt);.  apC
29e20 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ell = sqlite3Mal
29e30 6c 6f 63 28 20 6d 78 43 65 6c 6c 50 65 72 50 61  loc( mxCellPerPa
29e40 67 65 2a 28 73 69 7a 65 6f 66 28 75 38 2a 29 2b  ge*(sizeof(u8*)+
29e50 73 69 7a 65 6f 66 28 75 31 36 29 29 20 29 3b 0a  sizeof(u16)) );.
29e60 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20    if( apCell==0 
29e70 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
29e80 4e 4f 4d 45 4d 3b 0a 20 20 73 7a 43 65 6c 6c 20  NOMEM;.  szCell 
29e90 3d 20 28 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b  = (u16*)&apCell[
29ea0 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 5d 3b 0a  mxCellPerPage];.
29eb0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61    if( pPage->lea
29ec0 66 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  f ){.    /* The 
29ed0 74 61 62 6c 65 20 69 73 20 63 6f 6d 70 6c 65 74  table is complet
29ee0 65 6c 79 20 65 6d 70 74 79 20 2a 2f 0a 20 20 20  ely empty */.   
29ef0 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
29f00 3a 20 65 6d 70 74 79 20 74 61 62 6c 65 20 25 64  : empty table %d
29f10 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  \n", pPage->pgno
29f20 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
29f30 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67   /* The root pag
29f40 65 20 69 73 20 65 6d 70 74 79 20 62 75 74 20 68  e is empty but h
29f50 61 73 20 6f 6e 65 20 63 68 69 6c 64 2e 20 20 54  as one child.  T
29f60 72 61 6e 73 66 65 72 20 74 68 65 0a 20 20 20 20  ransfer the.    
29f70 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ** information f
29f80 72 6f 6d 20 74 68 61 74 20 6f 6e 65 20 63 68 69  rom that one chi
29f90 6c 64 20 69 6e 74 6f 20 74 68 65 20 72 6f 6f 74  ld into the root
29fa0 20 70 61 67 65 20 69 66 20 69 74 20 0a 20 20 20   page if it .   
29fb0 20 2a 2a 20 77 69 6c 6c 20 66 69 74 2e 20 20 54   ** will fit.  T
29fc0 68 69 73 20 72 65 64 75 63 65 73 20 74 68 65 20  his reduces the 
29fd0 64 65 70 74 68 20 6f 66 20 74 68 65 20 74 72 65  depth of the tre
29fe0 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a  e by one..    **
29ff0 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 72  .    ** If the r
2a000 6f 6f 74 20 70 61 67 65 20 69 73 20 70 61 67 65  oot page is page
2a010 20 31 2c 20 69 74 20 68 61 73 20 6c 65 73 73 20   1, it has less 
2a020 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20  space available 
2a030 74 68 61 6e 0a 20 20 20 20 2a 2a 20 69 74 73 20  than.    ** its 
2a040 63 68 69 6c 64 20 28 64 75 65 20 74 6f 20 74 68  child (due to th
2a050 65 20 31 30 30 20 62 79 74 65 20 68 65 61 64 65  e 100 byte heade
2a060 72 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74  r that occurs at
2a070 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20   the beginning. 
2a080 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 61 74     ** of the dat
2a090 61 62 61 73 65 20 66 6c 65 29 2c 20 73 6f 20 69  abase fle), so i
2a0a0 74 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61  t might not be a
2a0b0 62 6c 65 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20  ble to hold all 
2a0c0 6f 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 69  of the .    ** i
2a0d0 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 75 72 72 65  nformation curre
2a0e0 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 69  ntly contained i
2a0f0 6e 20 74 68 65 20 63 68 69 6c 64 2e 20 20 49 66  n the child.  If
2a100 20 74 68 69 73 20 69 73 20 74 68 65 20 0a 20 20   this is the .  
2a110 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 6e 20    ** case, then 
2a120 64 6f 20 6e 6f 74 20 64 6f 20 74 68 65 20 74 72  do not do the tr
2a130 61 6e 73 66 65 72 2e 20 20 4c 65 61 76 65 20 70  ansfer.  Leave p
2a140 61 67 65 20 31 20 65 6d 70 74 79 20 65 78 63 65  age 1 empty exce
2a150 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  pt.    ** for th
2a160 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20  e right-pointer 
2a170 74 6f 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  to the child pag
2a180 65 2e 20 20 54 68 65 20 63 68 69 6c 64 20 70 61  e.  The child pa
2a190 67 65 20 62 65 63 6f 6d 65 73 0a 20 20 20 20 2a  ge becomes.    *
2a1a0 2a 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f  * the virtual ro
2a1b0 6f 74 20 6f 66 20 74 68 65 20 74 72 65 65 2e 0a  ot of the tree..
2a1c0 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 6e 6f 43      */.    pgnoC
2a1d0 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28  hild = get4byte(
2a1e0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
2a1f0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
2a200 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
2a210 70 67 6e 6f 43 68 69 6c 64 3e 30 20 29 3b 0a 20  pgnoChild>0 );. 
2a220 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 43     assert( pgnoC
2a230 68 69 6c 64 3c 3d 70 61 67 65 72 50 61 67 65 63  hild<=pagerPagec
2a240 6f 75 6e 74 28 70 50 61 67 65 2d 3e 70 42 74 2d  ount(pPage->pBt-
2a250 3e 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  >pPager) );.    
2a260 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2a270 65 47 65 74 50 61 67 65 28 70 50 61 67 65 2d 3e  eGetPage(pPage->
2a280 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20  pBt, pgnoChild, 
2a290 26 70 43 68 69 6c 64 2c 20 30 29 3b 0a 20 20 20  &pChild, 0);.   
2a2a0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
2a2b0 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e  nd_shallow_balan
2a2c0 63 65 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ce;.    if( pPag
2a2d0 65 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  e->pgno==1 ){.  
2a2e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2a2f0 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 43  BtreeInitPage(pC
2a300 68 69 6c 64 2c 20 70 50 61 67 65 29 3b 0a 20 20  hild, pPage);.  
2a310 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2a320 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61  o end_shallow_ba
2a330 6c 61 6e 63 65 3b 0a 20 20 20 20 20 20 61 73 73  lance;.      ass
2a340 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76  ert( pChild->nOv
2a350 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 20  erflow==0 );.   
2a360 20 20 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e     if( pChild->n
2a370 46 72 65 65 3e 3d 31 30 30 20 29 7b 0a 20 20 20  Free>=100 ){.   
2a380 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 69 6c       /* The chil
2a390 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
2a3a0 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 72 6f  ll fit on the ro
2a3b0 6f 74 20 70 61 67 65 2c 20 73 6f 20 64 6f 20 74  ot page, so do t
2a3c0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  he.        ** co
2a3d0 70 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  py */.        in
2a3e0 74 20 69 3b 0a 20 20 20 20 20 20 20 20 7a 65 72  t i;.        zer
2a3f0 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70 43 68  oPage(pPage, pCh
2a400 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a  ild->aData[0]);.
2a410 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
2a420 20 69 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c   i<pChild->nCell
2a430 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2a440 20 20 61 70 43 65 6c 6c 5b 69 5d 20 3d 20 66 69    apCell[i] = fi
2a450 6e 64 43 65 6c 6c 28 70 43 68 69 6c 64 2c 69 29  ndCell(pChild,i)
2a460 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 43 65  ;.          szCe
2a470 6c 6c 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65  ll[i] = cellSize
2a480 50 74 72 28 70 43 68 69 6c 64 2c 20 61 70 43 65  Ptr(pChild, apCe
2a490 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ll[i]);.        
2a4a0 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 6d 62  }.        assemb
2a4b0 6c 65 50 61 67 65 28 70 50 61 67 65 2c 20 70 43  lePage(pPage, pC
2a4c0 68 69 6c 64 2d 3e 6e 43 65 6c 6c 2c 20 61 70 43  hild->nCell, apC
2a4d0 65 6c 6c 2c 20 73 7a 43 65 6c 6c 29 3b 0a 20 20  ell, szCell);.  
2a4e0 20 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68        /* Copy th
2a4f0 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20  e right-pointer 
2a500 6f 66 20 74 68 65 20 63 68 69 6c 64 20 74 6f 20  of the child to 
2a510 74 68 65 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20  the parent. */. 
2a520 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
2a530 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
2a540 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
2a550 5d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ], .            
2a560 67 65 74 34 62 79 74 65 28 26 70 43 68 69 6c 64  get4byte(&pChild
2a570 2d 3e 61 44 61 74 61 5b 70 43 68 69 6c 64 2d 3e  ->aData[pChild->
2a580 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a  hdrOffset+8]));.
2a590 20 20 20 20 20 20 20 20 66 72 65 65 50 61 67 65          freePage
2a5a0 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20  (pChild);.      
2a5b0 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
2a5c0 45 3a 20 63 68 69 6c 64 20 25 64 20 74 72 61 6e  E: child %d tran
2a5d0 73 66 65 72 20 74 6f 20 70 61 67 65 20 31 5c 6e  sfer to page 1\n
2a5e0 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29  ", pChild->pgno)
2a5f0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2a600 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
2a610 68 69 6c 64 20 68 61 73 20 6d 6f 72 65 20 69 6e  hild has more in
2a620 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77  formation that w
2a630 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 72  ill fit on the r
2a640 6f 6f 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  oot..        ** 
2a650 54 68 65 20 74 72 65 65 20 69 73 20 61 6c 72 65  The tree is alre
2a660 61 64 79 20 62 61 6c 61 6e 63 65 64 2e 20 20 44  ady balanced.  D
2a670 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20 20  o nothing. */.  
2a680 20 20 20 20 20 20 54 52 41 43 45 28 28 22 42 41        TRACE(("BA
2a690 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20 25 64 20  LANCE: child %d 
2a6a0 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20  will not fit on 
2a6b0 70 61 67 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c  page 1\n", pChil
2a6c0 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  d->pgno));.     
2a6d0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2a6e0 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
2a6f0 2d 3e 61 44 61 74 61 2c 20 70 43 68 69 6c 64 2d  ->aData, pChild-
2a700 3e 61 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70  >aData, pPage->p
2a710 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b  Bt->usableSize);
2a720 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 73  .      pPage->is
2a730 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Init = 0;.      
2a740 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20 3d  pPage->pParent =
2a750 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
2a760 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
2a770 61 67 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20  age(pPage, 0);. 
2a780 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
2a790 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
2a7a0 20 20 20 20 66 72 65 65 50 61 67 65 28 70 43 68      freePage(pCh
2a7b0 69 6c 64 29 3b 0a 20 20 20 20 20 20 54 52 41 43  ild);.      TRAC
2a7c0 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 74 72 61  E(("BALANCE: tra
2a7d0 6e 73 66 65 72 20 63 68 69 6c 64 20 25 64 20 69  nsfer child %d i
2a7e0 6e 74 6f 20 72 6f 6f 74 20 25 64 5c 6e 22 2c 0a  nto root %d\n",.
2a7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
2a800 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20 70 50 61 67  hild->pgno, pPag
2a810 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  e->pgno));.    }
2a820 0a 20 20 20 20 72 63 20 3d 20 72 65 70 61 72 65  .    rc = repare
2a830 6e 74 43 68 69 6c 64 50 61 67 65 73 28 70 50 61  ntChildPages(pPa
2a840 67 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ge);.    assert(
2a850 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2a860 77 3d 3d 30 20 29 3b 0a 23 69 66 6e 64 65 66 20  w==0 );.#ifndef 
2a870 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2a880 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
2a890 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
2a8a0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
2a8b0 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2a8c0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  pPage->nCell; i+
2a8d0 2b 29 7b 20 0a 20 20 20 20 20 20 20 20 72 63 20  +){ .        rc 
2a8e0 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28  = ptrmapPutOvfl(
2a8f0 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20  pPage, i);.     
2a900 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2a910 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2a920 20 20 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c    goto end_shall
2a930 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20  ow_balance;.    
2a940 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2a950 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72    }.#endif.    r
2a960 65 6c 65 61 73 65 50 61 67 65 28 70 43 68 69 6c  eleasePage(pChil
2a970 64 29 3b 0a 20 20 7d 0a 65 6e 64 5f 73 68 61 6c  d);.  }.end_shal
2a980 6c 6f 77 5f 62 61 6c 61 6e 63 65 3a 0a 20 20 73  low_balance:.  s
2a990 71 6c 69 74 65 33 5f 66 72 65 65 28 61 70 43 65  qlite3_free(apCe
2a9a0 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ll);.  return rc
2a9b0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ;.}.../*.** The 
2a9c0 72 6f 6f 74 20 70 61 67 65 20 69 73 20 6f 76 65  root page is ove
2a9d0 72 66 75 6c 6c 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  rfull.**.** When
2a9e0 20 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 43   this happens, C
2a9f0 72 65 61 74 65 20 61 20 6e 65 77 20 63 68 69 6c  reate a new chil
2aa00 64 20 70 61 67 65 20 61 6e 64 20 63 6f 70 79 20  d page and copy 
2aa10 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  the.** contents 
2aa20 6f 66 20 74 68 65 20 72 6f 6f 74 20 69 6e 74 6f  of the root into
2aa30 20 74 68 65 20 63 68 69 6c 64 2e 20 20 54 68 65   the child.  The
2aa40 6e 20 6d 61 6b 65 20 74 68 65 20 72 6f 6f 74 0a  n make the root.
2aa50 2a 2a 20 70 61 67 65 20 61 6e 20 65 6d 70 74 79  ** page an empty
2aa60 20 70 61 67 65 20 77 69 74 68 20 72 69 67 68 74   page with right
2aa70 43 68 69 6c 64 20 70 6f 69 6e 74 69 6e 67 20 74  Child pointing t
2aa80 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20 63 68 69  o the new.** chi
2aa90 6c 64 2e 20 20 20 46 69 6e 61 6c 6c 79 2c 20 63  ld.   Finally, c
2aaa0 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 69 6e 74 65  all balance_inte
2aab0 72 6e 61 6c 28 29 20 6f 6e 20 74 68 65 20 6e 65  rnal() on the ne
2aac0 77 20 63 68 69 6c 64 0a 2a 2a 20 74 6f 20 63 61  w child.** to ca
2aad0 75 73 65 20 69 74 20 74 6f 20 73 70 6c 69 74 2e  use it to split.
2aae0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
2aaf0 61 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 4d 65  alance_deeper(Me
2ab00 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  mPage *pPage){. 
2ab10 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
2ab20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76       /* Return v
2ab30 61 6c 75 65 20 66 72 6f 6d 20 73 75 62 70 72 6f  alue from subpro
2ab40 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 4d 65 6d  cedures */.  Mem
2ab50 50 61 67 65 20 2a 70 43 68 69 6c 64 3b 20 20 20  Page *pChild;   
2ab60 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61   /* Pointer to a
2ab70 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20   new child page 
2ab80 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68  */.  Pgno pgnoCh
2ab90 69 6c 64 3b 20 20 20 20 20 2f 2a 20 50 61 67 65  ild;     /* Page
2aba0 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
2abb0 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f  ew child page */
2abc0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2abd0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
2abe0 20 42 54 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   BTree */.  int 
2abf0 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20  usableSize;     
2ac00 2f 2a 20 54 6f 74 61 6c 20 75 73 61 62 6c 65 20  /* Total usable 
2ac10 73 69 7a 65 20 6f 66 20 61 20 70 61 67 65 20 2a  size of a page *
2ac20 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
2ac30 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
2ac40 6e 74 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  nt of the parent
2ac50 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 63   page */.  u8 *c
2ac60 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f  data;          /
2ac70 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * Content of the
2ac80 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20   child page */. 
2ac90 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
2aca0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
2acb0 6f 20 70 61 67 65 20 68 65 61 64 65 72 20 69 6e  o page header in
2acc0 20 70 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74   parent */.  int
2acd0 20 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20   brk;           
2ace0 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 6f   /* Offset to co
2acf0 6e 74 65 6e 74 20 6f 66 20 66 69 72 73 74 20 63  ntent of first c
2ad00 65 6c 6c 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f  ell in parent */
2ad10 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
2ad20 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29 3b  e->pParent==0 );
2ad30 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2ad40 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 3b  ->nOverflow>0 );
2ad50 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  .  pBt = pPage->
2ad60 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73  pBt;.  assert( s
2ad70 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2ad80 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
2ad90 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65  .  rc = allocate
2ada0 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26  BtreePage(pBt, &
2adb0 70 43 68 69 6c 64 2c 20 26 70 67 6e 6f 43 68 69  pChild, &pgnoChi
2adc0 6c 64 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  ld, pPage->pgno,
2add0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20   0);.  if( rc ) 
2ade0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 61 73 73  return rc;.  ass
2adf0 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
2ae00 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 43 68  rIswriteable(pCh
2ae10 69 6c 64 2d 3e 70 44 62 50 61 67 65 29 20 29 3b  ild->pDbPage) );
2ae20 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20  .  usableSize = 
2ae30 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
2ae40 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
2ae50 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20  >aData;.  hdr = 
2ae60 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2ae70 3b 0a 20 20 62 72 6b 20 3d 20 67 65 74 32 62 79  ;.  brk = get2by
2ae80 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
2ae90 3b 0a 20 20 63 64 61 74 61 20 3d 20 70 43 68 69  ;.  cdata = pChi
2aea0 6c 64 2d 3e 61 44 61 74 61 3b 0a 20 20 6d 65 6d  ld->aData;.  mem
2aeb0 63 70 79 28 63 64 61 74 61 2c 20 26 64 61 74 61  cpy(cdata, &data
2aec0 5b 68 64 72 5d 2c 20 70 50 61 67 65 2d 3e 63 65  [hdr], pPage->ce
2aed0 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 61 67 65  llOffset+2*pPage
2aee0 2d 3e 6e 43 65 6c 6c 2d 68 64 72 29 3b 0a 20 20  ->nCell-hdr);.  
2aef0 6d 65 6d 63 70 79 28 26 63 64 61 74 61 5b 62 72  memcpy(&cdata[br
2af00 6b 5d 2c 20 26 64 61 74 61 5b 62 72 6b 5d 2c 20  k], &data[brk], 
2af10 75 73 61 62 6c 65 53 69 7a 65 2d 62 72 6b 29 3b  usableSize-brk);
2af20 0a 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c  .  assert( pChil
2af30 64 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29 3b 0a  d->isInit==0 );.
2af40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2af50 72 65 65 49 6e 69 74 50 61 67 65 28 70 43 68 69  reeInitPage(pChi
2af60 6c 64 2c 20 70 50 61 67 65 29 3b 0a 20 20 69 66  ld, pPage);.  if
2af70 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
2af80 6e 63 65 64 65 65 70 65 72 5f 6f 75 74 3b 0a 20  ncedeeper_out;. 
2af90 20 6d 65 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e   memcpy(pChild->
2afa0 61 4f 76 66 6c 2c 20 70 50 61 67 65 2d 3e 61 4f  aOvfl, pPage->aO
2afb0 76 66 6c 2c 20 70 50 61 67 65 2d 3e 6e 4f 76 65  vfl, pPage->nOve
2afc0 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 50 61  rflow*sizeof(pPa
2afd0 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a  ge->aOvfl[0]));.
2afe0 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66    pChild->nOverf
2aff0 6c 6f 77 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76  low = pPage->nOv
2b000 65 72 66 6c 6f 77 3b 0a 20 20 69 66 28 20 70 43  erflow;.  if( pC
2b010 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  hild->nOverflow 
2b020 29 7b 0a 20 20 20 20 70 43 68 69 6c 64 2d 3e 6e  ){.    pChild->n
2b030 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Free = 0;.  }.  
2b040 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e  assert( pChild->
2b050 6e 43 65 6c 6c 3d 3d 70 50 61 67 65 2d 3e 6e 43  nCell==pPage->nC
2b060 65 6c 6c 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67  ell );.  zeroPag
2b070 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d  e(pPage, pChild-
2b080 3e 61 44 61 74 61 5b 30 5d 20 26 20 7e 50 54 46  >aData[0] & ~PTF
2b090 5f 4c 45 41 46 29 3b 0a 20 20 70 75 74 34 62 79  _LEAF);.  put4by
2b0a0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
2b0b0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
2b0c0 74 2b 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29  t+8], pgnoChild)
2b0d0 3b 0a 20 20 54 52 41 43 45 28 28 22 42 41 4c 41  ;.  TRACE(("BALA
2b0e0 4e 43 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20 25  NCE: copy root %
2b0f0 64 20 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70 50  d into %d\n", pP
2b100 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 43 68 69 6c  age->pgno, pChil
2b110 64 2d 3e 70 67 6e 6f 29 29 3b 0a 23 69 66 6e 64  d->pgno));.#ifnd
2b120 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2b130 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28 20  UTOVACUUM.  if( 
2b140 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2b150 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
2b160 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
2b170 28 70 42 74 2c 20 70 43 68 69 6c 64 2d 3e 70 67  (pBt, pChild->pg
2b180 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
2b190 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
2b1a0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2b1b0 6f 20 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f  o balancedeeper_
2b1c0 6f 75 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  out;.    for(i=0
2b1d0 3b 20 69 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c  ; i<pChild->nCel
2b1e0 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72  l; i++){.      r
2b1f0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66  c = ptrmapPutOvf
2b200 6c 28 70 43 68 69 6c 64 2c 20 69 29 3b 0a 20 20  l(pChild, i);.  
2b210 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2b220 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2b230 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2b240 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65    }.    }.  }.#e
2b250 6e 64 69 66 0a 20 20 72 63 20 3d 20 62 61 6c 61  ndif.  rc = bala
2b260 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 43 68 69  nce_nonroot(pChi
2b270 6c 64 29 3b 0a 0a 62 61 6c 61 6e 63 65 64 65 65  ld);..balancedee
2b280 70 65 72 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61  per_out:.  relea
2b290 73 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a  sePage(pChild);.
2b2a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2b2b0 2f 2a 0a 2a 2a 20 44 65 63 69 64 65 20 69 66 20  /*.** Decide if 
2b2c0 74 68 65 20 70 61 67 65 20 70 50 61 67 65 20 6e  the page pPage n
2b2d0 65 65 64 73 20 74 6f 20 62 65 20 62 61 6c 61 6e  eeds to be balan
2b2e0 63 65 64 2e 20 20 49 66 20 62 61 6c 61 6e 63 69  ced.  If balanci
2b2f0 6e 67 20 69 73 0a 2a 2a 20 72 65 71 75 69 72 65  ng is.** require
2b300 64 2c 20 63 61 6c 6c 20 74 68 65 20 61 70 70 72  d, call the appr
2b310 6f 70 72 69 61 74 65 20 62 61 6c 61 6e 63 69 6e  opriate balancin
2b320 67 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74  g routine..*/.st
2b330 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
2b340 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
2b350 20 69 6e 74 20 69 6e 73 65 72 74 29 7b 0a 20 20   int insert){.  
2b360 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2b370 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  OK;.  assert( sq
2b380 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2b390 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
2b3a0 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  ex) );.  if( pPa
2b3b0 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20 29  ge->pParent==0 )
2b3c0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
2b3d0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
2b3e0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
2b3f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2b400 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f  _OK && pPage->nO
2b410 76 65 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20  verflow>0 ){.   
2b420 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f     rc = balance_
2b430 64 65 65 70 65 72 28 70 50 61 67 65 29 3b 0a 20  deeper(pPage);. 
2b440 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
2b450 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
2b460 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b  age->nCell==0 ){
2b470 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61  .      rc = bala
2b480 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 70 50  nce_shallower(pP
2b490 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  age);.    }.  }e
2b4a0 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61  lse{.    if( pPa
2b4b0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ge->nOverflow>0 
2b4c0 7c 7c 20 0a 20 20 20 20 20 20 20 20 28 21 69 6e  || .        (!in
2b4d0 73 65 72 74 20 26 26 20 70 50 61 67 65 2d 3e 6e  sert && pPage->n
2b4e0 46 72 65 65 3e 70 50 61 67 65 2d 3e 70 42 74 2d  Free>pPage->pBt-
2b4f0 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29  >usableSize*2/3)
2b500 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62   ){.      rc = b
2b510 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70  alance_nonroot(p
2b520 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
2b530 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2b540 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2b550 69 6e 65 20 63 68 65 63 6b 73 20 61 6c 6c 20 63  ine checks all c
2b560 75 72 73 6f 72 73 20 74 68 61 74 20 70 6f 69 6e  ursors that poin
2b570 74 20 74 6f 20 74 61 62 6c 65 20 70 67 6e 6f 52  t to table pgnoR
2b580 6f 6f 74 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 6f  oot..** If any o
2b590 66 20 74 68 6f 73 65 20 63 75 72 73 6f 72 73 20  f those cursors 
2b5a0 77 65 72 65 20 6f 70 65 6e 65 64 20 77 69 74 68  were opened with
2b5b0 20 77 72 46 6c 61 67 3d 3d 30 20 69 6e 20 61 20   wrFlag==0 in a 
2b5c0 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 64 61 74  different.** dat
2b5d0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2b5e0 20 28 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e   (a database con
2b5f0 6e 65 63 74 69 6f 6e 20 74 68 61 74 20 73 68 61  nection that sha
2b600 72 65 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  res the pager.**
2b610 20 63 61 63 68 65 20 77 69 74 68 20 74 68 65 20   cache with the 
2b620 63 75 72 72 65 6e 74 20 63 6f 6e 6e 65 63 74 69  current connecti
2b630 6f 6e 29 20 61 6e 64 20 74 68 61 74 20 6f 74 68  on) and that oth
2b640 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a  er connection .*
2b650 2a 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  * is not in the 
2b660 52 65 61 64 55 6e 63 6f 6d 6d 6d 69 74 74 65 64  ReadUncommmitted
2b670 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 69   state, then thi
2b680 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
2b690 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f 43  s .** SQLITE_LOC
2b6a0 4b 45 44 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 77 65  KED..**.** As we
2b6b0 6c 6c 20 61 73 20 63 75 72 73 6f 72 73 20 77 69  ll as cursors wi
2b6c0 74 68 20 77 72 46 6c 61 67 3d 3d 30 2c 20 63 75  th wrFlag==0, cu
2b6d0 72 73 6f 72 73 20 77 69 74 68 20 77 72 46 6c 61  rsors with wrFla
2b6e0 67 3d 3d 31 20 61 6e 64 20 0a 2a 2a 20 69 73 49  g==1 and .** isI
2b6f0 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 3d 3d 31  ncrblobHandle==1
2b700 20 61 72 65 20 61 6c 73 6f 20 63 6f 6e 73 69 64   are also consid
2b710 65 72 65 64 20 27 72 65 61 64 27 20 63 75 72 73  ered 'read' curs
2b720 6f 72 73 2e 20 49 6e 63 72 65 6d 65 6e 74 61 6c  ors. Incremental
2b730 20 0a 2a 2a 20 62 6c 6f 62 20 63 75 72 73 6f 72   .** blob cursor
2b740 73 20 61 72 65 20 75 73 65 64 20 66 6f 72 20 62  s are used for b
2b750 6f 74 68 20 72 65 61 64 69 6e 67 20 61 6e 64 20  oth reading and 
2b760 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57  writing..**.** W
2b770 68 65 6e 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20  hen pgnoRoot is 
2b780 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
2b790 20 61 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c 65   an intkey table
2b7a0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
2b7b0 69 73 20 61 6c 73 6f 0a 2a 2a 20 72 65 73 70 6f  is also.** respo
2b7c0 6e 73 69 62 6c 65 20 66 6f 72 20 69 6e 76 61 6c  nsible for inval
2b7d0 69 64 61 74 69 6e 67 20 69 6e 63 72 65 6d 65 6e  idating incremen
2b7e0 74 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72 73  tal blob cursors
2b7f0 20 77 68 65 6e 20 74 68 65 20 74 61 62 6c 65 20   when the table 
2b800 72 6f 77 0a 2a 2a 20 6f 6e 20 77 68 69 63 68 20  row.** on which 
2b810 74 68 65 79 20 61 72 65 20 6f 70 65 6e 65 64 20  they are opened 
2b820 69 73 20 64 65 6c 65 74 65 64 20 6f 72 20 6d 6f  is deleted or mo
2b830 64 69 66 69 65 64 2e 20 43 75 72 73 6f 72 73 20  dified. Cursors 
2b840 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a  are invalidated.
2b850 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  ** according to 
2b860 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 75  the following ru
2b870 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20  les:.**.**   1) 
2b880 57 68 65 6e 20 42 74 72 65 65 43 6c 65 61 72 54  When BtreeClearT
2b890 61 62 6c 65 28 29 20 69 73 20 63 61 6c 6c 65 64  able() is called
2b8a0 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64   to completely d
2b8b0 65 6c 65 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  elete the conten
2b8c0 74 73 0a 2a 2a 20 20 20 20 20 20 6f 66 20 61 20  ts.**      of a 
2b8d0 42 2d 54 72 65 65 20 74 61 62 6c 65 2c 20 70 45  B-Tree table, pE
2b8e0 78 63 6c 75 64 65 20 69 73 20 73 65 74 20 74 6f  xclude is set to
2b8f0 20 7a 65 72 6f 20 61 6e 64 20 70 61 72 61 6d 65   zero and parame
2b900 74 65 72 20 69 52 6f 77 20 69 73 20 0a 2a 2a 20  ter iRow is .** 
2b910 20 20 20 20 20 73 65 74 20 74 6f 20 6e 6f 6e 2d       set to non-
2b920 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61  zero. In this ca
2b930 73 65 20 61 6c 6c 20 69 6e 63 72 65 6d 65 6e 74  se all increment
2b940 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  al blob cursors 
2b950 6f 70 65 6e 0a 2a 2a 20 20 20 20 20 20 6f 6e 20  open.**      on 
2b960 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64  the table rooted
2b970 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 61 72 65   at pgnoRoot are
2b980 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2a   invalidated..**
2b990 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 42 74  .**   2) When Bt
2b9a0 72 65 65 49 6e 73 65 72 74 28 29 2c 20 42 74 72  reeInsert(), Btr
2b9b0 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74  eeDelete() or Bt
2b9c0 72 65 65 50 75 74 44 61 74 61 28 29 20 69 73 20  reePutData() is 
2b9d0 63 61 6c 6c 65 64 20 74 6f 20 0a 2a 2a 20 20 20  called to .**   
2b9e0 20 20 20 6d 6f 64 69 66 79 20 61 20 74 61 62 6c     modify a tabl
2b9f0 65 20 72 6f 77 20 76 69 61 20 61 6e 20 53 51 4c  e row via an SQL
2ba00 20 73 74 61 74 65 6d 65 6e 74 2c 20 70 45 78 63   statement, pExc
2ba10 6c 75 64 65 20 69 73 20 73 65 74 20 74 6f 20 74  lude is set to t
2ba20 68 65 20 0a 2a 2a 20 20 20 20 20 20 77 72 69 74  he .**      writ
2ba30 65 20 63 75 72 73 6f 72 20 75 73 65 64 20 74 6f  e cursor used to
2ba40 20 64 6f 20 74 68 65 20 6d 6f 64 69 66 69 63 61   do the modifica
2ba50 74 69 6f 6e 20 61 6e 64 20 70 61 72 61 6d 65 74  tion and paramet
2ba60 65 72 20 69 52 6f 77 20 69 73 20 73 65 74 0a 2a  er iRow is set.*
2ba70 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20 69 6e  *      to the in
2ba80 74 65 67 65 72 20 72 6f 77 20 69 64 20 6f 66 20  teger row id of 
2ba90 74 68 65 20 42 2d 54 72 65 65 20 65 6e 74 72 79  the B-Tree entry
2baa0 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e   being modified.
2bab0 20 55 6e 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20   Unless.**      
2bac0 70 45 78 63 6c 75 64 65 20 69 73 20 69 74 73 65  pExclude is itse
2bad0 6c 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  lf an incrementa
2bae0 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72 2c 20 74  l blob cursor, t
2baf0 68 65 6e 20 61 6c 6c 20 69 6e 63 72 65 6d 65 6e  hen all incremen
2bb00 74 61 6c 0a 2a 2a 20 20 20 20 20 20 62 6c 6f 62  tal.**      blob
2bb10 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e   cursors open on
2bb20 20 72 6f 77 20 69 52 6f 77 20 6f 66 20 74 68 65   row iRow of the
2bb30 20 42 2d 54 72 65 65 20 61 72 65 20 69 6e 76 61   B-Tree are inva
2bb40 6c 69 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20  lidated..**.**  
2bb50 20 33 29 20 49 66 20 62 6f 74 68 20 70 45 78 63   3) If both pExc
2bb60 6c 75 64 65 20 61 6e 64 20 69 52 6f 77 20 61 72  lude and iRow ar
2bb70 65 20 73 65 74 20 74 6f 20 7a 65 72 6f 2c 20 6e  e set to zero, n
2bb80 6f 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c  o incremental bl
2bb90 6f 62 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 73  ob .**      curs
2bba0 6f 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ors are invalida
2bbb0 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
2bbc0 6e 74 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b  nt checkReadLock
2bbd0 73 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72  s(.  Btree *pBtr
2bbe0 65 65 2c 20 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  ee, .  Pgno pgno
2bbf0 52 6f 6f 74 2c 20 0a 20 20 42 74 43 75 72 73 6f  Root, .  BtCurso
2bc00 72 20 2a 70 45 78 63 6c 75 64 65 2c 0a 20 20 69  r *pExclude,.  i
2bc10 36 34 20 69 52 6f 77 0a 29 7b 0a 20 20 42 74 43  64 iRow.){.  BtC
2bc20 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68  ursor *p;.  BtSh
2bc30 61 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72  ared *pBt = pBtr
2bc40 65 65 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74  ee->pBt;.  sqlit
2bc50 65 33 20 2a 64 62 20 3d 20 70 42 74 72 65 65 2d  e3 *db = pBtree-
2bc60 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73  >db;.  assert( s
2bc70 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
2bc80 4d 75 74 65 78 28 70 42 74 72 65 65 29 20 29 3b  Mutex(pBtree) );
2bc90 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43  .  for(p=pBt->pC
2bca0 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70  ursor; p; p=p->p
2bcb0 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
2bcc0 3d 3d 70 45 78 63 6c 75 64 65 20 29 20 63 6f 6e  ==pExclude ) con
2bcd0 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70  tinue;.    if( p
2bce0 2d 3e 70 67 6e 6f 52 6f 6f 74 21 3d 70 67 6e 6f  ->pgnoRoot!=pgno
2bcf0 52 6f 6f 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Root ) continue;
2bd00 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2bd10 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
2bd20 20 20 69 66 28 20 70 2d 3e 69 73 49 6e 63 72 62    if( p->isIncrb
2bd30 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 28 20 0a  lobHandle && ( .
2bd40 20 20 20 20 20 20 20 20 20 28 21 70 45 78 63 6c           (!pExcl
2bd50 75 64 65 20 26 26 20 69 52 6f 77 29 0a 20 20 20  ude && iRow).   
2bd60 20 20 20 7c 7c 20 28 70 45 78 63 6c 75 64 65 20     || (pExclude 
2bd70 26 26 20 21 70 45 78 63 6c 75 64 65 2d 3e 69 73  && !pExclude->is
2bd80 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26  IncrblobHandle &
2bd90 26 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d  & p->info.nKey==
2bda0 69 52 6f 77 29 0a 20 20 20 20 29 29 7b 0a 20 20  iRow).    )){.  
2bdb0 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20      p->eState = 
2bdc0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
2bdd0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2bde0 20 69 66 28 20 70 2d 3e 65 53 74 61 74 65 21 3d   if( p->eState!=
2bdf0 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 63  CURSOR_VALID ) c
2be00 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
2be10 20 70 2d 3e 77 72 46 6c 61 67 3d 3d 30 20 0a 23   p->wrFlag==0 .#
2be20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2be30 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20  IT_INCRBLOB.    
2be40 20 7c 7c 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f   || p->isIncrblo
2be50 62 48 61 6e 64 6c 65 0a 23 65 6e 64 69 66 0a 20  bHandle.#endif. 
2be60 20 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69     ){.      sqli
2be70 74 65 33 20 2a 64 62 4f 74 68 65 72 20 3d 20 70  te3 *dbOther = p
2be80 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20  ->pBtree->db;.  
2be90 20 20 20 20 69 66 28 20 64 62 4f 74 68 65 72 3d      if( dbOther=
2bea0 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 28  =0 ||.         (
2beb0 64 62 4f 74 68 65 72 21 3d 64 62 20 26 26 20 28  dbOther!=db && (
2bec0 64 62 4f 74 68 65 72 2d 3e 66 6c 61 67 73 20 26  dbOther->flags &
2bed0 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f   SQLITE_ReadUnco
2bee0 6d 6d 69 74 74 65 64 29 3d 3d 30 29 20 29 7b 0a  mmitted)==0) ){.
2bef0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2bf00 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20  QLITE_LOCKED;.  
2bf10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2bf20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2bf30 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73  OK;.}../*.** Ins
2bf40 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64  ert a new record
2bf50 20 69 6e 74 6f 20 74 68 65 20 42 54 72 65 65 2e   into the BTree.
2bf60 20 20 54 68 65 20 6b 65 79 20 69 73 20 67 69 76    The key is giv
2bf70 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79  en by (pKey,nKey
2bf80 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  ).** and the dat
2bf90 61 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70  a is given by (p
2bfa0 44 61 74 61 2c 6e 44 61 74 61 29 2e 20 20 54 68  Data,nData).  Th
2bfb0 65 20 63 75 72 73 6f 72 20 69 73 20 75 73 65 64  e cursor is used
2bfc0 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69   only to.** defi
2bfd0 6e 65 20 77 68 61 74 20 74 61 62 6c 65 20 74 68  ne what table th
2bfe0 65 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20  e record should 
2bff0 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  be inserted into
2c000 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a  .  The cursor.**
2c010 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
2c020 67 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f  g at a random lo
2c030 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f  cation..**.** Fo
2c040 72 20 61 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c  r an INTKEY tabl
2c050 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79  e, only the nKey
2c060 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6b 65   value of the ke
2c070 79 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79  y is used.  pKey
2c080 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20   is.** ignored. 
2c090 20 46 6f 72 20 61 20 5a 45 52 4f 44 41 54 41 20   For a ZERODATA 
2c0a0 74 61 62 6c 65 2c 20 74 68 65 20 70 44 61 74 61  table, the pData
2c0b0 20 61 6e 64 20 6e 44 61 74 61 20 61 72 65 20 62   and nData are b
2c0c0 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a  oth ignored..*/.
2c0d0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2c0e0 49 6e 73 65 72 74 28 0a 20 20 42 74 43 75 72 73  Insert(.  BtCurs
2c0f0 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20  or *pCur,       
2c100 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65           /* Inse
2c110 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65  rt data into the
2c120 20 74 61 62 6c 65 20 6f 66 20 74 68 69 73 20 63   table of this c
2c130 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  ursor */.  const
2c140 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34   void *pKey, i64
2c150 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65   nKey,    /* The
2c160 20 6b 65 79 20 6f 66 20 74 68 65 20 6e 65 77 20   key of the new 
2c170 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73  record */.  cons
2c180 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69  t void *pData, i
2c190 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a 20 54 68  nt nData,  /* Th
2c1a0 65 20 64 61 74 61 20 6f 66 20 74 68 65 20 6e 65  e data of the ne
2c1b0 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  w record */.  in
2c1c0 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20  t nZero,        
2c1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c1e0 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
2c1f0 30 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e  0 bytes to appen
2c200 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20 20 69  d to data */.  i
2c210 6e 74 20 61 70 70 65 6e 64 42 69 61 73 20 20 20  nt appendBias   
2c220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c230 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
2c240 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70 65 6e   likely an appen
2c250 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  d */.){.  int rc
2c260 3b 0a 20 20 69 6e 74 20 6c 6f 63 3b 0a 20 20 69  ;.  int loc;.  i
2c270 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 4d 65 6d 50  nt szNew;.  MemP
2c280 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 42 74  age *pPage;.  Bt
2c290 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70  ree *p = pCur->p
2c2a0 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65  Btree;.  BtShare
2c2b0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
2c2c0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2c2d0 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73   *oldCell;.  uns
2c2e0 69 67 6e 65 64 20 63 68 61 72 20 2a 6e 65 77 43  igned char *newC
2c2f0 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ell = 0;..  asse
2c300 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
2c310 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
2c320 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  if( pBt->inTrans
2c330 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52  action!=TRANS_WR
2c340 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75  ITE ){.    /* Mu
2c350 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  st start a trans
2c360 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 64 6f  action before do
2c370 69 6e 67 20 61 6e 20 69 6e 73 65 72 74 20 2a 2f  ing an insert */
2c380 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72  .    rc = pBt->r
2c390 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45  eadOnly ? SQLITE
2c3a0 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49  _READONLY : SQLI
2c3b0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 65  TE_ERROR;.    re
2c3c0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
2c3d0 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61  ssert( !pBt->rea
2c3e0 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28 20 21  dOnly );.  if( !
2c3f0 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29 7b 0a  pCur->wrFlag ){.
2c400 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2c410 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20 43 75 72  E_PERM;   /* Cur
2c420 73 6f 72 20 6e 6f 74 20 6f 70 65 6e 20 66 6f 72  sor not open for
2c430 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a   writing */.  }.
2c440 20 20 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c    if( checkReadL
2c450 6f 63 6b 73 28 70 43 75 72 2d 3e 70 42 74 72 65  ocks(pCur->pBtre
2c460 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  e, pCur->pgnoRoo
2c470 74 2c 20 70 43 75 72 2c 20 6e 4b 65 79 29 20 29  t, pCur, nKey) )
2c480 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2c490 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54  ITE_LOCKED; /* T
2c4a0 68 65 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f  he table pCur po
2c4b0 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20 72 65  ints to has a re
2c4c0 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20  ad lock */.  }. 
2c4d0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
2c4e0 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
2c4f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43  ){.    return pC
2c500 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 0a 20  ur->skip;.  }.. 
2c510 20 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73   /* Save the pos
2c520 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74  itions of any ot
2c530 68 65 72 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  her cursors open
2c540 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 20 2a   on this table *
2c550 2f 0a 20 20 63 6c 65 61 72 43 75 72 73 6f 72 50  /.  clearCursorP
2c560 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
2c570 20 69 66 28 20 0a 20 20 20 20 53 51 4c 49 54 45   if( .    SQLITE
2c580 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65 41  _OK!=(rc = saveA
2c590 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70  llCursors(pBt, p
2c5a0 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
2c5b0 43 75 72 29 29 20 7c 7c 0a 20 20 20 20 53 51 4c  Cur)) ||.    SQL
2c5c0 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
2c5d0 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f  lite3BtreeMoveto
2c5e0 28 70 43 75 72 2c 20 70 4b 65 79 2c 20 30 2c 20  (pCur, pKey, 0, 
2c5f0 6e 4b 65 79 2c 20 61 70 70 65 6e 64 42 69 61 73  nKey, appendBias
2c600 2c 20 26 6c 6f 63 29 29 0a 20 20 29 7b 0a 20 20  , &loc)).  ){.  
2c610 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
2c620 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
2c630 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72  ->pPage;.  asser
2c640 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
2c650 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20   || nKey>=0 );. 
2c660 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2c670 6c 65 61 66 20 7c 7c 20 21 70 50 61 67 65 2d 3e  leaf || !pPage->
2c680 6c 65 61 66 44 61 74 61 20 29 3b 0a 20 20 54 52  leafData );.  TR
2c690 41 43 45 28 28 22 49 4e 53 45 52 54 3a 20 74 61  ACE(("INSERT: ta
2c6a0 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c 64  ble=%d nkey=%lld
2c6b0 20 6e 64 61 74 61 3d 25 64 20 70 61 67 65 3d 25   ndata=%d page=%
2c6c0 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %s\n",.       
2c6d0 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f     pCur->pgnoRoo
2c6e0 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74 61 2c 20  t, nKey, nData, 
2c6f0 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20  pPage->pgno,.   
2c700 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30 20 3f 20         loc==0 ? 
2c710 22 6f 76 65 72 77 72 69 74 65 22 20 3a 20 22 6e  "overwrite" : "n
2c720 65 77 20 65 6e 74 72 79 22 29 29 3b 0a 20 20 61  ew entry"));.  a
2c730 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
2c740 49 6e 69 74 20 29 3b 0a 20 20 61 6c 6c 6f 63 61  Init );.  alloca
2c750 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  teTempSpace(pBt)
2c760 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d 20 70 42  ;.  newCell = pB
2c770 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  t->pTmpSpace;.  
2c780 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d 30 20 29  if( newCell==0 )
2c790 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2c7a0 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 66 69 6c  OMEM;.  rc = fil
2c7b0 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65 2c 20 6e  lInCell(pPage, n
2c7c0 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b  ewCell, pKey, nK
2c7d0 65 79 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61  ey, pData, nData
2c7e0 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e 65 77 29  , nZero, &szNew)
2c7f0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
2c800 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20  o end_insert;.  
2c810 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3d 3d 63  assert( szNew==c
2c820 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
2c830 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b 0a 20 20  , newCell) );.  
2c840 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3c 3d 4d  assert( szNew<=M
2c850 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
2c860 20 29 3b 0a 20 20 69 66 28 20 6c 6f 63 3d 3d 30   );.  if( loc==0
2c870 20 26 26 20 43 55 52 53 4f 52 5f 56 41 4c 49 44   && CURSOR_VALID
2c880 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
2c890 7b 0a 20 20 20 20 75 31 36 20 73 7a 4f 6c 64 3b  {.    u16 szOld;
2c8a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2c8b0 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75  r->idx>=0 && pCu
2c8c0 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  r->idx<pPage->nC
2c8d0 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ell );.    rc = 
2c8e0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2c8f0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2c900 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
2c910 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  .      goto end_
2c920 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20  insert;.    }.  
2c930 20 20 6f 6c 64 43 65 6c 6c 20 3d 20 66 69 6e 64    oldCell = find
2c940 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
2c950 2d 3e 69 64 78 29 3b 0a 20 20 20 20 69 66 28 20  ->idx);.    if( 
2c960 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2c970 20 20 20 20 20 20 6d 65 6d 63 70 79 28 6e 65 77        memcpy(new
2c980 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c 6c 2c 20 34  Cell, oldCell, 4
2c990 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a 4f  );.    }.    szO
2c9a0 6c 64 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  ld = cellSizePtr
2c9b0 28 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29  (pPage, oldCell)
2c9c0 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72  ;.    rc = clear
2c9d0 43 65 6c 6c 28 70 50 61 67 65 2c 20 6f 6c 64 43  Cell(pPage, oldC
2c9e0 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ell);.    if( rc
2c9f0 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65   ) goto end_inse
2ca00 72 74 3b 0a 20 20 20 20 64 72 6f 70 43 65 6c 6c  rt;.    dropCell
2ca10 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  (pPage, pCur->id
2ca20 78 2c 20 73 7a 4f 6c 64 29 3b 0a 20 20 7d 65 6c  x, szOld);.  }el
2ca30 73 65 20 69 66 28 20 6c 6f 63 3c 30 20 26 26 20  se if( loc<0 && 
2ca40 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29  pPage->nCell>0 )
2ca50 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
2ca60 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20  age->leaf );.   
2ca70 20 70 43 75 72 2d 3e 69 64 78 2b 2b 3b 0a 20 20   pCur->idx++;.  
2ca80 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
2ca90 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72  ze = 0;.    pCur
2caa0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
2cab0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
2cac0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61  sert( pPage->lea
2cad0 66 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  f );.  }.  rc = 
2cae0 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67 65  insertCell(pPage
2caf0 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 6e 65 77  , pCur->idx, new
2cb00 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c 20 30 2c 20  Cell, szNew, 0, 
2cb10 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
2cb20 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
2cb30 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 72 63 20  nd_insert;.  rc 
2cb40 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 67 65 2c  = balance(pPage,
2cb50 20 31 29 3b 0a 20 20 2f 2a 20 73 71 6c 69 74 65   1);.  /* sqlite
2cb60 33 42 74 72 65 65 50 61 67 65 44 75 6d 70 28 70  3BtreePageDump(p
2cb70 43 75 72 2d 3e 70 42 74 2c 20 70 43 75 72 2d 3e  Cur->pBt, pCur->
2cb80 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 20 2a 2f  pgnoRoot, 1); */
2cb90 0a 20 20 2f 2a 20 66 66 6c 75 73 68 28 73 74 64  .  /* fflush(std
2cba0 6f 75 74 29 3b 20 2a 2f 0a 20 20 69 66 28 20 72  out); */.  if( r
2cbb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2cbc0 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70      moveToRoot(p
2cbd0 43 75 72 29 3b 0a 20 20 7d 0a 65 6e 64 5f 69 6e  Cur);.  }.end_in
2cbe0 73 65 72 74 3a 0a 20 20 72 65 74 75 72 6e 20 72  sert:.  return r
2cbf0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  c;.}../*.** Dele
2cc00 74 65 20 74 68 65 20 65 6e 74 72 79 20 74 68 61  te the entry tha
2cc10 74 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  t the cursor is 
2cc20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68  pointing to.  Th
2cc30 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c  e cursor.** is l
2cc40 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
2cc50 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f  a random locatio
2cc60 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
2cc70 33 42 74 72 65 65 44 65 6c 65 74 65 28 42 74 43  3BtreeDelete(BtC
2cc80 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2cc90 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
2cca0 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20   pCur->pPage;.  
2ccb0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
2ccc0 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Cell;.  int rc;.
2ccd0 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64    Pgno pgnoChild
2cce0 20 3d 20 30 3b 0a 20 20 42 74 72 65 65 20 2a 70   = 0;.  Btree *p
2ccf0 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
2cd00 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2cd10 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73   = p->pBt;..  as
2cd20 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
2cd30 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
2cd40 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2cd50 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28  >isInit );.  if(
2cd60 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
2cd70 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion!=TRANS_WRITE
2cd80 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20   ){.    /* Must 
2cd90 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63 74  start a transact
2cda0 69 6f 6e 20 62 65 66 6f 72 65 20 64 6f 69 6e 67  ion before doing
2cdb0 20 61 20 64 65 6c 65 74 65 20 2a 2f 0a 20 20 20   a delete */.   
2cdc0 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f   rc = pBt->readO
2cdd0 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41  nly ? SQLITE_REA
2cde0 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45  DONLY : SQLITE_E
2cdf0 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e  RROR;.    return
2ce00 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
2ce10 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  t( !pBt->readOnl
2ce20 79 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  y );.  if( pCur-
2ce30 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2ce40 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72 65 74  FAULT ){.    ret
2ce50 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a  urn pCur->skip;.
2ce60 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
2ce70 69 64 78 20 3e 3d 20 70 50 61 67 65 2d 3e 6e 43  idx >= pPage->nC
2ce80 65 6c 6c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ell ){.    retur
2ce90 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20  n SQLITE_ERROR; 
2cea0 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 69   /* The cursor i
2ceb0 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 74  s not pointing t
2cec0 6f 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20 20  o anything */.  
2ced0 7d 0a 20 20 69 66 28 20 21 70 43 75 72 2d 3e 77  }.  if( !pCur->w
2cee0 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 65 74  rFlag ){.    ret
2cef0 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  urn SQLITE_PERM;
2cf00 20 20 20 2f 2a 20 44 69 64 20 6e 6f 74 20 6f 70     /* Did not op
2cf10 65 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20 66  en this cursor f
2cf20 6f 72 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20 20  or writing */.  
2cf30 7d 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65 61  }.  if( checkRea
2cf40 64 4c 6f 63 6b 73 28 70 43 75 72 2d 3e 70 42 74  dLocks(pCur->pBt
2cf50 72 65 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  ree, pCur->pgnoR
2cf60 6f 6f 74 2c 20 70 43 75 72 2c 20 70 43 75 72 2d  oot, pCur, pCur-
2cf70 3e 69 6e 66 6f 2e 6e 4b 65 79 29 20 29 7b 0a 20  >info.nKey) ){. 
2cf80 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
2cf90 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20  _LOCKED; /* The 
2cfa0 74 61 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74  table pCur point
2cfb0 73 20 74 6f 20 68 61 73 20 61 20 72 65 61 64 20  s to has a read 
2cfc0 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 0a 20 20 2f  lock */.  }..  /
2cfd0 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75  * Restore the cu
2cfe0 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
2cff0 69 74 69 6f 6e 20 28 61 20 6e 6f 2d 6f 70 20 69  ition (a no-op i
2d000 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
2d010 6e 6f 74 20 69 6e 20 0a 20 20 2a 2a 20 43 55 52  not in .  ** CUR
2d020 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
2d030 73 74 61 74 65 29 20 61 6e 64 20 73 61 76 65 20  state) and save 
2d040 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 6f 66  the positions of
2d050 20 61 6e 79 20 6f 74 68 65 72 20 63 75 72 73 6f   any other curso
2d060 72 73 20 0a 20 20 2a 2a 20 6f 70 65 6e 20 6f 6e  rs .  ** open on
2d070 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2e   the same table.
2d080 20 54 68 65 6e 20 63 61 6c 6c 20 73 71 6c 69 74   Then call sqlit
2d090 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20 6f  e3PagerWrite() o
2d0a0 6e 20 74 68 65 20 70 61 67 65 0a 20 20 2a 2a 20  n the page.  ** 
2d0b0 74 68 61 74 20 74 68 65 20 65 6e 74 72 79 20 77  that the entry w
2d0c0 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 20 66  ill be deleted f
2d0d0 72 6f 6d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rom..  */.  if( 
2d0e0 0a 20 20 20 20 28 72 63 20 3d 20 72 65 73 74 6f  .    (rc = resto
2d0f0 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50  reOrClearCursorP
2d100 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 29 21 3d  osition(pCur))!=
2d110 30 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d 20 73  0 ||.    (rc = s
2d120 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
2d130 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t, pCur->pgnoRoo
2d140 74 2c 20 70 43 75 72 29 29 21 3d 30 20 7c 7c 0a  t, pCur))!=0 ||.
2d150 20 20 20 20 28 72 63 20 3d 20 73 71 6c 69 74 65      (rc = sqlite
2d160 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
2d170 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30 0a  e->pDbPage))!=0.
2d180 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
2d190 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  rc;.  }..  /* Lo
2d1a0 63 61 74 65 20 74 68 65 20 63 65 6c 6c 20 77 69  cate the cell wi
2d1b0 74 68 69 6e 20 69 74 73 20 70 61 67 65 20 61 6e  thin its page an
2d1c0 64 20 6c 65 61 76 65 20 70 43 65 6c 6c 20 70 6f  d leave pCell po
2d1d0 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 0a 20 20  inting to the.  
2d1e0 2a 2a 20 64 61 74 61 2e 20 54 68 65 20 63 6c 65  ** data. The cle
2d1f0 61 72 43 65 6c 6c 28 29 20 63 61 6c 6c 20 66 72  arCell() call fr
2d200 65 65 73 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  ees any overflow
2d210 20 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65   pages associate
2d220 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a 20  d with the.  ** 
2d230 63 65 6c 6c 2e 20 54 68 65 20 63 65 6c 6c 20 69  cell. The cell i
2d240 74 73 65 6c 66 20 69 73 20 73 74 69 6c 6c 20 69  tself is still i
2d250 6e 74 61 63 74 2e 0a 20 20 2a 2f 0a 20 20 70 43  ntact..  */.  pC
2d260 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
2d270 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29  Page, pCur->idx)
2d280 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e  ;.  if( !pPage->
2d290 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f  leaf ){.    pgno
2d2a0 43 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65  Child = get4byte
2d2b0 28 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72  (pCell);.  }.  r
2d2c0 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50  c = clearCell(pP
2d2d0 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 69  age, pCell);.  i
2d2e0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
2d2f0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69  urn rc;.  }..  i
2d300 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2d310 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
2d320 20 54 68 65 20 65 6e 74 72 79 20 77 65 20 61 72   The entry we ar
2d330 65 20 61 62 6f 75 74 20 74 6f 20 64 65 6c 65 74  e about to delet
2d340 65 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 20  e is not a leaf 
2d350 73 6f 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 0a  so if we do not.
2d360 20 20 20 20 2a 2a 20 64 6f 20 73 6f 6d 65 74 68      ** do someth
2d370 69 6e 67 20 77 65 20 77 69 6c 6c 20 6c 65 61 76  ing we will leav
2d380 65 20 61 20 68 6f 6c 65 20 6f 6e 20 61 6e 20 69  e a hole on an i
2d390 6e 74 65 72 6e 61 6c 20 70 61 67 65 2e 0a 20 20  nternal page..  
2d3a0 20 20 2a 2a 20 57 65 20 68 61 76 65 20 74 6f 20    ** We have to 
2d3b0 66 69 6c 6c 20 74 68 65 20 68 6f 6c 65 20 62 79  fill the hole by
2d3c0 20 6d 6f 76 69 6e 67 20 69 6e 20 61 20 63 65 6c   moving in a cel
2d3d0 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66 2e 20 20  l from a leaf.  
2d3e0 54 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20  The.    ** next 
2d3f0 43 65 6c 6c 20 61 66 74 65 72 20 74 68 65 20 6f  Cell after the o
2d400 6e 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64  ne to be deleted
2d410 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
2d420 6f 20 65 78 69 73 74 20 61 6e 64 0a 20 20 20 20  o exist and.    
2d430 2a 2a 20 74 6f 20 62 65 20 61 20 6c 65 61 66 20  ** to be a leaf 
2d440 73 6f 20 77 65 20 63 61 6e 20 75 73 65 20 69 74  so we can use it
2d450 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 42 74 43  ..    */.    BtC
2d460 75 72 73 6f 72 20 6c 65 61 66 43 75 72 3b 0a 20  ursor leafCur;. 
2d470 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
2d480 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 69 6e 74   *pNext;.    int
2d490 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20 75 6e   notUsed;.    un
2d4a0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d  signed char *tem
2d4b0 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 61  pCell = 0;.    a
2d4c0 73 73 65 72 74 28 20 21 70 50 61 67 65 2d 3e 6c  ssert( !pPage->l
2d4d0 65 61 66 44 61 74 61 20 29 3b 0a 20 20 20 20 73  eafData );.    s
2d4e0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 54 65  qlite3BtreeGetTe
2d4f0 6d 70 43 75 72 73 6f 72 28 70 43 75 72 2c 20 26  mpCursor(pCur, &
2d500 6c 65 61 66 43 75 72 29 3b 0a 20 20 20 20 72 63  leafCur);.    rc
2d510 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e   = sqlite3BtreeN
2d520 65 78 74 28 26 6c 65 61 66 43 75 72 2c 20 26 6e  ext(&leafCur, &n
2d530 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66 28  otUsed);.    if(
2d540 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2d550 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
2d560 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 6c  ite3PagerWrite(l
2d570 65 61 66 43 75 72 2e 70 50 61 67 65 2d 3e 70 44  eafCur.pPage->pD
2d580 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  bPage);.    }.  
2d590 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2d5a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 31 36  _OK ){.      u16
2d5b0 20 73 7a 4e 65 78 74 3b 0a 20 20 20 20 20 20 54   szNext;.      T
2d5c0 52 41 43 45 28 28 22 44 45 4c 45 54 45 3a 20 74  RACE(("DELETE: t
2d5d0 61 62 6c 65 3d 25 64 20 64 65 6c 65 74 65 20 69  able=%d delete i
2d5e0 6e 74 65 72 6e 61 6c 20 66 72 6f 6d 20 25 64 20  nternal from %d 
2d5f0 72 65 70 6c 61 63 65 20 66 72 6f 6d 20 6c 65 61  replace from lea
2d600 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  f %d\n",.       
2d610 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74    pCur->pgnoRoot
2d620 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 6c  , pPage->pgno, l
2d630 65 61 66 43 75 72 2e 70 50 61 67 65 2d 3e 70 67  eafCur.pPage->pg
2d640 6e 6f 29 29 3b 0a 20 20 20 20 20 20 64 72 6f 70  no));.      drop
2d650 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
2d660 2d 3e 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50  ->idx, cellSizeP
2d670 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
2d680 29 3b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d  );.      pNext =
2d690 20 66 69 6e 64 43 65 6c 6c 28 6c 65 61 66 43 75   findCell(leafCu
2d6a0 72 2e 70 50 61 67 65 2c 20 6c 65 61 66 43 75 72  r.pPage, leafCur
2d6b0 2e 69 64 78 29 3b 0a 20 20 20 20 20 20 73 7a 4e  .idx);.      szN
2d6c0 65 78 74 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  ext = cellSizePt
2d6d0 72 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c  r(leafCur.pPage,
2d6e0 20 70 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 61   pNext);.      a
2d6f0 73 73 65 72 74 28 20 4d 58 5f 43 45 4c 4c 5f 53  ssert( MX_CELL_S
2d700 49 5a 45 28 70 42 74 29 3e 3d 73 7a 4e 65 78 74  IZE(pBt)>=szNext
2d710 2b 34 20 29 3b 0a 20 20 20 20 20 20 61 6c 6c 6f  +4 );.      allo
2d720 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70 42  cateTempSpace(pB
2d730 74 29 3b 0a 20 20 20 20 20 20 74 65 6d 70 43 65  t);.      tempCe
2d740 6c 6c 20 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70  ll = pBt->pTmpSp
2d750 61 63 65 3b 0a 20 20 20 20 20 20 69 66 28 20 74  ace;.      if( t
2d760 65 6d 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20  empCell==0 ){.  
2d770 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2d780 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
2d790 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2d7a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2d7b0 20 20 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43      rc = insertC
2d7c0 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
2d7d0 3e 69 64 78 2c 20 70 4e 65 78 74 2d 34 2c 20 73  >idx, pNext-4, s
2d7e0 7a 4e 65 78 74 2b 34 2c 20 74 65 6d 70 43 65 6c  zNext+4, tempCel
2d7f0 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  l, 0);.      }. 
2d800 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
2d810 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2d820 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f    put4byte(findO
2d830 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 67  verflowCell(pPag
2d840 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 2c 20 70  e, pCur->idx), p
2d850 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20 20 20 20  gnoChild);.     
2d860 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28     rc = balance(
2d870 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 20  pPage, 0);.     
2d880 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
2d890 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2d8a0 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 6c        dropCell(l
2d8b0 65 61 66 43 75 72 2e 70 50 61 67 65 2c 20 6c 65  eafCur.pPage, le
2d8c0 61 66 43 75 72 2e 69 64 78 2c 20 73 7a 4e 65 78  afCur.idx, szNex
2d8d0 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  t);.        rc =
2d8e0 20 62 61 6c 61 6e 63 65 28 6c 65 61 66 43 75 72   balance(leafCur
2d8f0 2e 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  .pPage, 0);.    
2d900 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
2d910 6c 69 74 65 33 42 74 72 65 65 52 65 6c 65 61 73  lite3BtreeReleas
2d920 65 54 65 6d 70 43 75 72 73 6f 72 28 26 6c 65 61  eTempCursor(&lea
2d930 66 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  fCur);.  }else{.
2d940 20 20 20 20 54 52 41 43 45 28 28 22 44 45 4c 45      TRACE(("DELE
2d950 54 45 3a 20 74 61 62 6c 65 3d 25 64 20 64 65 6c  TE: table=%d del
2d960 65 74 65 20 66 72 6f 6d 20 6c 65 61 66 20 25 64  ete from leaf %d
2d970 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70 43 75 72  \n",.       pCur
2d980 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67  ->pgnoRoot, pPag
2d990 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 64  e->pgno));.    d
2d9a0 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  ropCell(pPage, p
2d9b0 43 75 72 2d 3e 69 64 78 2c 20 63 65 6c 6c 53 69  Cur->idx, cellSi
2d9c0 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  zePtr(pPage, pCe
2d9d0 6c 6c 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 62  ll));.    rc = b
2d9e0 61 6c 61 6e 63 65 28 70 50 61 67 65 2c 20 30 29  alance(pPage, 0)
2d9f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
2da00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2da10 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
2da20 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2da30 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
2da40 61 74 65 20 61 20 6e 65 77 20 42 54 72 65 65 20  ate a new BTree 
2da50 74 61 62 6c 65 2e 20 20 57 72 69 74 65 20 69 6e  table.  Write in
2da60 74 6f 20 2a 70 69 54 61 62 6c 65 20 74 68 65 20  to *piTable the 
2da70 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 66  page.** number f
2da80 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  or the root page
2da90 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
2daa0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 74 79 70  e..**.** The typ
2dab0 65 20 6f 66 20 74 79 70 65 20 69 73 20 64 65 74  e of type is det
2dac0 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 66  ermined by the f
2dad0 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 2e 20  lags parameter. 
2dae0 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a 20 66 6f 6c   Only the.** fol
2daf0 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73 20 6f 66  lowing values of
2db00 20 66 6c 61 67 73 20 61 72 65 20 63 75 72 72 65   flags are curre
2db10 6e 74 6c 79 20 69 6e 20 75 73 65 2e 20 20 4f 74  ntly in use.  Ot
2db20 68 65 72 20 76 61 6c 75 65 73 20 66 6f 72 0a 2a  her values for.*
2db30 2a 20 66 6c 61 67 73 20 6d 69 67 68 74 20 6e 6f  * flags might no
2db40 74 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a 20 20 20  t work:.**.**   
2db50 20 20 42 54 52 45 45 5f 49 4e 54 4b 45 59 7c 42    BTREE_INTKEY|B
2db60 54 52 45 45 5f 4c 45 41 46 44 41 54 41 20 20 20  TREE_LEAFDATA   
2db70 20 20 55 73 65 64 20 66 6f 72 20 53 51 4c 20 74    Used for SQL t
2db80 61 62 6c 65 73 20 77 69 74 68 20 72 6f 77 69 64  ables with rowid
2db90 20 6b 65 79 73 0a 2a 2a 20 20 20 20 20 42 54 52   keys.**     BTR
2dba0 45 45 5f 5a 45 52 4f 44 41 54 41 20 20 20 20 20  EE_ZERODATA     
2dbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 55 73 65               Use
2dbc0 64 20 66 6f 72 20 53 51 4c 20 69 6e 64 69 63 65  d for SQL indice
2dbd0 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
2dbe0 62 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65  btreeCreateTable
2dbf0 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a  (Btree *p, int *
2dc00 70 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61  piTable, int fla
2dc10 67 73 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  gs){.  BtShared 
2dc20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
2dc30 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b   MemPage *pRoot;
2dc40 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74  .  Pgno pgnoRoot
2dc50 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
2dc60 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
2dc70 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
2dc80 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69   );.  if( pBt->i
2dc90 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52  nTransaction!=TR
2dca0 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
2dcb0 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74 20 61   /* Must start a
2dcc0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 69 72   transaction fir
2dcd0 73 74 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70  st */.    rc = p
2dce0 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53  Bt->readOnly ? S
2dcf0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a  QLITE_READONLY :
2dd00 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
2dd10 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2dd20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 42 74  }.  assert( !pBt
2dd30 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 0a 23  ->readOnly );..#
2dd40 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
2dd50 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
2dd60 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
2dd70 65 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f 6f  ePage(pBt, &pRoo
2dd80 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c  t, &pgnoRoot, 1,
2dd90 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b   0);.  if( rc ){
2dda0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2ddb0 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69 66 28 20    }.#else.  if( 
2ddc0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
2ddd0 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
2dde0 4d 6f 76 65 3b 20 20 20 20 20 20 2f 2a 20 4d 6f  Move;      /* Mo
2ddf0 76 65 20 61 20 70 61 67 65 20 68 65 72 65 20 74  ve a page here t
2de00 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20  o make room for 
2de10 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 2a 2f  the root-page */
2de20 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
2de30 61 67 65 4d 6f 76 65 3b 20 2f 2a 20 54 68 65 20  ageMove; /* The 
2de40 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e  page to move to.
2de50 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43 72 65 61   */..    /* Crea
2de60 74 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65  ting a new table
2de70 20 6d 61 79 20 70 72 6f 62 61 62 6c 79 20 72 65   may probably re
2de80 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20  quire moving an 
2de90 65 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73  existing databas
2dea0 65 0a 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65  e.    ** to make
2deb0 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 6e 65   room for the ne
2dec0 77 20 74 61 62 6c 65 73 20 72 6f 6f 74 20 70 61  w tables root pa
2ded0 67 65 2e 20 49 6e 20 63 61 73 65 20 74 68 69 73  ge. In case this
2dee0 20 70 61 67 65 20 74 75 72 6e 73 0a 20 20 20 20   page turns.    
2def0 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 61 6e 20  ** out to be an 
2df00 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 64  overflow page, d
2df10 65 6c 65 74 65 20 61 6c 6c 20 6f 76 65 72 66 6c  elete all overfl
2df20 6f 77 20 70 61 67 65 2d 6d 61 70 20 63 61 63 68  ow page-map cach
2df30 65 73 0a 20 20 20 20 2a 2a 20 68 65 6c 64 20 62  es.    ** held b
2df40 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 73 2e 0a  y open cursors..
2df50 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 76 61 6c      */.    inval
2df60 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
2df70 43 61 63 68 65 28 70 42 74 29 3b 0a 0a 20 20 20  Cache(pBt);..   
2df80 20 2f 2a 20 52 65 61 64 20 74 68 65 20 76 61 6c   /* Read the val
2df90 75 65 20 6f 66 20 6d 65 74 61 5b 33 5d 20 66 72  ue of meta[3] fr
2dfa0 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
2dfb0 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  to determine whe
2dfc0 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f  re the.    ** ro
2dfd0 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 6e  ot page of the n
2dfe0 65 77 20 74 61 62 6c 65 20 73 68 6f 75 6c 64 20  ew table should 
2dff0 67 6f 2e 20 6d 65 74 61 5b 33 5d 20 69 73 20 74  go. meta[3] is t
2e000 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d  he largest root-
2e010 70 61 67 65 0a 20 20 20 20 2a 2a 20 63 72 65 61  page.    ** crea
2e020 74 65 64 20 73 6f 20 66 61 72 2c 20 73 6f 20 74  ted so far, so t
2e030 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65  he new root-page
2e040 20 69 73 20 28 6d 65 74 61 5b 33 5d 2b 31 29 2e   is (meta[3]+1).
2e050 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
2e060 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
2e070 4d 65 74 61 28 70 2c 20 34 2c 20 26 70 67 6e 6f  Meta(p, 4, &pgno
2e080 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66 28 20 72  Root);.    if( r
2e090 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2e0a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2e0b0 0a 20 20 20 20 7d 0a 20 20 20 20 70 67 6e 6f 52  .    }.    pgnoR
2e0c0 6f 6f 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 20 54  oot++;..    /* T
2e0d0 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65  he new root-page
2e0e0 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 6c 6c 6f   may not be allo
2e0f0 63 61 74 65 64 20 6f 6e 20 61 20 70 6f 69 6e 74  cated on a point
2e100 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 6f 72 20  er-map page, or 
2e110 74 68 65 0a 20 20 20 20 2a 2a 20 50 45 4e 44 49  the.    ** PENDI
2e120 4e 47 5f 42 59 54 45 20 70 61 67 65 2e 0a 20 20  NG_BYTE page..  
2e130 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20    */.    while( 
2e140 70 67 6e 6f 52 6f 6f 74 3d 3d 50 54 52 4d 41 50  pgnoRoot==PTRMAP
2e150 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 70 67 6e  _PAGENO(pBt, pgn
2e160 6f 52 6f 6f 74 29 20 7c 7c 0a 20 20 20 20 20 20  oRoot) ||.      
2e170 20 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 45 4e 44    pgnoRoot==PEND
2e180 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
2e190 74 29 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f  t) ){.      pgno
2e1a0 52 6f 6f 74 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Root++;.    }.  
2e1b0 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 52 6f    assert( pgnoRo
2e1c0 6f 74 3e 3d 33 20 29 3b 0a 0a 20 20 20 20 2f 2a  ot>=3 );..    /*
2e1d0 20 41 6c 6c 6f 63 61 74 65 20 61 20 70 61 67 65   Allocate a page
2e1e0 2e 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20  . The page that 
2e1f0 63 75 72 72 65 6e 74 6c 79 20 72 65 73 69 64 65  currently reside
2e200 73 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 77 69  s at pgnoRoot wi
2e210 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 6d 6f 76  ll.    ** be mov
2e220 65 64 20 74 6f 20 74 68 65 20 61 6c 6c 6f 63 61  ed to the alloca
2e230 74 65 64 20 70 61 67 65 20 28 75 6e 6c 65 73 73  ted page (unless
2e240 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70   the allocated p
2e250 61 67 65 20 68 61 70 70 65 6e 73 0a 20 20 20 20  age happens.    
2e260 2a 2a 20 74 6f 20 72 65 73 69 64 65 20 61 74 20  ** to reside at 
2e270 70 67 6e 6f 52 6f 6f 74 29 2e 0a 20 20 20 20 2a  pgnoRoot)..    *
2e280 2f 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63  /.    rc = alloc
2e290 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
2e2a0 2c 20 26 70 50 61 67 65 4d 6f 76 65 2c 20 26 70  , &pPageMove, &p
2e2b0 67 6e 6f 4d 6f 76 65 2c 20 70 67 6e 6f 52 6f 6f  gnoMove, pgnoRoo
2e2c0 74 2c 20 31 29 3b 0a 20 20 20 20 69 66 28 20 72  t, 1);.    if( r
2e2d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2e2e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2e2f0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
2e300 70 67 6e 6f 4d 6f 76 65 21 3d 70 67 6e 6f 52 6f  pgnoMove!=pgnoRo
2e310 6f 74 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 70  ot ){.      /* p
2e320 67 6e 6f 52 6f 6f 74 20 69 73 20 74 68 65 20 70  gnoRoot is the p
2e330 61 67 65 20 74 68 61 74 20 77 69 6c 6c 20 62 65  age that will be
2e340 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 72 6f   used for the ro
2e350 6f 74 2d 70 61 67 65 20 6f 66 0a 20 20 20 20 20  ot-page of.     
2e360 20 2a 2a 20 74 68 65 20 6e 65 77 20 74 61 62 6c   ** the new tabl
2e370 65 20 28 61 73 73 75 6d 69 6e 67 20 61 6e 20 65  e (assuming an e
2e380 72 72 6f 72 20 64 69 64 20 6e 6f 74 20 6f 63 63  rror did not occ
2e390 75 72 29 2e 20 42 75 74 20 77 65 20 77 65 72 65  ur). But we were
2e3a0 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61  .      ** alloca
2e3b0 74 65 64 20 70 67 6e 6f 4d 6f 76 65 2e 20 49 66  ted pgnoMove. If
2e3c0 20 72 65 71 75 69 72 65 64 20 28 69 2e 65 2e 20   required (i.e. 
2e3d0 69 66 20 69 74 20 77 61 73 20 6e 6f 74 20 61 6c  if it was not al
2e3e0 6c 6f 63 61 74 65 64 0a 20 20 20 20 20 20 2a 2a  located.      **
2e3f0 20 62 79 20 65 78 74 65 6e 64 69 6e 67 20 74 68   by extending th
2e400 65 20 66 69 6c 65 29 2c 20 74 68 65 20 63 75 72  e file), the cur
2e410 72 65 6e 74 20 70 61 67 65 20 61 74 20 70 6f 73  rent page at pos
2e420 69 74 69 6f 6e 20 70 67 6e 6f 4d 6f 76 65 0a 20  ition pgnoMove. 
2e430 20 20 20 20 20 2a 2a 20 69 73 20 61 6c 72 65 61       ** is alrea
2e440 64 79 20 6a 6f 75 72 6e 61 6c 65 64 2e 0a 20 20  dy journaled..  
2e450 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 75 38 20      */.      u8 
2e460 65 54 79 70 65 3b 0a 20 20 20 20 20 20 50 67 6e  eType;.      Pgn
2e470 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20  o iPtrPage;..   
2e480 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2e490 50 61 67 65 4d 6f 76 65 29 3b 0a 0a 20 20 20 20  PageMove);..    
2e4a0 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65 20 70 61    /* Move the pa
2e4b0 67 65 20 63 75 72 72 65 6e 74 6c 79 20 61 74 20  ge currently at 
2e4c0 70 67 6e 6f 52 6f 6f 74 20 74 6f 20 70 67 6e 6f  pgnoRoot to pgno
2e4d0 4d 6f 76 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72  Move. */.      r
2e4e0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2e4f0 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  GetPage(pBt, pgn
2e500 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30  oRoot, &pRoot, 0
2e510 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
2e520 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2e530 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
2e540 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
2e550 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
2e560 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 65 54  t, pgnoRoot, &eT
2e570 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b  ype, &iPtrPage);
2e580 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2e590 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 65 54 79 70  QLITE_OK || eTyp
2e5a0 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e==PTRMAP_ROOTPA
2e5b0 47 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  GE || eType==PTR
2e5c0 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a  MAP_FREEPAGE ){.
2e5d0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2e5e0 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20  age(pRoot);.    
2e5f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2e600 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
2e610 65 72 74 28 20 65 54 79 70 65 21 3d 50 54 52 4d  ert( eType!=PTRM
2e620 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a 20  AP_ROOTPAGE );. 
2e630 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79       assert( eTy
2e640 70 65 21 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe!=PTRMAP_FREEP
2e650 41 47 45 20 29 3b 0a 20 20 20 20 20 20 72 63 20  AGE );.      rc 
2e660 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
2e670 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61  ite(pRoot->pDbPa
2e680 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
2e690 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2e6a0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2e6b0 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20  age(pRoot);.    
2e6c0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2e6d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
2e6e0 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70  = relocatePage(p
2e6f0 42 74 2c 20 70 52 6f 6f 74 2c 20 65 54 79 70 65  Bt, pRoot, eType
2e700 2c 20 69 50 74 72 50 61 67 65 2c 20 70 67 6e 6f  , iPtrPage, pgno
2e710 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 72 65 6c  Move);.      rel
2e720 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b  easePage(pRoot);
2e730 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 62 74 61 69  ..      /* Obtai
2e740 6e 20 74 68 65 20 70 61 67 65 20 61 74 20 70 67  n the page at pg
2e750 6e 6f 52 6f 6f 74 20 2a 2f 0a 20 20 20 20 20 20  noRoot */.      
2e760 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2e770 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
2e780 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
2e790 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2e7a0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
2e7b0 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70  Bt, pgnoRoot, &p
2e7c0 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Root, 0);.      
2e7d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2e7e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
2e7f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
2e800 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2e810 65 33 50 61 67 65 72 57 72 69 74 65 28 70 52 6f  e3PagerWrite(pRo
2e820 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ot->pDbPage);.  
2e830 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2e840 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2e850 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
2e860 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ot);.        ret
2e870 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
2e880 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2e890 20 70 52 6f 6f 74 20 3d 20 70 50 61 67 65 4d 6f   pRoot = pPageMo
2e8a0 76 65 3b 0a 20 20 20 20 7d 20 0a 0a 20 20 20 20  ve;.    } ..    
2e8b0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 70 6f  /* Update the po
2e8c0 69 6e 74 65 72 2d 6d 61 70 20 61 6e 64 20 6d 65  inter-map and me
2e8d0 74 61 2d 64 61 74 61 20 77 69 74 68 20 74 68 65  ta-data with the
2e8e0 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67 65 20 6e   new root-page n
2e8f0 75 6d 62 65 72 2e 20 2a 2f 0a 20 20 20 20 72 63  umber. */.    rc
2e900 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
2e910 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 50 54 52 4d  , pgnoRoot, PTRM
2e920 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30 29 3b  AP_ROOTPAGE, 0);
2e930 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
2e940 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2e950 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72  (pRoot);.      r
2e960 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2e970 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2e980 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28  BtreeUpdateMeta(
2e990 70 2c 20 34 2c 20 70 67 6e 6f 52 6f 6f 74 29 3b  p, 4, pgnoRoot);
2e9a0 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
2e9b0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2e9c0 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 72  (pRoot);.      r
2e9d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2e9e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
2e9f0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
2ea00 50 61 67 65 28 70 42 74 2c 20 26 70 52 6f 6f 74  Page(pBt, &pRoot
2ea10 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20  , &pgnoRoot, 1, 
2ea20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
2ea30 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2ea40 23 65 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28  #endif.  assert(
2ea50 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2ea60 72 69 74 65 61 62 6c 65 28 70 52 6f 6f 74 2d 3e  riteable(pRoot->
2ea70 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 7a 65  pDbPage) );.  ze
2ea80 72 6f 50 61 67 65 28 70 52 6f 6f 74 2c 20 66 6c  roPage(pRoot, fl
2ea90 61 67 73 20 7c 20 50 54 46 5f 4c 45 41 46 29 3b  ags | PTF_LEAF);
2eaa0 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  .  sqlite3PagerU
2eab0 6e 72 65 66 28 70 52 6f 6f 74 2d 3e 70 44 62 50  nref(pRoot->pDbP
2eac0 61 67 65 29 3b 0a 20 20 2a 70 69 54 61 62 6c 65  age);.  *piTable
2ead0 20 3d 20 28 69 6e 74 29 70 67 6e 6f 52 6f 6f 74   = (int)pgnoRoot
2eae0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2eaf0 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  E_OK;.}.int sqli
2eb00 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61  te3BtreeCreateTa
2eb10 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ble(Btree *p, in
2eb20 74 20 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74 20  t *piTable, int 
2eb30 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74 20 72 63  flags){.  int rc
2eb40 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
2eb50 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70  Enter(p);.  p->p
2eb60 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
2eb70 20 20 72 63 20 3d 20 62 74 72 65 65 43 72 65 61    rc = btreeCrea
2eb80 74 65 54 61 62 6c 65 28 70 2c 20 70 69 54 61 62  teTable(p, piTab
2eb90 6c 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 73 71  le, flags);.  sq
2eba0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
2ebb0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
2ebc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65 20  .}../*.** Erase 
2ebd0 74 68 65 20 67 69 76 65 6e 20 64 61 74 61 62 61  the given databa
2ebe0 73 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20  se page and all 
2ebf0 69 74 73 20 63 68 69 6c 64 72 65 6e 2e 20 20 52  its children.  R
2ec00 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 70 61 67  eturn.** the pag
2ec10 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  e to the freelis
2ec20 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
2ec30 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61   clearDatabasePa
2ec40 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ge(.  BtShared *
2ec50 70 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  pBt,           /
2ec60 2a 20 54 68 65 20 42 54 72 65 65 20 74 68 61 74  * The BTree that
2ec70 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 74 61   contains the ta
2ec80 62 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ble */.  Pgno pg
2ec90 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  no,            /
2eca0 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f  * Page number to
2ecb0 20 63 6c 65 61 72 20 2a 2f 0a 20 20 4d 65 6d 50   clear */.  MemP
2ecc0 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 20  age *pParent,   
2ecd0 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65    /* Parent page
2ece0 2e 20 20 4e 55 4c 4c 20 66 6f 72 20 74 68 65 20  .  NULL for the 
2ecf0 72 6f 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 66 72  root */.  int fr
2ed00 65 65 50 61 67 65 46 6c 61 67 20 20 20 20 20 20  eePageFlag      
2ed10 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 20 70 61  /* Deallocate pa
2ed20 67 65 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b  ge if true */.){
2ed30 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2ed40 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  e = 0;.  int rc;
2ed50 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2ed60 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 69   *pCell;.  int i
2ed70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
2ed80 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2ed90 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2eda0 20 69 66 28 20 70 67 6e 6f 3e 70 61 67 65 72 50   if( pgno>pagerP
2edb0 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
2edc0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74  ager) ){.    ret
2edd0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
2ede0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  PT_BKPT;.  }..  
2edf0 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
2ee00 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 26  age(pBt, pgno, &
2ee10 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74 29 3b  pPage, pParent);
2ee20 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
2ee30 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61   cleardatabasepa
2ee40 67 65 5f 6f 75 74 3b 0a 20 20 66 6f 72 28 69 3d  ge_out;.  for(i=
2ee50 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  0; i<pPage->nCel
2ee60 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70 43 65  l; i++){.    pCe
2ee70 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
2ee80 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 69 66 28  age, i);.    if(
2ee90 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2eea0 0a 20 20 20 20 20 20 72 63 20 3d 20 63 6c 65 61  .      rc = clea
2eeb0 72 44 61 74 61 62 61 73 65 50 61 67 65 28 70 42  rDatabasePage(pB
2eec0 74 2c 20 67 65 74 34 62 79 74 65 28 70 43 65 6c  t, get4byte(pCel
2eed0 6c 29 2c 20 70 50 61 67 65 2d 3e 70 50 61 72 65  l), pPage->pPare
2eee0 6e 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  nt, 1);.      if
2eef0 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61  ( rc ) goto clea
2ef00 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75  rdatabasepage_ou
2ef10 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
2ef20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67  = clearCell(pPag
2ef30 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69  e, pCell);.    i
2ef40 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65  f( rc ) goto cle
2ef50 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f  ardatabasepage_o
2ef60 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 70  ut;.  }.  if( !p
2ef70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2ef80 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61    rc = clearData
2ef90 62 61 73 65 50 61 67 65 28 70 42 74 2c 20 67 65  basePage(pBt, ge
2efa0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
2efb0 44 61 74 61 5b 38 5d 29 2c 20 70 50 61 67 65 2d  Data[8]), pPage-
2efc0 3e 70 50 61 72 65 6e 74 2c 20 31 29 3b 0a 20 20  >pParent, 1);.  
2efd0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2efe0 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67  cleardatabasepag
2eff0 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28  e_out;.  }.  if(
2f000 20 66 72 65 65 50 61 67 65 46 6c 61 67 20 29 7b   freePageFlag ){
2f010 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61  .    rc = freePa
2f020 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 65 6c  ge(pPage);.  }el
2f030 73 65 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c  se if( (rc = sql
2f040 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2f050 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 3d  Page->pDbPage))=
2f060 3d 30 20 29 7b 0a 20 20 20 20 7a 65 72 6f 50 61  =0 ){.    zeroPa
2f070 67 65 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d  ge(pPage, pPage-
2f080 3e 61 44 61 74 61 5b 30 5d 20 7c 20 50 54 46 5f  >aData[0] | PTF_
2f090 4c 45 41 46 29 3b 0a 20 20 7d 0a 0a 63 6c 65 61  LEAF);.  }..clea
2f0a0 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75  rdatabasepage_ou
2f0b0 74 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  t:.  releasePage
2f0c0 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72  (pPage);.  retur
2f0d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
2f0e0 65 6c 65 74 65 20 61 6c 6c 20 69 6e 66 6f 72 6d  elete all inform
2f0f0 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20 73 69 6e  ation from a sin
2f100 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65  gle table in the
2f110 20 64 61 74 61 62 61 73 65 2e 20 20 69 54 61 62   database.  iTab
2f120 6c 65 20 69 73 0a 2a 2a 20 74 68 65 20 70 61 67  le is.** the pag
2f130 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
2f140 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c  root of the tabl
2f150 65 2e 20 20 41 66 74 65 72 20 74 68 69 73 20 72  e.  After this r
2f160 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2c 0a  outine returns,.
2f170 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ** the root page
2f180 20 69 73 20 65 6d 70 74 79 2c 20 62 75 74 20 73   is empty, but s
2f190 74 69 6c 6c 20 65 78 69 73 74 73 2e 0a 2a 2a 0a  till exists..**.
2f1a0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2f1b0 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 53  will fail with S
2f1c0 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20  QLITE_LOCKED if 
2f1d0 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f 70  there are any op
2f1e0 65 6e 0a 2a 2a 20 72 65 61 64 20 63 75 72 73 6f  en.** read curso
2f1f0 72 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e  rs on the table.
2f200 20 20 4f 70 65 6e 20 77 72 69 74 65 20 63 75 72    Open write cur
2f210 73 6f 72 73 20 61 72 65 20 6d 6f 76 65 64 20 74  sors are moved t
2f220 6f 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 6f 66  o the.** root of
2f230 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69   the table..*/.i
2f240 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
2f250 6c 65 61 72 54 61 62 6c 65 28 42 74 72 65 65 20  learTable(Btree 
2f260 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b  *p, int iTable){
2f270 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
2f280 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2f290 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  pBt;.  sqlite3Bt
2f2a0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
2f2b0 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
2f2c0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
2f2d0 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  !=TRANS_WRITE ){
2f2e0 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72  .    rc = pBt->r
2f2f0 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45  eadOnly ? SQLITE
2f300 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49  _READONLY : SQLI
2f310 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73  TE_ERROR;.  }els
2f320 65 20 69 66 28 20 28 72 63 20 3d 20 63 68 65 63  e if( (rc = chec
2f330 6b 52 65 61 64 4c 6f 63 6b 73 28 70 2c 20 69 54  kReadLocks(p, iT
2f340 61 62 6c 65 2c 20 30 2c 20 31 29 29 21 3d 53 51  able, 0, 1))!=SQ
2f350 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
2f360 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20  * nothing to do 
2f370 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 53  */.  }else if( S
2f380 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
2f390 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
2f3a0 42 74 2c 20 69 54 61 62 6c 65 2c 20 30 29 29 20  Bt, iTable, 0)) 
2f3b0 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74 68 69 6e  ){.    /* nothin
2f3c0 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c  g to do */.  }el
2f3d0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65  se{.    rc = cle
2f3e0 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28 70  arDatabasePage(p
2f3f0 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c 65  Bt, (Pgno)iTable
2f400 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  , 0, 0);.  }.  s
2f410 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
2f420 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
2f430 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65  ;.}../*.** Erase
2f440 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
2f450 20 69 6e 20 61 20 74 61 62 6c 65 20 61 6e 64 20   in a table and 
2f460 61 64 64 20 74 68 65 20 72 6f 6f 74 20 6f 66 20  add the root of 
2f470 74 68 65 20 74 61 62 6c 65 20 74 6f 0a 2a 2a 20  the table to.** 
2f480 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 45  the freelist.  E
2f490 78 63 65 70 74 2c 20 74 68 65 20 72 6f 6f 74 20  xcept, the root 
2f4a0 6f 66 20 74 68 65 20 70 72 69 6e 63 69 70 6c 65  of the principle
2f4b0 20 74 61 62 6c 65 20 28 74 68 65 20 6f 6e 65 20   table (the one 
2f4c0 6f 6e 0a 2a 2a 20 70 61 67 65 20 31 29 20 69 73  on.** page 1) is
2f4d0 20 6e 65 76 65 72 20 61 64 64 65 64 20 74 6f 20   never added to 
2f4e0 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
2f4f0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2f500 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
2f510 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66  SQLITE_LOCKED if
2f520 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f   there are any o
2f530 70 65 6e 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f  pen.** cursors o
2f540 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  n the table..**.
2f550 2a 2a 20 49 66 20 41 55 54 4f 56 41 43 55 55 4d  ** If AUTOVACUUM
2f560 20 69 73 20 65 6e 61 62 6c 65 64 20 61 6e 64 20   is enabled and 
2f570 74 68 65 20 70 61 67 65 20 61 74 20 69 54 61 62  the page at iTab
2f580 6c 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61  le is not the la
2f590 73 74 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20  st.** root page 
2f5a0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2f5b0 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6c  file, then the l
2f5c0 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20 0a 2a  ast root page .*
2f5d0 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  * in the databas
2f5e0 65 20 66 69 6c 65 20 69 73 20 6d 6f 76 65 64 20  e file is moved 
2f5f0 69 6e 74 6f 20 74 68 65 20 73 6c 6f 74 20 66 6f  into the slot fo
2f600 72 6d 65 72 6c 79 20 6f 63 63 75 70 69 65 64 20  rmerly occupied 
2f610 62 79 0a 2a 2a 20 69 54 61 62 6c 65 20 61 6e 64  by.** iTable and
2f620 20 74 68 61 74 20 6c 61 73 74 20 73 6c 6f 74 20   that last slot 
2f630 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70 69 65  formerly occupie
2f640 64 20 62 79 20 74 68 65 20 6c 61 73 74 20 72 6f  d by the last ro
2f650 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 64  ot page.** is ad
2f660 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
2f670 69 73 74 20 69 6e 73 74 65 61 64 20 6f 66 20 69  ist instead of i
2f680 54 61 62 6c 65 2e 20 20 49 6e 20 74 68 69 73 20  Table.  In this 
2f690 73 61 79 2c 20 61 6c 6c 0a 2a 2a 20 72 6f 6f 74  say, all.** root
2f6a0 20 70 61 67 65 73 20 61 72 65 20 6b 65 70 74 20   pages are kept 
2f6b0 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
2f6c0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2f6d0 20 66 69 6c 65 2c 20 77 68 69 63 68 0a 2a 2a 20   file, which.** 
2f6e0 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72  is necessary for
2f6f0 20 41 55 54 4f 56 41 43 55 55 4d 20 74 6f 20 77   AUTOVACUUM to w
2f700 6f 72 6b 20 72 69 67 68 74 2e 20 20 2a 70 69 4d  ork right.  *piM
2f710 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f 20 74  oved is set to t
2f720 68 65 20 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62  he .** page numb
2f730 65 72 20 74 68 61 74 20 75 73 65 64 20 74 6f 20  er that used to 
2f740 62 65 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74  be the last root
2f750 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c   page in the fil
2f760 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  e before.** the 
2f770 6d 6f 76 65 2e 20 20 49 66 20 6e 6f 20 70 61 67  move.  If no pag
2f780 65 20 67 65 74 73 20 6d 6f 76 65 64 2c 20 2a 70  e gets moved, *p
2f790 69 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f  iMoved is set to
2f7a0 20 30 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20   0..** The last 
2f7b0 72 6f 6f 74 20 70 61 67 65 20 69 73 20 72 65 63  root page is rec
2f7c0 6f 72 64 65 64 20 69 6e 20 6d 65 74 61 5b 33 5d  orded in meta[3]
2f7d0 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f   and the value o
2f7e0 66 0a 2a 2a 20 6d 65 74 61 5b 33 5d 20 69 73 20  f.** meta[3] is 
2f7f0 75 70 64 61 74 65 64 20 62 79 20 74 68 69 73 20  updated by this 
2f800 70 72 6f 63 65 64 75 72 65 2e 0a 2a 2f 0a 73 74  procedure..*/.st
2f810 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 44 72  atic int btreeDr
2f820 6f 70 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  opTable(Btree *p
2f830 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e  , int iTable, in
2f840 74 20 2a 70 69 4d 6f 76 65 64 29 7b 0a 20 20 69  t *piMoved){.  i
2f850 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
2f860 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 42   *pPage = 0;.  B
2f870 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2f880 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74  ->pBt;..  assert
2f890 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2f8a0 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
2f8b0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
2f8c0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
2f8d0 20 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e      return pBt->
2f8e0 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54  readOnly ? SQLIT
2f8f0 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c  E_READONLY : SQL
2f900 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
2f910 20 20 2f 2a 20 49 74 20 69 73 20 69 6c 6c 65 67    /* It is illeg
2f920 61 6c 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62  al to drop a tab
2f930 6c 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72  le if any cursor
2f940 73 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68  s are open on th
2f950 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e  e.  ** database.
2f960 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
2f970 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   in auto-vacuum 
2f980 6d 6f 64 65 20 74 68 65 20 62 61 63 6b 65 6e 64  mode the backend
2f990 20 6d 61 79 0a 20 20 2a 2a 20 6e 65 65 64 20 74   may.  ** need t
2f9a0 6f 20 6d 6f 76 65 20 61 6e 6f 74 68 65 72 20 72  o move another r
2f9b0 6f 6f 74 2d 70 61 67 65 20 74 6f 20 66 69 6c 6c  oot-page to fill
2f9c0 20 61 20 67 61 70 20 6c 65 66 74 20 62 79 20 74   a gap left by t
2f9d0 68 65 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20  he deleted.  ** 
2f9e0 72 6f 6f 74 20 70 61 67 65 2e 20 49 66 20 61 6e  root page. If an
2f9f0 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 77 61 73   open cursor was
2fa00 20 75 73 69 6e 67 20 74 68 69 73 20 70 61 67 65   using this page
2fa10 20 61 20 70 72 6f 62 6c 65 6d 20 77 6f 75 6c 64   a problem would
2fa20 20 0a 20 20 2a 2a 20 6f 63 63 75 72 2e 0a 20 20   .  ** occur..  
2fa30 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 43  */.  if( pBt->pC
2fa40 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 72 65 74  ursor ){.    ret
2fa50 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
2fa60 44 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73  D;.  }..  rc = s
2fa70 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
2fa80 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54  ge(pBt, (Pgno)iT
2fa90 61 62 6c 65 2c 20 26 70 50 61 67 65 2c 20 30 29  able, &pPage, 0)
2faa0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
2fab0 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  urn rc;.  rc = s
2fac0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
2fad0 54 61 62 6c 65 28 70 2c 20 69 54 61 62 6c 65 29  Table(p, iTable)
2fae0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
2faf0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
2fb00 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
2fb10 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2a 70 69 4d   rc;.  }..  *piM
2fb20 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28  oved = 0;..  if(
2fb30 20 69 54 61 62 6c 65 3e 31 20 29 7b 0a 23 69 66   iTable>1 ){.#if
2fb40 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2fb50 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 72  AUTOVACUUM.    r
2fb60 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61  c = freePage(pPa
2fb70 67 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  ge);.    release
2fb80 50 61 67 65 28 70 50 61 67 65 29 3b 0a 23 65 6c  Page(pPage);.#el
2fb90 73 65 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  se.    if( pBt->
2fba0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
2fbb0 20 20 20 20 50 67 6e 6f 20 6d 61 78 52 6f 6f 74      Pgno maxRoot
2fbc0 50 67 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  Pgno;.      rc =
2fbd0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
2fbe0 4d 65 74 61 28 70 2c 20 34 2c 20 26 6d 61 78 52  Meta(p, 4, &maxR
2fbf0 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20  ootPgno);.      
2fc00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2fc10 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  K ){.        rel
2fc20 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
2fc30 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2fc40 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
2fc50 20 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 6d     if( iTable==m
2fc60 61 78 52 6f 6f 74 50 67 6e 6f 20 29 7b 0a 20 20  axRootPgno ){.  
2fc70 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
2fc80 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70  table being drop
2fc90 70 65 64 20 69 73 20 74 68 65 20 74 61 62 6c 65  ped is the table
2fca0 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73   with the larges
2fcb0 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  t root-page.    
2fcc0 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e      ** number in
2fcd0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 70   the database, p
2fce0 75 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ut the root page
2fcf0 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69 73   on the free lis
2fd00 74 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  t. .        */. 
2fd10 20 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65         rc = free
2fd20 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
2fd30 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2fd40 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
2fd50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2fd60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
2fd70 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2fd80 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
2fd90 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
2fda0 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f   table being dro
2fdb0 70 70 65 64 20 64 6f 65 73 20 6e 6f 74 20 68 61  pped does not ha
2fdc0 76 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 72  ve the largest r
2fdd0 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20  oot-page.       
2fde0 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74 68   ** number in th
2fdf0 65 20 64 61 74 61 62 61 73 65 2e 20 53 6f 20 6d  e database. So m
2fe00 6f 76 65 20 74 68 65 20 70 61 67 65 20 74 68 61  ove the page tha
2fe10 74 20 64 6f 65 73 20 69 6e 74 6f 20 74 68 65 20  t does into the 
2fe20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 61 70 20  .        ** gap 
2fe30 6c 65 66 74 20 62 79 20 74 68 65 20 64 65 6c 65  left by the dele
2fe40 74 65 64 20 72 6f 6f 74 2d 70 61 67 65 2e 0a 20  ted root-page.. 
2fe50 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2fe60 20 20 4d 65 6d 50 61 67 65 20 2a 70 4d 6f 76 65    MemPage *pMove
2fe70 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
2fe80 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
2fe90 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2fea0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
2feb0 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c  Bt, maxRootPgno,
2fec0 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20   &pMove, 0);.   
2fed0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2fee0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2fef0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2ff00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ff10 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61   rc = relocatePa
2ff20 67 65 28 70 42 74 2c 20 70 4d 6f 76 65 2c 20 50  ge(pBt, pMove, P
2ff30 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20  TRMAP_ROOTPAGE, 
2ff40 30 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 20 20  0, iTable);.    
2ff50 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2ff60 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20  pMove);.        
2ff70 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2ff80 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
2ff90 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2ffa0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
2ffb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
2ffc0 50 61 67 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f  Page(pBt, maxRoo
2ffd0 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30  tPgno, &pMove, 0
2ffe0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2fff0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
30000 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
30010 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
30020 20 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65         rc = free
30030 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20  Page(pMove);.   
30040 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
30050 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20  (pMove);.       
30060 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30070 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
30080 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
30090 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 69     }.        *pi
300a0 4d 6f 76 65 64 20 3d 20 6d 61 78 52 6f 6f 74 50  Moved = maxRootP
300b0 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  gno;.      }..  
300c0 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6e      /* Set the n
300d0 65 77 20 27 6d 61 78 2d 72 6f 6f 74 2d 70 61 67  ew 'max-root-pag
300e0 65 27 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20  e' value in the 
300f0 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 2e  database header.
30100 20 54 68 69 73 0a 20 20 20 20 20 20 2a 2a 20 69   This.      ** i
30110 73 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20  s the old value 
30120 6c 65 73 73 20 6f 6e 65 2c 20 6c 65 73 73 20 6f  less one, less o
30130 6e 65 20 6d 6f 72 65 20 69 66 20 74 68 61 74 20  ne more if that 
30140 68 61 70 70 65 6e 73 20 74 6f 0a 20 20 20 20 20  happens to.     
30150 20 2a 2a 20 62 65 20 61 20 72 6f 6f 74 2d 70 61   ** be a root-pa
30160 67 65 20 6e 75 6d 62 65 72 2c 20 6c 65 73 73 20  ge number, less 
30170 6f 6e 65 20 61 67 61 69 6e 20 69 66 20 74 68 61  one again if tha
30180 74 20 69 73 20 74 68 65 0a 20 20 20 20 20 20 2a  t is the.      *
30190 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  * PENDING_BYTE_P
301a0 41 47 45 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  AGE..      */.  
301b0 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d      maxRootPgno-
301c0 2d 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 61 78  -;.      if( max
301d0 52 6f 6f 74 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e  RootPgno==PENDIN
301e0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
301f0 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 78 52   ){.        maxR
30200 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20  ootPgno--;.     
30210 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6d 61 78   }.      if( max
30220 52 6f 6f 74 50 67 6e 6f 3d 3d 50 54 52 4d 41 50  RootPgno==PTRMAP
30230 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6d 61 78  _PAGENO(pBt, max
30240 52 6f 6f 74 50 67 6e 6f 29 20 29 7b 0a 20 20 20  RootPgno) ){.   
30250 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f       maxRootPgno
30260 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  --;.      }.    
30270 20 20 61 73 73 65 72 74 28 20 6d 61 78 52 6f 6f    assert( maxRoo
30280 74 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42  tPgno!=PENDING_B
30290 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b  YTE_PAGE(pBt) );
302a0 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ..      rc = sql
302b0 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d  ite3BtreeUpdateM
302c0 65 74 61 28 70 2c 20 34 2c 20 6d 61 78 52 6f 6f  eta(p, 4, maxRoo
302d0 74 50 67 6e 6f 29 3b 0a 20 20 20 20 7d 65 6c 73  tPgno);.    }els
302e0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 66 72  e{.      rc = fr
302f0 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  eePage(pPage);. 
30300 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
30310 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23  (pPage);.    }.#
30320 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
30330 20 20 20 2f 2a 20 49 66 20 73 71 6c 69 74 65 33     /* If sqlite3
30340 42 74 72 65 65 44 72 6f 70 54 61 62 6c 65 20 77  BtreeDropTable w
30350 61 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70 61 67  as called on pag
30360 65 20 31 2e 20 2a 2f 0a 20 20 20 20 7a 65 72 6f  e 1. */.    zero
30370 50 61 67 65 28 70 50 61 67 65 2c 20 50 54 46 5f  Page(pPage, PTF_
30380 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 20  INTKEY|PTF_LEAF 
30390 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
303a0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  ge(pPage);.  }. 
303b0 20 72 65 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a   return rc;  .}.
303c0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
303d0 44 72 6f 70 54 61 62 6c 65 28 42 74 72 65 65 20  DropTable(Btree 
303e0 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20  *p, int iTable, 
303f0 69 6e 74 20 2a 70 69 4d 6f 76 65 64 29 7b 0a 20  int *piMoved){. 
30400 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
30410 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
30420 0a 20 20 70 2d 3e 70 42 74 2d 3e 64 62 20 3d 20  .  p->pBt->db = 
30430 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d 20 62 74  p->db;.  rc = bt
30440 72 65 65 44 72 6f 70 54 61 62 6c 65 28 70 2c 20  reeDropTable(p, 
30450 69 54 61 62 6c 65 2c 20 70 69 4d 6f 76 65 64 29  iTable, piMoved)
30460 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
30470 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
30480 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
30490 20 52 65 61 64 20 74 68 65 20 6d 65 74 61 2d 69   Read the meta-i
304a0 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 6f  nformation out o
304b0 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  f a database fil
304c0 65 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69  e.  Meta[0].** i
304d0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
304e0 66 72 65 65 20 70 61 67 65 73 20 63 75 72 72 65  free pages curre
304f0 6e 74 6c 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntly in the data
30500 62 61 73 65 2e 20 20 4d 65 74 61 5b 31 5d 0a 2a  base.  Meta[1].*
30510 2a 20 74 68 72 6f 75 67 68 20 6d 65 74 61 5b 31  * through meta[1
30520 35 5d 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  5] are available
30530 20 66 6f 72 20 75 73 65 20 62 79 20 68 69 67 68   for use by high
30540 65 72 20 6c 61 79 65 72 73 2e 20 20 4d 65 74 61  er layers.  Meta
30550 5b 30 5d 0a 2a 2a 20 69 73 20 72 65 61 64 2d 6f  [0].** is read-o
30560 6e 6c 79 2c 20 74 68 65 20 6f 74 68 65 72 73 20  nly, the others 
30570 61 72 65 20 72 65 61 64 2f 77 72 69 74 65 2e 0a  are read/write..
30580 2a 2a 20 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d  ** .** The schem
30590 61 20 6c 61 79 65 72 20 6e 75 6d 62 65 72 73 20  a layer numbers 
305a0 6d 65 74 61 20 76 61 6c 75 65 73 20 64 69 66 66  meta values diff
305b0 65 72 65 6e 74 6c 79 2e 20 20 41 74 20 74 68 65  erently.  At the
305c0 20 73 63 68 65 6d 61 0a 2a 2a 20 6c 61 79 65 72   schema.** layer
305d0 20 28 61 6e 64 20 74 68 65 20 53 65 74 43 6f 6f   (and the SetCoo
305e0 6b 69 65 20 61 6e 64 20 52 65 61 64 43 6f 6f 6b  kie and ReadCook
305f0 69 65 20 6f 70 63 6f 64 65 73 29 20 74 68 65 20  ie opcodes) the 
30600 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 66 72 65  number of.** fre
30610 65 20 70 61 67 65 73 20 69 73 20 6e 6f 74 20 76  e pages is not v
30620 69 73 69 62 6c 65 2e 20 20 53 6f 20 43 6f 6f 6b  isible.  So Cook
30630 69 65 5b 30 5d 20 69 73 20 74 68 65 20 73 61 6d  ie[0] is the sam
30640 65 20 61 73 20 4d 65 74 61 5b 31 5d 2e 0a 2a 2f  e as Meta[1]..*/
30650 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
30660 65 47 65 74 4d 65 74 61 28 42 74 72 65 65 20 2a  eGetMeta(Btree *
30670 70 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20  p, int idx, u32 
30680 2a 70 4d 65 74 61 29 7b 0a 20 20 44 62 50 61 67  *pMeta){.  DbPag
30690 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 69 6e  e *pDbPage;.  in
306a0 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64  t rc;.  unsigned
306b0 20 63 68 61 72 20 2a 70 50 31 3b 0a 20 20 42 74   char *pP1;.  Bt
306c0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
306d0 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33  >pBt;..  sqlite3
306e0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
306f0 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62   pBt->db = p->db
30700 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 69 6e 67 20  ;..  /* Reading 
30710 61 20 6d 65 74 61 2d 64 61 74 61 20 76 61 6c 75  a meta-data valu
30720 65 20 72 65 71 75 69 72 65 73 20 61 20 72 65 61  e requires a rea
30730 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20 31  d-lock on page 1
30740 20 28 61 6e 64 20 68 65 6e 63 65 0a 20 20 2a 2a   (and hence.  **
30750 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74   the sqlite_mast
30760 65 72 20 74 61 62 6c 65 2e 20 57 65 20 67 72 61  er table. We gra
30770 62 20 74 68 69 73 20 6c 6f 63 6b 20 72 65 67 61  b this lock rega
30780 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65  rdless of whethe
30790 72 20 6f 72 0a 20 20 2a 2a 20 6e 6f 74 20 74 68  r or.  ** not th
307a0 65 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63  e SQLITE_ReadUnc
307b0 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73  ommitted flag is
307c0 20 73 65 74 20 28 74 68 65 20 74 61 62 6c 65 20   set (the table 
307d0 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 0a 20  rooted at page. 
307e0 20 2a 2a 20 31 20 69 73 20 74 72 65 61 74 65 64   ** 1 is treated
307f0 20 61 73 20 61 20 73 70 65 63 69 61 6c 20 63 61   as a special ca
30800 73 65 20 62 79 20 71 75 65 72 79 54 61 62 6c 65  se by queryTable
30810 4c 6f 63 6b 28 29 20 61 6e 64 20 6c 6f 63 6b 54  Lock() and lockT
30820 61 62 6c 65 28 29 29 2e 0a 20 20 2a 2f 0a 20 20  able())..  */.  
30830 72 63 20 3d 20 71 75 65 72 79 54 61 62 6c 65 4c  rc = queryTableL
30840 6f 63 6b 28 70 2c 20 31 2c 20 52 45 41 44 5f 4c  ock(p, 1, READ_L
30850 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  OCK);.  if( rc!=
30860 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30870 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
30880 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ve(p);.    retur
30890 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  n rc;.  }..  ass
308a0 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26 20 69  ert( idx>=0 && i
308b0 64 78 3c 3d 31 35 20 29 3b 0a 20 20 72 63 20 3d  dx<=15 );.  rc =
308c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
308d0 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 31 2c  (pBt->pPager, 1,
308e0 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66   &pDbPage);.  if
308f0 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69  ( rc ){.    sqli
30900 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
30910 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
30920 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 28 75 6e  .  }.  pP1 = (un
30930 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 73 71  signed char *)sq
30940 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
30950 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 2a 70  a(pDbPage);.  *p
30960 4d 65 74 61 20 3d 20 67 65 74 34 62 79 74 65 28  Meta = get4byte(
30970 26 70 50 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d  &pP1[36 + idx*4]
30980 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
30990 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
309a0 0a 0a 20 20 2f 2a 20 49 66 20 61 75 74 6f 76 61  ..  /* If autova
309b0 63 75 75 6d 65 64 20 69 73 20 64 69 73 61 62 6c  cuumed is disabl
309c0 65 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64  ed in this build
309d0 20 62 75 74 20 77 65 20 61 72 65 20 74 72 79 69   but we are tryi
309e0 6e 67 20 74 6f 20 0a 20 20 2a 2a 20 61 63 63 65  ng to .  ** acce
309f0 73 73 20 61 6e 20 61 75 74 6f 76 61 63 75 75 6d  ss an autovacuum
30a00 65 64 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ed database, the
30a10 6e 20 6d 61 6b 65 20 74 68 65 20 64 61 74 61 62  n make the datab
30a20 61 73 65 20 72 65 61 64 6f 6e 6c 79 2e 20 0a 20  ase readonly. . 
30a30 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
30a40 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
30a50 4d 0a 20 20 69 66 28 20 69 64 78 3d 3d 34 20 26  M.  if( idx==4 &
30a60 26 20 2a 70 4d 65 74 61 3e 30 20 29 20 70 42 74  & *pMeta>0 ) pBt
30a70 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a  ->readOnly = 1;.
30a80 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 72 61  #endif..  /* Gra
30a90 62 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b 20  b the read-lock 
30aa0 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20  on page 1. */.  
30ab0 72 63 20 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70  rc = lockTable(p
30ac0 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b  , 1, READ_LOCK);
30ad0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
30ae0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
30af0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n rc;.}../*.** W
30b00 72 69 74 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d  rite meta-inform
30b10 61 74 69 6f 6e 20 62 61 63 6b 20 69 6e 74 6f 20  ation back into 
30b20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d  the database.  M
30b30 65 74 61 5b 30 5d 20 69 73 0a 2a 2a 20 72 65 61  eta[0] is.** rea
30b40 64 2d 6f 6e 6c 79 20 61 6e 64 20 6d 61 79 20 6e  d-only and may n
30b50 6f 74 20 62 65 20 77 72 69 74 74 65 6e 2e 0a 2a  ot be written..*
30b60 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
30b70 65 65 55 70 64 61 74 65 4d 65 74 61 28 42 74 72  eeUpdateMeta(Btr
30b80 65 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20  ee *p, int idx, 
30b90 75 33 32 20 69 4d 65 74 61 29 7b 0a 20 20 42 74  u32 iMeta){.  Bt
30ba0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
30bb0 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64  >pBt;.  unsigned
30bc0 20 63 68 61 72 20 2a 70 50 31 3b 0a 20 20 69 6e   char *pP1;.  in
30bd0 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
30be0 69 64 78 3e 3d 31 20 26 26 20 69 64 78 3c 3d 31  idx>=1 && idx<=1
30bf0 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  5 );.  sqlite3Bt
30c00 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
30c10 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
30c20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
30c30 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  !=TRANS_WRITE ){
30c40 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72  .    rc = pBt->r
30c50 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45  eadOnly ? SQLITE
30c60 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49  _READONLY : SQLI
30c70 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73  TE_ERROR;.  }els
30c80 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
30c90 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 3b  Bt->pPage1!=0 );
30ca0 0a 20 20 20 20 70 50 31 20 3d 20 70 42 74 2d 3e  .    pP1 = pBt->
30cb0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20  pPage1->aData;. 
30cc0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
30cd0 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e 70  agerWrite(pBt->p
30ce0 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
30cf0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
30d00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30d10 70 75 74 34 62 79 74 65 28 26 70 50 31 5b 33 36  put4byte(&pP1[36
30d20 20 2b 20 69 64 78 2a 34 5d 2c 20 69 4d 65 74 61   + idx*4], iMeta
30d30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
30d40 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
30d50 4d 0a 20 20 20 20 20 20 69 66 28 20 69 64 78 3d  M.      if( idx=
30d60 3d 37 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  =7 ){.        as
30d70 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
30d80 61 63 75 75 6d 20 7c 7c 20 69 4d 65 74 61 3d 3d  acuum || iMeta==
30d90 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
30da0 65 72 74 28 20 69 4d 65 74 61 3d 3d 30 20 7c 7c  ert( iMeta==0 ||
30db0 20 69 4d 65 74 61 3d 3d 31 20 29 3b 0a 20 20 20   iMeta==1 );.   
30dc0 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
30dd0 63 75 75 6d 20 3d 20 69 4d 65 74 61 3b 0a 20 20  cuum = iMeta;.  
30de0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
30df0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
30e00 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
30e10 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
30e20 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
30e30 66 6c 61 67 20 62 79 74 65 20 61 74 20 74 68 65  flag byte at the
30e40 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
30e50 65 20 70 61 67 65 20 74 68 61 74 20 74 68 65 20  e page that the 
30e60 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 63 75 72  cursor.** is cur
30e70 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20  rently pointing 
30e80 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  to..*/.int sqlit
30e90 65 33 42 74 72 65 65 46 6c 61 67 73 28 42 74 43  e3BtreeFlags(BtC
30ea0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
30eb0 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 61 62  /* TODO: What ab
30ec0 6f 75 74 20 43 55 52 53 4f 52 5f 52 45 51 55 49  out CURSOR_REQUI
30ed0 52 45 53 45 45 4b 20 73 74 61 74 65 3f 20 50 72  RESEEK state? Pr
30ee0 6f 62 61 62 6c 79 20 6e 65 65 64 20 74 6f 20 63  obably need to c
30ef0 61 6c 6c 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65  all.  ** restore
30f00 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73  OrClearCursorPos
30f10 69 74 69 6f 6e 28 29 20 68 65 72 65 2e 0a 20 20  ition() here..  
30f20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  */.  MemPage *pP
30f30 61 67 65 3b 0a 20 20 72 65 73 74 6f 72 65 4f 72  age;.  restoreOr
30f40 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  ClearCursorPosit
30f50 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 70 50 61  ion(pCur);.  pPa
30f60 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
30f70 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
30f80 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
30f90 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
30fa0 70 50 61 67 65 2d 3e 70 42 74 3d 3d 70 43 75 72  pPage->pBt==pCur
30fb0 2d 3e 70 42 74 20 29 3b 0a 20 20 72 65 74 75 72  ->pBt );.  retur
30fc0 6e 20 70 50 61 67 65 20 3f 20 70 50 61 67 65 2d  n pPage ? pPage-
30fd0 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
30fe0 72 4f 66 66 73 65 74 5d 20 3a 20 30 3b 0a 7d 0a  rOffset] : 0;.}.
30ff0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
31000 68 65 20 70 61 67 65 72 20 61 73 73 6f 63 69 61  he pager associa
31010 74 65 64 20 77 69 74 68 20 61 20 42 54 72 65 65  ted with a BTree
31020 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
31030 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  is used for.** t
31040 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67  esting and debug
31050 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 50 61  ging only..*/.Pa
31060 67 65 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65  ger *sqlite3Btre
31070 65 50 61 67 65 72 28 42 74 72 65 65 20 2a 70 29  ePager(Btree *p)
31080 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42  {.  return p->pB
31090 74 2d 3e 70 50 61 67 65 72 3b 0a 7d 0a 0a 23 69  t->pPager;.}..#i
310a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
310b0 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
310c0 4b 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  K./*.** Append a
310d0 20 6d 65 73 73 61 67 65 20 74 6f 20 74 68 65 20   message to the 
310e0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74  error message st
310f0 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
31100 76 6f 69 64 20 63 68 65 63 6b 41 70 70 65 6e 64  void checkAppend
31110 4d 73 67 28 0a 20 20 49 6e 74 65 67 72 69 74 79  Msg(.  Integrity
31120 43 6b 20 2a 70 43 68 65 63 6b 2c 0a 20 20 63 68  Ck *pCheck,.  ch
31130 61 72 20 2a 7a 4d 73 67 31 2c 0a 20 20 63 6f 6e  ar *zMsg1,.  con
31140 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
31150 2c 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 76 61 5f  ,.  ....){.  va_
31160 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20  list ap;.  char 
31170 2a 7a 4d 73 67 32 3b 0a 20 20 69 66 28 20 21 70  *zMsg2;.  if( !p
31180 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20 29 20 72  Check->mxErr ) r
31190 65 74 75 72 6e 3b 0a 20 20 70 43 68 65 63 6b 2d  eturn;.  pCheck-
311a0 3e 6d 78 45 72 72 2d 2d 3b 0a 20 20 70 43 68 65  >mxErr--;.  pChe
311b0 63 6b 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 76 61  ck->nErr++;.  va
311c0 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
311d0 61 74 29 3b 0a 20 20 7a 4d 73 67 32 20 3d 20 73  at);.  zMsg2 = s
311e0 71 6c 69 74 65 33 56 4d 50 72 69 6e 74 66 28 30  qlite3VMPrintf(0
311f0 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a  , zFormat, ap);.
31200 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
31210 69 66 28 20 7a 4d 73 67 31 3d 3d 30 20 29 20 7a  if( zMsg1==0 ) z
31220 4d 73 67 31 20 3d 20 22 22 3b 0a 20 20 69 66 28  Msg1 = "";.  if(
31230 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67   pCheck->zErrMsg
31240 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f   ){.    char *zO
31250 6c 64 20 3d 20 70 43 68 65 63 6b 2d 3e 7a 45 72  ld = pCheck->zEr
31260 72 4d 73 67 3b 0a 20 20 20 20 70 43 68 65 63 6b  rMsg;.    pCheck
31270 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20  ->zErrMsg = 0;. 
31280 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
31290 69 6e 67 28 26 70 43 68 65 63 6b 2d 3e 7a 45 72  ing(&pCheck->zEr
312a0 72 4d 73 67 2c 20 7a 4f 6c 64 2c 20 22 5c 6e 22  rMsg, zOld, "\n"
312b0 2c 20 7a 4d 73 67 31 2c 20 7a 4d 73 67 32 2c 20  , zMsg1, zMsg2, 
312c0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 73  (char*)0);.    s
312d0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 6c 64  qlite3_free(zOld
312e0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
312f0 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
31300 28 26 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73  (&pCheck->zErrMs
31310 67 2c 20 7a 4d 73 67 31 2c 20 7a 4d 73 67 32 2c  g, zMsg1, zMsg2,
31320 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 7d 0a   (char*)0);.  }.
31330 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
31340 4d 73 67 32 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  Msg2);.}.#endif 
31350 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  /* SQLITE_OMIT_I
31360 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a  NTEGRITY_CHECK *
31370 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
31380 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
31390 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 64 64  _CHECK./*.** Add
313a0 20 31 20 74 6f 20 74 68 65 20 72 65 66 65 72 65   1 to the refere
313b0 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 70 61  nce count for pa
313c0 67 65 20 69 50 61 67 65 2e 20 20 49 66 20 74 68  ge iPage.  If th
313d0 69 73 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64  is is the second
313e0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20 74 6f  .** reference to
313f0 20 74 68 65 20 70 61 67 65 2c 20 61 64 64 20 61   the page, add a
31400 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
31410 74 6f 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d  to pCheck->zErrM
31420 73 67 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20  sg..** Return 1 
31430 69 66 20 74 68 65 72 65 20 61 72 65 20 32 20 6f  if there are 2 o
31440 72 65 20 6d 6f 72 65 20 72 65 66 65 72 65 6e 63  re more referenc
31450 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 61  es to the page a
31460 6e 64 20 30 20 69 66 0a 2a 2a 20 69 66 20 74 68  nd 0 if.** if th
31470 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
31480 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
31490 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73   page..**.** Als
314a0 6f 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  o check that the
314b0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
314c0 69 6e 20 62 6f 75 6e 64 73 2e 0a 2a 2f 0a 73 74  in bounds..*/.st
314d0 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52 65  atic int checkRe
314e0 66 28 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70  f(IntegrityCk *p
314f0 43 68 65 63 6b 2c 20 69 6e 74 20 69 50 61 67 65  Check, int iPage
31500 2c 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74  , char *zContext
31510 29 7b 0a 20 20 69 66 28 20 69 50 61 67 65 3d 3d  ){.  if( iPage==
31520 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
31530 69 66 28 20 69 50 61 67 65 3e 70 43 68 65 63 6b  if( iPage>pCheck
31540 2d 3e 6e 50 61 67 65 20 7c 7c 20 69 50 61 67 65  ->nPage || iPage
31550 3c 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41  <0 ){.    checkA
31560 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
31570 20 7a 43 6f 6e 74 65 78 74 2c 20 22 69 6e 76 61   zContext, "inva
31580 6c 69 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20  lid page number 
31590 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  %d", iPage);.   
315a0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
315b0 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 61 6e 52   if( pCheck->anR
315c0 65 66 5b 69 50 61 67 65 5d 3d 3d 31 20 29 7b 0a  ef[iPage]==1 ){.
315d0 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
315e0 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
315f0 65 78 74 2c 20 22 32 6e 64 20 72 65 66 65 72 65  ext, "2nd refere
31600 6e 63 65 20 74 6f 20 70 61 67 65 20 25 64 22 2c  nce to page %d",
31610 20 69 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74   iPage);.    ret
31620 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
31630 75 72 6e 20 20 28 70 43 68 65 63 6b 2d 3e 61 6e  urn  (pCheck->an
31640 52 65 66 5b 69 50 61 67 65 5d 2b 2b 29 3e 31 3b  Ref[iPage]++)>1;
31650 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
31660 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
31670 55 4d 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  UM./*.** Check t
31680 68 61 74 20 74 68 65 20 65 6e 74 72 79 20 69 6e  hat the entry in
31690 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
316a0 20 66 6f 72 20 70 61 67 65 20 69 43 68 69 6c 64   for page iChild
316b0 20 6d 61 70 73 20 74 6f 20 0a 2a 2a 20 70 61 67   maps to .** pag
316c0 65 20 69 50 61 72 65 6e 74 2c 20 70 6f 69 6e 74  e iParent, point
316d0 65 72 20 74 79 70 65 20 70 74 72 54 79 70 65 2e  er type ptrType.
316e0 20 49 66 20 6e 6f 74 2c 20 61 70 70 65 6e 64 20   If not, append 
316f0 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
31700 0a 2a 2a 20 74 6f 20 70 43 68 65 63 6b 2e 0a 2a  .** to pCheck..*
31710 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  /.static void ch
31720 65 63 6b 50 74 72 6d 61 70 28 0a 20 20 49 6e 74  eckPtrmap(.  Int
31730 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b  egrityCk *pCheck
31740 2c 20 20 20 2f 2a 20 49 6e 74 65 67 72 69 74 79  ,   /* Integrity
31750 20 63 68 65 63 6b 20 63 6f 6e 74 65 78 74 20 2a   check context *
31760 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c  /.  Pgno iChild,
31770 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
31780 69 6c 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ild page number 
31790 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20  */.  u8 eType,  
317a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
317b0 78 70 65 63 74 65 64 20 70 6f 69 6e 74 65 72 20  xpected pointer 
317c0 6d 61 70 20 74 79 70 65 20 2a 2f 0a 20 20 50 67  map type */.  Pg
317d0 6e 6f 20 69 50 61 72 65 6e 74 2c 20 20 20 20 20  no iParent,     
317e0 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64       /* Expected
317f0 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 72   pointer map par
31800 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ent page number 
31810 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74  */.  char *zCont
31820 65 78 74 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ext         /* C
31830 6f 6e 74 65 78 74 20 64 65 73 63 72 69 70 74 69  ontext descripti
31840 6f 6e 20 28 75 73 65 64 20 66 6f 72 20 65 72 72  on (used for err
31850 6f 72 20 6d 73 67 29 20 2a 2f 0a 29 7b 0a 20 20  or msg) */.){.  
31860 69 6e 74 20 72 63 3b 0a 20 20 75 38 20 65 50 74  int rc;.  u8 ePt
31870 72 6d 61 70 54 79 70 65 3b 0a 20 20 50 67 6e 6f  rmapType;.  Pgno
31880 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74 3b 0a   iPtrmapParent;.
31890 0a 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65  .  rc = ptrmapGe
318a0 74 28 70 43 68 65 63 6b 2d 3e 70 42 74 2c 20 69  t(pCheck->pBt, i
318b0 43 68 69 6c 64 2c 20 26 65 50 74 72 6d 61 70 54  Child, &ePtrmapT
318c0 79 70 65 2c 20 26 69 50 74 72 6d 61 70 50 61 72  ype, &iPtrmapPar
318d0 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ent);.  if( rc!=
318e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
318f0 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
31900 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
31910 2c 20 22 46 61 69 6c 65 64 20 74 6f 20 72 65 61  , "Failed to rea
31920 64 20 70 74 72 6d 61 70 20 6b 65 79 3d 25 64 22  d ptrmap key=%d"
31930 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20 20 20 72  , iChild);.    r
31940 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 69 66  eturn;.  }..  if
31950 28 20 65 50 74 72 6d 61 70 54 79 70 65 21 3d 65  ( ePtrmapType!=e
31960 54 79 70 65 20 7c 7c 20 69 50 74 72 6d 61 70 50  Type || iPtrmapP
31970 61 72 65 6e 74 21 3d 69 50 61 72 65 6e 74 20 29  arent!=iParent )
31980 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e  {.    checkAppen
31990 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
319a0 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20 22 42  ntext, .      "B
319b0 61 64 20 70 74 72 20 6d 61 70 20 65 6e 74 72 79  ad ptr map entry
319c0 20 6b 65 79 3d 25 64 20 65 78 70 65 63 74 65 64   key=%d expected
319d0 3d 28 25 64 2c 25 64 29 20 67 6f 74 3d 28 25 64  =(%d,%d) got=(%d
319e0 2c 25 64 29 22 2c 20 0a 20 20 20 20 20 20 69 43  ,%d)", .      iC
319f0 68 69 6c 64 2c 20 65 54 79 70 65 2c 20 69 50 61  hild, eType, iPa
31a00 72 65 6e 74 2c 20 65 50 74 72 6d 61 70 54 79 70  rent, ePtrmapTyp
31a10 65 2c 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74  e, iPtrmapParent
31a20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.
31a30 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 65  ./*.** Check the
31a40 20 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68   integrity of th
31a50 65 20 66 72 65 65 6c 69 73 74 20 6f 72 20 6f 66  e freelist or of
31a60 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   an overflow pag
31a70 65 20 6c 69 73 74 2e 0a 2a 2a 20 56 65 72 69 66  e list..** Verif
31a80 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  y that the numbe
31a90 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
31aa0 65 20 6c 69 73 74 20 69 73 20 4e 2e 0a 2a 2f 0a  e list is N..*/.
31ab0 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
31ac0 6b 4c 69 73 74 28 0a 20 20 49 6e 74 65 67 72 69  kList(.  Integri
31ad0 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 2f  tyCk *pCheck,  /
31ae0 2a 20 49 6e 74 65 67 72 69 74 79 20 63 68 65 63  * Integrity chec
31af0 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  king context */.
31b00 20 20 69 6e 74 20 69 73 46 72 65 65 4c 69 73 74    int isFreeList
31b10 2c 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ,       /* True 
31b20 66 6f 72 20 61 20 66 72 65 65 6c 69 73 74 2e 20  for a freelist. 
31b30 20 46 61 6c 73 65 20 66 6f 72 20 6f 76 65 72 66   False for overf
31b40 6c 6f 77 20 70 61 67 65 20 6c 69 73 74 20 2a 2f  low page list */
31b50 0a 20 20 69 6e 74 20 69 50 61 67 65 2c 20 20 20  .  int iPage,   
31b60 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
31b70 20 6e 75 6d 62 65 72 20 66 6f 72 20 66 69 72 73   number for firs
31b80 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  t page in the li
31b90 73 74 20 2a 2f 0a 20 20 69 6e 74 20 4e 2c 20 20  st */.  int N,  
31ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31bb0 20 45 78 70 65 63 74 65 64 20 6e 75 6d 62 65 72   Expected number
31bc0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
31bd0 20 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72 20   list */.  char 
31be0 2a 7a 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20  *zContext       
31bf0 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72 20   /* Context for 
31c00 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a  error messages *
31c10 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
31c20 69 6e 74 20 65 78 70 65 63 74 65 64 20 3d 20 4e  int expected = N
31c30 3b 0a 20 20 69 6e 74 20 69 46 69 72 73 74 20 3d  ;.  int iFirst =
31c40 20 69 50 61 67 65 3b 0a 20 20 77 68 69 6c 65 28   iPage;.  while(
31c50 20 4e 2d 2d 20 3e 20 30 20 26 26 20 70 43 68 65   N-- > 0 && pChe
31c60 63 6b 2d 3e 6d 78 45 72 72 20 29 7b 0a 20 20 20  ck->mxErr ){.   
31c70 20 44 62 50 61 67 65 20 2a 70 4f 76 66 6c 50 61   DbPage *pOvflPa
31c80 67 65 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  ge;.    unsigned
31c90 20 63 68 61 72 20 2a 70 4f 76 66 6c 44 61 74 61   char *pOvflData
31ca0 3b 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 3c  ;.    if( iPage<
31cb0 31 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b  1 ){.      check
31cc0 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
31cd0 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20  , zContext,.    
31ce0 20 20 20 20 20 22 25 64 20 6f 66 20 25 64 20 70       "%d of %d p
31cf0 61 67 65 73 20 6d 69 73 73 69 6e 67 20 66 72 6f  ages missing fro
31d00 6d 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20  m overflow list 
31d10 73 74 61 72 74 69 6e 67 20 61 74 20 25 64 22 2c  starting at %d",
31d20 0a 20 20 20 20 20 20 20 20 20 20 4e 2b 31 2c 20  .          N+1, 
31d30 65 78 70 65 63 74 65 64 2c 20 69 46 69 72 73 74  expected, iFirst
31d40 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
31d50 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68      }.    if( ch
31d60 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69  eckRef(pCheck, i
31d70 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 20  Page, zContext) 
31d80 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66 28  ) break;.    if(
31d90 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
31da0 28 70 43 68 65 63 6b 2d 3e 70 50 61 67 65 72 2c  (pCheck->pPager,
31db0 20 28 50 67 6e 6f 29 69 50 61 67 65 2c 20 26 70   (Pgno)iPage, &p
31dc0 4f 76 66 6c 50 61 67 65 29 20 29 7b 0a 20 20 20  OvflPage) ){.   
31dd0 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
31de0 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
31df0 78 74 2c 20 22 66 61 69 6c 65 64 20 74 6f 20 67  xt, "failed to g
31e00 65 74 20 70 61 67 65 20 25 64 22 2c 20 69 50 61  et page %d", iPa
31e10 67 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ge);.      break
31e20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4f 76 66  ;.    }.    pOvf
31e30 6c 44 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65  lData = (unsigne
31e40 64 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  d char *)sqlite3
31e50 50 61 67 65 72 47 65 74 44 61 74 61 28 70 4f 76  PagerGetData(pOv
31e60 66 6c 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  flPage);.    if(
31e70 20 69 73 46 72 65 65 4c 69 73 74 20 29 7b 0a 20   isFreeList ){. 
31e80 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 67 65 74       int n = get
31e90 34 62 79 74 65 28 26 70 4f 76 66 6c 44 61 74 61  4byte(&pOvflData
31ea0 5b 34 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  [4]);.#ifndef SQ
31eb0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
31ec0 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70  CUUM.      if( p
31ed0 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f  Check->pBt->auto
31ee0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
31ef0 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43    checkPtrmap(pC
31f00 68 65 63 6b 2c 20 69 50 61 67 65 2c 20 50 54 52  heck, iPage, PTR
31f10 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c  MAP_FREEPAGE, 0,
31f20 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   zContext);.    
31f30 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
31f40 20 69 66 28 20 6e 3e 70 43 68 65 63 6b 2d 3e 70   if( n>pCheck->p
31f50 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34  Bt->usableSize/4
31f60 2d 38 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  -8 ){.        ch
31f70 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
31f80 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20  eck, zContext,. 
31f90 20 20 20 20 20 20 20 20 20 20 22 66 72 65 65 6c            "freel
31fa0 69 73 74 20 6c 65 61 66 20 63 6f 75 6e 74 20 74  ist leaf count t
31fb0 6f 6f 20 62 69 67 20 6f 6e 20 70 61 67 65 20 25  oo big on page %
31fc0 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  d", iPage);.    
31fd0 20 20 20 20 4e 2d 2d 3b 0a 20 20 20 20 20 20 7d      N--;.      }
31fe0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f  else{.        fo
31ff0 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
32000 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f  {.          Pgno
32010 20 69 46 72 65 65 50 61 67 65 20 3d 20 67 65 74   iFreePage = get
32020 34 62 79 74 65 28 26 70 4f 76 66 6c 44 61 74 61  4byte(&pOvflData
32030 5b 38 2b 69 2a 34 5d 29 3b 0a 23 69 66 6e 64 65  [8+i*4]);.#ifnde
32040 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
32050 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 20  TOVACUUM.       
32060 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70     if( pCheck->p
32070 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
32080 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68  {.            ch
32090 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b  eckPtrmap(pCheck
320a0 2c 20 69 46 72 65 65 50 61 67 65 2c 20 50 54 52  , iFreePage, PTR
320b0 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 2c  MAP_FREEPAGE, 0,
320c0 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20   zContext);.    
320d0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
320e0 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 52 65           checkRe
320f0 66 28 70 43 68 65 63 6b 2c 20 69 46 72 65 65 50  f(pCheck, iFreeP
32100 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  age, zContext);.
32110 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32120 20 20 4e 20 2d 3d 20 6e 3b 0a 20 20 20 20 20 20    N -= n;.      
32130 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  }.    }.#ifndef 
32140 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
32150 56 41 43 55 55 4d 0a 20 20 20 20 65 6c 73 65 7b  VACUUM.    else{
32160 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
32170 73 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  s database suppo
32180 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 20  rts auto-vacuum 
32190 61 6e 64 20 69 50 61 67 65 20 69 73 20 6e 6f 74  and iPage is not
321a0 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20 20 20   the last.      
321b0 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20  ** page in this 
321c0 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 2c 20 63  overflow list, c
321d0 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 70 6f  heck that the po
321e0 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20  inter-map entry 
321f0 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  for.      ** the
32200 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 67 65 20   following page 
32210 6d 61 74 63 68 65 73 20 69 50 61 67 65 2e 0a 20  matches iPage.. 
32220 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
32230 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61  ( pCheck->pBt->a
32240 75 74 6f 56 61 63 75 75 6d 20 26 26 20 4e 3e 30  utoVacuum && N>0
32250 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d 20   ){.        i = 
32260 67 65 74 34 62 79 74 65 28 70 4f 76 66 6c 44 61  get4byte(pOvflDa
32270 74 61 29 3b 0a 20 20 20 20 20 20 20 20 63 68 65  ta);.        che
32280 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c  ckPtrmap(pCheck,
32290 20 69 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46   i, PTRMAP_OVERF
322a0 4c 4f 57 32 2c 20 69 50 61 67 65 2c 20 7a 43 6f  LOW2, iPage, zCo
322b0 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a  ntext);.      }.
322c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
322d0 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74   iPage = get4byt
322e0 65 28 70 4f 76 66 6c 44 61 74 61 29 3b 0a 20 20  e(pOvflData);.  
322f0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
32300 72 65 66 28 70 4f 76 66 6c 50 61 67 65 29 3b 0a  ref(pOvflPage);.
32310 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20    }.}.#endif /* 
32320 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45  SQLITE_OMIT_INTE
32330 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a  GRITY_CHECK */..
32340 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
32350 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  MIT_INTEGRITY_CH
32360 45 43 4b 0a 2f 2a 0a 2a 2a 20 44 6f 20 76 61 72  ECK./*.** Do var
32370 69 6f 75 73 20 73 61 6e 69 74 79 20 63 68 65 63  ious sanity chec
32380 6b 73 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 70  ks on a single p
32390 61 67 65 20 6f 66 20 61 20 74 72 65 65 2e 20 20  age of a tree.  
323a0 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 74 72  Return.** the tr
323b0 65 65 20 64 65 70 74 68 2e 20 20 52 6f 6f 74 20  ee depth.  Root 
323c0 70 61 67 65 73 20 72 65 74 75 72 6e 20 30 2e 20  pages return 0. 
323d0 20 50 61 72 65 6e 74 73 20 6f 66 20 72 6f 6f 74   Parents of root
323e0 20 70 61 67 65 73 0a 2a 2a 20 72 65 74 75 72 6e   pages.** return
323f0 20 31 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68   1, and so forth
32400 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 73 65 20 63  ..** .** These c
32410 68 65 63 6b 73 20 61 72 65 20 64 6f 6e 65 3a 0a  hecks are done:.
32420 2a 2a 0a 2a 2a 20 20 20 20 20 20 31 2e 20 20 4d  **.**      1.  M
32430 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 63 65  ake sure that ce
32440 6c 6c 73 20 61 6e 64 20 66 72 65 65 62 6c 6f 63  lls and freebloc
32450 6b 73 20 64 6f 20 6e 6f 74 20 6f 76 65 72 6c 61  ks do not overla
32460 70 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 62 75  p.**          bu
32470 74 20 63 6f 6d 62 69 6e 65 20 74 6f 20 63 6f 6d  t combine to com
32480 70 6c 65 74 65 6c 79 20 63 6f 76 65 72 20 74 68  pletely cover th
32490 65 20 70 61 67 65 2e 0a 2a 2a 20 20 4e 4f 20 20  e page..**  NO  
324a0 32 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 63 65  2.  Make sure ce
324b0 6c 6c 20 6b 65 79 73 20 61 72 65 20 69 6e 20 6f  ll keys are in o
324c0 72 64 65 72 2e 0a 2a 2a 20 20 4e 4f 20 20 33 2e  rder..**  NO  3.
324d0 20 20 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 6b    Make sure no k
324e0 65 79 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  ey is less than 
324f0 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 4c 6f 77  or equal to zLow
32500 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 4e 4f 20  erBound..**  NO 
32510 20 34 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 6e   4.  Make sure n
32520 6f 20 6b 65 79 20 69 73 20 67 72 65 61 74 65 72  o key is greater
32530 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74   than or equal t
32540 6f 20 7a 55 70 70 65 72 42 6f 75 6e 64 2e 0a 2a  o zUpperBound..*
32550 2a 20 20 20 20 20 20 35 2e 20 20 43 68 65 63 6b  *      5.  Check
32560 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f   the integrity o
32570 66 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  f overflow pages
32580 2e 0a 2a 2a 20 20 20 20 20 20 36 2e 20 20 52 65  ..**      6.  Re
32590 63 75 72 73 69 76 65 6c 79 20 63 61 6c 6c 20 63  cursively call c
325a0 68 65 63 6b 54 72 65 65 50 61 67 65 20 6f 6e 20  heckTreePage on 
325b0 61 6c 6c 20 63 68 69 6c 64 72 65 6e 2e 0a 2a 2a  all children..**
325c0 20 20 20 20 20 20 37 2e 20 20 56 65 72 69 66 79        7.  Verify
325d0 20 74 68 61 74 20 74 68 65 20 64 65 70 74 68 20   that the depth 
325e0 6f 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20  of all children 
325f0 69 73 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2a 20  is the same..** 
32600 20 20 20 20 20 38 2e 20 20 4d 61 6b 65 20 73 75       8.  Make su
32610 72 65 20 74 68 69 73 20 70 61 67 65 20 69 73 20  re this page is 
32620 61 74 20 6c 65 61 73 74 20 33 33 25 20 66 75 6c  at least 33% ful
32630 6c 20 6f 72 20 65 6c 73 65 20 69 74 20 69 73 0a  l or else it is.
32640 2a 2a 20 20 20 20 20 20 20 20 20 20 74 68 65 20  **          the 
32650 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 72 65 65  root of the tree
32660 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
32670 63 68 65 63 6b 54 72 65 65 50 61 67 65 28 0a 20  checkTreePage(. 
32680 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43   IntegrityCk *pC
32690 68 65 63 6b 2c 20 20 2f 2a 20 43 6f 6e 74 65 78  heck,  /* Contex
326a0 74 20 66 6f 72 20 74 68 65 20 73 61 6e 69 74 79  t for the sanity
326b0 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69 6e 74 20   check */.  int 
326c0 69 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  iPage,          
326d0 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
326e0 20 6f 66 20 74 68 65 20 70 61 67 65 20 74 6f 20   of the page to 
326f0 63 68 65 63 6b 20 2a 2f 0a 20 20 4d 65 6d 50 61  check */.  MemPa
32700 67 65 20 2a 70 50 61 72 65 6e 74 2c 20 20 20 20  ge *pParent,    
32710 20 2f 2a 20 50 61 72 65 6e 74 20 70 61 67 65 20   /* Parent page 
32720 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50 61 72 65  */.  char *zPare
32730 6e 74 43 6f 6e 74 65 78 74 20 20 2f 2a 20 50 61  ntContext  /* Pa
32740 72 65 6e 74 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rent context */.
32750 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
32760 61 67 65 3b 0a 20 20 69 6e 74 20 69 2c 20 72 63  age;.  int i, rc
32770 2c 20 64 65 70 74 68 2c 20 64 32 2c 20 70 67 6e  , depth, d2, pgn
32780 6f 2c 20 63 6e 74 3b 0a 20 20 69 6e 74 20 68 64  o, cnt;.  int hd
32790 72 2c 20 63 65 6c 6c 53 74 61 72 74 3b 0a 20 20  r, cellStart;.  
327a0 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 75 38 20  int nCell;.  u8 
327b0 2a 64 61 74 61 3b 0a 20 20 42 74 53 68 61 72 65  *data;.  BtShare
327c0 64 20 2a 70 42 74 3b 0a 20 20 69 6e 74 20 75 73  d *pBt;.  int us
327d0 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 68 61 72  ableSize;.  char
327e0 20 7a 43 6f 6e 74 65 78 74 5b 31 30 30 5d 3b 0a   zContext[100];.
327f0 20 20 63 68 61 72 20 2a 68 69 74 3b 0a 0a 20 20    char *hit;..  
32800 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
32810 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74  (sizeof(zContext
32820 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 50 61  ), zContext, "Pa
32830 67 65 20 25 64 3a 20 22 2c 20 69 50 61 67 65 29  ge %d: ", iPage)
32840 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  ;..  /* Check th
32850 61 74 20 74 68 65 20 70 61 67 65 20 65 78 69 73  at the page exis
32860 74 73 0a 20 20 2a 2f 0a 20 20 70 42 74 20 3d 20  ts.  */.  pBt = 
32870 70 43 68 65 63 6b 2d 3e 70 42 74 3b 0a 20 20 75  pCheck->pBt;.  u
32880 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
32890 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69  >usableSize;.  i
328a0 66 28 20 69 50 61 67 65 3d 3d 30 20 29 20 72 65  f( iPage==0 ) re
328b0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 63 68  turn 0;.  if( ch
328c0 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69  eckRef(pCheck, i
328d0 50 61 67 65 2c 20 7a 50 61 72 65 6e 74 43 6f 6e  Page, zParentCon
328e0 74 65 78 74 29 20 29 20 72 65 74 75 72 6e 20 30  text) ) return 0
328f0 3b 0a 20 20 69 66 28 20 28 72 63 20 3d 20 73 71  ;.  if( (rc = sq
32900 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
32910 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 50 61  e(pBt, (Pgno)iPa
32920 67 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 21  ge, &pPage, 0))!
32930 3d 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41  =0 ){.    checkA
32940 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
32950 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20   zContext,.     
32960 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 67 65 74    "unable to get
32970 20 74 68 65 20 70 61 67 65 2e 20 65 72 72 6f 72   the page. error
32980 20 63 6f 64 65 3d 25 64 22 2c 20 72 63 29 3b 0a   code=%d", rc);.
32990 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
329a0 7d 0a 20 20 69 66 28 20 28 72 63 20 3d 20 73 71  }.  if( (rc = sq
329b0 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
329c0 67 65 28 70 50 61 67 65 2c 20 70 50 61 72 65 6e  ge(pPage, pParen
329d0 74 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 63 68  t))!=0 ){.    ch
329e0 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
329f0 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a  eck, zContext, .
32a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32a10 20 20 20 22 73 71 6c 69 74 65 33 42 74 72 65 65     "sqlite3Btree
32a20 49 6e 69 74 50 61 67 65 28 29 20 72 65 74 75 72  InitPage() retur
32a30 6e 73 20 65 72 72 6f 72 20 63 6f 64 65 20 25 64  ns error code %d
32a40 22 2c 20 72 63 29 3b 0a 20 20 20 20 72 65 6c 65  ", rc);.    rele
32a50 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
32a60 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
32a70 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 6f 75  }..  /* Check ou
32a80 74 20 61 6c 6c 20 74 68 65 20 63 65 6c 6c 73 2e  t all the cells.
32a90 0a 20 20 2a 2f 0a 20 20 64 65 70 74 68 20 3d 20  .  */.  depth = 
32aa0 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
32ab0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26 26 20  pPage->nCell && 
32ac0 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 3b 20 69  pCheck->mxErr; i
32ad0 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65  ++){.    u8 *pCe
32ae0 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 73 7a 3b 0a  ll;.    int sz;.
32af0 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
32b00 6f 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  o;..    /* Check
32b10 20 70 61 79 6c 6f 61 64 20 6f 76 65 72 66 6c 6f   payload overflo
32b20 77 20 70 61 67 65 73 0a 20 20 20 20 2a 2f 0a 20  w pages.    */. 
32b30 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
32b40 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74  ntf(sizeof(zCont
32b50 65 78 74 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a  ext), zContext,.
32b60 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4f 6e               "On
32b70 20 74 72 65 65 20 70 61 67 65 20 25 64 20 63 65   tree page %d ce
32b80 6c 6c 20 25 64 3a 20 22 2c 20 69 50 61 67 65 2c  ll %d: ", iPage,
32b90 20 69 29 3b 0a 20 20 20 20 70 43 65 6c 6c 20 3d   i);.    pCell =
32ba0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
32bb0 69 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  i);.    sqlite3B
32bc0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
32bd0 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
32be0 69 6e 66 6f 29 3b 0a 20 20 20 20 73 7a 20 3d 20  info);.    sz = 
32bf0 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20  info.nData;.    
32c00 69 66 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b  if( !pPage->intK
32c10 65 79 20 29 20 73 7a 20 2b 3d 20 69 6e 66 6f 2e  ey ) sz += info.
32c20 6e 4b 65 79 3b 0a 20 20 20 20 61 73 73 65 72 74  nKey;.    assert
32c30 28 20 73 7a 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c  ( sz==info.nPayl
32c40 6f 61 64 20 29 3b 0a 20 20 20 20 69 66 28 20 73  oad );.    if( s
32c50 7a 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  z>info.nLocal ){
32c60 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65  .      int nPage
32c70 20 3d 20 28 73 7a 20 2d 20 69 6e 66 6f 2e 6e 4c   = (sz - info.nL
32c80 6f 63 61 6c 20 2b 20 75 73 61 62 6c 65 53 69 7a  ocal + usableSiz
32c90 65 20 2d 20 35 29 2f 28 75 73 61 62 6c 65 53 69  e - 5)/(usableSi
32ca0 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 20 20 50  ze - 4);.      P
32cb0 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67  gno pgnoOvfl = g
32cc0 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69  et4byte(&pCell[i
32cd0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b  nfo.iOverflow]);
32ce0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
32cf0 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
32d00 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61        if( pBt->a
32d10 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
32d20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70       checkPtrmap
32d30 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 4f 76 66  (pCheck, pgnoOvf
32d40 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
32d50 4f 57 31 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e  OW1, iPage, zCon
32d60 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23  text);.      }.#
32d70 65 6e 64 69 66 0a 20 20 20 20 20 20 63 68 65 63  endif.      chec
32d80 6b 4c 69 73 74 28 70 43 68 65 63 6b 2c 20 30 2c  kList(pCheck, 0,
32d90 20 70 67 6e 6f 4f 76 66 6c 2c 20 6e 50 61 67 65   pgnoOvfl, nPage
32da0 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  , zContext);.   
32db0 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
32dc0 20 73 61 6e 69 74 79 20 6f 66 20 6c 65 66 74 20   sanity of left 
32dd0 63 68 69 6c 64 20 70 61 67 65 2e 0a 20 20 20 20  child page..    
32de0 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  */.    if( !pPag
32df0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
32e00 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
32e10 28 70 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66  (pCell);.#ifndef
32e20 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
32e30 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66  OVACUUM.      if
32e40 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
32e50 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65  m ){.        che
32e60 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c  ckPtrmap(pCheck,
32e70 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54   pgno, PTRMAP_BT
32e80 52 45 45 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e  REE, iPage, zCon
32e90 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23  text);.      }.#
32ea0 65 6e 64 69 66 0a 20 20 20 20 20 20 64 32 20 3d  endif.      d2 =
32eb0 20 63 68 65 63 6b 54 72 65 65 50 61 67 65 28 70   checkTreePage(p
32ec0 43 68 65 63 6b 2c 70 67 6e 6f 2c 70 50 61 67 65  Check,pgno,pPage
32ed0 2c 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20  ,zContext);.    
32ee0 20 20 69 66 28 20 69 3e 30 20 26 26 20 64 32 21    if( i>0 && d2!
32ef0 3d 64 65 70 74 68 20 29 7b 0a 20 20 20 20 20 20  =depth ){.      
32f00 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
32f10 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
32f20 74 2c 20 22 43 68 69 6c 64 20 70 61 67 65 20 64  t, "Child page d
32f30 65 70 74 68 20 64 69 66 66 65 72 73 22 29 3b 0a  epth differs");.
32f40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 65        }.      de
32f50 70 74 68 20 3d 20 64 32 3b 0a 20 20 20 20 7d 0a  pth = d2;.    }.
32f60 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
32f70 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67  ->leaf ){.    pg
32f80 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
32f90 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
32fa0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
32fb0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
32fc0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43  printf(sizeof(zC
32fd0 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65 78  ontext), zContex
32fe0 74 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  t, .            
32ff0 20 20 20 20 20 20 20 20 20 22 4f 6e 20 70 61 67           "On pag
33000 65 20 25 64 20 61 74 20 72 69 67 68 74 20 63 68  e %d at right ch
33010 69 6c 64 3a 20 22 2c 20 69 50 61 67 65 29 3b 0a  ild: ", iPage);.
33020 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
33030 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
33040 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
33050 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
33060 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65  checkPtrmap(pChe
33070 63 6b 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50  ck, pgno, PTRMAP
33080 5f 42 54 52 45 45 2c 20 69 50 61 67 65 2c 20 30  _BTREE, iPage, 0
33090 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
330a0 20 20 20 20 63 68 65 63 6b 54 72 65 65 50 61 67      checkTreePag
330b0 65 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20  e(pCheck, pgno, 
330c0 70 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29  pPage, zContext)
330d0 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20 43 68 65  ;.  }. .  /* Che
330e0 63 6b 20 66 6f 72 20 63 6f 6d 70 6c 65 74 65 20  ck for complete 
330f0 63 6f 76 65 72 61 67 65 20 6f 66 20 74 68 65 20  coverage of the 
33100 70 61 67 65 0a 20 20 2a 2f 0a 20 20 64 61 74 61  page.  */.  data
33110 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
33120 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
33130 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 68 69 74  hdrOffset;.  hit
33140 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61   = sqlite3PageMa
33150 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53  lloc( pBt->pageS
33160 69 7a 65 20 29 3b 0a 20 20 69 66 28 20 68 69 74  ize );.  if( hit
33170 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65 74 28 68   ){.    memset(h
33180 69 74 2c 20 30 2c 20 75 73 61 62 6c 65 53 69 7a  it, 0, usableSiz
33190 65 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  e );.    memset(
331a0 68 69 74 2c 20 31 2c 20 67 65 74 32 62 79 74 65  hit, 1, get2byte
331b0 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 29 3b  (&data[hdr+5]));
331c0 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 67 65 74  .    nCell = get
331d0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
331e0 33 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 53 74 61  3]);.    cellSta
331f0 72 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d 20  rt = hdr + 12 - 
33200 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20  4*pPage->leaf;. 
33210 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
33220 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
33230 20 69 6e 74 20 70 63 20 3d 20 67 65 74 32 62 79   int pc = get2by
33240 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 53 74 61  te(&data[cellSta
33250 72 74 2b 69 2a 32 5d 29 3b 0a 20 20 20 20 20 20  rt+i*2]);.      
33260 75 31 36 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53  u16 size = cellS
33270 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 64  izePtr(pPage, &d
33280 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20 20 20 20  ata[pc]);.      
33290 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 66 28  int j;.      if(
332a0 20 28 70 63 2b 73 69 7a 65 2d 31 29 3e 3d 75 73   (pc+size-1)>=us
332b0 61 62 6c 65 53 69 7a 65 20 7c 7c 20 70 63 3c 30  ableSize || pc<0
332c0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63   ){.        chec
332d0 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
332e0 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20  k, 0, .         
332f0 20 20 20 22 43 6f 72 72 75 70 74 69 6f 6e 20 64     "Corruption d
33300 65 74 65 63 74 65 64 20 69 6e 20 63 65 6c 6c 20  etected in cell 
33310 25 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 69  %d on page %d",i
33320 2c 69 50 61 67 65 2c 30 29 3b 0a 20 20 20 20 20  ,iPage,0);.     
33330 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
33340 66 6f 72 28 6a 3d 70 63 2b 73 69 7a 65 2d 31 3b  for(j=pc+size-1;
33350 20 6a 3e 3d 70 63 3b 20 6a 2d 2d 29 20 68 69 74   j>=pc; j--) hit
33360 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  [j]++;.      }. 
33370 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 63 6e 74     }.    for(cnt
33380 3d 30 2c 20 69 3d 67 65 74 32 62 79 74 65 28 26  =0, i=get2byte(&
33390 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 20 69 3e  data[hdr+1]); i>
333a0 30 20 26 26 20 69 3c 75 73 61 62 6c 65 53 69 7a  0 && i<usableSiz
333b0 65 20 26 26 20 63 6e 74 3c 31 30 30 30 30 3b 20  e && cnt<10000; 
333c0 0a 20 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b  .           cnt+
333d0 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69  +){.      int si
333e0 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
333f0 61 74 61 5b 69 2b 32 5d 29 3b 0a 20 20 20 20 20  ata[i+2]);.     
33400 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 66   int j;.      if
33410 28 20 28 69 2b 73 69 7a 65 2d 31 29 3e 3d 75 73  ( (i+size-1)>=us
33420 61 62 6c 65 53 69 7a 65 20 7c 7c 20 69 3c 30 20  ableSize || i<0 
33430 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  ){.        check
33440 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
33450 2c 20 30 2c 20 20 0a 20 20 20 20 20 20 20 20 20  , 0,  .         
33460 20 20 20 22 43 6f 72 72 75 70 74 69 6f 6e 20 64     "Corruption d
33470 65 74 65 63 74 65 64 20 69 6e 20 63 65 6c 6c 20  etected in cell 
33480 25 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 69  %d on page %d",i
33490 2c 69 50 61 67 65 2c 30 29 3b 0a 20 20 20 20 20  ,iPage,0);.     
334a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
334b0 66 6f 72 28 6a 3d 69 2b 73 69 7a 65 2d 31 3b 20  for(j=i+size-1; 
334c0 6a 3e 3d 69 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a  j>=i; j--) hit[j
334d0 5d 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ]++;.      }.   
334e0 20 20 20 69 20 3d 20 67 65 74 32 62 79 74 65 28     i = get2byte(
334f0 26 64 61 74 61 5b 69 5d 29 3b 0a 20 20 20 20 7d  &data[i]);.    }
33500 0a 20 20 20 20 66 6f 72 28 69 3d 63 6e 74 3d 30  .    for(i=cnt=0
33510 3b 20 69 3c 75 73 61 62 6c 65 53 69 7a 65 3b 20  ; i<usableSize; 
33520 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
33530 68 69 74 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20  hit[i]==0 ){.   
33540 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20       cnt++;.    
33550 20 20 7d 65 6c 73 65 20 69 66 28 20 68 69 74 5b    }else if( hit[
33560 69 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  i]>1 ){.        
33570 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
33580 43 68 65 63 6b 2c 20 30 2c 0a 20 20 20 20 20 20  Check, 0,.      
33590 20 20 20 20 22 4d 75 6c 74 69 70 6c 65 20 75 73      "Multiple us
335a0 65 73 20 66 6f 72 20 62 79 74 65 20 25 64 20 6f  es for byte %d o
335b0 66 20 70 61 67 65 20 25 64 22 2c 20 69 2c 20 69  f page %d", i, i
335c0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62  Page);.        b
335d0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
335e0 20 20 7d 0a 20 20 20 20 69 66 28 20 63 6e 74 21    }.    if( cnt!
335f0 3d 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 7b 0a  =data[hdr+7] ){.
33600 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
33610 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 20  dMsg(pCheck, 0, 
33620 0a 20 20 20 20 20 20 20 20 20 20 22 46 72 61 67  .          "Frag
33630 6d 65 6e 74 65 64 20 73 70 61 63 65 20 69 73 20  mented space is 
33640 25 64 20 62 79 74 65 20 72 65 70 6f 72 74 65 64  %d byte reported
33650 20 61 73 20 25 64 20 6f 6e 20 70 61 67 65 20 25   as %d on page %
33660 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 63 6e  d",.          cn
33670 74 2c 20 64 61 74 61 5b 68 64 72 2b 37 5d 2c 20  t, data[hdr+7], 
33680 69 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  iPage);.    }.  
33690 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46  }.  sqlite3PageF
336a0 72 65 65 28 68 69 74 29 3b 0a 0a 20 20 72 65 6c  ree(hit);..  rel
336b0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
336c0 0a 20 20 72 65 74 75 72 6e 20 64 65 70 74 68 2b  .  return depth+
336d0 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  1;.}.#endif /* S
336e0 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47  QLITE_OMIT_INTEG
336f0 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23  RITY_CHECK */..#
33700 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
33710 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
33720 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  CK./*.** This ro
33730 75 74 69 6e 65 20 64 6f 65 73 20 61 20 63 6f 6d  utine does a com
33740 70 6c 65 74 65 20 63 68 65 63 6b 20 6f 66 20 74  plete check of t
33750 68 65 20 67 69 76 65 6e 20 42 54 72 65 65 20 66  he given BTree f
33760 69 6c 65 2e 20 20 61 52 6f 6f 74 5b 5d 20 69 73  ile.  aRoot[] is
33770 0a 2a 2a 20 61 6e 20 61 72 72 61 79 20 6f 66 20  .** an array of 
33780 70 61 67 65 73 20 6e 75 6d 62 65 72 73 20 77 65  pages numbers we
33790 72 65 20 65 61 63 68 20 70 61 67 65 20 6e 75 6d  re each page num
337a0 62 65 72 20 69 73 20 74 68 65 20 72 6f 6f 74 20  ber is the root 
337b0 70 61 67 65 20 6f 66 0a 2a 2a 20 61 20 74 61 62  page of.** a tab
337c0 6c 65 2e 20 20 6e 52 6f 6f 74 20 69 73 20 74 68  le.  nRoot is th
337d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  e number of entr
337e0 69 65 73 20 69 6e 20 61 52 6f 6f 74 2e 0a 2a 2a  ies in aRoot..**
337f0 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e  .** If everythin
33800 67 20 63 68 65 63 6b 73 20 6f 75 74 2c 20 74 68  g checks out, th
33810 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
33820 6e 73 20 4e 55 4c 4c 2e 20 20 49 66 20 73 6f 6d  ns NULL.  If som
33830 65 74 68 69 6e 67 20 69 73 0a 2a 2a 20 61 6d 69  ething is.** ami
33840 73 73 2c 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ss, an error mes
33850 73 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  sage is written 
33860 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  into memory obta
33870 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
33880 28 29 0a 2a 2a 20 61 6e 64 20 61 20 70 6f 69 6e  ().** and a poin
33890 74 65 72 20 74 6f 20 74 68 61 74 20 65 72 72 6f  ter to that erro
338a0 72 20 6d 65 73 73 61 67 65 20 69 73 20 72 65 74  r message is ret
338b0 75 72 6e 65 64 2e 20 20 54 68 65 20 63 61 6c 6c  urned.  The call
338c0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ing function.** 
338d0 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
338e0 6f 72 20 66 72 65 65 69 6e 67 20 74 68 65 20 65  or freeing the e
338f0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 68 65  rror message whe
33900 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2f  n it is done..*/
33910 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74  .char *sqlite3Bt
33920 72 65 65 49 6e 74 65 67 72 69 74 79 43 68 65 63  reeIntegrityChec
33930 6b 28 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20  k(.  Btree *p,  
33940 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
33950 74 6f 20 62 65 20 63 68 65 63 6b 65 64 20 2a 2f  to be checked */
33960 0a 20 20 69 6e 74 20 2a 61 52 6f 6f 74 2c 20 20  .  int *aRoot,  
33970 20 2f 2a 20 41 6e 20 61 72 72 61 79 20 6f 66 20   /* An array of 
33980 72 6f 6f 74 20 70 61 67 65 73 20 6e 75 6d 62 65  root pages numbe
33990 72 73 20 66 6f 72 20 69 6e 64 69 76 69 64 75 61  rs for individua
339a0 6c 20 74 72 65 65 73 20 2a 2f 0a 20 20 69 6e 74  l trees */.  int
339b0 20 6e 52 6f 6f 74 2c 20 20 20 20 2f 2a 20 4e 75   nRoot,    /* Nu
339c0 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
339d0 69 6e 20 61 52 6f 6f 74 5b 5d 20 2a 2f 0a 20 20  in aRoot[] */.  
339e0 69 6e 74 20 6d 78 45 72 72 2c 20 20 20 20 2f 2a  int mxErr,    /*
339f0 20 53 74 6f 70 20 72 65 70 6f 72 74 69 6e 67 20   Stop reporting 
33a00 65 72 72 6f 72 73 20 61 66 74 65 72 20 74 68 69  errors after thi
33a10 73 20 6d 61 6e 79 20 2a 2f 0a 20 20 69 6e 74 20  s many */.  int 
33a20 2a 70 6e 45 72 72 20 20 20 20 2f 2a 20 57 72 69  *pnErr    /* Wri
33a30 74 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  te number of err
33a40 6f 72 73 20 73 65 65 6e 20 74 6f 20 74 68 69 73  ors seen to this
33a50 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 29 7b 0a   variable */.){.
33a60 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
33a70 52 65 66 3b 0a 20 20 49 6e 74 65 67 72 69 74 79  Ref;.  Integrity
33a80 43 6b 20 73 43 68 65 63 6b 3b 0a 20 20 42 74 53  Ck sCheck;.  BtS
33a90 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
33aa0 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  pBt;..  sqlite3B
33ab0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
33ac0 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
33ad0 0a 20 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65  .  nRef = sqlite
33ae0 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
33af0 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 69  Bt->pPager);.  i
33b00 66 28 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68  f( lockBtreeWith
33b10 52 65 74 72 79 28 70 29 21 3d 53 51 4c 49 54 45  Retry(p)!=SQLITE
33b20 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
33b30 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
33b40 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69  .    return sqli
33b50 74 65 33 53 74 72 44 75 70 28 22 55 6e 61 62 6c  te3StrDup("Unabl
33b60 65 20 74 6f 20 61 63 71 75 69 72 65 20 61 20 72  e to acquire a r
33b70 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
33b80 64 61 74 61 62 61 73 65 22 29 3b 0a 20 20 7d 0a  database");.  }.
33b90 20 20 73 43 68 65 63 6b 2e 70 42 74 20 3d 20 70    sCheck.pBt = p
33ba0 42 74 3b 0a 20 20 73 43 68 65 63 6b 2e 70 50 61  Bt;.  sCheck.pPa
33bb0 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
33bc0 72 3b 0a 20 20 73 43 68 65 63 6b 2e 6e 50 61 67  r;.  sCheck.nPag
33bd0 65 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  e = pagerPagecou
33be0 6e 74 28 73 43 68 65 63 6b 2e 70 50 61 67 65 72  nt(sCheck.pPager
33bf0 29 3b 0a 20 20 73 43 68 65 63 6b 2e 6d 78 45 72  );.  sCheck.mxEr
33c00 72 20 3d 20 6d 78 45 72 72 3b 0a 20 20 73 43 68  r = mxErr;.  sCh
33c10 65 63 6b 2e 6e 45 72 72 20 3d 20 30 3b 0a 20 20  eck.nErr = 0;.  
33c20 2a 70 6e 45 72 72 20 3d 20 30 3b 0a 23 69 66 6e  *pnErr = 0;.#ifn
33c30 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
33c40 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66 28  AUTOVACUUM.  if(
33c50 20 70 42 74 2d 3e 6e 54 72 75 6e 63 21 3d 30 20   pBt->nTrunc!=0 
33c60 29 7b 0a 20 20 20 20 73 43 68 65 63 6b 2e 6e 50  ){.    sCheck.nP
33c70 61 67 65 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e  age = pBt->nTrun
33c80 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  c;.  }.#endif.  
33c90 69 66 28 20 73 43 68 65 63 6b 2e 6e 50 61 67 65  if( sCheck.nPage
33ca0 3d 3d 30 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63  ==0 ){.    unloc
33cb0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
33cc0 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Bt);.    sqlite3
33cd0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
33ce0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
33cf0 0a 20 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 20  .  sCheck.anRef 
33d00 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
33d10 20 28 73 43 68 65 63 6b 2e 6e 50 61 67 65 2b 31   (sCheck.nPage+1
33d20 29 2a 73 69 7a 65 6f 66 28 73 43 68 65 63 6b 2e  )*sizeof(sCheck.
33d30 61 6e 52 65 66 5b 30 5d 29 20 29 3b 0a 20 20 69  anRef[0]) );.  i
33d40 66 28 20 21 73 43 68 65 63 6b 2e 61 6e 52 65 66  f( !sCheck.anRef
33d50 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74   ){.    unlockBt
33d60 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
33d70 3b 0a 20 20 20 20 2a 70 6e 45 72 72 20 3d 20 31  ;.    *pnErr = 1
33d80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
33d90 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
33da0 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4d 50  return sqlite3MP
33db0 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20 22 55 6e  rintf(p->db, "Un
33dc0 61 62 6c 65 20 74 6f 20 6d 61 6c 6c 6f 63 20 25  able to malloc %
33dd0 64 20 62 79 74 65 73 22 2c 20 0a 20 20 20 20 20  d bytes", .     
33de0 20 20 20 28 73 43 68 65 63 6b 2e 6e 50 61 67 65     (sCheck.nPage
33df0 2b 31 29 2a 73 69 7a 65 6f 66 28 73 43 68 65 63  +1)*sizeof(sChec
33e00 6b 2e 61 6e 52 65 66 5b 30 5d 29 29 3b 0a 20 20  k.anRef[0]));.  
33e10 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d  }.  for(i=0; i<=
33e20 73 43 68 65 63 6b 2e 6e 50 61 67 65 3b 20 69 2b  sCheck.nPage; i+
33e30 2b 29 7b 20 73 43 68 65 63 6b 2e 61 6e 52 65 66  +){ sCheck.anRef
33e40 5b 69 5d 20 3d 20 30 3b 20 7d 0a 20 20 69 20 3d  [i] = 0; }.  i =
33e50 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41   PENDING_BYTE_PA
33e60 47 45 28 70 42 74 29 3b 0a 20 20 69 66 28 20 69  GE(pBt);.  if( i
33e70 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 29  <=sCheck.nPage )
33e80 7b 0a 20 20 20 20 73 43 68 65 63 6b 2e 61 6e 52  {.    sCheck.anR
33e90 65 66 5b 69 5d 20 3d 20 31 3b 0a 20 20 7d 0a 20  ef[i] = 1;.  }. 
33ea0 20 73 43 68 65 63 6b 2e 7a 45 72 72 4d 73 67 20   sCheck.zErrMsg 
33eb0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  = 0;..  /* Check
33ec0 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f   the integrity o
33ed0 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 0a 20  f the freelist. 
33ee0 20 2a 2f 0a 20 20 63 68 65 63 6b 4c 69 73 74 28   */.  checkList(
33ef0 26 73 43 68 65 63 6b 2c 20 31 2c 20 67 65 74 34  &sCheck, 1, get4
33f00 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
33f10 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 2c 0a 20  1->aData[32]),. 
33f20 20 20 20 20 20 20 20 20 20 20 20 67 65 74 34 62             get4b
33f30 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
33f40 2d 3e 61 44 61 74 61 5b 33 36 5d 29 2c 20 22 4d  ->aData[36]), "M
33f50 61 69 6e 20 66 72 65 65 6c 69 73 74 3a 20 22 29  ain freelist: ")
33f60 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 61 6c  ;..  /* Check al
33f70 6c 20 74 68 65 20 74 61 62 6c 65 73 2e 0a 20 20  l the tables..  
33f80 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
33f90 6e 52 6f 6f 74 20 26 26 20 73 43 68 65 63 6b 2e  nRoot && sCheck.
33fa0 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  mxErr; i++){.   
33fb0 20 69 66 28 20 61 52 6f 6f 74 5b 69 5d 3d 3d 30   if( aRoot[i]==0
33fc0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66   ) continue;.#if
33fd0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
33fe0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
33ff0 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
34000 75 75 6d 20 26 26 20 61 52 6f 6f 74 5b 69 5d 3e  uum && aRoot[i]>
34010 31 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b  1 ){.      check
34020 50 74 72 6d 61 70 28 26 73 43 68 65 63 6b 2c 20  Ptrmap(&sCheck, 
34030 61 52 6f 6f 74 5b 69 5d 2c 20 50 54 52 4d 41 50  aRoot[i], PTRMAP
34040 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20 30 29  _ROOTPAGE, 0, 0)
34050 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
34060 20 20 20 63 68 65 63 6b 54 72 65 65 50 61 67 65     checkTreePage
34070 28 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f 74 5b  (&sCheck, aRoot[
34080 69 5d 2c 20 30 2c 20 22 4c 69 73 74 20 6f 66 20  i], 0, "List of 
34090 74 72 65 65 20 72 6f 6f 74 73 3a 20 22 29 3b 0a  tree roots: ");.
340a0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73    }..  /* Make s
340b0 75 72 65 20 65 76 65 72 79 20 70 61 67 65 20 69  ure every page i
340c0 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20 72 65  n the file is re
340d0 66 65 72 65 6e 63 65 64 0a 20 20 2a 2f 0a 20 20  ferenced.  */.  
340e0 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 73 43 68 65  for(i=1; i<=sChe
340f0 63 6b 2e 6e 50 61 67 65 20 26 26 20 73 43 68 65  ck.nPage && sChe
34100 63 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a  ck.mxErr; i++){.
34110 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
34120 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
34130 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e 52    if( sCheck.anR
34140 65 66 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  ef[i]==0 ){.    
34150 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
34160 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 61  (&sCheck, 0, "Pa
34170 67 65 20 25 64 20 69 73 20 6e 65 76 65 72 20 75  ge %d is never u
34180 73 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a  sed", i);.    }.
34190 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20 49 66 20  #else.    /* If 
341a0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
341b0 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
341c0 6d 2c 20 6d 61 6b 65 20 73 75 72 65 20 6e 6f 20  m, make sure no 
341d0 74 61 62 6c 65 73 20 63 6f 6e 74 61 69 6e 0a 20  tables contain. 
341e0 20 20 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73     ** references
341f0 20 74 6f 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20   to pointer-map 
34200 70 61 67 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  pages..    */.  
34210 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e 52    if( sCheck.anR
34220 65 66 5b 69 5d 3d 3d 30 20 26 26 20 0a 20 20 20  ef[i]==0 && .   
34230 20 20 20 20 28 50 54 52 4d 41 50 5f 50 41 47 45      (PTRMAP_PAGE
34240 4e 4f 28 70 42 74 2c 20 69 29 21 3d 69 20 7c 7c  NO(pBt, i)!=i ||
34250 20 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75   !pBt->autoVacuu
34260 6d 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  m) ){.      chec
34270 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65  kAppendMsg(&sChe
34280 63 6b 2c 20 30 2c 20 22 50 61 67 65 20 25 64 20  ck, 0, "Page %d 
34290 69 73 20 6e 65 76 65 72 20 75 73 65 64 22 2c 20  is never used", 
342a0 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  i);.    }.    if
342b0 28 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69  ( sCheck.anRef[i
342c0 5d 21 3d 30 20 26 26 20 0a 20 20 20 20 20 20 20  ]!=0 && .       
342d0 28 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  (PTRMAP_PAGENO(p
342e0 42 74 2c 20 69 29 3d 3d 69 20 26 26 20 70 42 74  Bt, i)==i && pBt
342f0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 20 29 7b  ->autoVacuum) ){
34300 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65  .      checkAppe
34310 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30  ndMsg(&sCheck, 0
34320 2c 20 22 50 6f 69 6e 74 65 72 20 6d 61 70 20 70  , "Pointer map p
34330 61 67 65 20 25 64 20 69 73 20 72 65 66 65 72 65  age %d is refere
34340 6e 63 65 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d  nced", i);.    }
34350 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
34360 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 69 73  * Make sure this
34370 20 61 6e 61 6c 79 73 69 73 20 64 69 64 20 6e 6f   analysis did no
34380 74 20 6c 65 61 76 65 20 61 6e 79 20 75 6e 72 65  t leave any unre
34390 66 28 29 20 70 61 67 65 73 0a 20 20 2a 2f 0a 20  f() pages.  */. 
343a0 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
343b0 75 73 65 64 28 70 42 74 29 3b 0a 20 20 69 66 28  used(pBt);.  if(
343c0 20 6e 52 65 66 20 21 3d 20 73 71 6c 69 74 65 33   nRef != sqlite3
343d0 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42  PagerRefcount(pB
343e0 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20  t->pPager) ){.  
343f0 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
34400 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20  (&sCheck, 0, .  
34410 20 20 20 20 22 4f 75 74 73 74 61 6e 64 69 6e 67      "Outstanding
34420 20 70 61 67 65 20 63 6f 75 6e 74 20 67 6f 65 73   page count goes
34430 20 66 72 6f 6d 20 25 64 20 74 6f 20 25 64 20 64   from %d to %d d
34440 75 72 69 6e 67 20 74 68 69 73 20 61 6e 61 6c 79  uring this analy
34450 73 69 73 22 2c 0a 20 20 20 20 20 20 6e 52 65 66  sis",.      nRef
34460 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  , sqlite3PagerRe
34470 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  fcount(pBt->pPag
34480 65 72 29 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a  er).    );.  }..
34490 20 20 2f 2a 20 43 6c 65 61 6e 20 20 75 70 20 61    /* Clean  up a
344a0 6e 64 20 72 65 70 6f 72 74 20 65 72 72 6f 72 73  nd report errors
344b0 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
344c0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
344d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73 43   sqlite3_free(sC
344e0 68 65 63 6b 2e 61 6e 52 65 66 29 3b 0a 20 20 2a  heck.anRef);.  *
344f0 70 6e 45 72 72 20 3d 20 73 43 68 65 63 6b 2e 6e  pnErr = sCheck.n
34500 45 72 72 3b 0a 20 20 72 65 74 75 72 6e 20 73 43  Err;.  return sC
34510 68 65 63 6b 2e 7a 45 72 72 4d 73 67 3b 0a 7d 0a  heck.zErrMsg;.}.
34520 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
34530 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
34540 43 48 45 43 4b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  CHECK */../*.** 
34550 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20  Return the full 
34560 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20  pathname of the 
34570 75 6e 64 65 72 6c 79 69 6e 67 20 64 61 74 61 62  underlying datab
34580 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ase file..**.** 
34590 54 68 65 20 70 61 67 65 72 20 66 69 6c 65 6e 61  The pager filena
345a0 6d 65 20 69 73 20 69 6e 76 61 72 69 61 6e 74 20  me is invariant 
345b0 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 70  as long as the p
345c0 61 67 65 72 20 69 73 0a 2a 2a 20 6f 70 65 6e 20  ager is.** open 
345d0 73 6f 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  so it is safe to
345e0 20 61 63 63 65 73 73 20 77 69 74 68 6f 75 74 20   access without 
345f0 74 68 65 20 42 74 53 68 61 72 65 64 20 6d 75 74  the BtShared mut
34600 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  ex..*/.const cha
34610 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47  r *sqlite3BtreeG
34620 65 74 46 69 6c 65 6e 61 6d 65 28 42 74 72 65 65  etFilename(Btree
34630 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20   *p){.  assert( 
34640 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d  p->pBt->pPager!=
34650 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  0 );.  return sq
34660 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61  lite3PagerFilena
34670 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  me(p->pBt->pPage
34680 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  r);.}../*.** Ret
34690 75 72 6e 20 74 68 65 20 70 61 74 68 6e 61 6d 65  urn the pathname
346a0 20 6f 66 20 74 68 65 20 64 69 72 65 63 74 6f 72   of the director
346b0 79 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  y that contains 
346c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
346d0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  e..**.** The pag
346e0 65 72 20 64 69 72 65 63 74 6f 72 79 20 6e 61 6d  er directory nam
346f0 65 20 69 73 20 69 6e 76 61 72 69 61 6e 74 20 61  e is invariant a
34700 73 20 6c 6f 6e 67 20 61 73 20 74 68 65 20 70 61  s long as the pa
34710 67 65 72 20 69 73 0a 2a 2a 20 6f 70 65 6e 20 73  ger is.** open s
34720 6f 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  o it is safe to 
34730 61 63 63 65 73 73 20 77 69 74 68 6f 75 74 20 74  access without t
34740 68 65 20 42 74 53 68 61 72 65 64 20 6d 75 74 65  he BtShared mute
34750 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  x..*/.const char
34760 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 47 65   *sqlite3BtreeGe
34770 74 44 69 72 6e 61 6d 65 28 42 74 72 65 65 20 2a  tDirname(Btree *
34780 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  p){.  assert( p-
34790 3e 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20  >pBt->pPager!=0 
347a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
347b0 74 65 33 50 61 67 65 72 44 69 72 6e 61 6d 65 28  te3PagerDirname(
347c0 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  p->pBt->pPager);
347d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
347e0 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20 6f 66   the pathname of
347f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
34800 65 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62  e for this datab
34810 61 73 65 2e 20 54 68 65 20 72 65 74 75 72 6e 0a  ase. The return.
34820 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  ** value of this
34830 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68 65 20   routine is the 
34840 73 61 6d 65 20 72 65 67 61 72 64 6c 65 73 73 20  same regardless 
34850 6f 66 20 77 68 65 74 68 65 72 20 74 68 65 20 6a  of whether the j
34860 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 68  ournal file.** h
34870 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64 20  as been created 
34880 6f 72 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  or not..**.** Th
34890 65 20 70 61 67 65 72 20 6a 6f 75 72 6e 61 6c 20  e pager journal 
348a0 66 69 6c 65 6e 61 6d 65 20 69 73 20 69 6e 76 61  filename is inva
348b0 72 69 61 6e 74 20 61 73 20 6c 6f 6e 67 20 61 73  riant as long as
348c0 20 74 68 65 20 70 61 67 65 72 20 69 73 0a 2a 2a   the pager is.**
348d0 20 6f 70 65 6e 20 73 6f 20 69 74 20 69 73 20 73   open so it is s
348e0 61 66 65 20 74 6f 20 61 63 63 65 73 73 20 77 69  afe to access wi
348f0 74 68 6f 75 74 20 74 68 65 20 42 74 53 68 61 72  thout the BtShar
34900 65 64 20 6d 75 74 65 78 2e 0a 2a 2f 0a 63 6f 6e  ed mutex..*/.con
34910 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
34920 42 74 72 65 65 47 65 74 4a 6f 75 72 6e 61 6c 6e  BtreeGetJournaln
34930 61 6d 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  ame(Btree *p){. 
34940 20 61 73 73 65 72 74 28 20 70 2d 3e 70 42 74 2d   assert( p->pBt-
34950 3e 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20  >pPager!=0 );.  
34960 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 61  return sqlite3Pa
34970 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 70  gerJournalname(p
34980 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  ->pBt->pPager);.
34990 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
349a0 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a  E_OMIT_VACUUM./*
349b0 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20 63 6f 6d  .** Copy the com
349c0 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74 20 6f 66  plete content of
349d0 20 70 42 74 46 72 6f 6d 20 69 6e 74 6f 20 70 42   pBtFrom into pB
349e0 74 54 6f 2e 20 20 41 20 74 72 61 6e 73 61 63 74  tTo.  A transact
349f0 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 62 65 20 61  ion.** must be a
34a00 63 74 69 76 65 20 66 6f 72 20 62 6f 74 68 20 66  ctive for both f
34a10 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  iles..**.** The 
34a20 73 69 7a 65 20 6f 66 20 66 69 6c 65 20 70 54 6f  size of file pTo
34a30 20 6d 61 79 20 62 65 20 72 65 64 75 63 65 64 20   may be reduced 
34a40 62 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f  by this operatio
34a50 6e 2e 0a 2a 2a 20 49 66 20 61 6e 79 74 68 69 6e  n..** If anythin
34a60 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 74 68  g goes wrong, th
34a70 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  e transaction on
34a80 20 70 54 6f 20 69 73 20 72 6f 6c 6c 65 64 20 62   pTo is rolled b
34a90 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ack. .**.** If s
34aa0 75 63 63 65 73 73 66 75 6c 2c 20 43 6f 6d 6d 69  uccessful, Commi
34ab0 74 50 68 61 73 65 4f 6e 65 28 29 20 6d 61 79 20  tPhaseOne() may 
34ac0 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 70 54 6f  be called on pTo
34ad0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
34ae0 67 2e 20 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  g. .** The calle
34af0 72 20 73 68 6f 75 6c 64 20 66 69 6e 69 73 68 20  r should finish 
34b00 63 6f 6d 6d 69 74 74 69 6e 67 20 74 68 65 20 74  committing the t
34b10 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 70 54  ransaction on pT
34b20 6f 20 62 79 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20  o by calling.** 
34b30 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
34b40 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  it()..*/.static 
34b50 69 6e 74 20 62 74 72 65 65 43 6f 70 79 46 69 6c  int btreeCopyFil
34b60 65 28 42 74 72 65 65 20 2a 70 54 6f 2c 20 42 74  e(Btree *pTo, Bt
34b70 72 65 65 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69  ree *pFrom){.  i
34b80 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
34b90 4b 3b 0a 20 20 50 67 6e 6f 20 69 3b 0a 0a 20 20  K;.  Pgno i;..  
34ba0 50 67 6e 6f 20 6e 46 72 6f 6d 50 61 67 65 3b 20  Pgno nFromPage; 
34bb0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
34bc0 20 70 61 67 65 73 20 69 6e 20 70 46 72 6f 6d 20   pages in pFrom 
34bd0 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 6f 50 61 67  */.  Pgno nToPag
34be0 65 3b 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  e;       /* Numb
34bf0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70  er of pages in p
34c00 54 6f 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 4e 65  To */.  Pgno nNe
34c10 77 50 61 67 65 3b 20 20 20 20 20 20 2f 2a 20 4e  wPage;      /* N
34c20 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
34c30 6e 20 70 54 6f 20 61 66 74 65 72 20 74 68 65 20  n pTo after the 
34c40 63 6f 70 79 20 2a 2f 0a 0a 20 20 50 67 6e 6f 20  copy */..  Pgno 
34c50 69 53 6b 69 70 3b 20 20 20 20 20 20 20 20 20 2f  iSkip;         /
34c60 2a 20 50 65 6e 64 69 6e 67 20 62 79 74 65 20 70  * Pending byte p
34c70 61 67 65 20 69 6e 20 70 54 6f 20 2a 2f 0a 20 20  age in pTo */.  
34c80 69 6e 74 20 6e 54 6f 50 61 67 65 53 69 7a 65 3b  int nToPageSize;
34c90 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65      /* Page size
34ca0 20 6f 66 20 70 54 6f 20 69 6e 20 62 79 74 65 73   of pTo in bytes
34cb0 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 6f 6d 50   */.  int nFromP
34cc0 61 67 65 53 69 7a 65 3b 20 20 2f 2a 20 50 61 67  ageSize;  /* Pag
34cd0 65 20 73 69 7a 65 20 6f 66 20 70 46 72 6f 6d 20  e size of pFrom 
34ce0 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a 20 20 42  in bytes */..  B
34cf0 74 53 68 61 72 65 64 20 2a 70 42 74 54 6f 20 3d  tShared *pBtTo =
34d00 20 70 54 6f 2d 3e 70 42 74 3b 0a 20 20 42 74 53   pTo->pBt;.  BtS
34d10 68 61 72 65 64 20 2a 70 42 74 46 72 6f 6d 20 3d  hared *pBtFrom =
34d20 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a 20 20 70   pFrom->pBt;.  p
34d30 42 74 54 6f 2d 3e 64 62 20 3d 20 70 54 6f 2d 3e  BtTo->db = pTo->
34d40 64 62 3b 0a 20 20 70 42 74 46 72 6f 6d 2d 3e 64  db;.  pBtFrom->d
34d50 62 20 3d 20 70 46 72 6f 6d 2d 3e 64 62 3b 0a 0a  b = pFrom->db;..
34d60 20 20 6e 54 6f 50 61 67 65 53 69 7a 65 20 3d 20    nToPageSize = 
34d70 70 42 74 54 6f 2d 3e 70 61 67 65 53 69 7a 65 3b  pBtTo->pageSize;
34d80 0a 20 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65  .  nFromPageSize
34d90 20 3d 20 70 42 74 46 72 6f 6d 2d 3e 70 61 67 65   = pBtFrom->page
34da0 53 69 7a 65 3b 0a 0a 20 20 69 66 28 20 70 54 6f  Size;..  if( pTo
34db0 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
34dc0 5f 57 52 49 54 45 20 7c 7c 20 70 46 72 6f 6d 2d  _WRITE || pFrom-
34dd0 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
34de0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72 65 74  WRITE ){.    ret
34df0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
34e00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 42 74 54  ;.  }.  if( pBtT
34e10 6f 2d 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20  o->pCursor ){.  
34e20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
34e30 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20 6e 54 6f  BUSY;.  }..  nTo
34e40 50 61 67 65 20 3d 20 70 61 67 65 72 50 61 67 65  Page = pagerPage
34e50 63 6f 75 6e 74 28 70 42 74 54 6f 2d 3e 70 50 61  count(pBtTo->pPa
34e60 67 65 72 29 3b 0a 20 20 6e 46 72 6f 6d 50 61 67  ger);.  nFromPag
34e70 65 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75  e = pagerPagecou
34e80 6e 74 28 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67  nt(pBtFrom->pPag
34e90 65 72 29 3b 0a 20 20 69 53 6b 69 70 20 3d 20 50  er);.  iSkip = P
34ea0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
34eb0 28 70 42 74 54 6f 29 3b 0a 0a 20 20 2f 2a 20 56  (pBtTo);..  /* V
34ec0 61 72 69 61 62 6c 65 20 6e 4e 65 77 50 61 67 65  ariable nNewPage
34ed0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
34ee0 66 20 70 61 67 65 73 20 72 65 71 75 69 72 65 64  f pages required
34ef0 20 74 6f 20 73 74 6f 72 65 20 74 68 65 0a 20 20   to store the.  
34f00 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70  ** contents of p
34f10 46 72 6f 6d 20 75 73 69 6e 67 20 74 68 65 20 63  From using the c
34f20 75 72 72 65 6e 74 20 70 61 67 65 2d 73 69 7a 65  urrent page-size
34f30 20 6f 66 20 70 54 6f 2e 0a 20 20 2a 2f 0a 20 20   of pTo..  */.  
34f40 6e 4e 65 77 50 61 67 65 20 3d 20 28 28 69 36 34  nNewPage = ((i64
34f50 29 6e 46 72 6f 6d 50 61 67 65 20 2a 20 28 69 36  )nFromPage * (i6
34f60 34 29 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 20  4)nFromPageSize 
34f70 2b 20 28 69 36 34 29 6e 54 6f 50 61 67 65 53 69  + (i64)nToPageSi
34f80 7a 65 20 2d 20 31 29 20 2f 20 0a 20 20 20 20 20  ze - 1) / .     
34f90 20 28 69 36 34 29 6e 54 6f 50 61 67 65 53 69 7a   (i64)nToPageSiz
34fa0 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 31 3b 20 72  e;..  for(i=1; r
34fb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
34fc0 28 69 3c 3d 6e 54 6f 50 61 67 65 20 7c 7c 20 69  (i<=nToPage || i
34fd0 3c 3d 6e 4e 65 77 50 61 67 65 29 3b 20 69 2b 2b  <=nNewPage); i++
34fe0 29 7b 0a 0a 20 20 20 20 2f 2a 20 4a 6f 75 72 6e  ){..    /* Journ
34ff0 61 6c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  al the original 
35000 70 61 67 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  page..    **.   
35010 20 2a 2a 20 69 53 6b 69 70 20 69 73 20 74 68 65   ** iSkip is the
35020 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
35030 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 61 67 65  the locking page
35040 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50   (PENDING_BYTE_P
35050 41 47 45 29 0a 20 20 20 20 2a 2a 20 69 6e 20 64  AGE).    ** in d
35060 61 74 61 62 61 73 65 20 2a 70 54 6f 20 28 62 65  atabase *pTo (be
35070 66 6f 72 65 20 74 68 65 20 63 6f 70 79 29 2e 20  fore the copy). 
35080 54 68 69 73 20 70 61 67 65 20 69 73 20 6e 65 76  This page is nev
35090 65 72 20 77 72 69 74 74 65 6e 20 0a 20 20 20 20  er written .    
350a0 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  ** into the jour
350b0 6e 61 6c 20 66 69 6c 65 2e 20 55 6e 6c 65 73 73  nal file. Unless
350c0 20 69 3d 3d 69 53 6b 69 70 20 6f 72 20 74 68 65   i==iSkip or the
350d0 20 70 61 67 65 20 77 61 73 20 6e 6f 74 0a 20 20   page was not.  
350e0 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e 20    ** present in 
350f0 70 54 6f 20 62 65 66 6f 72 65 20 74 68 65 20 63  pTo before the c
35100 6f 70 79 20 6f 70 65 72 61 74 69 6f 6e 2c 20 6a  opy operation, j
35110 6f 75 72 6e 61 6c 20 70 61 67 65 20 69 20 66 72  ournal page i fr
35120 6f 6d 20 70 54 6f 2e 0a 20 20 20 20 2a 2f 0a 20  om pTo..    */. 
35130 20 20 20 69 66 28 20 69 21 3d 69 53 6b 69 70 20     if( i!=iSkip 
35140 26 26 20 69 3c 3d 6e 54 6f 50 61 67 65 20 29 7b  && i<=nToPage ){
35150 0a 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70  .      DbPage *p
35160 44 62 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20  DbPage = 0;.    
35170 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
35180 67 65 72 47 65 74 28 70 42 74 54 6f 2d 3e 70 50  gerGet(pBtTo->pP
35190 61 67 65 72 2c 20 69 2c 20 26 70 44 62 50 61 67  ager, i, &pDbPag
351a0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
351b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
351c0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
351d0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44  te3PagerWrite(pD
351e0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
351f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
35200 4b 20 26 26 20 69 3e 6e 46 72 6f 6d 50 61 67 65  K && i>nFromPage
35210 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
35220 20 59 65 61 68 2e 20 20 49 74 20 73 65 65 6d 73   Yeah.  It seems
35230 20 77 69 65 72 64 20 74 6f 20 63 61 6c 6c 20 44   wierd to call D
35240 6f 6e 74 57 72 69 74 65 28 29 20 72 69 67 68 74  ontWrite() right
35250 20 61 66 74 65 72 20 57 72 69 74 65 28 29 2e 20   after Write(). 
35260 42 75 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  But.          **
35270 20 74 68 61 74 20 69 73 20 62 65 63 61 75 73 65   that is because
35280 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68   the names of th
35290 6f 73 65 20 70 72 6f 63 65 64 75 72 65 73 20 64  ose procedures d
352a0 6f 20 6e 6f 74 20 65 78 61 63 74 6c 79 20 0a 20  o not exactly . 
352b0 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 70 72           ** repr
352c0 65 73 65 6e 74 20 77 68 61 74 20 74 68 65 79 20  esent what they 
352d0 64 6f 2e 20 20 57 72 69 74 65 28 29 20 72 65 61  do.  Write() rea
352e0 6c 6c 79 20 6d 65 61 6e 73 20 22 70 75 74 20 74  lly means "put t
352f0 68 69 73 20 70 61 67 65 20 69 6e 20 74 68 65 0a  his page in the.
35300 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 6f 6c            ** rol
35310 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e  lback journal an
35320 64 20 6d 61 72 6b 20 69 74 20 61 73 20 64 69 72  d mark it as dir
35330 74 79 20 73 6f 20 74 68 61 74 20 69 74 20 77 69  ty so that it wi
35340 6c 6c 20 62 65 20 77 72 69 74 74 65 6e 0a 20 20  ll be written.  
35350 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68          ** to th
35360 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
35370 6c 61 74 65 72 2e 22 20 20 44 6f 6e 74 57 72 69  later."  DontWri
35380 74 65 28 29 20 75 6e 64 6f 65 73 20 74 68 65 20  te() undoes the 
35390 73 65 63 6f 6e 64 20 70 61 72 74 20 6f 66 0a 20  second part of. 
353a0 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74           ** that
353b0 20 61 6e 64 20 70 72 65 76 65 6e 74 73 20 74 68   and prevents th
353c0 65 20 70 61 67 65 20 66 72 6f 6d 20 62 65 69 6e  e page from bein
353d0 67 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  g written to the
353e0 20 64 61 74 61 62 61 73 65 2e 20 54 68 65 0a 20   database. The. 
353f0 20 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65           ** page
35400 20 69 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65   is still on the
35410 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
35420 6c 2c 20 74 68 6f 75 67 68 2e 20 20 41 6e 64 20  l, though.  And 
35430 74 68 61 74 20 69 73 20 74 68 65 20 0a 20 20 20  that is the .   
35440 20 20 20 20 20 20 20 2a 2a 20 77 68 6f 6c 65 20         ** whole 
35450 70 6f 69 6e 74 20 6f 66 20 74 68 69 73 20 62 6c  point of this bl
35460 6f 63 6b 3a 20 74 6f 20 70 75 74 20 70 61 67 65  ock: to put page
35470 73 20 6f 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  s on the rollbac
35480 6b 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20  k journal. .    
35490 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
354a0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44     sqlite3PagerD
354b0 6f 6e 74 57 72 69 74 65 28 70 44 62 50 61 67 65  ontWrite(pDbPage
354c0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
354d0 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
354e0 72 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b  rUnref(pDbPage);
354f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
35500 20 20 20 20 2f 2a 20 4f 76 65 72 77 72 69 74 65      /* Overwrite
35510 20 74 68 65 20 64 61 74 61 20 69 6e 20 70 61 67   the data in pag
35520 65 20 69 20 6f 66 20 74 68 65 20 74 61 72 67 65  e i of the targe
35530 74 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  t database */.  
35540 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
35550 5f 4f 4b 20 26 26 20 69 21 3d 69 53 6b 69 70 20  _OK && i!=iSkip 
35560 26 26 20 69 3c 3d 6e 4e 65 77 50 61 67 65 20 29  && i<=nNewPage )
35570 7b 0a 0a 20 20 20 20 20 20 44 62 50 61 67 65 20  {..      DbPage 
35580 2a 70 54 6f 50 61 67 65 20 3d 20 30 3b 0a 20 20  *pToPage = 0;.  
35590 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
355a0 34 20 69 4f 66 66 3b 0a 0a 20 20 20 20 20 20 72  4 iOff;..      r
355b0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
355c0 47 65 74 28 70 42 74 54 6f 2d 3e 70 50 61 67 65  Get(pBtTo->pPage
355d0 72 2c 20 69 2c 20 26 70 54 6f 50 61 67 65 29 3b  r, i, &pToPage);
355e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
355f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
35600 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
35610 50 61 67 65 72 57 72 69 74 65 28 70 54 6f 50 61  PagerWrite(pToPa
35620 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  ge);.      }..  
35630 20 20 20 20 66 6f 72 28 0a 20 20 20 20 20 20 20      for(.       
35640 20 69 4f 66 66 3d 28 69 2d 31 29 2a 6e 54 6f 50   iOff=(i-1)*nToP
35650 61 67 65 53 69 7a 65 3b 20 0a 20 20 20 20 20 20  ageSize; .      
35660 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20    rc==SQLITE_OK 
35670 26 26 20 69 4f 66 66 3c 69 2a 6e 54 6f 50 61 67  && iOff<i*nToPag
35680 65 53 69 7a 65 3b 20 0a 20 20 20 20 20 20 20 20  eSize; .        
35690 69 4f 66 66 20 2b 3d 20 6e 46 72 6f 6d 50 61 67  iOff += nFromPag
356a0 65 53 69 7a 65 0a 20 20 20 20 20 20 29 7b 0a 20  eSize.      ){. 
356b0 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70         DbPage *p
356c0 46 72 6f 6d 50 61 67 65 20 3d 20 30 3b 0a 20 20  FromPage = 0;.  
356d0 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 6f 6d        Pgno iFrom
356e0 20 3d 20 28 69 4f 66 66 2f 6e 46 72 6f 6d 50 61   = (iOff/nFromPa
356f0 67 65 53 69 7a 65 29 2b 31 3b 0a 0a 20 20 20 20  geSize)+1;..    
35700 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d 50      if( iFrom==P
35710 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
35720 28 70 42 74 46 72 6f 6d 29 20 29 7b 0a 20 20 20  (pBtFrom) ){.   
35730 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
35740 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
35750 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
35760 50 61 67 65 72 47 65 74 28 70 42 74 46 72 6f 6d  PagerGet(pBtFrom
35770 2d 3e 70 50 61 67 65 72 2c 20 69 46 72 6f 6d 2c  ->pPager, iFrom,
35780 20 26 70 46 72 6f 6d 50 61 67 65 29 3b 0a 20 20   &pFromPage);.  
35790 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
357a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
357b0 20 20 20 20 20 63 68 61 72 20 2a 7a 54 6f 20 3d       char *zTo =
357c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
357d0 44 61 74 61 28 70 54 6f 50 61 67 65 29 3b 0a 20  Data(pToPage);. 
357e0 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
357f0 46 72 6f 6d 20 3d 20 73 71 6c 69 74 65 33 50 61  From = sqlite3Pa
35800 67 65 72 47 65 74 44 61 74 61 28 70 46 72 6f 6d  gerGetData(pFrom
35810 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
35820 20 69 6e 74 20 6e 43 6f 70 79 3b 0a 0a 20 20 20   int nCopy;..   
35830 20 20 20 20 20 20 20 69 66 28 20 6e 46 72 6f 6d         if( nFrom
35840 50 61 67 65 53 69 7a 65 3e 3d 6e 54 6f 50 61 67  PageSize>=nToPag
35850 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
35860 20 20 20 20 20 7a 46 72 6f 6d 20 2b 3d 20 28 28       zFrom += ((
35870 69 2d 31 29 2a 6e 54 6f 50 61 67 65 53 69 7a 65  i-1)*nToPageSize
35880 20 2d 20 28 28 69 46 72 6f 6d 2d 31 29 2a 6e 46   - ((iFrom-1)*nF
35890 72 6f 6d 50 61 67 65 53 69 7a 65 29 29 3b 0a 20  romPageSize));. 
358a0 20 20 20 20 20 20 20 20 20 20 20 6e 43 6f 70 79             nCopy
358b0 20 3d 20 6e 54 6f 50 61 67 65 53 69 7a 65 3b 0a   = nToPageSize;.
358c0 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
358d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 6f  .            zTo
358e0 20 2b 3d 20 28 28 28 69 46 72 6f 6d 2d 31 29 2a   += (((iFrom-1)*
358f0 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 29 20 2d  nFromPageSize) -
35900 20 28 69 2d 31 29 2a 6e 54 6f 50 61 67 65 53 69   (i-1)*nToPageSi
35910 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ze);.           
35920 20 6e 43 6f 70 79 20 3d 20 6e 46 72 6f 6d 50 61   nCopy = nFromPa
35930 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  geSize;.        
35940 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 6d    }..          m
35950 65 6d 63 70 79 28 7a 54 6f 2c 20 7a 46 72 6f 6d  emcpy(zTo, zFrom
35960 2c 20 6e 43 6f 70 79 29 3b 0a 09 20 20 73 71 6c  , nCopy);..  sql
35970 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
35980 46 72 6f 6d 50 61 67 65 29 3b 0a 20 20 20 20 20  FromPage);.     
35990 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
359a0 20 20 20 20 69 66 28 20 70 54 6f 50 61 67 65 20      if( pToPage 
359b0 29 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  ) sqlite3PagerUn
359c0 72 65 66 28 70 54 6f 50 61 67 65 29 3b 0a 20 20  ref(pToPage);.  
359d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
359e0 20 74 68 69 6e 67 73 20 68 61 76 65 20 77 6f 72   things have wor
359f0 6b 65 64 20 73 6f 20 66 61 72 2c 20 74 68 65 20  ked so far, the 
35a00 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d 61  database file ma
35a10 79 20 6e 65 65 64 20 74 6f 20 62 65 20 0a 20 20  y need to be .  
35a20 2a 2a 20 74 72 75 6e 63 61 74 65 64 2e 20 54 68  ** truncated. Th
35a30 65 20 63 6f 6d 70 6c 65 78 20 70 61 72 74 20 69  e complex part i
35a40 73 20 74 68 61 74 20 69 74 20 6d 61 79 20 6e 65  s that it may ne
35a50 65 64 20 74 6f 20 62 65 20 74 72 75 6e 63 61 74  ed to be truncat
35a60 65 64 20 74 6f 0a 20 20 2a 2a 20 61 20 73 69 7a  ed to.  ** a siz
35a70 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 6e  e that is not an
35a80 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c   integer multipl
35a90 65 20 6f 66 20 6e 54 6f 50 61 67 65 53 69 7a 65  e of nToPageSize
35aa0 20 2d 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20   - the current. 
35ab0 20 2a 2a 20 70 61 67 65 20 73 69 7a 65 20 75 73   ** page size us
35ac0 65 64 20 62 79 20 74 68 65 20 70 61 67 65 72 20  ed by the pager 
35ad0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
35ae0 42 2d 54 72 65 65 20 70 54 6f 2e 0a 20 20 2a 2a  B-Tree pTo..  **
35af0 0a 20 20 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  .  ** For exampl
35b00 65 2c 20 73 61 79 20 74 68 65 20 70 61 67 65 2d  e, say the page-
35b10 73 69 7a 65 20 6f 66 20 70 54 6f 20 69 73 20 32  size of pTo is 2
35b20 30 34 38 20 62 79 74 65 73 20 61 6e 64 20 74 68  048 bytes and th
35b30 65 20 6f 72 69 67 69 6e 61 6c 20 0a 20 20 2a 2a  e original .  **
35b40 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
35b50 20 69 73 20 35 20 28 31 30 20 4b 42 20 66 69 6c   is 5 (10 KB fil
35b60 65 29 2e 20 49 66 20 70 46 72 6f 6d 20 68 61 73  e). If pFrom has
35b70 20 61 20 70 61 67 65 20 73 69 7a 65 20 6f 66 20   a page size of 
35b80 31 30 32 34 20 0a 20 20 2a 2a 20 62 79 74 65 73  1024 .  ** bytes
35b90 20 61 6e 64 20 39 20 70 61 67 65 73 2c 20 74 68   and 9 pages, th
35ba0 65 6e 20 74 68 65 20 66 69 6c 65 20 6e 65 65 64  en the file need
35bb0 73 20 74 6f 20 62 65 20 74 72 75 6e 63 61 74 65  s to be truncate
35bc0 64 20 74 6f 20 39 4b 42 2e 0a 20 20 2a 2f 0a 20  d to 9KB..  */. 
35bd0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
35be0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 46  OK ){.    if( nF
35bf0 72 6f 6d 50 61 67 65 53 69 7a 65 21 3d 6e 54 6f  romPageSize!=nTo
35c00 50 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  PageSize ){.    
35c10 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
35c20 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 50  pFile = sqlite3P
35c30 61 67 65 72 46 69 6c 65 28 70 42 74 54 6f 2d 3e  agerFile(pBtTo->
35c40 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
35c50 36 34 20 69 53 69 7a 65 20 3d 20 28 69 36 34 29  64 iSize = (i64)
35c60 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 20 2a 20  nFromPageSize * 
35c70 28 69 36 34 29 6e 46 72 6f 6d 50 61 67 65 3b 0a  (i64)nFromPage;.
35c80 20 20 20 20 20 20 69 36 34 20 69 4e 6f 77 20 3d        i64 iNow =
35c90 20 28 69 36 34 29 28 28 6e 54 6f 50 61 67 65 3e   (i64)((nToPage>
35ca0 6e 4e 65 77 50 61 67 65 29 3f 6e 54 6f 50 61 67  nNewPage)?nToPag
35cb0 65 3a 6e 4e 65 77 50 61 67 65 29 20 2a 20 28 69  e:nNewPage) * (i
35cc0 36 34 29 6e 54 6f 50 61 67 65 53 69 7a 65 3b 20  64)nToPageSize; 
35cd0 0a 20 20 20 20 20 20 69 36 34 20 69 50 65 6e 64  .      i64 iPend
35ce0 69 6e 67 20 3d 20 28 28 69 36 34 29 50 45 4e 44  ing = ((i64)PEND
35cf0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
35d00 74 54 6f 29 2d 31 29 20 2a 28 69 36 34 29 6e 54  tTo)-1) *(i64)nT
35d10 6f 50 61 67 65 53 69 7a 65 3b 0a 20 20 0a 20 20  oPageSize;.  .  
35d20 20 20 20 20 61 73 73 65 72 74 28 20 69 53 69 7a      assert( iSiz
35d30 65 3c 3d 69 4e 6f 77 20 29 3b 0a 20 20 0a 20 20  e<=iNow );.  .  
35d40 20 20 20 20 2f 2a 20 43 6f 6d 6d 69 74 20 70 68      /* Commit ph
35d50 61 73 65 20 6f 6e 65 20 73 79 6e 63 73 20 74 68  ase one syncs th
35d60 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
35d70 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
35d80 54 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e  To .      ** con
35d90 74 61 69 6e 69 6e 67 20 74 68 65 20 6f 72 69 67  taining the orig
35da0 69 6e 61 6c 20 64 61 74 61 2e 20 49 74 20 64 6f  inal data. It do
35db0 65 73 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20  es not sync the 
35dc0 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
35dd0 20 20 20 20 2a 2a 20 69 74 73 65 6c 66 2e 20 41      ** itself. A
35de0 66 74 65 72 20 64 6f 69 6e 67 20 74 68 69 73 20  fter doing this 
35df0 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 75 73  it is safe to us
35e00 65 20 4f 73 54 72 75 6e 63 61 74 65 28 29 20 61  e OsTruncate() a
35e10 6e 64 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a  nd other.      *
35e20 2a 20 66 69 6c 65 20 41 50 49 73 20 6f 6e 20 74  * file APIs on t
35e30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
35e40 20 64 69 72 65 63 74 6c 79 2e 0a 20 20 20 20 20   directly..     
35e50 20 2a 2f 0a 20 20 20 20 20 20 70 42 74 54 6f 2d   */.      pBtTo-
35e60 3e 64 62 20 3d 20 70 54 6f 2d 3e 64 62 3b 0a 20  >db = pTo->db;. 
35e70 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
35e80 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
35e90 65 4f 6e 65 28 70 42 74 54 6f 2d 3e 70 50 61 67  eOne(pBtTo->pPag
35ea0 65 72 2c 20 30 2c 20 30 2c 20 31 29 3b 0a 20 20  er, 0, 0, 1);.  
35eb0 20 20 20 20 69 66 28 20 69 53 69 7a 65 3c 69 4e      if( iSize<iN
35ec0 6f 77 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ow && rc==SQLITE
35ed0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
35ee0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
35ef0 6e 63 61 74 65 28 70 46 69 6c 65 2c 20 69 53 69  ncate(pFile, iSi
35f00 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a  ze);.      }.  .
35f10 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f        /* The loo
35f20 70 20 74 68 61 74 20 63 6f 70 69 65 64 20 64 61  p that copied da
35f30 74 61 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65  ta from database
35f40 20 70 46 72 6f 6d 20 74 6f 20 70 54 6f 20 64 69   pFrom to pTo di
35f50 64 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 70  d not.      ** p
35f60 6f 70 75 6c 61 74 65 20 74 68 65 20 6c 6f 63 6b  opulate the lock
35f70 69 6e 67 20 70 61 67 65 20 6f 66 20 64 61 74 61  ing page of data
35f80 62 61 73 65 20 70 54 6f 2e 20 49 66 20 74 68 65  base pTo. If the
35f90 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 0a 20 20   page-size of.  
35fa0 20 20 20 20 2a 2a 20 70 46 72 6f 6d 20 69 73 20      ** pFrom is 
35fb0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 61  smaller than tha
35fc0 74 20 6f 66 20 70 54 6f 2c 20 74 68 69 73 20 6d  t of pTo, this m
35fd0 65 61 6e 73 20 73 6f 6d 65 20 64 61 74 61 20 77  eans some data w
35fe0 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 74  ill.      ** not
35ff0 20 68 61 76 65 20 62 65 65 6e 20 63 6f 70 69 65   have been copie
36000 64 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  d. .      **.   
36010 20 20 20 2a 2a 20 54 68 69 73 20 62 6c 6f 63 6b     ** This block
36020 20 63 6f 70 69 65 73 20 74 68 65 20 6d 69 73 73   copies the miss
36030 69 6e 67 20 64 61 74 61 20 66 72 6f 6d 20 64 61  ing data from da
36040 74 61 62 61 73 65 20 70 46 72 6f 6d 20 74 6f 20  tabase pFrom to 
36050 70 54 6f 20 0a 20 20 20 20 20 20 2a 2a 20 75 73  pTo .      ** us
36060 69 6e 67 20 66 69 6c 65 20 41 50 49 73 2e 20 54  ing file APIs. T
36070 68 69 73 20 69 73 20 73 61 66 65 20 62 65 63 61  his is safe beca
36080 75 73 65 20 61 74 20 74 68 69 73 20 70 6f 69 6e  use at this poin
36090 74 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 0a 20  t we know that. 
360a0 20 20 20 20 20 2a 2a 20 61 6c 6c 20 6f 66 20 74       ** all of t
360b0 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
360c0 20 66 72 6f 6d 20 70 54 6f 20 68 61 73 20 62 65   from pTo has be
360d0 65 6e 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74  en synced into t
360e0 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  he .      ** jou
360f0 72 6e 61 6c 20 66 69 6c 65 2e 20 41 74 20 74 68  rnal file. At th
36100 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f 75 6c  is point it woul
36110 64 20 62 65 20 73 61 66 65 20 74 6f 20 64 6f 20  d be safe to do 
36120 61 6e 79 74 68 69 6e 67 20 61 74 0a 20 20 20 20  anything at.    
36130 20 20 2a 2a 20 61 6c 6c 20 74 6f 20 74 68 65 20    ** all to the 
36140 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 65 78  database file ex
36150 63 65 70 74 20 74 72 75 6e 63 61 74 65 20 69 74  cept truncate it
36160 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 2e 0a   to zero bytes..
36170 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
36180 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
36190 20 26 26 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a   && nFromPageSiz
361a0 65 3c 6e 54 6f 50 61 67 65 53 69 7a 65 20 26 26  e<nToPageSize &&
361b0 20 69 53 69 7a 65 3e 69 50 65 6e 64 69 6e 67 29   iSize>iPending)
361c0 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4f  {.        i64 iO
361d0 66 66 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ff;.        for(
361e0 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 3d  .          iOff=
361f0 69 50 65 6e 64 69 6e 67 3b 20 0a 20 20 20 20 20  iPending; .     
36200 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
36210 4f 4b 20 26 26 20 69 4f 66 66 3c 28 69 50 65 6e  OK && iOff<(iPen
36220 64 69 6e 67 2b 6e 54 6f 50 61 67 65 53 69 7a 65  ding+nToPageSize
36230 29 3b 20 0a 20 20 20 20 20 20 20 20 20 20 69 4f  ); .          iO
36240 66 66 20 2b 3d 20 6e 46 72 6f 6d 50 61 67 65 53  ff += nFromPageS
36250 69 7a 65 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ize.        ){. 
36260 20 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20           DbPage 
36270 2a 70 46 72 6f 6d 50 61 67 65 20 3d 20 30 3b 0a  *pFromPage = 0;.
36280 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69            Pgno i
36290 46 72 6f 6d 20 3d 20 28 69 4f 66 66 2f 6e 46 72  From = (iOff/nFr
362a0 6f 6d 50 61 67 65 53 69 7a 65 29 2b 31 3b 0a 20  omPageSize)+1;. 
362b0 20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20   .          if( 
362c0 69 46 72 6f 6d 3d 3d 50 45 4e 44 49 4e 47 5f 42  iFrom==PENDING_B
362d0 59 54 45 5f 50 41 47 45 28 70 42 74 46 72 6f 6d  YTE_PAGE(pBtFrom
362e0 29 20 7c 7c 20 69 46 72 6f 6d 3e 6e 46 72 6f 6d  ) || iFrom>nFrom
362f0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
36300 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
36310 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20          }.  .   
36320 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
36330 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 46  te3PagerGet(pBtF
36340 72 6f 6d 2d 3e 70 50 61 67 65 72 2c 20 69 46 72  rom->pPager, iFr
36350 6f 6d 2c 20 26 70 46 72 6f 6d 50 61 67 65 29 3b  om, &pFromPage);
36360 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
36370 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
36380 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
36390 20 2a 7a 46 72 6f 6d 20 3d 20 73 71 6c 69 74 65   *zFrom = sqlite
363a0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 46  3PagerGetData(pF
363b0 72 6f 6d 50 61 67 65 29 3b 0a 20 20 09 20 20 72  romPage);.  .  r
363c0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
363d0 74 65 28 70 46 69 6c 65 2c 20 7a 46 72 6f 6d 2c  te(pFile, zFrom,
363e0 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 2c 20   nFromPageSize, 
363f0 69 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20 20  iOff);.         
36400 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
36410 6e 72 65 66 28 70 46 72 6f 6d 50 61 67 65 29 3b  nref(pFromPage);
36420 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
36430 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
36440 20 0a 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20   .      /* Sync 
36450 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
36460 65 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72  e */.      if( r
36470 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
36480 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
36490 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 70 42  ite3PagerSync(pB
364a0 74 54 6f 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  tTo->pPager);.  
364b0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
364c0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
364d0 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
364e0 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 2c 20  (pBtTo->pPager, 
364f0 6e 4e 65 77 50 61 67 65 29 3b 0a 20 20 20 20 7d  nNewPage);.    }
36500 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
36510 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
36520 70 42 74 54 6f 2d 3e 70 61 67 65 53 69 7a 65 46  pBtTo->pageSizeF
36530 69 78 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  ixed = 0;.    }.
36540 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 20 29 7b    }..  if( rc ){
36550 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
36560 65 52 6f 6c 6c 62 61 63 6b 28 70 54 6f 29 3b 0a  eRollback(pTo);.
36570 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
36580 3b 20 20 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  ;  .}.int sqlite
36590 33 42 74 72 65 65 43 6f 70 79 46 69 6c 65 28 42  3BtreeCopyFile(B
365a0 74 72 65 65 20 2a 70 54 6f 2c 20 42 74 72 65 65  tree *pTo, Btree
365b0 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 6e 74 20   *pFrom){.  int 
365c0 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
365d0 65 65 45 6e 74 65 72 28 70 54 6f 29 3b 0a 20 20  eeEnter(pTo);.  
365e0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
365f0 72 28 70 46 72 6f 6d 29 3b 0a 20 20 72 63 20 3d  r(pFrom);.  rc =
36600 20 62 74 72 65 65 43 6f 70 79 46 69 6c 65 28 70   btreeCopyFile(p
36610 54 6f 2c 20 70 46 72 6f 6d 29 3b 0a 20 20 73 71  To, pFrom);.  sq
36620 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
36630 70 46 72 6f 6d 29 3b 0a 20 20 73 71 6c 69 74 65  pFrom);.  sqlite
36640 33 42 74 72 65 65 4c 65 61 76 65 28 70 54 6f 29  3BtreeLeave(pTo)
36650 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
36660 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
36670 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 20 2a  TE_OMIT_VACUUM *
36680 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  /../*.** Return 
36690 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 20 74 72  non-zero if a tr
366a0 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
366b0 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ive..*/.int sqli
366c0 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
366d0 73 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61  s(Btree *p){.  a
366e0 73 73 65 72 74 28 20 70 3d 3d 30 20 7c 7c 20 73  ssert( p==0 || s
366f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
36700 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
36710 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26  );.  return (p &
36720 26 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  & (p->inTrans==T
36730 52 41 4e 53 5f 57 52 49 54 45 29 29 3b 0a 7d 0a  RANS_WRITE));.}.
36740 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6e 6f  ./*.** Return no
36750 6e 2d 7a 65 72 6f 20 69 66 20 61 20 73 74 61 74  n-zero if a stat
36760 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
36770 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a  n is active..*/.
36780 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
36790 49 73 49 6e 53 74 6d 74 28 42 74 72 65 65 20 2a  IsInStmt(Btree *
367a0 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  p){.  assert( sq
367b0 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
367c0 75 74 65 78 28 70 29 20 29 3b 0a 20 20 72 65 74  utex(p) );.  ret
367d0 75 72 6e 20 28 70 2d 3e 70 42 74 20 26 26 20 70  urn (p->pBt && p
367e0 2d 3e 70 42 74 2d 3e 69 6e 53 74 6d 74 29 3b 0a  ->pBt->inStmt);.
367f0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
36800 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 20 72 65  non-zero if a re
36810 61 64 20 28 6f 72 20 77 72 69 74 65 29 20 74 72  ad (or write) tr
36820 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
36830 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ive..*/.int sqli
36840 74 65 33 42 74 72 65 65 49 73 49 6e 52 65 61 64  te3BtreeIsInRead
36850 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 29 7b  Trans(Btree *p){
36860 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
36870 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
36880 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
36890 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28 70   return (p && (p
368a0 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
368b0 5f 4e 4f 4e 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  _NONE));.}../*.*
368c0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
368d0 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65  returns a pointe
368e0 72 20 74 6f 20 61 20 62 6c 6f 62 20 6f 66 20 6d  r to a blob of m
368f0 65 6d 6f 72 79 20 61 73 73 6f 63 69 61 74 65 64  emory associated
36900 20 77 69 74 68 0a 2a 2a 20 61 20 73 69 6e 67 6c   with.** a singl
36910 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e 20  e shared-btree. 
36920 54 68 65 20 6d 65 6d 6f 72 79 20 69 73 20 75 73  The memory is us
36930 65 64 20 62 79 20 63 6c 69 65 6e 74 20 63 6f 64  ed by client cod
36940 65 20 66 6f 72 20 69 74 73 20 6f 77 6e 0a 2a 2a  e for its own.**
36950 20 70 75 72 70 6f 73 65 73 20 28 66 6f 72 20 65   purposes (for e
36960 78 61 6d 70 6c 65 2c 20 74 6f 20 73 74 6f 72 65  xample, to store
36970 20 61 20 68 69 67 68 2d 6c 65 76 65 6c 20 73 63   a high-level sc
36980 68 65 6d 61 20 61 73 73 6f 63 69 61 74 65 64 20  hema associated 
36990 77 69 74 68 20 0a 2a 2a 20 74 68 65 20 73 68 61  with .** the sha
369a0 72 65 64 2d 62 74 72 65 65 29 2e 20 54 68 65 20  red-btree). The 
369b0 62 74 72 65 65 20 6c 61 79 65 72 20 6d 61 6e 61  btree layer mana
369c0 67 65 73 20 72 65 66 65 72 65 6e 63 65 20 63 6f  ges reference co
369d0 75 6e 74 69 6e 67 20 69 73 73 75 65 73 2e 0a 2a  unting issues..*
369e0 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
369f0 69 6d 65 20 74 68 69 73 20 69 73 20 63 61 6c 6c  ime this is call
36a00 65 64 20 6f 6e 20 61 20 73 68 61 72 65 64 2d 62  ed on a shared-b
36a10 74 72 65 65 2c 20 6e 42 79 74 65 73 20 62 79 74  tree, nBytes byt
36a20 65 73 20 6f 66 20 6d 65 6d 6f 72 79 0a 2a 2a 20  es of memory.** 
36a30 61 72 65 20 61 6c 6c 6f 63 61 74 65 64 2c 20 7a  are allocated, z
36a40 65 72 6f 65 64 2c 20 61 6e 64 20 72 65 74 75 72  eroed, and retur
36a50 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  ned to the calle
36a60 72 2e 20 46 6f 72 20 65 61 63 68 20 73 75 62 73  r. For each subs
36a70 65 71 75 65 6e 74 20 0a 2a 2a 20 63 61 6c 6c 20  equent .** call 
36a80 74 68 65 20 6e 42 79 74 65 73 20 70 61 72 61 6d  the nBytes param
36a90 65 74 65 72 20 69 73 20 69 67 6e 6f 72 65 64 20  eter is ignored 
36aa0 61 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  and a pointer to
36ab0 20 74 68 65 20 73 61 6d 65 20 62 6c 6f 62 0a 2a   the same blob.*
36ac0 2a 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 74 75  * of memory retu
36ad0 72 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  rned. .**.** If 
36ae0 74 68 65 20 6e 42 79 74 65 73 20 70 61 72 61 6d  the nBytes param
36af0 65 74 65 72 20 69 73 20 30 20 61 6e 64 20 74 68  eter is 0 and th
36b00 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d 6f 72 79  e blob of memory
36b10 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
36b20 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2c 20  n.** allocated, 
36b30 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 20 69  a null pointer i
36b40 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 74  s returned. If t
36b50 68 65 20 62 6c 6f 62 20 68 61 73 20 61 6c 72 65  he blob has alre
36b60 61 64 79 20 62 65 65 6e 0a 2a 2a 20 61 6c 6c 6f  ady been.** allo
36b70 63 61 74 65 64 2c 20 69 74 20 69 73 20 72 65 74  cated, it is ret
36b80 75 72 6e 65 64 20 61 73 20 6e 6f 72 6d 61 6c 2e  urned as normal.
36b90 0a 2a 2a 0a 2a 2a 20 4a 75 73 74 20 62 65 66 6f  .**.** Just befo
36ba0 72 65 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  re the shared-bt
36bb0 72 65 65 20 69 73 20 63 6c 6f 73 65 64 2c 20 74  ree is closed, t
36bc0 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 61 73 73  he function pass
36bd0 65 64 20 61 73 20 74 68 65 20 0a 2a 2a 20 78 46  ed as the .** xF
36be0 72 65 65 20 61 72 67 75 6d 65 6e 74 20 77 68 65  ree argument whe
36bf0 6e 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  n the memory all
36c00 6f 63 61 74 69 6f 6e 20 77 61 73 20 6d 61 64 65  ocation was made
36c10 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e 20 74   is invoked on t
36c20 68 65 20 0a 2a 2a 20 62 6c 6f 62 20 6f 66 20 61  he .** blob of a
36c30 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 2e  llocated memory.
36c40 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73   This function s
36c50 68 6f 75 6c 64 20 6e 6f 74 20 63 61 6c 6c 20 73  hould not call s
36c60 71 6c 69 74 65 33 5f 66 72 65 65 28 29 0a 2a 2a  qlite3_free().**
36c70 20 6f 6e 20 74 68 65 20 6d 65 6d 6f 72 79 2c 20   on the memory, 
36c80 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20  the btree layer 
36c90 64 6f 65 73 20 74 68 61 74 2e 0a 2a 2f 0a 76 6f  does that..*/.vo
36ca0 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
36cb0 53 63 68 65 6d 61 28 42 74 72 65 65 20 2a 70 2c  Schema(Btree *p,
36cc0 20 69 6e 74 20 6e 42 79 74 65 73 2c 20 76 6f 69   int nBytes, voi
36cd0 64 28 2a 78 46 72 65 65 29 28 76 6f 69 64 20 2a  d(*xFree)(void *
36ce0 29 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  )){.  BtShared *
36cf0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
36d00 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
36d10 72 28 70 29 3b 0a 20 20 69 66 28 20 21 70 42 74  r(p);.  if( !pBt
36d20 2d 3e 70 53 63 68 65 6d 61 20 26 26 20 6e 42 79  ->pSchema && nBy
36d30 74 65 73 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  tes ){.    pBt->
36d40 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65  pSchema = sqlite
36d50 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 6e 42 79 74  3MallocZero(nByt
36d60 65 73 29 3b 0a 20 20 20 20 70 42 74 2d 3e 78 46  es);.    pBt->xF
36d70 72 65 65 53 63 68 65 6d 61 20 3d 20 78 46 72 65  reeSchema = xFre
36d80 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  e;.  }.  sqlite3
36d90 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
36da0 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 70 53 63   return pBt->pSc
36db0 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  hema;.}../*.** R
36dc0 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e  eturn true if an
36dd0 6f 74 68 65 72 20 75 73 65 72 20 6f 66 20 74 68  other user of th
36de0 65 20 73 61 6d 65 20 73 68 61 72 65 64 20 62 74  e same shared bt
36df0 72 65 65 20 61 73 20 74 68 65 20 61 72 67 75 6d  ree as the argum
36e00 65 6e 74 0a 2a 2a 20 68 61 6e 64 6c 65 20 68 6f  ent.** handle ho
36e10 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  lds an exclusive
36e20 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 73 71 6c   lock on the sql
36e30 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
36e40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
36e50 42 74 72 65 65 53 63 68 65 6d 61 4c 6f 63 6b 65  BtreeSchemaLocke
36e60 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  d(Btree *p){.  i
36e70 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
36e80 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
36e90 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
36ea0 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
36eb0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
36ec0 63 20 3d 20 28 71 75 65 72 79 54 61 62 6c 65 4c  c = (queryTableL
36ed0 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f  ock(p, MASTER_RO
36ee0 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 21 3d  OT, READ_LOCK)!=
36ef0 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71  SQLITE_OK);.  sq
36f00 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
36f10 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
36f20 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
36f30 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
36f40 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 4f 62 74 61  CACHE./*.** Obta
36f50 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  in a lock on the
36f60 20 74 61 62 6c 65 20 77 68 6f 73 65 20 72 6f 6f   table whose roo
36f70 74 20 70 61 67 65 20 69 73 20 69 54 61 62 2e 20  t page is iTab. 
36f80 20 54 68 65 0a 2a 2a 20 6c 6f 63 6b 20 69 73 20   The.** lock is 
36f90 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20  a write lock if 
36fa0 69 73 57 72 69 74 65 6c 6f 63 6b 20 69 73 20 74  isWritelock is t
36fb0 72 75 65 20 6f 72 20 61 20 72 65 61 64 20 6c 6f  rue or a read lo
36fc0 63 6b 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 66  ck.** if it is f
36fd0 61 6c 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  alse..*/.int sql
36fe0 69 74 65 33 42 74 72 65 65 4c 6f 63 6b 54 61 62  ite3BtreeLockTab
36ff0 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  le(Btree *p, int
37000 20 69 54 61 62 2c 20 75 38 20 69 73 57 72 69 74   iTab, u8 isWrit
37010 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63  eLock){.  int rc
37020 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
37030 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
37040 29 7b 0a 20 20 20 20 75 38 20 6c 6f 63 6b 54 79  ){.    u8 lockTy
37050 70 65 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 20 2b  pe = READ_LOCK +
37060 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20   isWriteLock;.  
37070 20 20 61 73 73 65 72 74 28 20 52 45 41 44 5f 4c    assert( READ_L
37080 4f 43 4b 2b 31 3d 3d 57 52 49 54 45 5f 4c 4f 43  OCK+1==WRITE_LOC
37090 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
370a0 20 69 73 57 72 69 74 65 4c 6f 63 6b 3d 3d 30 20   isWriteLock==0 
370b0 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b 3d 3d  || isWriteLock==
370c0 31 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 );.    sqlite3
370d0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
370e0 20 20 20 72 63 20 3d 20 71 75 65 72 79 54 61 62     rc = queryTab
370f0 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 2c 20  leLock(p, iTab, 
37100 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20 69  lockType);.    i
37110 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
37120 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c   ){.      rc = l
37130 6f 63 6b 54 61 62 6c 65 28 70 2c 20 69 54 61 62  ockTable(p, iTab
37140 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20  , lockType);.   
37150 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
37160 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
37170 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
37180 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
37190 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
371a0 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  BLOB./*.** Argum
371b0 65 6e 74 20 70 43 73 72 20 6d 75 73 74 20 62 65  ent pCsr must be
371c0 20 61 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64   a cursor opened
371d0 20 66 6f 72 20 77 72 69 74 69 6e 67 20 6f 6e 20   for writing on 
371e0 61 6e 20 0a 2a 2a 20 49 4e 54 4b 45 59 20 74 61  an .** INTKEY ta
371f0 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  ble currently po
37200 69 6e 74 69 6e 67 20 61 74 20 61 20 76 61 6c 69  inting at a vali
37210 64 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 0a  d table entry. .
37220 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
37230 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 64 61   modifies the da
37240 74 61 20 73 74 6f 72 65 64 20 61 73 20 70 61 72  ta stored as par
37250 74 20 6f 66 20 74 68 61 74 20 65 6e 74 72 79 2e  t of that entry.
37260 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 64 61 74  .** Only the dat
37270 61 20 63 6f 6e 74 65 6e 74 20 6d 61 79 20 6f 6e  a content may on
37280 6c 79 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20  ly be modified, 
37290 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
372a0 6c 65 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20  le.** to change 
372b0 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
372c0 65 20 64 61 74 61 20 73 74 6f 72 65 64 2e 0a 2a  e data stored..*
372d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
372e0 65 65 50 75 74 44 61 74 61 28 42 74 43 75 72 73  eePutData(BtCurs
372f0 6f 72 20 2a 70 43 73 72 2c 20 75 33 32 20 6f 66  or *pCsr, u32 of
37300 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76  fset, u32 amt, v
37310 6f 69 64 20 2a 7a 29 7b 0a 20 20 61 73 73 65 72  oid *z){.  asser
37320 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
37330 74 65 78 28 70 43 73 72 29 20 29 3b 0a 20 20 61  tex(pCsr) );.  a
37340 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
37350 75 74 65 78 5f 68 65 6c 64 28 70 43 73 72 2d 3e  utex_held(pCsr->
37360 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
37370 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70  x) );.  assert(p
37380 43 73 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48  Csr->isIncrblobH
37390 61 6e 64 6c 65 29 3b 0a 0a 20 20 72 65 73 74 6f  andle);..  resto
373a0 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50  reOrClearCursorP
373b0 6f 73 69 74 69 6f 6e 28 70 43 73 72 29 3b 0a 20  osition(pCsr);. 
373c0 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 65   assert( pCsr->e
373d0 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 52 45  State!=CURSOR_RE
373e0 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
373f0 66 28 20 70 43 73 72 2d 3e 65 53 74 61 74 65 21  f( pCsr->eState!
37400 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
37410 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
37420 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 0a 20  TE_ABORT;.  }.. 
37430 20 2f 2a 20 43 68 65 63 6b 20 73 6f 6d 65 20 70   /* Check some p
37440 72 65 63 6f 6e 64 69 74 69 6f 6e 73 3a 20 0a 20  reconditions: . 
37450 20 2a 2a 20 20 20 28 61 29 20 74 68 65 20 63 75   **   (a) the cu
37460 72 73 6f 72 20 69 73 20 6f 70 65 6e 20 66 6f 72  rsor is open for
37470 20 77 72 69 74 69 6e 67 2c 0a 20 20 2a 2a 20 20   writing,.  **  
37480 20 28 62 29 20 74 68 65 72 65 20 69 73 20 6e 6f   (b) there is no
37490 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68   read-lock on th
374a0 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6d 6f  e table being mo
374b0 64 69 66 69 65 64 20 61 6e 64 0a 20 20 2a 2a 20  dified and.  ** 
374c0 20 20 28 63 29 20 74 68 65 20 63 75 72 73 6f 72    (c) the cursor
374d0 20 70 6f 69 6e 74 73 20 61 74 20 61 20 76 61 6c   points at a val
374e0 69 64 20 72 6f 77 20 6f 66 20 61 6e 20 69 6e 74  id row of an int
374f0 4b 65 79 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  Key table..  */.
37500 20 20 69 66 28 20 21 70 43 73 72 2d 3e 77 72 46    if( !pCsr->wrF
37510 6c 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72  lag ){.    retur
37520 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
37530 59 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  Y;.  }.  assert(
37540 20 21 70 43 73 72 2d 3e 70 42 74 2d 3e 72 65 61   !pCsr->pBt->rea
37550 64 4f 6e 6c 79 20 0a 20 20 20 20 20 20 20 20 20  dOnly .         
37560 20 26 26 20 70 43 73 72 2d 3e 70 42 74 2d 3e 69   && pCsr->pBt->i
37570 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
37580 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69  ANS_WRITE );.  i
37590 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b  f( checkReadLock
375a0 73 28 70 43 73 72 2d 3e 70 42 74 72 65 65 2c 20  s(pCsr->pBtree, 
375b0 70 43 73 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCsr->pgnoRoot, 
375c0 70 43 73 72 2c 20 30 29 20 29 7b 0a 20 20 20 20  pCsr, 0) ){.    
375d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
375e0 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62  CKED; /* The tab
375f0 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74  le pCur points t
37600 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  o has a read loc
37610 6b 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  k */.  }.  if( p
37620 43 73 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Csr->eState==CUR
37630 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 21  SOR_INVALID || !
37640 70 43 73 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74  pCsr->pPage->int
37650 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Key ){.    retur
37660 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
37670 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 61 63    }..  return ac
37680 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 73 72  cessPayload(pCsr
37690 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28  , offset, amt, (
376a0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
376b0 7a 2c 20 30 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 20  z, 0, 1);.}../* 
376c0 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 6f  .** Set a flag o
376d0 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20 74 6f  n this cursor to
376e0 20 63 61 63 68 65 20 74 68 65 20 6c 6f 63 61 74   cache the locat
376f0 69 6f 6e 73 20 6f 66 20 70 61 67 65 73 20 66 72  ions of pages fr
37700 6f 6d 20 74 68 65 20 0a 2a 2a 20 6f 76 65 72 66  om the .** overf
37710 6c 6f 77 20 6c 69 73 74 20 66 6f 72 20 74 68 65  low list for the
37720 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20 54 68   current row. Th
37730 69 73 20 69 73 20 75 73 65 64 20 62 79 20 63 75  is is used by cu
37740 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20  rsors opened.** 
37750 66 6f 72 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  for incremental 
37760 62 6c 6f 62 20 49 4f 20 6f 6e 6c 79 2e 0a 2a 2a  blob IO only..**
37770 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
37780 6e 20 73 65 74 73 20 61 20 66 6c 61 67 20 6f 6e  n sets a flag on
37790 6c 79 2e 20 54 68 65 20 61 63 74 75 61 6c 20 70  ly. The actual p
377a0 61 67 65 20 6c 6f 63 61 74 69 6f 6e 20 63 61 63  age location cac
377b0 68 65 0a 2a 2a 20 28 73 74 6f 72 65 64 20 69 6e  he.** (stored in
377c0 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66   BtCursor.aOverf
377d0 6c 6f 77 5b 5d 29 20 69 73 20 61 6c 6c 6f 63 61  low[]) is alloca
377e0 74 65 64 20 61 6e 64 20 75 73 65 64 20 62 79 20  ted and used by 
377f0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 63 63 65  function.** acce
37800 73 73 50 61 79 6c 6f 61 64 28 29 20 28 74 68 65  ssPayload() (the
37810 20 77 6f 72 6b 65 72 20 66 75 6e 63 74 69 6f 6e   worker function
37820 20 66 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65   for sqlite3Btre
37830 65 44 61 74 61 28 29 20 61 6e 64 0a 2a 2a 20 73  eData() and.** s
37840 71 6c 69 74 65 33 42 74 72 65 65 50 75 74 44 61  qlite3BtreePutDa
37850 74 61 28 29 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ta())..*/.void s
37860 71 6c 69 74 65 33 42 74 72 65 65 43 61 63 68 65  qlite3BtreeCache
37870 4f 76 65 72 66 6c 6f 77 28 42 74 43 75 72 73 6f  Overflow(BtCurso
37880 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
37890 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
378a0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
378b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
378c0 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
378d0 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
378e0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
378f0 21 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f  !pCur->isIncrblo
37900 62 48 61 6e 64 6c 65 29 3b 0a 20 20 61 73 73 65  bHandle);.  asse
37910 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65 72 66  rt(!pCur->aOverf
37920 6c 6f 77 29 3b 0a 20 20 70 43 75 72 2d 3e 69 73  low);.  pCur->is
37930 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 3d  IncrblobHandle =
37940 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a            1;.}.#endif.