/ Hex Artifact Content
Login

Artifact bae7f135dad8fd72ac41ce3c13b7b7ba9fe4d056:


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 36 20 32 30 30 38 2f 30  c,v 1.466 2008/0
0190: 36 2f 31 38 20 31 37 3a 30 39 3a 31 30 20 64 61  6/18 17:09:10 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 43 6c 6f 73 65 20 61 6e 20 6f  /*.** Close an o
abd0: 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e 64  pen database and
abe0: 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   invalidate all 
abf0: 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20  cursors..*/.int 
ac00: 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73  sqlite3BtreeClos
ac10: 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42  e(Btree *p){.  B
ac20: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
ac30: 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73 6f  ->pBt;.  BtCurso
ac40: 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20 43  r *pCur;..  /* C
ac50: 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  lose all cursors
ac60: 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69 73   opened via this
ac70: 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20 61   handle.  */.  a
ac80: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
ac90: 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
aca0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
acb0: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
acc0: 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70  );.  pBt->db = p
acd0: 2d 3e 64 62 3b 0a 20 20 70 43 75 72 20 3d 20 70  ->db;.  pCur = p
ace0: 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 77  Bt->pCursor;.  w
acf0: 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20 20  hile( pCur ){.  
ad00: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d 70    BtCursor *pTmp
ad10: 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43 75   = pCur;.    pCu
ad20: 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b  r = pCur->pNext;
ad30: 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e 70  .    if( pTmp->p
ad40: 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20  Btree==p ){.    
ad50: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
ad60: 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29 3b  oseCursor(pTmp);
ad70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
ad80: 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63   Rollback any ac
ad90: 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tive transaction
ada0: 20 61 6e 64 20 66 72 65 65 20 74 68 65 20 68 61   and free the ha
adb0: 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e 0a  ndle structure..
adc0: 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f    ** The call to
add0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
ade0: 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61 6e  lback() drops an
adf0: 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68 65  y table-locks he
ae00: 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73 20  ld by.  ** this 
ae10: 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20 73  handle..  */.  s
ae20: 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c 62  qlite3BtreeRollb
ae30: 61 63 6b 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ack(p);.  sqlite
ae40: 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
ae50: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
ae60: 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20 6f  re still other o
ae70: 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72  utstanding refer
ae80: 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68 61  ences to the sha
ae90: 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20 73  red-btree.  ** s
aea0: 74 72 75 63 74 75 72 65 2c 20 72 65 74 75 72 6e  tructure, return
aeb0: 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69 6e   now. The remain
aec0: 64 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f 63  der of this proc
aed0: 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20 20  edure cleans .  
aee0: 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72 65 64  ** up the shared
aef0: 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 61  -btree..  */.  a
af00: 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f  ssert( p->wantTo
af10: 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c 6f  Lock==0 && p->lo
af20: 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  cked==0 );.  if(
af30: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c   !p->sharable ||
af40: 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69   removeFromShari
af50: 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b 0a 20  ngList(pBt) ){. 
af60: 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20 69 73     /* The pBt is
af70: 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74 68   no longer on th
af80: 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2c 20  e sharing list, 
af90: 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65 73 73  so we can access
afa0: 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74 68 6f  .    ** it witho
afb0: 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68 6f 6c  ut having to hol
afc0: 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20 20 20  d the mutex..   
afd0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61 6e   **.    ** Clean
afe0: 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74 65 20   out and delete 
aff0: 74 68 65 20 42 74 53 68 61 72 65 64 20 6f 62 6a  the BtShared obj
b000: 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ect..    */.    
b010: 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 43  assert( !pBt->pC
b020: 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73 71 6c  ursor );.    sql
b030: 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28 70  ite3PagerClose(p
b040: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  Bt->pPager);.   
b050: 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65 53   if( pBt->xFreeS
b060: 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70 53  chema && pBt->pS
b070: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 70  chema ){.      p
b080: 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 28  Bt->xFreeSchema(
b090: 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  pBt->pSchema);. 
b0a0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
b0b0: 5f 66 72 65 65 28 70 42 74 2d 3e 70 53 63 68 65  _free(pBt->pSche
b0c0: 6d 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ma);.    sqlite3
b0d0: 5f 66 72 65 65 28 70 42 74 2d 3e 70 54 6d 70 53  _free(pBt->pTmpS
b0e0: 70 61 63 65 29 3b 0a 20 20 20 20 73 71 6c 69 74  pace);.    sqlit
b0f0: 65 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20  e3_free(pBt);.  
b100: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
b110: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
b120: 43 48 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d  CHE.  assert( p-
b130: 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29  >wantToLock==0 )
b140: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c  ;.  assert( p->l
b150: 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66  ocked==0 );.  if
b160: 28 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e  ( p->pPrev ) p->
b170: 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
b180: 2d 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70  ->pNext;.  if( p
b190: 2d 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65  ->pNext ) p->pNe
b1a0: 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70  xt->pPrev = p->p
b1b0: 50 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  Prev;.#endif..  
b1c0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
b1d0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
b1e0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  _OK;.}../*.** Ch
b1f0: 61 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f  ange the limit o
b200: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
b210: 70 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e  pages allowed in
b220: 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a   the cache..**.*
b230: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  * The maximum nu
b240: 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 70 61  mber of cache pa
b250: 67 65 73 20 69 73 20 73 65 74 20 74 6f 20 74 68  ges is set to th
b260: 65 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61  e absolute.** va
b270: 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20  lue of mxPage.  
b280: 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67  If mxPage is neg
b290: 61 74 69 76 65 2c 20 74 68 65 20 70 61 67 65 72  ative, the pager
b2a0: 20 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65   will.** operate
b2b0: 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20   asynchronously 
b2c0: 2d 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74  - it will not st
b2d0: 6f 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29  op to do fsync()
b2e0: 73 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64  s.** to insure d
b2f0: 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
b300: 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61  o the disk surfa
b310: 63 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e  ce before.** con
b320: 74 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61  tinuing.  Transa
b330: 63 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72  ctions still wor
b340: 6b 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73  k if synchronous
b350: 20 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20   is off,.** and 
b360: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e  the database can
b370: 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
b380: 20 69 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d   if this program
b390: 0a 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75  .** crashes.  Bu
b3a0: 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69  t if the operati
b3b0: 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65  ng system crashe
b3c0: 73 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a  s or there is.**
b3d0: 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72   an abrupt power
b3e0: 20 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79   failure when sy
b3f0: 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66  nchronous is off
b400: 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  , the database.*
b410: 2a 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20  * could be left 
b420: 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  in an inconsiste
b430: 6e 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72  nt and unrecover
b440: 61 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53  able state..** S
b450: 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e  ynchronous is on
b460: 20 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64   by default so d
b470: 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
b480: 6f 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72  on is not.** nor
b490: 6d 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a  mally a worry..*
b4a0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
b4b0: 65 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42  eeSetCacheSize(B
b4c0: 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50  tree *p, int mxP
b4d0: 61 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64  age){.  BtShared
b4e0: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
b4f0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
b500: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
b510: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
b520: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
b530: 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  r(p);.  sqlite3P
b540: 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65  agerSetCachesize
b550: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  (pBt->pPager, mx
b560: 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
b570: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
b580: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b590: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
b5a0: 67 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20  ge the way data 
b5b0: 69 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  is synced to dis
b5c0: 6b 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e  k in order to in
b5d0: 63 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61  crease or decrea
b5e0: 73 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74  se.** how well t
b5f0: 68 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69  he database resi
b600: 73 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74  sts damage due t
b610: 6f 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64  o OS crashes and
b620: 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72   power.** failur
b630: 65 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20  es.  Level 1 is 
b640: 74 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e  the same as asyn
b650: 63 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e  chronous (no syn
b660: 63 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a  cs() occur and.*
b670: 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67  * there is a hig
b680: 68 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66  h probability of
b690: 20 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20   damage)  Level 
b6a0: 32 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  2 is the default
b6b0: 2e 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61  .  There.** is a
b6c0: 20 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f   very low but no
b6d0: 6e 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69  n-zero probabili
b6e0: 74 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c  ty of damage.  L
b6f0: 65 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74  evel 3 reduces t
b700: 68 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74  he.** probabilit
b710: 79 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e  y of damage to n
b720: 65 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74  ear zero but wit
b730: 68 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72  h a write perfor
b740: 6d 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e  mance reduction.
b750: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
b760: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
b770: 41 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65  AGMAS.int sqlite
b780: 33 42 74 72 65 65 53 65 74 53 61 66 65 74 79 4c  3BtreeSetSafetyL
b790: 65 76 65 6c 28 42 74 72 65 65 20 2a 70 2c 20 69  evel(Btree *p, i
b7a0: 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75  nt level, int fu
b7b0: 6c 6c 53 79 6e 63 29 7b 0a 20 20 42 74 53 68 61  llSync){.  BtSha
b7c0: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
b7d0: 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
b7e0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
b7f0: 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  p->db->mutex) );
b800: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
b810: 6e 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74  nter(p);.  sqlit
b820: 65 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79  e3PagerSetSafety
b830: 4c 65 76 65 6c 28 70 42 74 2d 3e 70 50 61 67 65  Level(pBt->pPage
b840: 72 2c 20 6c 65 76 65 6c 2c 20 66 75 6c 6c 53 79  r, level, fullSy
b850: 6e 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  nc);.  sqlite3Bt
b860: 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
b870: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b880: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
b890: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
b8a0: 74 68 65 20 67 69 76 65 6e 20 62 74 72 65 65 20  the given btree 
b8b0: 69 73 20 73 65 74 20 74 6f 20 73 61 66 65 74 79  is set to safety
b8c0: 20 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74   level 1.  In ot
b8d0: 68 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65  her.** words, re
b8e0: 74 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20  turn TRUE if no 
b8f0: 73 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e  sync() occurs on
b900: 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e   the disk files.
b910: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
b920: 74 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64  treeSyncDisabled
b930: 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74  (Btree *p){.  Bt
b940: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
b950: 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  >pBt;.  int rc;.
b960: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
b970: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e  3_mutex_held(p->
b980: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a  db->mutex) );  .
b990: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
b9a0: 74 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74  ter(p);.  assert
b9b0: 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50  ( pBt && pBt->pP
b9c0: 61 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20 73  ager );.  rc = s
b9d0: 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e  qlite3PagerNosyn
b9e0: 63 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  c(pBt->pPager);.
b9f0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
ba00: 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
ba10: 20 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66   rc;.}..#if !def
ba20: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
ba30: 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20  _PAGER_PRAGMAS) 
ba40: 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  || !defined(SQLI
ba50: 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a  TE_OMIT_VACUUM).
ba60: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
ba70: 20 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73   default pages s
ba80: 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  ize and the numb
ba90: 65 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62  er of reserved b
baa0: 79 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a  ytes per page..*
bab0: 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69  *.** The page si
bac0: 7a 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77  ze must be a pow
bad0: 65 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20  er of 2 between 
bae0: 35 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20  512 and 65536.  
baf0: 49 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73  If the page.** s
bb00: 69 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65  ize supplied doe
bb10: 73 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20  s not meet this 
bb20: 63 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20  constraint then 
bb30: 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73  the page size is
bb40: 20 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e   not.** changed.
bb50: 0a 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65  .**.** Page size
bb60: 73 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65  s are constraine
bb70: 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20  d to be a power 
bb80: 6f 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74  of two so that t
bb90: 68 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20  he region.** of 
bba0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
bbb0: 65 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69  e used for locki
bbc0: 6e 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74  ng (beginning at
bbd0: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a   PENDING_BYTE,.*
bbe0: 2a 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65  * the first byte
bbf0: 20 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f   past the 1GB bo
bc00: 75 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30  undary, 0x400000
bc10: 30 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63  00) needs to occ
bc20: 75 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67  ur.** at the beg
bc30: 69 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65  inning of a page
bc40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d  ..**.** If param
bc50: 65 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73  eter nReserve is
bc60: 20 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c   less than zero,
bc70: 20 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72   then the number
bc80: 20 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20   of reserved.** 
bc90: 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69  bytes per page i
bca0: 73 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64  s left unchanged
bcb0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
bcc0: 42 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65  BtreeSetPageSize
bcd0: 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70  (Btree *p, int p
bce0: 61 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65  ageSize, int nRe
bcf0: 73 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63  serve){.  int rc
bd00: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
bd10: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
bd20: 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
bd30: 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
bd40: 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53    if( pBt->pageS
bd50: 69 7a 65 46 69 78 65 64 20 29 7b 0a 20 20 20 20  izeFixed ){.    
bd60: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
bd70: 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  e(p);.    return
bd80: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
bd90: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73  ;.  }.  if( nRes
bda0: 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52  erve<0 ){.    nR
bdb0: 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61  eserve = pBt->pa
bdc0: 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73  geSize - pBt->us
bdd0: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20  ableSize;.  }.  
bde0: 69 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31  if( pageSize>=51
bdf0: 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
be00: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
be10: 49 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20 28  IZE &&.        (
be20: 28 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67  (pageSize-1)&pag
be30: 65 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20  eSize)==0 ){.   
be40: 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69   assert( (pageSi
be50: 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  ze & 7)==0 );.  
be60: 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
be70: 70 50 61 67 65 31 20 26 26 20 21 70 42 74 2d 3e  pPage1 && !pBt->
be80: 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70  pCursor );.    p
be90: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  Bt->pageSize = p
bea0: 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 73 71 6c  ageSize;.    sql
beb0: 69 74 65 33 5f 66 72 65 65 28 70 42 74 2d 3e 70  ite3_free(pBt->p
bec0: 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20 70  TmpSpace);.    p
bed0: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20  Bt->pTmpSpace = 
bee0: 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  0;.    rc = sqli
bef0: 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
bf00: 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
bf10: 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29   &pBt->pageSize)
bf20: 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 75 73 61  ;.  }.  pBt->usa
bf30: 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70  bleSize = pBt->p
bf40: 61 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72  ageSize - nReser
bf50: 76 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ve;.  sqlite3Btr
bf60: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
bf70: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
bf80: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
bf90: 72 65 6e 74 6c 79 20 64 65 66 69 6e 65 64 20 70  rently defined p
bfa0: 61 67 65 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20  age size.*/.int 
bfb0: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
bfc0: 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  ageSize(Btree *p
bfd0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  ){.  return p->p
bfe0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a  Bt->pageSize;.}.
bff0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
c000: 47 65 74 52 65 73 65 72 76 65 28 42 74 72 65 65  GetReserve(Btree
c010: 20 2a 70 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20   *p){.  int n;. 
c020: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
c030: 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e  er(p);.  n = p->
c040: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20  pBt->pageSize - 
c050: 70 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  p->pBt->usableSi
c060: 7a 65 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ze;.  sqlite3Btr
c070: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
c080: 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
c090: 20 53 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   Set the maximum
c0a0: 20 70 61 67 65 20 63 6f 75 6e 74 20 66 6f 72 20   page count for 
c0b0: 61 20 64 61 74 61 62 61 73 65 20 69 66 20 6d 78  a database if mx
c0c0: 50 61 67 65 20 69 73 20 70 6f 73 69 74 69 76 65  Page is positive
c0d0: 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20  ..** No changes 
c0e0: 61 72 65 20 6d 61 64 65 20 69 66 20 6d 78 50 61  are made if mxPa
c0f0: 67 65 20 69 73 20 30 20 6f 72 20 6e 65 67 61 74  ge is 0 or negat
c100: 69 76 65 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65  ive..** Regardle
c110: 73 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 20  ss of the value 
c120: 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
c130: 6e 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  n the maximum pa
c140: 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
c150: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 61 78   sqlite3BtreeMax
c160: 50 61 67 65 43 6f 75 6e 74 28 42 74 72 65 65 20  PageCount(Btree 
c170: 2a 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b  *p, int mxPage){
c180: 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69  .  int n;.  sqli
c190: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
c1a0: 3b 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 50  ;.  n = sqlite3P
c1b0: 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
c1c0: 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c  (p->pBt->pPager,
c1d0: 20 6d 78 50 61 67 65 29 3b 0a 20 20 73 71 6c 69   mxPage);.  sqli
c1e0: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
c1f0: 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a  ;.  return n;.}.
c200: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
c210: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ed(SQLITE_OMIT_P
c220: 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c  AGER_PRAGMAS) ||
c230: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
c240: 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f  _OMIT_VACUUM) */
c250: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
c260: 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
c270: 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65   property of the
c280: 20 64 61 74 61 62 61 73 65 2e 20 49 66 20 74 68   database. If th
c290: 65 20 27 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a  e 'autoVacuum'.*
c2a0: 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  * parameter is n
c2b0: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75  on-zero, then au
c2c0: 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 69  to-vacuum mode i
c2d0: 73 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65  s enabled. If ze
c2e0: 72 6f 2c 20 69 74 0a 2a 2a 20 69 73 20 64 69 73  ro, it.** is dis
c2f0: 61 62 6c 65 64 2e 20 54 68 65 20 64 65 66 61 75  abled. The defau
c300: 6c 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  lt value for the
c310: 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f   auto-vacuum pro
c320: 70 65 72 74 79 20 69 73 20 0a 2a 2a 20 64 65 74  perty is .** det
c330: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 53  ermined by the S
c340: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
c350: 54 4f 56 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a  TOVACUUM macro..
c360: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
c370: 72 65 65 53 65 74 41 75 74 6f 56 61 63 75 75 6d  reeSetAutoVacuum
c380: 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 61  (Btree *p, int a
c390: 75 74 6f 56 61 63 75 75 6d 29 7b 0a 23 69 66 64  utoVacuum){.#ifd
c3a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
c3b0: 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75  UTOVACUUM.  retu
c3c0: 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
c3d0: 4c 59 3b 0a 23 65 6c 73 65 0a 20 20 42 74 53 68  LY;.#else.  BtSh
c3e0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
c3f0: 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Bt;.  int rc = S
c400: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
c410: 61 76 20 3d 20 28 61 75 74 6f 56 61 63 75 75 6d  av = (autoVacuum
c420: 3f 31 3a 30 29 3b 0a 0a 20 20 73 71 6c 69 74 65  ?1:0);..  sqlite
c430: 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
c440: 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53    if( pBt->pageS
c450: 69 7a 65 46 69 78 65 64 20 26 26 20 61 76 21 3d  izeFixed && av!=
c460: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
c470: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
c480: 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d  TE_READONLY;.  }
c490: 65 6c 73 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61  else{.    pBt->a
c4a0: 75 74 6f 56 61 63 75 75 6d 20 3d 20 61 76 3b 0a  utoVacuum = av;.
c4b0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
c4c0: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
c4d0: 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
c4e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
c4f0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
c500: 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70   'auto-vacuum' p
c510: 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f  roperty. If auto
c520: 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65  -vacuum is .** e
c530: 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75  nabled 1 is retu
c540: 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20  rned. Otherwise 
c550: 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
c560: 33 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63  3BtreeGetAutoVac
c570: 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23  uum(Btree *p){.#
c580: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
c590: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72  T_AUTOVACUUM.  r
c5a0: 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f  eturn BTREE_AUTO
c5b0: 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c  VACUUM_NONE;.#el
c5c0: 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  se.  int rc;.  s
c5d0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
c5e0: 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20  (p);.  rc = (.  
c5f0: 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f    (!p->pBt->auto
c600: 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
c610: 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20  TOVACUUM_NONE:. 
c620: 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63     (!p->pBt->inc
c630: 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41  rVacuum)?BTREE_A
c640: 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a  UTOVACUUM_FULL:.
c650: 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41      BTREE_AUTOVA
c660: 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20  CUUM_INCR.  );. 
c670: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
c680: 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
c690: 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  rc;.#endif.}.../
c6a0: 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72  *.** Get a refer
c6b0: 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f  ence to pPage1 o
c6c0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
c6d0: 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a  ile.  This will.
c6e0: 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20  ** also acquire 
c6f0: 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68  a readlock on th
c700: 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53  at file..**.** S
c710: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
c720: 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e  rned on success.
c730: 20 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73    If the file is
c740: 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66   not a.** well-f
c750: 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66  ormed database f
c760: 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45  ile, then SQLITE
c770: 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75  _CORRUPT is retu
c780: 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f  rned..** SQLITE_
c790: 42 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64  BUSY is returned
c7a0: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
c7b0: 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c   is locked.  SQL
c7c0: 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20  ITE_NOMEM.** is 
c7d0: 72 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72  returned if we r
c7e0: 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  un out of memory
c7f0: 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  . .*/.static int
c800: 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61   lockBtree(BtSha
c810: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74  red *pBt){.  int
c820: 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
c830: 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 6e 50  pPage1;.  int nP
c840: 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
c850: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
c860: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
c870: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61  ;.  if( pBt->pPa
c880: 67 65 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ge1 ) return SQL
c890: 49 54 45 5f 4f 4b 3b 0a 20 20 72 63 20 3d 20 73  ITE_OK;.  rc = s
c8a0: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
c8b0: 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67  ge(pBt, 1, &pPag
c8c0: 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  e1, 0);.  if( rc
c8d0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
c8e0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44  turn rc;..  /* D
c8f0: 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20  o some checking 
c900: 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74  to help insure t
c910: 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65  he file we opene
c920: 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a  d really is.  **
c930: 20 61 20 76 61 6c 69 64 20 64 61 74 61 62 61 73   a valid databas
c940: 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20  e file. .  */.  
c950: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
c960: 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e  rPagecount(pBt->
c970: 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b  pPager, &nPage);
c980: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
c990: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
c9a0: 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
c9b0: 65 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ed;.  }else if( 
c9c0: 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 69  nPage>0 ){.    i
c9d0: 6e 74 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  nt pageSize;.   
c9e0: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
c9f0: 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d  .    u8 *page1 =
ca00: 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a   pPage1->aData;.
ca10: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
ca20: 4e 4f 54 41 44 42 3b 0a 20 20 20 20 69 66 28 20  NOTADB;.    if( 
ca30: 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d  memcmp(page1, zM
ca40: 61 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21  agicHeader, 16)!
ca50: 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  =0 ){.      goto
ca60: 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
ca70: 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ed;.    }.    if
ca80: 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b  ( page1[18]>1 ){
ca90: 0a 20 20 20 20 20 20 70 42 74 2d 3e 72 65 61 64  .      pBt->read
caa0: 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Only = 1;.    }.
cab0: 20 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39      if( page1[19
cac0: 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  ]>1 ){.      got
cad0: 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
cae0: 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  led;.    }..    
caf0: 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 65  /* The maximum e
cb00: 6d 62 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e  mbedded fraction
cb10: 20 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c 79   must be exactly
cb20: 20 32 35 25 2e 20 20 41 6e 64 20 74 68 65 20 6d   25%.  And the m
cb30: 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 65 6d  inimum.    ** em
cb40: 62 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20  bedded fraction 
cb50: 6d 75 73 74 20 62 65 20 31 32 2e 35 25 20 66 6f  must be 12.5% fo
cb60: 72 20 62 6f 74 68 20 6c 65 61 66 2d 64 61 74 61  r both leaf-data
cb70: 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61   and non-leaf-da
cb80: 74 61 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f  ta..    ** The o
cb90: 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61  riginal design a
cba0: 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f  llowed these amo
cbb0: 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75  unts to vary, bu
cbc0: 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76  t as of.    ** v
cbd0: 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65  ersion 3.6.0, we
cbe0: 20 72 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f   require them to
cbf0: 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a   be fixed..    *
cc00: 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70  /.    if( memcmp
cc10: 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31  (&page1[21], "\1
cc20: 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d  00\040\040",3)!=
cc30: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
cc40: 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
cc50: 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67  d;.    }.    pag
cc60: 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65  eSize = get2byte
cc70: 28 26 70 61 67 65 31 5b 31 36 5d 29 3b 0a 20 20  (&page1[16]);.  
cc80: 20 20 69 66 28 20 28 28 70 61 67 65 53 69 7a 65    if( ((pageSize
cc90: 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30  -1)&pageSize)!=0
cca0: 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 35 31 32   || pageSize<512
ccb0: 20 7c 7c 0a 20 20 20 20 20 20 20 20 28 53 51 4c   ||.        (SQL
ccc0: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
ccd0: 45 3c 33 32 37 36 38 20 26 26 20 70 61 67 65 53  E<32768 && pageS
cce0: 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
ccf0: 41 47 45 5f 53 49 5a 45 29 0a 20 20 20 20 29 7b  AGE_SIZE).    ){
cd00: 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65  .      goto page
cd10: 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20  1_init_failed;. 
cd20: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
cd30: 20 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d   (pageSize & 7)=
cd40: 3d 30 20 29 3b 0a 20 20 20 20 75 73 61 62 6c 65  =0 );.    usable
cd50: 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20  Size = pageSize 
cd60: 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20  - page1[20];.   
cd70: 20 69 66 28 20 70 61 67 65 53 69 7a 65 21 3d 70   if( pageSize!=p
cd80: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  Bt->pageSize ){.
cd90: 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72        /* After r
cda0: 65 61 64 69 6e 67 20 74 68 65 20 66 69 72 73 74  eading the first
cdb0: 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
cdc0: 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61  abase assuming a
cdd0: 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20   page size.     
cde0: 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e   ** of BtShared.
cdf0: 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76  pageSize, we hav
ce00: 65 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61  e discovered tha
ce10: 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  t the page-size 
ce20: 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75  is.      ** actu
ce30: 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55  ally pageSize. U
ce40: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
ce50: 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70  se, leave pBt->p
ce60: 50 61 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a  Page1 at.      *
ce70: 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72  * zero and retur
ce80: 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65  n SQLITE_OK. The
ce90: 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c   caller will cal
cea0: 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a  l this function.
ceb0: 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77        ** again w
cec0: 69 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ith the correct 
ced0: 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20  page-size..     
cee0: 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73   */.      releas
cef0: 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20  ePage(pPage1);. 
cf00: 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65       pBt->usable
cf10: 53 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a  Size = usableSiz
cf20: 65 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 61  e;.      pBt->pa
cf30: 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
cf40: 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
cf50: 5f 66 72 65 65 28 70 42 74 2d 3e 70 54 6d 70 53  _free(pBt->pTmpS
cf60: 70 61 63 65 29 3b 0a 20 20 20 20 20 20 70 42 74  pace);.      pBt
cf70: 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b  ->pTmpSpace = 0;
cf80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
cf90: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
cfa0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
cfb0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
cfc0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
cfd0: 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  _OK;.    }.    i
cfe0: 66 28 20 75 73 61 62 6c 65 53 69 7a 65 3c 35 30  f( usableSize<50
cff0: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
d000: 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
d010: 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  d;.    }.    pBt
d020: 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
d030: 65 53 69 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e  eSize;.    pBt->
d040: 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75 73 61  usableSize = usa
d050: 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66  bleSize;.#ifndef
d060: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
d070: 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d  OVACUUM.    pBt-
d080: 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67  >autoVacuum = (g
d090: 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33  et4byte(&page1[3
d0a0: 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 4*4])?1:0);.
d0b0: 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
d0c0: 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28  uum = (get4byte(
d0d0: 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d  &page1[36 + 7*4]
d0e0: 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20  )?1:0);.#endif. 
d0f0: 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61   }..  /* maxLoca
d100: 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  l is the maximum
d110: 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f   amount of paylo
d120: 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61  ad to store loca
d130: 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63  lly for.  ** a c
d140: 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ell.  Make sure 
d150: 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75  it is small enou
d160: 67 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65  gh so that at le
d170: 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20  ast minFanout.  
d180: 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c  ** cells can wil
d190: 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67  l fit on one pag
d1a0: 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61 20  e.  We assume a 
d1b0: 31 30 2d 62 79 74 65 20 70 61 67 65 20 68 65 61  10-byte page hea
d1c0: 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65  der..  ** Beside
d1d0: 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74  s the payload, t
d1e0: 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f  he cell must sto
d1f0: 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62  re:.  **     2-b
d200: 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  yte pointer to t
d210: 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20  he cell.  **    
d220: 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f   4-byte child po
d230: 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39  inter.  **     9
d240: 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65  -byte nKey value
d250: 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
d260: 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a   nData value.  *
d270: 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65  *     4-byte ove
d280: 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74  rflow page point
d290: 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c  er.  ** So a cel
d2a0: 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20  l consists of a 
d2b0: 32 2d 62 79 74 65 20 70 6f 69 6e 65 72 2c 20 61  2-byte poiner, a
d2c0: 20 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73   header which is
d2d0: 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a   as much as.  **
d2e0: 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20   17 bytes long, 
d2f0: 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20  0 to N bytes of 
d300: 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20  payload, and an 
d310: 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20  optional 4 byte 
d320: 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61  overflow.  ** pa
d330: 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f  ge pointer..  */
d340: 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c  .  pBt->maxLocal
d350: 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
d360: 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d  ize-12)*64/255 -
d370: 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c   23;.  pBt->minL
d380: 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61  ocal = (pBt->usa
d390: 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32  bleSize-12)*32/2
d3a0: 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e  55 - 23;.  pBt->
d3b0: 6d 61 78 4c 65 61 66 20 3d 20 70 42 74 2d 3e 75  maxLeaf = pBt->u
d3c0: 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 3b 0a  sableSize - 35;.
d3d0: 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d    pBt->minLeaf =
d3e0: 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a   (pBt->usableSiz
d3f0: 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32  e-12)*32/255 - 2
d400: 33 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 6d 69  3;.  if( pBt->mi
d410: 6e 4c 6f 63 61 6c 3e 70 42 74 2d 3e 6d 61 78 4c  nLocal>pBt->maxL
d420: 6f 63 61 6c 20 7c 7c 20 70 42 74 2d 3e 6d 61 78  ocal || pBt->max
d430: 4c 6f 63 61 6c 3c 30 20 29 7b 0a 20 20 20 20 67  Local<0 ){.    g
d440: 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
d450: 61 69 6c 65 64 3b 0a 20 20 7d 0a 20 20 61 73 73  ailed;.  }.  ass
d460: 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65 61  ert( pBt->maxLea
d470: 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45 4c  f + 23 <= MX_CEL
d480: 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20  L_SIZE(pBt) );. 
d490: 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 70   pBt->pPage1 = p
d4a0: 50 61 67 65 31 3b 0a 20 20 72 65 74 75 72 6e 20  Page1;.  return 
d4b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67 65  SQLITE_OK;..page
d4c0: 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a 20  1_init_failed:. 
d4d0: 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
d4e0: 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  ge1);.  pBt->pPa
d4f0: 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  ge1 = 0;.  retur
d500: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
d510: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b  his routine work
d520: 73 20 6c 69 6b 65 20 6c 6f 63 6b 42 74 72 65 65  s like lockBtree
d530: 28 29 20 65 78 63 65 70 74 20 74 68 61 74 20 69  () except that i
d540: 74 20 61 6c 73 6f 20 69 6e 76 6f 6b 65 73 20 74  t also invokes t
d550: 68 65 0a 2a 2a 20 62 75 73 79 20 63 61 6c 6c 62  he.** busy callb
d560: 61 63 6b 20 69 66 20 74 68 65 72 65 20 69 73 20  ack if there is 
d570: 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e 2e  lock contention.
d580: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
d590: 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65 74 72  ockBtreeWithRetr
d5a0: 79 28 42 74 72 65 65 20 2a 70 52 65 66 29 7b 0a  y(Btree *pRef){.
d5b0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
d5c0: 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28  E_OK;..  assert(
d5d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
d5e0: 64 73 4d 75 74 65 78 28 70 52 65 66 29 20 29 3b  dsMutex(pRef) );
d5f0: 0a 20 20 69 66 28 20 70 52 65 66 2d 3e 69 6e 54  .  if( pRef->inT
d600: 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45  rans==TRANS_NONE
d610: 20 29 7b 0a 20 20 20 20 75 38 20 69 6e 54 72 61   ){.    u8 inTra
d620: 6e 73 61 63 74 69 6f 6e 20 3d 20 70 52 65 66 2d  nsaction = pRef-
d630: 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  >pBt->inTransact
d640: 69 6f 6e 3b 0a 20 20 20 20 62 74 72 65 65 49 6e  ion;.    btreeIn
d650: 74 65 67 72 69 74 79 28 70 52 65 66 29 3b 0a 20  tegrity(pRef);. 
d660: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
d670: 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 70  treeBeginTrans(p
d680: 52 65 66 2c 20 30 29 3b 0a 20 20 20 20 70 52 65  Ref, 0);.    pRe
d690: 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  f->pBt->inTransa
d6a0: 63 74 69 6f 6e 20 3d 20 69 6e 54 72 61 6e 73 61  ction = inTransa
d6b0: 63 74 69 6f 6e 3b 0a 20 20 20 20 70 52 65 66 2d  ction;.    pRef-
d6c0: 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
d6d0: 5f 4e 4f 4e 45 3b 0a 20 20 20 20 69 66 28 20 72  _NONE;.    if( r
d6e0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
d6f0: 20 20 20 20 20 20 70 52 65 66 2d 3e 70 42 74 2d        pRef->pBt-
d700: 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b  >nTransaction--;
d710: 0a 20 20 20 20 7d 0a 20 20 20 20 62 74 72 65 65  .    }.    btree
d720: 49 6e 74 65 67 72 69 74 79 28 70 52 65 66 29 3b  Integrity(pRef);
d730: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
d740: 3b 0a 7d 0a 20 20 20 20 20 20 20 0a 0a 2f 2a 0a  ;.}.       ../*.
d750: 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  ** If there are 
d760: 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63  no outstanding c
d770: 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61 72  ursors and we ar
d780: 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69 64  e not in the mid
d790: 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61 6e  dle.** of a tran
d7a0: 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65 72  saction but ther
d7b0: 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63 6b  e is a read lock
d7c0: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
d7d0: 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72  , then.** this r
d7e0: 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74 68  outine unrefs th
d7f0: 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66 20  e first page of 
d800: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
d810: 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73 20  e which .** has 
d820: 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72 65  the effect of re
d830: 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61 64  leasing the read
d840: 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   lock..**.** If 
d850: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f 75  there are any ou
d860: 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72  tstanding cursor
d870: 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
d880: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
d890: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 20  * If there is a 
d8a0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70  transaction in p
d8b0: 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72 6f  rogress, this ro
d8c0: 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70  utine is a no-op
d8d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
d8e0: 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
d8f0: 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a 70  used(BtShared *p
d900: 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  Bt){.  assert( s
d910: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
d920: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
d930: 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
d940: 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
d950: 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70 43  _NONE && pBt->pC
d960: 75 72 73 6f 72 3d 3d 30 20 26 26 20 70 42 74 2d  ursor==0 && pBt-
d970: 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20 20  >pPage1!=0 ){.  
d980: 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
d990: 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e  erRefcount(pBt->
d9a0: 70 50 61 67 65 72 29 3e 3d 31 20 29 7b 0a 20 20  pPager)>=1 ){.  
d9b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
d9c0: 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 29  >pPage1->aData )
d9d0: 3b 0a 23 69 66 20 30 0a 20 20 20 20 20 20 69 66  ;.#if 0.      if
d9e0: 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  ( pBt->pPage1->a
d9f0: 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Data==0 ){.     
da00: 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67     MemPage *pPag
da10: 65 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31 3b  e = pBt->pPage1;
da20: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e  .        pPage->
da30: 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 50  aData = sqlite3P
da40: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
da50: 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
da60: 20 20 20 20 20 70 50 61 67 65 2d 3e 70 42 74 20       pPage->pBt 
da70: 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 70  = pBt;.        p
da80: 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 31 3b 0a  Page->pgno = 1;.
da90: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
daa0: 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
dab0: 28 70 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a 20  (pBt->pPage1);. 
dac0: 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70 50     }.    pBt->pP
dad0: 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 70 42  age1 = 0;.    pB
dae0: 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  t->inStmt = 0;. 
daf0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61   }.}../*.** Crea
db00: 74 65 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  te a new databas
db10: 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e  e by initializin
db20: 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  g the first page
db30: 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2e   of the.** file.
db40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  .*/.static int n
db50: 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68 61  ewDatabase(BtSha
db60: 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65 6d  red *pBt){.  Mem
db70: 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e 73  Page *pP1;.  uns
db80: 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61  igned char *data
db90: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
dba0: 74 20 6e 50 61 67 65 3b 0a 0a 20 20 61 73 73 65  t nPage;..  asse
dbb0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
dbc0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
dbd0: 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  x) );.  rc = sql
dbe0: 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
dbf0: 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
dc00: 26 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  &nPage);.  if( r
dc10: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
dc20: 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 72  nPage>0 ){.    r
dc30: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
dc40: 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  pP1 = pBt->pPage
dc50: 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 31  1;.  assert( pP1
dc60: 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d 20  !=0 );.  data = 
dc70: 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63  pP1->aData;.  rc
dc80: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
dc90: 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61 67  rite(pP1->pDbPag
dca0: 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
dcb0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 63  eturn rc;.  memc
dcc0: 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63 48  py(data, zMagicH
dcd0: 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a 4d  eader, sizeof(zM
dce0: 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20 20  agicHeader));.  
dcf0: 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 7a  assert( sizeof(z
dd00: 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31 36  MagicHeader)==16
dd10: 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26   );.  put2byte(&
dd20: 64 61 74 61 5b 31 36 5d 2c 20 70 42 74 2d 3e 70  data[16], pBt->p
dd30: 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74 61  ageSize);.  data
dd40: 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61  [18] = 1;.  data
dd50: 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 64 61 74 61  [19] = 1;.  data
dd60: 5b 32 30 5d 20 3d 20 70 42 74 2d 3e 70 61 67 65  [20] = pBt->page
dd70: 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61 62  Size - pBt->usab
dd80: 6c 65 53 69 7a 65 3b 0a 20 20 64 61 74 61 5b 32  leSize;.  data[2
dd90: 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b  1] = 64;.  data[
dda0: 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61  22] = 32;.  data
ddb0: 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d  [23] = 32;.  mem
ddc0: 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30  set(&data[24], 0
ddd0: 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72  , 100-24);.  zer
dde0: 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49  oPage(pP1, PTF_I
ddf0: 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50  NTKEY|PTF_LEAF|P
de00: 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20  TF_LEAFDATA );. 
de10: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69   pBt->pageSizeFi
de20: 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66  xed = 1;.#ifndef
de30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
de40: 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74  OVACUUM.  assert
de50: 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
de60: 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74  m==1 || pBt->aut
de70: 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20  oVacuum==0 );.  
de80: 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63  assert( pBt->inc
de90: 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42  rVacuum==1 || pB
dea0: 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30  t->incrVacuum==0
deb0: 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26   );.  put4byte(&
dec0: 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20  data[36 + 4*4], 
ded0: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
dee0: 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61  ;.  put4byte(&da
def0: 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42  ta[36 + 7*4], pB
df00: 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a  t->incrVacuum);.
df10: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
df20: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
df30: 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73  .** Attempt to s
df40: 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73  tart a new trans
df50: 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d  action. A write-
df60: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
df70: 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68 65  s started if the
df80: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
df90: 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68   is nonzero, oth
dfa0: 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a  erwise a read-.*
dfb0: 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20  * transaction.  
dfc0: 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
dfd0: 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d  gument is 2 or m
dfe0: 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76  ore and exclusiv
dff0: 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  e.** transaction
e000: 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61   is started, mea
e010: 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68  ning that no oth
e020: 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c  er process is al
e030: 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65  lowed.** to acce
e040: 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ss the database.
e050: 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67 20    A preexisting 
e060: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20  transaction may 
e070: 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64  not be.** upgrad
e080: 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20  ed to exclusive 
e090: 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  by calling this 
e0a0: 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64  routine a second
e0b0: 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65   time - the.** e
e0c0: 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20  xclusivity flag 
e0d0: 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61  only works for a
e0e0: 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
e0f0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d  ..**.** A write-
e100: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
e110: 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66 6f   be started befo
e120: 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e  re attempting an
e130: 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f  y .** changes to
e140: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
e150: 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  None of the foll
e160: 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a  owing routines .
e170: 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c  ** will work unl
e180: 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ess a transactio
e190: 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69 72  n is started fir
e1a0: 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73  st:.**.**      s
e1b0: 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
e1c0: 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20  eTable().**     
e1d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65   sqlite3BtreeCre
e1e0: 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20  ateIndex().**   
e1f0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
e200: 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20  learTable().**  
e210: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
e220: 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20  DropTable().**  
e230: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
e240: 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20  Insert().**     
e250: 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c   sqlite3BtreeDel
e260: 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  ete().**      sq
e270: 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74 65  lite3BtreeUpdate
e280: 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20  Meta().**.** If 
e290: 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d  an initial attem
e2a0: 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74 68  pt to acquire th
e2b0: 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63  e lock fails bec
e2c0: 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e  ause of lock con
e2d0: 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74  tention.** and t
e2e0: 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20  he database was 
e2f0: 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63  previously unloc
e300: 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65  ked, then invoke
e310: 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
e320: 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73  r.** if there is
e330: 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68   one.  But if th
e340: 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75 73  ere was previous
e350: 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20  ly a read-lock, 
e360: 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65  do not.** invoke
e370: 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
e380: 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20  r - just return 
e390: 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51  SQLITE_BUSY.  SQ
e3a0: 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a  LITE_BUSY is .**
e3b0: 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74   returned when t
e3c0: 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
e3d0: 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f  a read-lock in o
e3e0: 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20  rder to avoid a 
e3f0: 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20  deadlock..**.** 
e400: 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61 72  Suppose there ar
e410: 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20  e two processes 
e420: 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20  A and B.  A has 
e430: 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20  a read lock and 
e440: 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72  B has.** a reser
e450: 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69  ved lock.  B tri
e460: 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f  es to promote to
e470: 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20 69   exclusive but i
e480: 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73  s blocked becaus
e490: 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64  e.** of A's read
e4a0: 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20   lock.  A tries 
e4b0: 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65  to promote to re
e4c0: 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62 6c  served but is bl
e4d0: 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f  ocked by B..** O
e4e0: 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  ne or the other 
e4f0: 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65  of the two proce
e500: 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20 77  sses must give w
e510: 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20  ay or there can 
e520: 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73  be.** no progres
e530: 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67  s.  By returning
e540: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64   SQLITE_BUSY and
e550: 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68   not invoking th
e560: 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a  e busy callback.
e570: 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64  ** when A alread
e580: 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  y has a read loc
e590: 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20  k, we encourage 
e5a0: 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64  A to give up and
e5b0: 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65   let B.** procee
e5c0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
e5d0: 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73  3BtreeBeginTrans
e5e0: 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77  (Btree *p, int w
e5f0: 72 66 6c 61 67 29 7b 0a 20 20 42 74 53 68 61 72  rflag){.  BtShar
e600: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
e610: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
e620: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69 74  ITE_OK;..  sqlit
e630: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
e640: 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  .  pBt->db = p->
e650: 64 62 3b 0a 20 20 62 74 72 65 65 49 6e 74 65 67  db;.  btreeInteg
e660: 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  rity(p);..  /* I
e670: 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61  f the btree is a
e680: 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69 74  lready in a writ
e690: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f  e-transaction, o
e6a0: 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c 72  r it.  ** is alr
e6b0: 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d 74  eady in a read-t
e6c0: 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 61  ransaction and a
e6d0: 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f   read-transactio
e6e0: 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65 73  n.  ** is reques
e6f0: 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20 6e  ted, this is a n
e700: 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o-op..  */.  if(
e710: 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
e720: 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d 3e  NS_WRITE || (p->
e730: 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 52  inTrans==TRANS_R
e740: 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29 20  EAD && !wrflag) 
e750: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e  ){.    goto tran
e760: 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20  s_begun;.  }..  
e770: 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61 63  /* Write transac
e780: 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70 6f  tions are not po
e790: 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61 64  ssible on a read
e7a0: 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a  -only database *
e7b0: 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61  /.  if( pBt->rea
e7c0: 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c 61 67 20  dOnly && wrflag 
e7d0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
e7e0: 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20  TE_READONLY;.   
e7f0: 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75   goto trans_begu
e800: 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  n;.  }..  /* If 
e810: 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  another database
e820: 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72 65   handle has alre
e830: 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72 69  ady opened a wri
e840: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 0a  te transaction .
e850: 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68 61    ** on this sha
e860: 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63 74  red-btree struct
e870: 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e 64  ure and a second
e880: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
e890: 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71 75 65  on is.  ** reque
e8a0: 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51 4c  sted, return SQL
e8b0: 49 54 45 5f 42 55 53 59 2e 0a 20 20 2a 2f 0a 20  ITE_BUSY..  */. 
e8c0: 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e   if( pBt->inTran
e8d0: 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
e8e0: 52 49 54 45 20 26 26 20 77 72 66 6c 61 67 20 29  RITE && wrflag )
e8f0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
e900: 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74 6f  E_BUSY;.    goto
e910: 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
e920: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
e930: 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41  E_OMIT_SHARED_CA
e940: 43 48 45 0a 20 20 69 66 28 20 77 72 66 6c 61 67  CHE.  if( wrflag
e950: 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b  >1 ){.    BtLock
e960: 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 66 6f 72   *pIter;.    for
e970: 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63  (pIter=pBt->pLoc
e980: 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d  k; pIter; pIter=
e990: 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  pIter->pNext){. 
e9a0: 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e       if( pIter->
e9b0: 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20  pBtree!=p ){.   
e9c0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
e9d0: 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 67  _BUSY;.        g
e9e0: 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b  oto trans_begun;
e9f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
ea00: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 64 6f 20   }.#endif..  do 
ea10: 7b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  {.    if( pBt->p
ea20: 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20  Page1==0 ){.    
ea30: 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 72 63    do{.        rc
ea40: 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42 74   = lockBtree(pBt
ea50: 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 28  );.      }while(
ea60: 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
ea70: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
ea80: 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   );.    }..    i
ea90: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
eaa0: 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20 20   && wrflag ){.  
eab0: 20 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61      if( pBt->rea
eac0: 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20 20  dOnly ){.       
ead0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41   rc = SQLITE_REA
eae0: 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65 6c  DONLY;.      }el
eaf0: 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
eb00: 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65 67   sqlite3PagerBeg
eb10: 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  in(pBt->pPage1->
eb20: 70 44 62 50 61 67 65 2c 20 77 72 66 6c 61 67 3e  pDbPage, wrflag>
eb30: 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
eb40: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
eb50: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
eb60: 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29  newDatabase(pBt)
eb70: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
eb80: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
eb90: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
eba0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
ebb0: 77 72 66 6c 61 67 20 29 20 70 42 74 2d 3e 69 6e  wrflag ) pBt->in
ebc0: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Stmt = 0;.    }e
ebd0: 6c 73 65 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63  lse{.      unloc
ebe0: 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
ebf0: 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68  Bt);.    }.  }wh
ec00: 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
ec10: 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54  BUSY && pBt->inT
ec20: 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
ec30: 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20  S_NONE &&.      
ec40: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
ec50: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
ec60: 72 28 70 42 74 2c 20 30 29 20 29 3b 0a 0a 20 20  r(pBt, 0) );..  
ec70: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
ec80: 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e  K ){.    if( p->
ec90: 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e  inTrans==TRANS_N
eca0: 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ONE ){.      pBt
ecb0: 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b 2b  ->nTransaction++
ecc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 69  ;.    }.    p->i
ecd0: 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61 67  nTrans = (wrflag
ece0: 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52 41  ?TRANS_WRITE:TRA
ecf0: 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69 66  NS_READ);.    if
ed00: 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42 74  ( p->inTrans>pBt
ed10: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
ed20: 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  ){.      pBt->in
ed30: 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 2d  Transaction = p-
ed40: 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d 0a  >inTrans;.    }.
ed50: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ed60: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
ed70: 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67 3e  .    if( wrflag>
ed80: 31 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  1 ){.      asser
ed90: 74 28 20 21 70 42 74 2d 3e 70 45 78 63 6c 75 73  t( !pBt->pExclus
eda0: 69 76 65 20 29 3b 0a 20 20 20 20 20 20 70 42 74  ive );.      pBt
edb0: 2d 3e 70 45 78 63 6c 75 73 69 76 65 20 3d 20 70  ->pExclusive = p
edc0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
edd0: 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75 6e   }...trans_begun
ede0: 3a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72 69  :.  btreeIntegri
edf0: 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  ty(p);.  sqlite3
ee00: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
ee10: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
ee20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ee30: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 0a 2f  IT_AUTOVACUUM../
ee40: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 6f 69  *.** Set the poi
ee50: 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69 65 73  nter-map entries
ee60: 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64 72 65   for all childre
ee70: 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67 65 2e  n of page pPage.
ee80: 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70 50 61   Also, if.** pPa
ee90: 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65 6c 6c  ge contains cell
eea0: 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  s that point to 
eeb0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
eec0: 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65 72 0a  set the pointer.
eed0: 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66  ** map entries f
eee0: 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  or the overflow 
eef0: 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e 0a 2a  pages as well..*
ef00: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
ef10: 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d 65 6d  ChildPtrmaps(Mem
ef20: 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
ef30: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
ef40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef50: 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20 76 61     /* Counter va
ef60: 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20  riable */.  int 
ef70: 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
ef80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ef90: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
efa0: 73 20 69 6e 20 70 61 67 65 20 70 50 61 67 65 20  s in page pPage 
efb0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
efc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efd0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
efe0: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74 53 68  n code */.  BtSh
eff0: 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
f000: 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 69 73  e->pBt;.  int is
f010: 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
f020: 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67 6e 6f  ->isInit;.  Pgno
f030: 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d 3e 70   pgno = pPage->p
f040: 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  gno;..  assert( 
f050: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
f060: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
f070: 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20  utex) );.  rc = 
f080: 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
f090: 50 61 67 65 28 70 50 61 67 65 2c 20 70 50 61 67  Page(pPage, pPag
f0a0: 65 2d 3e 70 50 61 72 65 6e 74 29 3b 0a 20 20 69  e->pParent);.  i
f0b0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f0c0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 65 74   ){.    goto set
f0d0: 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
f0e0: 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c 6c 20  ut;.  }.  nCell 
f0f0: 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
f100: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43  .  for(i=0; i<nC
f110: 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75  ell; i++){.    u
f120: 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  8 *pCell = findC
f130: 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 0a  ell(pPage, i);..
f140: 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
f150: 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65 2c  utOvflPtr(pPage,
f160: 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28   pCell);.    if(
f170: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
f180: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73 65 74  {.      goto set
f190: 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
f1a0: 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ut;.    }..    i
f1b0: 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
f1c0: 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20 63 68  ){.      Pgno ch
f1d0: 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79  ildPgno = get4by
f1e0: 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20  te(pCell);.     
f1f0: 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
f200: 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c 20  pBt, childPgno, 
f210: 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 67  PTRMAP_BTREE, pg
f220: 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
f230: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
f240: 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74  oto set_child_pt
f250: 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d  rmaps_out;.    }
f260: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
f270: 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
f280: 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d  Pgno childPgno =
f290: 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
f2a0: 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
f2b0: 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
f2c0: 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
f2d0: 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f 2c  (pBt, childPgno,
f2e0: 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
f2f0: 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73 65 74 5f 63  gno);.  }..set_c
f300: 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74  hild_ptrmaps_out
f310: 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69  :.  pPage->isIni
f320: 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a  t = isInitOrig;.
f330: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f340: 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72 65 20  /*.** Somewhere 
f350: 6f 6e 20 70 50 61 67 65 2c 20 77 68 69 63 68 20  on pPage, which 
f360: 69 73 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f  is guarenteed to
f370: 20 62 65 20 61 20 62 74 72 65 65 20 70 61 67 65   be a btree page
f380: 2c 20 6e 6f 74 20 61 6e 20 6f 76 65 72 66 6c 6f  , not an overflo
f390: 77 0a 2a 2a 20 70 61 67 65 2c 20 69 73 20 61 20  w.** page, is a 
f3a0: 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65 20  pointer to page 
f3b0: 69 46 72 6f 6d 2e 20 4d 6f 64 69 66 79 20 74 68  iFrom. Modify th
f3c0: 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 20 74 68  is pointer so th
f3d0: 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 0a  at it points to.
f3e0: 2a 2a 20 69 54 6f 2e 20 50 61 72 61 6d 65 74 65  ** iTo. Paramete
f3f0: 72 20 65 54 79 70 65 20 64 65 73 63 72 69 62 65  r eType describe
f400: 73 20 74 68 65 20 74 79 70 65 20 6f 66 20 70 6f  s the type of po
f410: 69 6e 74 65 72 20 74 6f 20 62 65 20 6d 6f 64 69  inter to be modi
f420: 66 69 65 64 2c 20 61 73 20 0a 2a 2a 20 66 6f 6c  fied, as .** fol
f430: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54 52 4d  lows:.**.** PTRM
f440: 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20 70 50  AP_BTREE:     pP
f450: 61 67 65 20 69 73 20 61 20 62 74 72 65 65 2d 70  age is a btree-p
f460: 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
f470: 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63 68 69   points at a chi
f480: 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ld .**          
f490: 20 20 20 20 20 20 20 20 20 70 61 67 65 20 6f 66           page of
f4a0: 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 50 54   pPage..**.** PT
f4b0: 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 3a 20  RMAP_OVERFLOW1: 
f4c0: 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65  pPage is a btree
f4d0: 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
f4e0: 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 6e 20  er points at an 
f4f0: 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20 20 20  overflow.**     
f500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
f510: 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ge pointed to by
f520: 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65 6c 6c   one of the cell
f530: 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a  s on pPage..**.*
f540: 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  * PTRMAP_OVERFLO
f550: 57 32 3a 20 70 50 61 67 65 20 69 73 20 61 6e 20  W2: pPage is an 
f560: 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e 20 54  overflow-page. T
f570: 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  he pointer point
f580: 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a 2a 2a  s at the next.**
f590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5a0: 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65     overflow page
f5b0: 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 2a 2f   in the list..*/
f5c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 64 69  .static int modi
f5d0: 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 4d 65  fyPagePointer(Me
f5e0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 50 67  mPage *pPage, Pg
f5f0: 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f 20 69  no iFrom, Pgno i
f600: 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b 0a 20  To, u8 eType){. 
f610: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
f620: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
f630: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
f640: 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50  ;.  if( eType==P
f650: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 20  TRMAP_OVERFLOW2 
f660: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 6f  ){.    /* The po
f670: 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79 73 20  inter is always 
f680: 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74 65  the first 4 byte
f690: 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e  s of the page in
f6a0: 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a 2f 0a   this case.  */.
f6b0: 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
f6c0: 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29 21 3d  (pPage->aData)!=
f6d0: 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 72  iFrom ){.      r
f6e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
f6f0: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
f700: 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 70 50  .    put4byte(pP
f710: 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 6f 29  age->aData, iTo)
f720: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
f730: 6e 74 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20  nt isInitOrig = 
f740: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20  pPage->isInit;. 
f750: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
f760: 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 73 71  t nCell;..    sq
f770: 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
f780: 67 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  ge(pPage, 0);.  
f790: 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    nCell = pPage-
f7a0: 3e 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72  >nCell;..    for
f7b0: 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
f7c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70  ++){.      u8 *p
f7d0: 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
f7e0: 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20  pPage, i);.     
f7f0: 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
f800: 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a  AP_OVERFLOW1 ){.
f810: 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f          CellInfo
f820: 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 73   info;.        s
f830: 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
f840: 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70  CellPtr(pPage, p
f850: 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  Cell, &info);.  
f860: 20 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69        if( info.i
f870: 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
f880: 20 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d        if( iFrom=
f890: 3d 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c  =get4byte(&pCell
f8a0: 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
f8b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
f8c0: 20 70 75 74 34 62 79 74 65 28 26 70 43 65 6c 6c   put4byte(&pCell
f8d0: 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d  [info.iOverflow]
f8e0: 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20  , iTo);.        
f8f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
f900: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
f910: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
f920: 20 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79        if( get4by
f930: 74 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d  te(pCell)==iFrom
f940: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75   ){.          pu
f950: 74 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54  t4byte(pCell, iT
f960: 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  o);.          br
f970: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
f980: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a       }.    }.  .
f990: 20 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c      if( i==nCell
f9a0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54   ){.      if( eT
f9b0: 79 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45  ype!=PTRMAP_BTRE
f9c0: 45 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  E || .          
f9d0: 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
f9e0: 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
f9f0: 72 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72  rOffset+8])!=iFr
fa00: 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  om ){.        re
fa10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
fa20: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20  UPT_BKPT;.      
fa30: 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  }.      put4byte
fa40: 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
fa50: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
fa60: 38 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a  8], iTo);.    }.
fa70: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
fa80: 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b  it = isInitOrig;
fa90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
faa0: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
fab0: 2a 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e  ** Move the open
fac0: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
fad0: 44 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69  DbPage to locati
fae0: 6f 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e 20  on iFreePage in 
faf0: 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
fb00: 2e 20 54 68 65 20 70 44 62 50 61 67 65 20 72 65  . The pDbPage re
fb10: 66 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20  ference remains 
fb20: 76 61 6c 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  valid..*/.static
fb30: 20 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67   int relocatePag
fb40: 65 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e(.  BtShared *p
fb50: 42 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  Bt,           /*
fb60: 20 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50   Btree */.  MemP
fb70: 61 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20  age *pDbPage,   
fb80: 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67       /* Open pag
fb90: 65 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75  e to move */.  u
fba0: 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20  8 eType,        
fbb0: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
fbc0: 65 72 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e  er map 'type' en
fbd0: 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20  try for pDbPage 
fbe0: 2a 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61  */.  Pgno iPtrPa
fbf0: 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ge,           /*
fc00: 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61   Pointer map 'pa
fc10: 67 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72  ge-no' entry for
fc20: 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67   pDbPage */.  Pg
fc30: 6e 6f 20 69 46 72 65 65 50 61 67 65 20 20 20 20  no iFreePage    
fc40: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f         /* The lo
fc50: 63 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70  cation to move p
fc60: 44 62 50 61 67 65 20 74 6f 20 2a 2f 0a 29 7b 0a  DbPage to */.){.
fc70: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50    MemPage *pPtrP
fc80: 61 67 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61  age;   /* The pa
fc90: 67 65 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  ge that contains
fca0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44   a pointer to pD
fcb0: 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  bPage */.  Pgno 
fcc0: 69 44 62 50 61 67 65 20 3d 20 70 44 62 50 61 67  iDbPage = pDbPag
fcd0: 65 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72  e->pgno;.  Pager
fce0: 20 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e   *pPager = pBt->
fcf0: 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
fd00: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 65 54 79  ;..  assert( eTy
fd10: 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
fd20: 4c 4f 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50  LOW2 || eType==P
fd30: 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20  TRMAP_OVERFLOW1 
fd40: 7c 7c 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d  || .      eType=
fd50: 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c  =PTRMAP_BTREE ||
fd60: 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52   eType==PTRMAP_R
fd70: 4f 4f 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73  OOTPAGE );.  ass
fd80: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
fd90: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
fda0: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
fdb0: 20 70 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70   pDbPage->pBt==p
fdc0: 42 74 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65  Bt );..  /* Move
fdd0: 20 70 61 67 65 20 69 44 62 50 61 67 65 20 66 72   page iDbPage fr
fde0: 6f 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c  om its current l
fdf0: 6f 63 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20  ocation to page 
fe00: 6e 75 6d 62 65 72 20 69 46 72 65 65 50 61 67 65  number iFreePage
fe10: 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55   */.  TRACE(("AU
fe20: 54 4f 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67  TOVACUUM: Moving
fe30: 20 25 64 20 74 6f 20 66 72 65 65 20 70 61 67 65   %d to free page
fe40: 20 25 64 20 28 70 74 72 20 70 61 67 65 20 25 64   %d (ptr page %d
fe50: 20 74 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20   type %d)\n", . 
fe60: 20 20 20 20 20 69 44 62 50 61 67 65 2c 20 69 46       iDbPage, iF
fe70: 72 65 65 50 61 67 65 2c 20 69 50 74 72 50 61 67  reePage, iPtrPag
fe80: 65 2c 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63  e, eType));.  rc
fe90: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d   = sqlite3PagerM
fea0: 6f 76 65 70 61 67 65 28 70 50 61 67 65 72 2c 20  ovepage(pPager, 
feb0: 70 44 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65  pDbPage->pDbPage
fec0: 2c 20 69 46 72 65 65 50 61 67 65 29 3b 0a 20 20  , iFreePage);.  
fed0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
fee0: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
fef0: 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67  rc;.  }.  pDbPag
ff00: 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50  e->pgno = iFreeP
ff10: 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44  age;..  /* If pD
ff20: 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72 65  bPage was a btre
ff30: 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20  e-page, then it 
ff40: 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20 70  may have child p
ff50: 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c  ages and/or cell
ff60: 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e  s.  ** that poin
ff70: 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
ff80: 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  ges. The pointer
ff90: 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72   map entries for
ffa0: 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20   all these.  ** 
ffb0: 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65  pages need to be
ffc0: 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20   changed..  **. 
ffd0: 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20 69   ** If pDbPage i
ffe0: 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  s an overflow pa
fff0: 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ge, then the fir
10000 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20 73  st 4 bytes may s
10010 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e  tore a.  ** poin
10020 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71 75  ter to a subsequ
10030 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
10040 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  e. If this is th
10050 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a  e case, then.  *
10060 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * the pointer ma
10070 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  p needs to be up
10080 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 75  dated for the su
10090 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
100a0 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  w page..  */.  i
100b0 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
100c0 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d  _BTREE || eType=
100d0 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
100e0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74   ){.    rc = set
100f0 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62  ChildPtrmaps(pDb
10100 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
10110 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
10120 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
10130 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
10140 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66      Pgno nextOvf
10150 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44 62  l = get4byte(pDb
10160 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
10170 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d    if( nextOvfl!=
10180 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
10190 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e  ptrmapPut(pBt, n
101a0 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  extOvfl, PTRMAP_
101b0 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65  OVERFLOW2, iFree
101c0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
101d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
101e0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
101f0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
10200 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78   }.  }..  /* Fix
10210 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 6f   the database po
10220 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50  inter on page iP
10230 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e  trPage that poin
10240 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20 73  ted at iDbPage s
10250 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70  o.  ** that it p
10260 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50 61  oints at iFreePa
10270 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65  ge. Also fix the
10280 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
10290 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72  ry for.  ** iPtr
102a0 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  Page..  */.  if(
102b0 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52   eType!=PTRMAP_R
102c0 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
102d0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
102e0 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 74  GetPage(pBt, iPt
102f0 72 50 61 67 65 2c 20 26 70 50 74 72 50 61 67 65  rPage, &pPtrPage
10300 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
10310 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
10320 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
10330 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
10340 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
10350 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61  (pPtrPage->pDbPa
10360 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
10370 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10380 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
10390 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20  pPtrPage);.     
103a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
103b0 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66  }.    rc = modif
103c0 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74  yPagePointer(pPt
103d0 72 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20  rPage, iDbPage, 
103e0 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65  iFreePage, eType
103f0 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
10400 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
10410 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
10420 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
10430 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
10440 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70   iFreePage, eTyp
10450 65 2c 20 69 50 74 72 50 61 67 65 29 3b 0a 20 20  e, iPtrPage);.  
10460 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
10470 20 72 63 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69   rc;.}..static i
10480 6e 74 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e  nt pagerPagecoun
10490 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
104a0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
104b0 74 20 6e 50 61 67 65 3b 0a 20 20 72 63 20 3d 20  t nPage;.  rc = 
104c0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
104d0 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e  count(pPager, &n
104e0 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Page);.  return 
104f0 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 6e  (rc==SQLITE_OK?n
10500 50 61 67 65 3a 2d 31 29 3b 0a 7d 0a 0a 2f 2a 20  Page:-1);.}../* 
10510 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
10520 69 6f 6e 20 72 65 71 75 69 72 65 64 20 62 79 20  ion required by 
10530 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29  incrVacuumStep()
10540 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
10550 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
10560 65 28 42 74 53 68 61 72 65 64 20 2a 2c 20 4d 65  e(BtShared *, Me
10570 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a  mPage **, Pgno *
10580 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a  , Pgno, u8);../*
10590 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61 20 73 69  .** Perform a si
105a0 6e 67 6c 65 20 73 74 65 70 20 6f 66 20 61 6e 20  ngle step of an 
105b0 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75  incremental-vacu
105c0 75 6d 2e 20 49 66 20 73 75 63 63 65 73 73 66 75  um. If successfu
105d0 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e 20 53 51 4c  l,.** return SQL
105e0 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68 65 72 65  ITE_OK. If there
105f0 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74 6f 20 64   is no work to d
10600 6f 20 28 61 6e 64 20 74 68 65 72 65 66 6f 72 65  o (and therefore
10610 20 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20 69 6e 20   no.** point in 
10620 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e  calling this fun
10630 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c 20 72 65  ction again), re
10640 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
10650 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20 73 70 65  ..**.** More spe
10660 63 69 66 69 63 6c 79 2c 20 74 68 69 73 20 66 75  cificly, this fu
10670 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20  nction attempts 
10680 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a 65 20 74  to re-organize t
10690 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
106a0 73 6f 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  so that the last
106b0 20 70 61 67 65 20 6f 66 20 74 68 65 20 66 69 6c   page of the fil
106c0 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 75  e currently in u
106d0 73 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67  se.** is no long
106e0 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a  er in use..**.**
106f0 20 49 66 20 74 68 65 20 6e 46 69 6e 20 70 61 72   If the nFin par
10700 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65  ameter is non-ze
10710 72 6f 2c 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e  ro, the implemen
10720 74 61 74 69 6f 6e 20 61 73 73 75 6d 65 73 0a 2a  tation assumes.*
10730 2a 20 74 68 61 74 20 74 68 65 20 63 61 6c 6c 65  * that the calle
10740 72 20 77 69 6c 6c 20 6b 65 65 70 20 63 61 6c 6c  r will keep call
10750 69 6e 67 20 69 6e 63 72 56 61 63 75 75 6d 53 74  ing incrVacuumSt
10760 65 70 28 29 20 75 6e 74 69 6c 0a 2a 2a 20 69 74  ep() until.** it
10770 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
10780 44 4f 4e 45 20 6f 72 20 61 6e 20 65 72 72 6f 72  DONE or an error
10790 2c 20 61 6e 64 20 74 68 61 74 20 6e 46 69 6e 20  , and that nFin 
107a0 69 73 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72  is the.** number
107b0 20 6f 66 20 70 61 67 65 73 20 74 68 65 20 64 61   of pages the da
107c0 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c  tabase file will
107d0 20 63 6f 6e 74 61 69 6e 20 61 66 74 65 72 20 74   contain after t
107e0 68 69 73 20 0a 2a 2a 20 70 72 6f 63 65 73 73 20  his .** process 
107f0 69 73 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2f 0a  is complete..*/.
10800 73 74 61 74 69 63 20 69 6e 74 20 69 6e 63 72 56  static int incrV
10810 61 63 75 75 6d 53 74 65 70 28 42 74 53 68 61 72  acuumStep(BtShar
10820 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6e 46  ed *pBt, Pgno nF
10830 69 6e 29 7b 0a 20 20 50 67 6e 6f 20 69 4c 61 73  in){.  Pgno iLas
10840 74 50 67 3b 20 20 20 20 20 20 20 20 20 20 20 20  tPg;            
10850 20 2f 2a 20 4c 61 73 74 20 70 61 67 65 20 69 6e   /* Last page in
10860 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
10870 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73  .  Pgno nFreeLis
10880 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
10890 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
108a0 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65  still on the fre
108b0 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73  e-list */..  ass
108c0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
108d0 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
108e0 65 78 29 20 29 3b 0a 20 20 69 4c 61 73 74 50 67  ex) );.  iLastPg
108f0 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a   = pBt->nTrunc;.
10900 20 20 69 66 28 20 69 4c 61 73 74 50 67 3d 3d 30    if( iLastPg==0
10910 20 29 7b 0a 20 20 20 20 69 4c 61 73 74 50 67 20   ){.    iLastPg 
10920 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
10930 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
10940 20 7d 0a 0a 20 20 69 66 28 20 21 50 54 52 4d 41   }..  if( !PTRMA
10950 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 4c  P_ISPAGE(pBt, iL
10960 61 73 74 50 67 29 20 26 26 20 69 4c 61 73 74 50  astPg) && iLastP
10970 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g!=PENDING_BYTE_
10980 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
10990 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 75 38 20   int rc;.    u8 
109a0 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f 20  eType;.    Pgno 
109b0 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20 6e  iPtrPage;..    n
109c0 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34 62  FreeList = get4b
109d0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
109e0 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20  ->aData[36]);.  
109f0 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74 3d    if( nFreeList=
10a00 3d 30 20 7c 7c 20 6e 46 69 6e 3d 3d 69 4c 61 73  =0 || nFin==iLas
10a10 74 50 67 20 29 7b 0a 20 20 20 20 20 20 72 65 74  tPg ){.      ret
10a20 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
10a30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d  .    }..    rc =
10a40 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20   ptrmapGet(pBt, 
10a50 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65 2c  iLastPg, &eType,
10a60 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20   &iPtrPage);.   
10a70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10a80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
10a90 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
10aa0 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
10ab0 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20  AP_ROOTPAGE ){. 
10ac0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10ad0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
10ae0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
10af0 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52  eType==PTRMAP_FR
10b00 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20  EEPAGE ){.      
10b10 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a 20  if( nFin==0 ){. 
10b20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65         /* Remove
10b30 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 74   the page from t
10b40 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c 69  he files free-li
10b50 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74 20  st. This is not 
10b60 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20 20  required.       
10b70 20 2a 2a 20 69 66 20 6e 46 69 6e 20 69 73 20 6e   ** if nFin is n
10b80 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61 74  on-zero. In that
10b90 20 63 61 73 65 2c 20 74 68 65 20 66 72 65 65 2d   case, the free-
10ba0 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20 20  list will be.   
10bb0 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74 65       ** truncate
10bc0 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72 20  d to zero after 
10bd0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
10be0 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f 65  turns, so it doe
10bf0 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  sn't .        **
10c00 20 6d 61 74 74 65 72 20 69 66 20 69 74 20 73 74   matter if it st
10c10 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f 6d  ill contains som
10c20 65 20 67 61 72 62 61 67 65 20 65 6e 74 72 69 65  e garbage entrie
10c30 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
10c40 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65 65        Pgno iFree
10c50 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50  Pg;.        MemP
10c60 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20  age *pFreePg;.  
10c70 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
10c80 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
10c90 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72  , &pFreePg, &iFr
10ca0 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20 31  eePg, iLastPg, 1
10cb0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
10cc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
10cd0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
10ce0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
10cf0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69         assert( i
10d00 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67 20  FreePg==iLastPg 
10d10 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  );.        relea
10d20 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29 3b  sePage(pFreePg);
10d30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20 65  .      }.    } e
10d40 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e 6f  lse {.      Pgno
10d50 20 69 46 72 65 65 50 67 3b 20 20 20 20 20 20 20   iFreePg;       
10d60 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
10d70 66 20 66 72 65 65 20 70 61 67 65 20 74 6f 20 6d  f free page to m
10d80 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20 2a  ove pLastPg to *
10d90 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  /.      MemPage 
10da0 2a 70 4c 61 73 74 50 67 3b 0a 0a 20 20 20 20 20  *pLastPg;..     
10db0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
10dc0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69  eeGetPage(pBt, i
10dd0 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50 67  LastPg, &pLastPg
10de0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
10df0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
10e00 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
10e10 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
10e20 20 20 20 2f 2a 20 49 66 20 6e 46 69 6e 20 69 73     /* If nFin is
10e30 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f 70   zero, this loop
10e40 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f 6e   runs exactly on
10e50 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61 73  ce and page pLas
10e60 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73 20  tPg.      ** is 
10e70 73 77 61 70 70 65 64 20 77 69 74 68 20 74 68 65  swapped with the
10e80 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65   first free page
10e90 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65 20   pulled off the 
10ea0 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20 20  free list..     
10eb0 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e 20   **.      ** On 
10ec0 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
10ed0 69 66 20 6e 46 69 6e 20 69 73 20 67 72 65 61 74  if nFin is great
10ee0 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68  er than zero, th
10ef0 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a 2a  en keep.      **
10f00 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20 61   looping until a
10f10 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61 74   free-page locat
10f20 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 66 69  ed within the fi
10f30 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a 20  rst nFin pages. 
10f40 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 66       ** of the f
10f50 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20 20  ile is found..  
10f60 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f 20      */.      do 
10f70 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  {.        MemPag
10f80 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20 20  e *pFreePg;.    
10f90 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74      rc = allocat
10fa0 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
10fb0 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65 65  &pFreePg, &iFree
10fc0 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  Pg, 0, 0);.     
10fd0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
10fe0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
10ff0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
11000 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20 20  astPg);.        
11010 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
11020 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
11030 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65  eleasePage(pFree
11040 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c  Pg);.      }whil
11050 65 28 20 6e 46 69 6e 21 3d 30 20 26 26 20 69 46  e( nFin!=0 && iF
11060 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20 20  reePg>nFin );.  
11070 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72 65      assert( iFre
11080 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a 20  ePg<iLastPg );. 
11090 20 20 20 20 20 0a 20 20 20 20 20 20 72 63 20 3d       .      rc =
110a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
110b0 74 65 28 70 4c 61 73 74 50 67 2d 3e 70 44 62 50  te(pLastPg->pDbP
110c0 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  age);.      if( 
110d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
110e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65  .        rc = re
110f0 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
11100 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c 20  pLastPg, eType, 
11110 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65 50  iPtrPage, iFreeP
11120 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
11130 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4c    releasePage(pL
11140 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 69 66  astPg);.      if
11150 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11160 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
11170 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
11180 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 42 74 2d 3e    }.  }..  pBt->
11190 6e 54 72 75 6e 63 20 3d 20 69 4c 61 73 74 50 67  nTrunc = iLastPg
111a0 20 2d 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 70   - 1;.  while( p
111b0 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 50 45 4e 44  Bt->nTrunc==PEND
111c0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
111d0 74 29 7c 7c 50 54 52 4d 41 50 5f 49 53 50 41 47  t)||PTRMAP_ISPAG
111e0 45 28 70 42 74 2c 20 70 42 74 2d 3e 6e 54 72 75  E(pBt, pBt->nTru
111f0 6e 63 29 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  nc) ){.    pBt->
11200 6e 54 72 75 6e 63 2d 2d 3b 0a 20 20 7d 0a 20 20  nTrunc--;.  }.  
11210 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
11220 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69  ;.}../*.** A wri
11230 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
11240 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65  ust be opened be
11250 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69  fore calling thi
11260 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49  s function..** I
11270 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e  t performs a sin
11280 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b  gle unit of work
11290 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72   towards an incr
112a0 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a  emental vacuum..
112b0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63  **.** If the inc
112c0 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
112d0 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74 65  is finished afte
112e0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
112f0 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49  has run,.** SQLI
11300 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72  TE_DONE is retur
11310 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ned. If it is no
11320 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20  t finished, but 
11330 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  no error occured
11340 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ,.** SQLITE_OK i
11350 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
11360 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65 20  rwise an SQLite 
11370 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a  error code. .*/.
11380 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
11390 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65 65  IncrVacuum(Btree
113a0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
113b0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
113c0 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c  = p->pBt;..  sql
113d0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
113e0 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70  );.  pBt->db = p
113f0 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
11400 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
11410 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  on==TRANS_WRITE 
11420 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
11430 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20  RANS_WRITE );.  
11440 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56 61  if( !pBt->autoVa
11450 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d  cuum ){.    rc =
11460 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
11470 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 76 61 6c  }else{.    inval
11480 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77  idateAllOverflow
11490 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20 20  Cache(pBt);.    
114a0 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53  rc = incrVacuumS
114b0 74 65 70 28 70 42 74 2c 20 30 29 3b 0a 20 20 7d  tep(pBt, 0);.  }
114c0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
114d0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
114e0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
114f0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
11500 61 6c 6c 65 64 20 70 72 69 6f 72 20 74 6f 20 73  alled prior to s
11510 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
11520 74 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63  t when a transac
11530 74 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69  tion.** is commi
11540 74 65 64 20 66 6f 72 20 61 6e 20 61 75 74 6f 2d  ted for an auto-
11550 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 2e  vacuum database.
11560 0a 2a 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  .**.** If SQLITE
11570 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2c  _OK is returned,
11580 20 74 68 65 6e 20 2a 70 6e 54 72 75 6e 63 20 69   then *pnTrunc i
11590 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
115a0 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20  ber of pages.** 
115b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
115c0 65 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 6e  e should be trun
115d0 63 61 74 65 64 20 74 6f 20 64 75 72 69 6e 67 20  cated to during 
115e0 74 68 65 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65  the commit proce
115f0 73 73 2e 20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65  ss. .** i.e. the
11600 20 64 61 74 61 62 61 73 65 20 68 61 73 20 62 65   database has be
11610 65 6e 20 72 65 6f 72 67 61 6e 69 7a 65 64 20 73  en reorganized s
11620 6f 20 74 68 61 74 20 6f 6e 6c 79 20 74 68 65 20  o that only the 
11630 66 69 72 73 74 20 2a 70 6e 54 72 75 6e 63 0a 2a  first *pnTrunc.*
11640 2a 20 70 61 67 65 73 20 61 72 65 20 69 6e 20 75  * pages are in u
11650 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
11660 74 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  t autoVacuumComm
11670 69 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  it(BtShared *pBt
11680 2c 20 50 67 6e 6f 20 2a 70 6e 54 72 75 6e 63 29  , Pgno *pnTrunc)
11690 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
116a0 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20  ITE_OK;.  Pager 
116b0 2a 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  *pPager = pBt->p
116c0 50 61 67 65 72 3b 0a 23 69 66 6e 64 65 66 20 4e  Pager;.#ifndef N
116d0 44 45 42 55 47 0a 20 20 69 6e 74 20 6e 52 65 66  DEBUG.  int nRef
116e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
116f0 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  efcount(pPager);
11700 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
11710 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
11720 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
11730 29 20 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74  ) );.  invalidat
11740 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
11750 65 28 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74  e(pBt);.  assert
11760 28 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  (pBt->autoVacuum
11770 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69  );.  if( !pBt->i
11780 6e 63 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  ncrVacuum ){.   
11790 20 50 67 6e 6f 20 6e 46 69 6e 20 3d 20 30 3b 0a   Pgno nFin = 0;.
117a0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54  .    if( pBt->nT
117b0 72 75 6e 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  runc==0 ){.     
117c0 20 50 67 6e 6f 20 6e 46 72 65 65 3b 0a 20 20 20   Pgno nFree;.   
117d0 20 20 20 50 67 6e 6f 20 6e 50 74 72 6d 61 70 3b     Pgno nPtrmap;
117e0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  .      const int
117f0 20 70 67 73 7a 20 3d 20 70 42 74 2d 3e 70 61 67   pgsz = pBt->pag
11800 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 69 6e 74  eSize;.      int
11810 20 6e 4f 72 69 67 20 3d 20 70 61 67 65 72 50 61   nOrig = pagerPa
11820 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
11830 67 65 72 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  ger);..      if(
11840 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70   PTRMAP_ISPAGE(p
11850 42 74 2c 20 6e 4f 72 69 67 29 20 29 7b 0a 20 20  Bt, nOrig) ){.  
11860 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
11870 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
11880 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11890 69 66 28 20 6e 4f 72 69 67 3d 3d 50 45 4e 44 49  if( nOrig==PENDI
118a0 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
118b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 4f 72  ) ){.        nOr
118c0 69 67 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ig--;.      }.  
118d0 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34      nFree = get4
118e0 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
118f0 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
11900 20 20 20 20 20 6e 50 74 72 6d 61 70 20 3d 20 28       nPtrmap = (
11910 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d  nFree-nOrig+PTRM
11920 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e  AP_PAGENO(pBt, n
11930 4f 72 69 67 29 2b 70 67 73 7a 2f 35 29 2f 28 70  Orig)+pgsz/5)/(p
11940 67 73 7a 2f 35 29 3b 0a 20 20 20 20 20 20 6e 46  gsz/5);.      nF
11950 69 6e 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72  in = nOrig - nFr
11960 65 65 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20  ee - nPtrmap;.  
11970 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3e 50 45      if( nOrig>PE
11980 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
11990 70 42 74 29 20 26 26 20 6e 46 69 6e 3c 3d 50 45  pBt) && nFin<=PE
119a0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
119b0 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pBt) ){.        
119c0 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a  nFin--;.      }.
119d0 20 20 20 20 20 20 77 68 69 6c 65 28 20 50 54 52        while( PTR
119e0 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
119f0 6e 46 69 6e 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50  nFin) || nFin==P
11a00 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
11a10 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  (pBt) ){.       
11a20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d   nFin--;.      }
11a30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77 68 69 6c  .    }..    whil
11a40 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
11a50 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 69   ){.      rc = i
11a60 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 70 42  ncrVacuumStep(pB
11a70 74 2c 20 6e 46 69 6e 29 3b 0a 20 20 20 20 7d 0a  t, nFin);.    }.
11a80 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
11a90 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
11aa0 20 61 73 73 65 72 74 28 6e 46 69 6e 3d 3d 30 20   assert(nFin==0 
11ab0 7c 7c 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d  || pBt->nTrunc==
11ac0 30 20 7c 7c 20 6e 46 69 6e 3c 3d 70 42 74 2d 3e  0 || nFin<=pBt->
11ad0 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20 20 20 72  nTrunc);.      r
11ae0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
11af0 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54       if( pBt->nT
11b00 72 75 6e 63 20 26 26 20 6e 46 69 6e 20 29 7b 0a  runc && nFin ){.
11b10 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
11b20 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
11b30 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
11b40 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 75  age);.        pu
11b50 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
11b60 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
11b70 30 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34  0);.        put4
11b80 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
11b90 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 30 29  1->aData[36], 0)
11ba0 3b 0a 20 20 20 20 20 20 20 20 70 42 74 2d 3e 6e  ;.        pBt->n
11bb0 54 72 75 6e 63 20 3d 20 6e 46 69 6e 3b 0a 20 20  Trunc = nFin;.  
11bc0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
11bd0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11be0 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
11bf0 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
11c00 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
11c10 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   }..  if( rc==SQ
11c20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a  LITE_OK ){.    *
11c30 70 6e 54 72 75 6e 63 20 3d 20 70 42 74 2d 3e 6e  pnTrunc = pBt->n
11c40 54 72 75 6e 63 3b 0a 20 20 20 20 70 42 74 2d 3e  Trunc;.    pBt->
11c50 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 20 20 7d 0a  nTrunc = 0;.  }.
11c60 20 20 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d    assert( nRef==
11c70 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
11c80 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a  ount(pPager) );.
11c90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
11ca0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
11cb0 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
11cc0 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
11cd0 6f 66 20 61 20 74 77 6f 2d 70 68 61 73 65 20 63  of a two-phase c
11ce0 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20 72 6f 75  ommit.  This rou
11cf0 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65 73 20 61  tine.** causes a
11d00 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
11d10 6c 20 74 6f 20 62 65 20 63 72 65 61 74 65 64 20  l to be created 
11d20 28 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  (if it does not 
11d30 61 6c 72 65 61 64 79 20 65 78 69 73 74 29 0a 2a  already exist).*
11d40 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74 65 64 20  * and populated 
11d50 77 69 74 68 20 65 6e 6f 75 67 68 20 69 6e 66 6f  with enough info
11d60 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20  rmation so that 
11d70 69 66 20 61 20 70 6f 77 65 72 20 6c 6f 73 73 20  if a power loss 
11d80 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65 20 64 61  occurs.** the da
11d90 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 72 65  tabase can be re
11da0 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
11db0 69 67 69 6e 61 6c 20 73 74 61 74 65 20 62 79 20  iginal state by 
11dc0 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a 2a 2a 20  playing back.** 
11dd0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  the journal.  Th
11de0 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  en the contents 
11df0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
11e00 72 65 20 66 6c 75 73 68 65 64 20 6f 75 74 20 74  re flushed out t
11e10 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b 2e 20 20  o.** the disk.  
11e20 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61  After the journa
11e30 6c 20 69 73 20 73 61 66 65 6c 79 20 6f 6e 20 6f  l is safely on o
11e40 78 69 64 65 2c 20 74 68 65 20 63 68 61 6e 67 65  xide, the change
11e50 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64 61 74 61  s to the.** data
11e60 62 61 73 65 20 61 72 65 20 77 72 69 74 74 65 6e  base are written
11e70 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
11e80 73 65 20 66 69 6c 65 20 61 6e 64 20 66 6c 75 73  se file and flus
11e90 68 65 64 20 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a  hed to oxide..**
11ea0 20 41 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   At the end of t
11eb0 68 69 73 20 63 61 6c 6c 2c 20 74 68 65 20 72 6f  his call, the ro
11ec0 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 73  llback journal s
11ed0 74 69 6c 6c 20 65 78 69 73 74 73 20 6f 6e 20 74  till exists on t
11ee0 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 77  he.** disk and w
11ef0 65 20 61 72 65 20 73 74 69 6c 6c 20 68 6f 6c 64  e are still hold
11f00 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73  ing all locks, s
11f10 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
11f20 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d  n has not.** com
11f30 6d 69 74 74 65 64 2e 20 20 53 65 65 20 73 71 6c  mitted.  See sql
11f40 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28  ite3BtreeCommit(
11f50 29 20 66 6f 72 20 74 68 65 20 73 65 63 6f 6e 64  ) for the second
11f60 20 70 68 61 73 65 20 6f 66 20 74 68 65 0a 2a 2a   phase of the.**
11f70 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e   commit process.
11f80 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 61 6c 6c  .**.** This call
11f90 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 6e   is a no-op if n
11fa0 6f 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  o write-transact
11fb0 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ion is currently
11fc0 20 61 63 74 69 76 65 20 6f 6e 20 70 42 74 2e 0a   active on pBt..
11fd0 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
11fe0 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
11ff0 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  se file for the 
12000 62 74 72 65 65 20 70 42 74 2e 20 7a 4d 61 73 74  btree pBt. zMast
12010 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20  er points to.** 
12020 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
12030 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
12040 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
12050 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
12060 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75 61 6c 20  e.** individual 
12070 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 6f 72  journal file, or
12080 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64 69 63 61   is NULL, indica
12090 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65 72 20 6a  ting no master j
120a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20  ournal file .** 
120b0 28 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65  (single database
120c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a   transaction)..*
120d0 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69  *.** When this i
120e0 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6d 61  s called, the ma
120f0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 73 68 6f  ster journal sho
12100 75 6c 64 20 61 6c 72 65 61 64 79 20 68 61 76 65  uld already have
12110 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61 74 65 64   been.** created
12120 2c 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  , populated with
12130 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 70 6f   this journal po
12140 69 6e 74 65 72 20 61 6e 64 20 73 79 6e 63 65 64  inter and synced
12150 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20   to disk..**.** 
12160 4f 6e 63 65 20 74 68 69 73 20 69 73 20 72 6f 75  Once this is rou
12170 74 69 6e 65 20 68 61 73 20 72 65 74 75 72 6e 65  tine has returne
12180 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74 68 69 6e  d, the only thin
12190 67 20 72 65 71 75 69 72 65 64 20 74 6f 20 63 6f  g required to co
121a0 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77 72 69 74  mmit.** the writ
121b0 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 66 6f  e-transaction fo
121c0 72 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  r this database 
121d0 66 69 6c 65 20 69 73 20 74 6f 20 64 65 6c 65 74  file is to delet
121e0 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  e the journal..*
121f0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
12200 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65  eeCommitPhaseOne
12210 28 42 74 72 65 65 20 2a 70 2c 20 63 6f 6e 73 74  (Btree *p, const
12220 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
12230 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
12240 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e  TE_OK;.  if( p->
12250 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
12260 52 49 54 45 20 29 7b 0a 20 20 20 20 42 74 53 68  RITE ){.    BtSh
12270 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
12280 42 74 3b 0a 20 20 20 20 50 67 6e 6f 20 6e 54 72  Bt;.    Pgno nTr
12290 75 6e 63 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  unc = 0;.    sql
122a0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
122b0 29 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d  );.    pBt->db =
122c0 20 70 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20   p->db;.#ifndef 
122d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
122e0 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
122f0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
12300 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75 74  {.      rc = aut
12310 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42  oVacuumCommit(pB
12320 74 2c 20 26 6e 54 72 75 6e 63 29 3b 20 0a 20 20  t, &nTrunc); .  
12330 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12340 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
12350 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
12360 76 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72  ve(p);.        r
12370 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
12380 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
12390 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
123a0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
123b0 6e 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ne(pBt->pPager, 
123c0 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63 2c  zMaster, nTrunc,
123d0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
123e0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
123f0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
12400 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20  }../*.** Commit 
12410 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
12420 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f  currently in pro
12430 67 72 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  gress..**.** Thi
12440 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d  s routine implem
12450 65 6e 74 73 20 74 68 65 20 73 65 63 6f 6e 64 20  ents the second 
12460 70 68 61 73 65 20 6f 66 20 61 20 32 2d 70 68 61  phase of a 2-pha
12470 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a  se commit.  The.
12480 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  ** sqlite3BtreeS
12490 79 6e 63 28 29 20 72 6f 75 74 69 6e 65 20 64 6f  ync() routine do
124a0 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
124b0 73 65 20 61 6e 64 20 73 68 6f 75 6c 64 20 62 65  se and should be
124c0 20 69 6e 76 6f 6b 65 64 0a 2a 2a 20 70 72 69 6f   invoked.** prio
124d0 72 20 74 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69  r to calling thi
124e0 73 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 65 20  s routine.  The 
124f0 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63  sqlite3BtreeSync
12500 28 29 20 72 6f 75 74 69 6e 65 20 64 69 64 0a 2a  () routine did.*
12510 2a 20 61 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f  * all the work o
12520 66 20 77 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d  f writing inform
12530 61 74 69 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73  ation out to dis
12540 6b 20 61 6e 64 20 66 6c 75 73 68 69 6e 67 20 74  k and flushing t
12550 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73  he.** contents s
12560 6f 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20  o that they are 
12570 77 72 69 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65  written onto the
12580 20 64 69 73 6b 20 70 6c 61 74 74 65 72 2e 20 20   disk platter.  
12590 41 6c 6c 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74  All this.** rout
125a0 69 6e 65 20 68 61 73 20 74 6f 20 64 6f 20 69 73  ine has to do is
125b0 20 64 65 6c 65 74 65 20 6f 72 20 74 72 75 6e 63   delete or trunc
125c0 61 74 65 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  ate the rollback
125d0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 28 77 68 69   journal.** (whi
125e0 63 68 20 63 61 75 73 65 73 20 74 68 65 20 74 72  ch causes the tr
125f0 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d  ansaction to com
12600 6d 69 74 29 20 61 6e 64 20 64 72 6f 70 20 6c 6f  mit) and drop lo
12610 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  cks..**.** This 
12620 77 69 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65  will release the
12630 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74   write lock on t
12640 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
12650 2e 20 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61  .  If there.** a
12660 72 65 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72  re no active cur
12670 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65  sors, it also re
12680 6c 65 61 73 65 73 20 74 68 65 20 72 65 61 64 20  leases the read 
12690 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lock..*/.int sql
126a0 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50  ite3BtreeCommitP
126b0 68 61 73 65 54 77 6f 28 42 74 72 65 65 20 2a 70  haseTwo(Btree *p
126c0 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
126d0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
126e0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
126f0 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20  r(p);.  pBt->db 
12700 3d 20 70 2d 3e 64 62 3b 0a 20 20 62 74 72 65 65  = p->db;.  btree
12710 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
12720 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
12730 65 20 68 61 73 20 61 20 77 72 69 74 65 2d 74 72  e has a write-tr
12740 61 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20  ansaction open, 
12750 63 6f 6d 6d 69 74 20 74 68 65 20 73 68 61 72 65  commit the share
12760 64 2d 62 74 72 65 65 73 20 0a 20 20 2a 2a 20 74  d-btrees .  ** t
12770 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 73  ransaction and s
12780 65 74 20 74 68 65 20 73 68 61 72 65 64 20 73 74  et the shared st
12790 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 52 45 41  ate to TRANS_REA
127a0 44 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  D..  */.  if( p-
127b0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
127c0 57 52 49 54 45 20 29 7b 0a 20 20 20 20 69 6e 74  WRITE ){.    int
127d0 20 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28   rc;.    assert(
127e0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
127f0 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
12800 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
12810 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
12820 6e 3e 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  n>0 );.    rc = 
12830 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
12840 69 74 50 68 61 73 65 54 77 6f 28 70 42 74 2d 3e  itPhaseTwo(pBt->
12850 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
12860 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12870 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  {.      sqlite3B
12880 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
12890 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
128a0 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e     }.    pBt->in
128b0 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
128c0 41 4e 53 5f 52 45 41 44 3b 0a 20 20 20 20 70 42  ANS_READ;.    pB
128d0 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  t->inStmt = 0;. 
128e0 20 7d 0a 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61   }.  unlockAllTa
128f0 62 6c 65 73 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  bles(p);..  /* I
12900 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61 73  f the handle has
12910 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 74 72 61   any kind of tra
12920 6e 73 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 64  nsaction open, d
12930 65 63 72 65 6d 65 6e 74 20 74 68 65 20 74 72 61  ecrement the tra
12940 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f  nsaction.  ** co
12950 75 6e 74 20 6f 66 20 74 68 65 20 73 68 61 72 65  unt of the share
12960 64 20 62 74 72 65 65 2e 20 49 66 20 74 68 65 20  d btree. If the 
12970 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 75 6e  transaction coun
12980 74 20 72 65 61 63 68 65 73 20 30 2c 20 73 65 74  t reaches 0, set
12990 0a 20 20 2a 2a 20 74 68 65 20 73 68 61 72 65 64  .  ** the shared
129a0 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f   state to TRANS_
129b0 4e 4f 4e 45 2e 20 54 68 65 20 75 6e 6c 6f 63 6b  NONE. The unlock
129c0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 29 20  BtreeIfUnused() 
129d0 63 61 6c 6c 20 62 65 6c 6f 77 0a 20 20 2a 2a 20  call below.  ** 
129e0 77 69 6c 6c 20 75 6e 6c 6f 63 6b 20 74 68 65 20  will unlock the 
129f0 70 61 67 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  pager..  */.  if
12a00 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  ( p->inTrans!=TR
12a10 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
12a20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
12a30 6e 2d 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  n--;.    if( 0==
12a40 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
12a50 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  n ){.      pBt->
12a60 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
12a70 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
12a80 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20  }.  }..  /* Set 
12a90 74 68 65 20 68 61 6e 64 6c 65 73 20 63 75 72 72  the handles curr
12aa0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
12ab0 73 74 61 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e  state to TRANS_N
12ac0 4f 4e 45 20 61 6e 64 20 75 6e 6c 6f 63 6b 0a 20  ONE and unlock. 
12ad0 20 2a 2a 20 74 68 65 20 70 61 67 65 72 20 69 66   ** the pager if
12ae0 20 74 68 69 73 20 63 61 6c 6c 20 63 6c 6f 73 65   this call close
12af0 64 20 74 68 65 20 6f 6e 6c 79 20 72 65 61 64 20  d the only read 
12b00 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
12b10 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e  tion..  */.  p->
12b20 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f  inTrans = TRANS_
12b30 4e 4f 4e 45 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74  NONE;.  unlockBt
12b40 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
12b50 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  ;..  btreeIntegr
12b60 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ity(p);.  sqlite
12b70 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
12b80 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12b90 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  OK;.}../*.** Do 
12ba0 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66 20 61  both phases of a
12bb0 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20   commit..*/.int 
12bc0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
12bd0 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  it(Btree *p){.  
12be0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
12bf0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
12c00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
12c10 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  reeCommitPhaseOn
12c20 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  e(p, 0);.  if( r
12c30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
12c40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
12c50 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
12c60 54 77 6f 28 70 29 3b 0a 20 20 7d 0a 20 20 73 71  Two(p);.  }.  sq
12c70 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
12c80 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
12c90 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .}..#ifndef NDEB
12ca0 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  UG./*.** Return 
12cb0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 72  the number of wr
12cc0 69 74 65 2d 63 75 72 73 6f 72 73 20 6f 70 65 6e  ite-cursors open
12cd0 20 6f 6e 20 74 68 69 73 20 68 61 6e 64 6c 65 2e   on this handle.
12ce0 20 54 68 69 73 20 69 73 20 66 6f 72 20 75 73 65   This is for use
12cf0 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28 29 20  .** in assert() 
12d00 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73 6f 20  expressions, so 
12d10 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d 70 69  it is only compi
12d20 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20 69 73  led if NDEBUG is
12d30 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65 64 2e   not.** defined.
12d40 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70  .**.** For the p
12d50 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20  urposes of this 
12d60 72 6f 75 74 69 6e 65 2c 20 61 20 77 72 69 74 65  routine, a write
12d70 2d 63 75 72 73 6f 72 20 69 73 20 61 6e 79 20 63  -cursor is any c
12d80 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20 69 73  ursor that.** is
12d90 20 63 61 70 61 62 6c 65 20 6f 66 20 77 72 69 74   capable of writ
12da0 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
12db0 73 65 2e 20 20 54 68 61 74 20 6d 65 61 6e 73 20  se.  That means 
12dc0 74 68 65 20 63 75 72 73 6f 72 20 77 61 73 0a 2a  the cursor was.*
12dd0 2a 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f 70 65  * originally ope
12de0 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 20  ned for writing 
12df0 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 68  and the cursor h
12e00 61 73 20 6e 6f 74 20 62 65 20 64 69 73 61 62 6c  as not be disabl
12e10 65 64 0a 2a 2a 20 62 79 20 68 61 76 69 6e 67 20  ed.** by having 
12e20 69 74 73 20 73 74 61 74 65 20 63 68 61 6e 67 65  its state change
12e30 64 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c  d to CURSOR_FAUL
12e40 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  T..*/.static int
12e50 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f   countWriteCurso
12e60 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  rs(BtShared *pBt
12e70 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
12e80 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d 20 30  Cur;.  int r = 0
12e90 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70 42 74  ;.  for(pCur=pBt
12ea0 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75 72 3b  ->pCursor; pCur;
12eb0 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e 65 78   pCur=pCur->pNex
12ec0 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72  t){.    if( pCur
12ed0 2d 3e 77 72 46 6c 61 67 20 26 26 20 70 43 75 72  ->wrFlag && pCur
12ee0 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
12ef0 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20 0a 20  _FAULT ) r++; . 
12f00 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b 0a 7d   }.  return r;.}
12f10 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
12f20 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
12f30 20 74 68 65 20 73 74 61 74 65 20 74 6f 20 43 55   the state to CU
12f40 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64 20 74  RSOR_FAULT and t
12f50 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  he error.** code
12f60 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f 72 20   to errCode for 
12f70 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f 6e 20  every cursor on 
12f80 42 74 53 68 61 72 65 64 20 74 68 61 74 20 70 42  BtShared that pB
12f90 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63  tree.** referenc
12fa0 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72 79 20  es..**.** Every 
12fb0 63 75 72 73 6f 72 20 69 73 20 74 72 69 70 70 65  cursor is trippe
12fc0 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 75 72  d, including cur
12fd0 73 6f 72 73 20 74 68 61 74 20 62 65 6c 6f 6e 67  sors that belong
12fe0 0a 2a 2a 20 74 6f 20 6f 74 68 65 72 20 64 61 74  .** to other dat
12ff0 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
13000 73 20 74 68 61 74 20 68 61 70 70 65 6e 20 74 6f  s that happen to
13010 20 62 65 20 73 68 61 72 69 6e 67 0a 2a 2a 20 74   be sharing.** t
13020 68 65 20 63 61 63 68 65 20 77 69 74 68 20 70 42  he cache with pB
13030 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  tree..**.** This
13040 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61   routine gets ca
13050 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f 6c 6c  lled when a roll
13060 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a 2a 2a 20  back occurs..** 
13070 41 6c 6c 20 63 75 72 73 6f 72 73 20 75 73 69 6e  All cursors usin
13080 67 20 74 68 65 20 73 61 6d 65 20 63 61 63 68 65  g the same cache
13090 20 6d 75 73 74 20 62 65 20 74 72 69 70 70 65 64   must be tripped
130a0 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74 20 74  .** to prevent t
130b0 68 65 6d 20 66 72 6f 6d 20 74 72 79 69 6e 67 20  hem from trying 
130c0 74 6f 20 75 73 65 20 74 68 65 20 62 74 72 65 65  to use the btree
130d0 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 72 6f   after.** the ro
130e0 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 72 6f 6c  llback.  The rol
130f0 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64  lback may have d
13100 65 6c 65 74 65 64 20 74 61 62 6c 65 73 0a 2a 2a  eleted tables.**
13110 20 6f 72 20 6d 6f 76 65 64 20 72 6f 6f 74 20 70   or moved root p
13120 61 67 65 73 2c 20 73 6f 20 69 74 20 69 73 20 6e  ages, so it is n
13130 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f  ot sufficient to
13140 0a 2a 2a 20 73 61 76 65 20 74 68 65 20 73 74 61  .** save the sta
13150 74 65 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72  te of the cursor
13160 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75  .  The cursor mu
13170 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  st be.** invalid
13180 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  ated..*/.void sq
13190 6c 69 74 65 33 42 74 72 65 65 54 72 69 70 41 6c  lite3BtreeTripAl
131a0 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65 20 2a  lCursors(Btree *
131b0 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72 72 43  pBtree, int errC
131c0 6f 64 65 29 7b 0a 20 20 42 74 43 75 72 73 6f 72  ode){.  BtCursor
131d0 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   *p;.  sqlite3Bt
131e0 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29  reeEnter(pBtree)
131f0 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72 65 65  ;.  for(p=pBtree
13200 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  ->pBt->pCursor; 
13210 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
13220 20 20 20 20 63 6c 65 61 72 43 75 72 73 6f 72 50      clearCursorP
13230 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20 20 20 20  osition(p);.    
13240 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  p->eState = CURS
13250 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70 2d  OR_FAULT;.    p-
13260 3e 73 6b 69 70 20 3d 20 65 72 72 43 6f 64 65 3b  >skip = errCode;
13270 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
13280 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
13290 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
132a0 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  ack the transact
132b0 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  ion in progress.
132c0 20 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69    All cursors wi
132d0 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  ll be.** invalid
132e0 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61  ed by this opera
132f0 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d  tion.  Any attem
13300 70 74 20 74 6f 20 75 73 65 20 61 20 63 75 72 73  pt to use a curs
13310 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 6f  or.** that was o
13320 70 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e  pen at the begin
13330 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65  ning of this ope
13340 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75  ration will resu
13350 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f  lt.** in an erro
13360 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69  r..**.** This wi
13370 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  ll release the w
13380 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
13390 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
133a0 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   If there.** are
133b0 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f   no active curso
133c0 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65  rs, it also rele
133d0 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f  ases the read lo
133e0 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ck..*/.int sqlit
133f0 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
13400 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
13410 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
13420 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
13430 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
13440 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
13450 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
13460 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
13470 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
13480 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
13490 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
134a0 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
134b0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
134c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54  E_OK ){.    /* T
134d0 68 69 73 20 69 73 20 61 20 68 6f 72 72 69 62 6c  his is a horribl
134e0 65 20 73 69 74 75 61 74 69 6f 6e 2e 20 41 6e 20  e situation. An 
134f0 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65  IO or malloc() e
13500 72 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68 69  rror occured whi
13510 6c 73 74 0a 20 20 20 20 2a 2a 20 74 72 79 69 6e  lst.    ** tryin
13520 67 20 74 6f 20 73 61 76 65 20 63 75 72 73 6f 72  g to save cursor
13530 20 70 6f 73 69 74 69 6f 6e 73 2e 20 49 66 20 74   positions. If t
13540 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 6d 61  his is an automa
13550 74 69 63 20 72 6f 6c 6c 62 61 63 6b 20 28 61 73  tic rollback (as
13560 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 73 75  .    ** the resu
13570 6c 74 20 6f 66 20 61 20 63 6f 6e 73 74 72 61 69  lt of a constrai
13580 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  nt, malloc() fai
13590 6c 75 72 65 20 6f 72 20 49 4f 20 65 72 72 6f 72  lure or IO error
135a0 29 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74  ) then .    ** t
135b0 68 65 20 63 61 63 68 65 20 6d 61 79 20 62 65 20  he cache may be 
135c0 69 6e 74 65 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e  internally incon
135d0 73 69 73 74 65 6e 74 20 28 6e 6f 74 20 63 6f 6e  sistent (not con
135e0 74 61 69 6e 20 76 61 6c 69 64 20 74 72 65 65 73  tain valid trees
135f0 29 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20 63  ) so.    ** we c
13600 61 6e 6e 6f 74 20 73 69 6d 70 6c 79 20 72 65 74  annot simply ret
13610 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 74 6f  urn the error to
13620 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 49 6e 73   the caller. Ins
13630 74 65 61 64 2c 20 61 62 6f 72 74 20 0a 20 20 20  tead, abort .   
13640 20 2a 2a 20 61 6c 6c 20 71 75 65 72 69 65 73 20   ** all queries 
13650 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 69 6e  that may be usin
13660 67 20 61 6e 79 20 6f 66 20 74 68 65 20 63 75 72  g any of the cur
13670 73 6f 72 73 20 74 68 61 74 20 66 61 69 6c 65 64  sors that failed
13680 20 74 6f 20 73 61 76 65 2e 0a 20 20 20 20 2a 2f   to save..    */
13690 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
136a0 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28  eTripAllCursors(
136b0 70 2c 20 72 63 29 3b 0a 20 20 7d 0a 23 65 6e 64  p, rc);.  }.#end
136c0 69 66 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  if.  btreeIntegr
136d0 69 74 79 28 70 29 3b 0a 20 20 75 6e 6c 6f 63 6b  ity(p);.  unlock
136e0 41 6c 6c 54 61 62 6c 65 73 28 70 29 3b 0a 0a 20  AllTables(p);.. 
136f0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
13700 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
13710 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 23 69      int rc2;..#i
13720 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13730 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
13740 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 30   pBt->nTrunc = 0
13750 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 61 73  ;.#endif..    as
13760 73 65 72 74 28 20 54 52 41 4e 53 5f 57 52 49 54  sert( TRANS_WRIT
13770 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  E==pBt->inTransa
13780 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20 72 63 32  ction );.    rc2
13790 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 52   = sqlite3PagerR
137a0 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70 50 61  ollback(pBt->pPa
137b0 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
137c0 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  2!=SQLITE_OK ){.
137d0 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
137e0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68      }..    /* Th
137f0 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68  e rollback may h
13800 61 76 65 20 64 65 73 74 72 6f 79 65 64 20 74 68  ave destroyed th
13810 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  e pPage1->aData 
13820 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20 20 20 2a  value.  So.    *
13830 2a 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 42 74  * call sqlite3Bt
13840 72 65 65 47 65 74 50 61 67 65 28 29 20 6f 6e 20  reeGetPage() on 
13850 70 61 67 65 20 31 20 61 67 61 69 6e 20 74 6f 20  page 1 again to 
13860 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72 65  make.    ** sure
13870 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20 69   pPage1->aData i
13880 73 20 73 65 74 20 63 6f 72 72 65 63 74 6c 79 2e  s set correctly.
13890 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69   */.    if( sqli
138a0 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
138b0 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
138c0 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   0)==SQLITE_OK )
138d0 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
138e0 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20  age(pPage1);.   
138f0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63   }.    assert( c
13900 6f 75 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73  ountWriteCursors
13910 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20 20 20 20  (pBt)==0 );.    
13920 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
13930 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b  on = TRANS_READ;
13940 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 69  .  }..  if( p->i
13950 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f  nTrans!=TRANS_NO
13960 4e 45 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  NE ){.    assert
13970 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ( pBt->nTransact
13980 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20 70 42 74  ion>0 );.    pBt
13990 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d  ->nTransaction--
139a0 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74  ;.    if( 0==pBt
139b0 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  ->nTransaction )
139c0 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54  {.      pBt->inT
139d0 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41  ransaction = TRA
139e0 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  NS_NONE;.    }. 
139f0 20 7d 0a 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73   }..  p->inTrans
13a00 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
13a10 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30   pBt->inStmt = 0
13a20 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  ;.  unlockBtreeI
13a30 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a 20  fUnused(pBt);.. 
13a40 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
13a50 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
13a60 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
13a70 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
13a80 2a 20 53 74 61 72 74 20 61 20 73 74 61 74 65 6d  * Start a statem
13a90 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
13aa0 6f 6e 2e 20 20 54 68 65 20 73 75 62 74 72 61 6e  on.  The subtran
13ab0 73 61 63 74 69 6f 6e 20 63 61 6e 0a 2a 2a 20 63  saction can.** c
13ac0 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  an be rolled bac
13ad0 6b 20 69 6e 64 65 70 65 6e 64 65 6e 74 6c 79 20  k independently 
13ae0 6f 66 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e  of the main tran
13af0 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 59 6f 75 20  saction..** You 
13b00 6d 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61  must start a tra
13b10 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20  nsaction before 
13b20 73 74 61 72 74 69 6e 67 20 61 20 73 75 62 74 72  starting a subtr
13b30 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68  ansaction..** Th
13b40 65 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  e subtransaction
13b50 20 69 73 20 65 6e 64 65 64 20 61 75 74 6f 6d 61   is ended automa
13b60 74 69 63 61 6c 6c 79 20 69 66 20 74 68 65 20 6d  tically if the m
13b70 61 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ain transaction.
13b80 2a 2a 20 63 6f 6d 6d 69 74 73 20 6f 72 20 72 6f  ** commits or ro
13b90 6c 6c 73 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  lls back..**.** 
13ba0 4f 6e 6c 79 20 6f 6e 65 20 73 75 62 74 72 61 6e  Only one subtran
13bb0 73 61 63 74 69 6f 6e 20 6d 61 79 20 62 65 20 61  saction may be a
13bc0 63 74 69 76 65 20 61 74 20 61 20 74 69 6d 65 2e  ctive at a time.
13bd0 20 20 49 74 20 69 73 20 61 6e 20 65 72 72 6f 72    It is an error
13be0 20 74 6f 20 74 72 79 0a 2a 2a 20 74 6f 20 73 74   to try.** to st
13bf0 61 72 74 20 61 20 6e 65 77 20 73 75 62 74 72 61  art a new subtra
13c00 6e 73 61 63 74 69 6f 6e 20 69 66 20 61 6e 6f 74  nsaction if anot
13c10 68 65 72 20 73 75 62 74 72 61 6e 73 61 63 74 69  her subtransacti
13c20 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61 63  on is already ac
13c30 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74  tive..**.** Stat
13c40 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63  ement subtransac
13c50 74 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61  tions are used a
13c60 72 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c  round individual
13c70 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a   SQL statements.
13c80 2a 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74  ** that are cont
13c90 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42  ained within a B
13ca0 45 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c  EGIN...COMMIT bl
13cb0 6f 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74  ock.  If a const
13cc0 72 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f  raint.** error o
13cd0 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
13ce0 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
13cf0 65 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f  effect of that o
13d00 6e 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20  ne statement.** 
13d10 63 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  can be rolled ba
13d20 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  ck without havin
13d30 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68  g to rollback th
13d40 65 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63  e entire transac
13d50 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
13d60 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 53 74  ite3BtreeBeginSt
13d70 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  mt(Btree *p){.  
13d80 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
13d90 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
13da0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
13db0 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d  Enter(p);.  pBt-
13dc0 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  >db = p->db;.  i
13dd0 66 28 20 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d  f( (p->inTrans!=
13de0 54 52 41 4e 53 5f 57 52 49 54 45 29 20 7c 7c 20  TRANS_WRITE) || 
13df0 70 42 74 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a 20  pBt->inStmt ){. 
13e00 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61     rc = pBt->rea
13e10 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52  dOnly ? SQLITE_R
13e20 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45  EADONLY : SQLITE
13e30 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b  _ERROR;.  }else{
13e40 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
13e50 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
13e60 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
13e70 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65      rc = pBt->re
13e80 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f  adOnly ? SQLITE_
13e90 4f 4b 20 3a 20 73 71 6c 69 74 65 33 50 61 67 65  OK : sqlite3Page
13ea0 72 53 74 6d 74 42 65 67 69 6e 28 70 42 74 2d 3e  rStmtBegin(pBt->
13eb0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 42 74  pPager);.    pBt
13ec0 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 20 20  ->inStmt = 1;.  
13ed0 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
13ee0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
13ef0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
13f00 20 43 6f 6d 6d 69 74 20 74 68 65 20 73 74 61 74   Commit the stat
13f10 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
13f20 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69 6e  ion currently in
13f30 20 70 72 6f 67 72 65 73 73 2e 20 20 49 66 20 6e   progress.  If n
13f40 6f 0a 2a 2a 20 73 75 62 74 72 61 6e 73 61 63 74  o.** subtransact
13f50 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2c 20 74  ion is active, t
13f60 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  his is a no-op..
13f70 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
13f80 72 65 65 43 6f 6d 6d 69 74 53 74 6d 74 28 42 74  reeCommitStmt(Bt
13f90 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ree *p){.  int r
13fa0 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  c;.  BtShared *p
13fb0 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73  Bt = p->pBt;.  s
13fc0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
13fd0 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d  (p);.  pBt->db =
13fe0 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 42   p->db;.  if( pB
13ff0 74 2d 3e 69 6e 53 74 6d 74 20 26 26 20 21 70 42  t->inStmt && !pB
14000 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  t->readOnly ){. 
14010 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
14020 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70  agerStmtCommit(p
14030 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 7d  Bt->pPager);.  }
14040 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53  else{.    rc = S
14050 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
14060 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  pBt->inStmt = 0;
14070 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
14080 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
14090 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
140a0 6f 6c 6c 62 61 63 6b 20 74 68 65 20 61 63 74 69  ollback the acti
140b0 76 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62  ve statement sub
140c0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
140d0 20 6e 6f 20 73 75 62 74 72 61 6e 73 61 63 74 69   no subtransacti
140e0 6f 6e 0a 2a 2a 20 69 73 20 61 63 74 69 76 65 20  on.** is active 
140f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
14100 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 41  a no-op..**.** A
14110 6c 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20  ll cursors will 
14120 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 62  be invalidated b
14130 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
14140 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 0a 2a  .  Any attempt.*
14150 2a 20 74 6f 20 75 73 65 20 61 20 63 75 72 73 6f  * to use a curso
14160 72 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20  r that was open 
14170 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
14180 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   of this operati
14190 6f 6e 0a 2a 2a 20 77 69 6c 6c 20 72 65 73 75 6c  on.** will resul
141a0 74 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  t in an error..*
141b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
141c0 65 65 52 6f 6c 6c 62 61 63 6b 53 74 6d 74 28 42  eeRollbackStmt(B
141d0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
141e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
141f0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
14200 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69  = p->pBt;.  sqli
14210 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
14220 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d  ;.  pBt->db = p-
14230 3e 64 62 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  >db;.  if( pBt->
14240 69 6e 53 74 6d 74 20 26 26 20 21 70 42 74 2d 3e  inStmt && !pBt->
14250 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20  readOnly ){.    
14260 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
14270 72 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 70 42  rStmtRollback(pB
14280 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
14290 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69  assert( countWri
142a0 74 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d  teCursors(pBt)==
142b0 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  0 );.    pBt->in
142c0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Stmt = 0;.  }.  
142d0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
142e0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
142f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
14300 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f 72 20  te a new cursor 
14310 66 6f 72 20 74 68 65 20 42 54 72 65 65 20 77 68  for the BTree wh
14320 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e 20 74  ose root is on t
14330 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61 62 6c  he page.** iTabl
14340 65 2e 20 20 54 68 65 20 61 63 74 20 6f 66 20 61  e.  The act of a
14350 63 71 75 69 72 69 6e 67 20 61 20 63 75 72 73 6f  cquiring a curso
14360 72 20 67 65 74 73 20 61 20 72 65 61 64 20 6c 6f  r gets a read lo
14370 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65 20 64 61  ck on .** the da
14380 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
14390 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 30 2c  ** If wrFlag==0,
143a0 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
143b0 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75 73 65   can only be use
143c0 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 2a  d for reading..*
143d0 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31 2c 20  * If wrFlag==1, 
143e0 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
143f0 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f 72 20  can be used for 
14400 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72 0a 2a  reading or for.*
14410 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f 74 68  * writing if oth
14420 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20 66 6f  er conditions fo
14430 72 20 77 72 69 74 69 6e 67 20 61 72 65 20 61 6c  r writing are al
14440 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65 0a 2a  so met.  These.*
14450 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64 69 74  * are the condit
14460 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74 20 62  ions that must b
14470 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72 20 66  e met in order f
14480 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a  or writing to.**
14490 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a   be allowed:.**.
144a0 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72 73 6f  ** 1:  The curso
144b0 72 20 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e  r must have been
144c0 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46   opened with wrF
144d0 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20  lag==1.**.** 2: 
144e0 20 4f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   Other database 
144f0 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74  connections that
14500 20 73 68 61 72 65 20 74 68 65 20 73 61 6d 65 20   share the same 
14510 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a 20 20  pager cache.**  
14520 20 20 20 62 75 74 20 77 68 69 63 68 20 61 72 65     but which are
14530 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45 41 44   not in the READ
14540 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73 74 61  _UNCOMMITTED sta
14550 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 0a  te may not have.
14560 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73 20 6f  **     cursors o
14570 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61 67 3d  pen with wrFlag=
14580 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74  =0 on the same t
14590 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65  able.  Otherwise
145a0 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68 61 6e  .**     the chan
145b0 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 69 73  ges made by this
145c0 20 77 72 69 74 65 20 63 75 72 73 6f 72 20 77 6f   write cursor wo
145d0 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65 20 74  uld be visible t
145e0 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72 65 61  o.**     the rea
145f0 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74 68 65  d cursors in the
14600 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20   other database 
14610 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  connection..**.*
14620 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61 62 61  * 3:  The databa
14630 73 65 20 6d 75 73 74 20 62 65 20 77 72 69 74 61  se must be writa
14640 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65 61 64  ble (not on read
14650 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a 2a 0a  -only media).**.
14660 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d 75 73  ** 4:  There mus
14670 74 20 62 65 20 61 6e 20 61 63 74 69 76 65 20 74  t be an active t
14680 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
14690 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20 69 73  * No checking is
146a0 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75   done to make su
146b0 72 65 20 74 68 61 74 20 70 61 67 65 20 69 54 61  re that page iTa
146c0 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20 74 68  ble really is th
146d0 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f  e.** root page o
146e0 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49 66 20  f a b-tree.  If 
146f0 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20  it is not, then 
14700 74 68 65 20 63 75 72 73 6f 72 20 61 63 71 75 69  the cursor acqui
14710 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  red.** will not 
14720 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79 2e 0a  work correctly..
14730 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
14740 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72  reeCursor(.  Btr
14750 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ee *p,          
14760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14770 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
14780 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
14790 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
147a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
147b0 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62  Root page of tab
147c0 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
147d0 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20  int wrFlag,     
147e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147f0 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77         /* 1 to w
14800 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c  rite. 0 read-onl
14810 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65  y */.  struct Ke
14820 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
14830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14840 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f   First arg to co
14850 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
14860 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  n */.  BtCursor 
14870 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20  *pCur           
14880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14890 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63   Space for new c
148a0 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ursor */.){.  in
148b0 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
148c0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
148d0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
148e0 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
148f0 78 28 70 29 20 29 3b 0a 20 20 69 66 28 20 77 72  x(p) );.  if( wr
14900 46 6c 61 67 20 29 7b 0a 20 20 20 20 69 66 28 20  Flag ){.    if( 
14910 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  pBt->readOnly ){
14920 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
14930 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
14940 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 65     }.    if( che
14950 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 2c 20 69  ckReadLocks(p, i
14960 54 61 62 6c 65 2c 20 30 2c 20 30 29 20 29 7b 0a  Table, 0, 0) ){.
14970 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
14980 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20  ITE_LOCKED;.    
14990 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 42 74  }.  }..  if( pBt
149a0 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20  ->pPage1==0 ){. 
149b0 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65     rc = lockBtre
149c0 65 57 69 74 68 52 65 74 72 79 28 70 29 3b 0a 20  eWithRetry(p);. 
149d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
149e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
149f0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
14a00 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64     if( pBt->read
14a10 4f 6e 6c 79 20 26 26 20 77 72 46 6c 61 67 20 29  Only && wrFlag )
14a20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
14a30 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
14a40 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72      }.  }.  pCur
14a50 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67  ->pgnoRoot = (Pg
14a60 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 69 66 28  no)iTable;.  if(
14a70 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 70 61   iTable==1 && pa
14a80 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
14a90 2d 3e 70 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a  ->pPager)==0 ){.
14aa0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14ab0 45 4d 50 54 59 3b 0a 20 20 20 20 67 6f 74 6f 20  EMPTY;.    goto 
14ac0 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78  create_cursor_ex
14ad0 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 72  ception;.  }.  r
14ae0 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
14af0 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  ge(pBt, pCur->pg
14b00 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 70  noRoot, &pCur->p
14b10 50 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Page, 0);.  if( 
14b20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
14b30 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74 65  .    goto create
14b40 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f  _cursor_exceptio
14b50 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  n;.  }..  /* Now
14b60 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 65   that no other e
14b70 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72 2c  rrors can occur,
14b80 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67 20   finish filling 
14b90 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72 0a  in the BtCursor.
14ba0 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 2c 20    ** variables, 
14bb0 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72 20  link the cursor 
14bc0 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72 65  into the BtShare
14bd0 64 20 6c 69 73 74 20 61 6e 64 20 73 65 74 20 2a  d list and set *
14be0 70 70 43 75 72 20 28 74 68 65 0a 20 20 2a 2a 20  ppCur (the.  ** 
14bf0 6f 75 74 70 75 74 20 61 72 67 75 6d 65 6e 74 20  output argument 
14c00 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
14c10 29 2e 0a 20 20 2a 2f 0a 20 20 70 43 75 72 2d 3e  )..  */.  pCur->
14c20 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79 49  pKeyInfo = pKeyI
14c30 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74  nfo;.  pCur->pBt
14c40 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72 2d  ree = p;.  pCur-
14c50 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70 43  >pBt = pBt;.  pC
14c60 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20 77 72 46  ur->wrFlag = wrF
14c70 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e 65  lag;.  pCur->pNe
14c80 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f  xt = pBt->pCurso
14c90 72 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 70  r;.  if( pCur->p
14ca0 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75 72  Next ){.    pCur
14cb0 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
14cc0 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42 74   pCur;.  }.  pBt
14cd0 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72  ->pCursor = pCur
14ce0 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65  ;.  pCur->eState
14cf0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
14d00 44 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  D;..  return SQL
14d10 49 54 45 5f 4f 4b 3b 0a 0a 63 72 65 61 74 65 5f  ITE_OK;..create_
14d20 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e  cursor_exception
14d30 3a 0a 20 20 69 66 28 20 70 43 75 72 20 29 7b 0a  :.  if( pCur ){.
14d40 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
14d50 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20  pCur->pPage);.  
14d60 7d 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  }.  unlockBtreeI
14d70 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
14d80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74  return rc;.}.int
14d90 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
14da0 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70 2c  sor(.  Btree *p,
14db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14dd0 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
14de0 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
14df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e10 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66   /* Root page of
14e20 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a   table to open *
14e30 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20  /.  int wrFlag, 
14e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e60 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20 30  /* 1 to write. 0
14e70 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20   read-only */.  
14e80 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20 2a  struct KeyInfo *
14e90 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20 20  pKeyInfo,       
14ea0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
14eb0 69 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f 6d  irst arg to xCom
14ec0 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43 75  pare() */.  BtCu
14ed0 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20 20  rsor *pCur      
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 20 2f 2a 20 57 72 69 74 65          /* Write
14f00 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72 65   new cursor here
14f10 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
14f20 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
14f30 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42  nter(p);.  p->pB
14f40 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  t->db = p->db;. 
14f50 20 72 63 20 3d 20 62 74 72 65 65 43 75 72 73 6f   rc = btreeCurso
14f60 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72 46  r(p, iTable, wrF
14f70 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20 70  lag, pKeyInfo, p
14f80 43 75 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  Cur);.  sqlite3B
14f90 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
14fa0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74  return rc;.}.int
14fb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72   sqlite3BtreeCur
14fc0 73 6f 72 53 69 7a 65 28 29 7b 0a 20 20 72 65 74  sorSize(){.  ret
14fd0 75 72 6e 20 73 69 7a 65 6f 66 28 42 74 43 75 72  urn sizeof(BtCur
14fe0 73 6f 72 29 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  sor);.}..../*.**
14ff0 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72 2e   Close a cursor.
15000 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b 20    The read lock 
15010 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
15020 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65 64  file is released
15030 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61 73  .** when the las
15040 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f 73  t cursor is clos
15050 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
15060 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
15070 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
15080 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  r){.  Btree *pBt
15090 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74 72  ree = pCur->pBtr
150a0 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65  ee;.  if( pBtree
150b0 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
150c0 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70 42   *pBt = pCur->pB
150d0 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  t;.    sqlite3Bt
150e0 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29  reeEnter(pBtree)
150f0 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20  ;.    pBt->db = 
15100 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20  pBtree->db;.    
15110 63 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  clearCursorPosit
15120 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 20 20 69  ion(pCur);.    i
15130 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20 29  f( pCur->pPrev )
15140 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70 50  {.      pCur->pP
15150 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43 75  rev->pNext = pCu
15160 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  r->pNext;.    }e
15170 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  lse{.      pBt->
15180 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d 3e  pCursor = pCur->
15190 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
151a0 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74   if( pCur->pNext
151b0 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e   ){.      pCur->
151c0 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
151d0 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  Cur->pPrev;.    
151e0 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  }.    releasePag
151f0 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a  e(pCur->pPage);.
15200 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
15210 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
15220 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72    invalidateOver
15230 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b  flowCache(pCur);
15240 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f  .    /* sqlite3_
15250 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20  free(pCur); */. 
15260 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
15270 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20  eave(pBtree);.  
15280 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
15290 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
152a0 61 6b 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ake a temporary 
152b0 63 75 72 73 6f 72 20 62 79 20 66 69 6c 6c 69 6e  cursor by fillin
152c0 67 20 69 6e 20 74 68 65 20 66 69 65 6c 64 73 20  g in the fields 
152d0 6f 66 20 70 54 65 6d 70 43 75 72 2e 0a 2a 2a 20  of pTempCur..** 
152e0 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20 63 75  The temporary cu
152f0 72 73 6f 72 20 69 73 20 6e 6f 74 20 6f 6e 20 74  rsor is not on t
15300 68 65 20 63 75 72 73 6f 72 20 6c 69 73 74 20 66  he cursor list f
15310 6f 72 20 74 68 65 20 42 74 72 65 65 2e 0a 2a 2f  or the Btree..*/
15320 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
15330 65 65 47 65 74 54 65 6d 70 43 75 72 73 6f 72 28  eeGetTempCursor(
15340 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
15350 42 74 43 75 72 73 6f 72 20 2a 70 54 65 6d 70 43  BtCursor *pTempC
15360 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
15370 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
15380 70 43 75 72 29 20 29 3b 0a 20 20 6d 65 6d 63 70  pCur) );.  memcp
15390 79 28 70 54 65 6d 70 43 75 72 2c 20 70 43 75 72  y(pTempCur, pCur
153a0 2c 20 73 69 7a 65 6f 66 28 2a 70 43 75 72 29 29  , sizeof(*pCur))
153b0 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e 70 4e  ;.  pTempCur->pN
153c0 65 78 74 20 3d 20 30 3b 0a 20 20 70 54 65 6d 70  ext = 0;.  pTemp
153d0 43 75 72 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a  Cur->pPrev = 0;.
153e0 20 20 69 66 28 20 70 54 65 6d 70 43 75 72 2d 3e    if( pTempCur->
153f0 70 50 61 67 65 20 29 7b 0a 20 20 20 20 73 71 6c  pPage ){.    sql
15400 69 74 65 33 50 61 67 65 72 52 65 66 28 70 54 65  ite3PagerRef(pTe
15410 6d 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 70 44  mpCur->pPage->pD
15420 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  bPage);.  }.}../
15430 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 74 65  *.** Delete a te
15440 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20 73  mporary cursor s
15450 75 63 68 20 61 73 20 77 61 73 20 6d 61 64 65 20  uch as was made 
15460 62 79 20 74 68 65 20 43 72 65 61 74 65 54 65 6d  by the CreateTem
15470 70 6f 72 61 72 79 43 75 72 73 6f 72 28 29 0a 2a  poraryCursor().*
15480 2a 20 66 75 6e 63 74 69 6f 6e 20 61 62 6f 76 65  * function above
15490 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
154a0 33 42 74 72 65 65 52 65 6c 65 61 73 65 54 65 6d  3BtreeReleaseTem
154b0 70 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72  pCursor(BtCursor
154c0 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
154d0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
154e0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69  tex(pCur) );.  i
154f0 66 28 20 70 43 75 72 2d 3e 70 50 61 67 65 20 29  f( pCur->pPage )
15500 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
15510 65 72 55 6e 72 65 66 28 70 43 75 72 2d 3e 70 50  erUnref(pCur->pP
15520 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
15530 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
15540 20 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73   sure the BtCurs
15550 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65  or* given in the
15560 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20   argument has a 
15570 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f  valid.** BtCurso
15580 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  r.info structure
15590 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  .  If it is not 
155a0 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63  already valid, c
155b0 61 6c 6c 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74  all.** sqlite3Bt
155c0 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
155d0 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a  o fill it in..**
155e0 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  .** BtCursor.inf
155f0 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20  o is a cache of 
15600 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
15610 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  in the current c
15620 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68  ell..** Using th
15630 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73  is cache reduces
15640 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
15650 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42  alls to sqlite3B
15660 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e  treeParseCell().
15670 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32  .**.** 2007-06-2
15680 35 3a 20 20 54 68 65 72 65 20 69 73 20 61 20 62  5:  There is a b
15690 75 67 20 69 6e 20 73 6f 6d 65 20 76 65 72 73 69  ug in some versi
156a0 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74 68 61 74  ons of MSVC that
156b0 20 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f   cause the.** co
156c0 6d 70 69 6c 65 72 20 74 6f 20 63 72 61 73 68 20  mpiler to crash 
156d0 77 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f  when getCellInfo
156e0 28 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  () is implemente
156f0 64 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a  d as a macro..**
15700 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20   But there is a 
15710 6d 65 61 73 75 72 65 61 62 6c 65 20 73 70 65 65  measureable spee
15720 64 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20 75  d advantage to u
15730 73 69 6e 67 20 74 68 65 20 6d 61 63 72 6f 20 6f  sing the macro o
15740 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c  n gcc.** (when l
15750 65 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74  ess compiler opt
15760 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20  imizations like 
15770 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65 20 75  -Os or -O0 are u
15780 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63  sed and the.** c
15790 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74 20 64  ompiler is not d
157a0 6f 69 6e 67 20 61 67 72 65 73 73 69 76 65 20 69  oing agressive i
157b0 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65  nlining.)  So we
157c0 20 75 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63   use a real func
157d0 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43  tion.** for MSVC
157e0 20 61 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f 72   and a macro for
157f0 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65   everything else
15800 2e 20 20 54 69 63 6b 65 74 20 23 32 34 35 37 2e  .  Ticket #2457.
15810 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
15820 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  UG.  static void
15830 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
15840 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
15850 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
15860 66 6f 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26  fo;.    memset(&
15870 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28  info, 0, sizeof(
15880 69 6e 66 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69  info));.    sqli
15890 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
158a0 6c 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70  l(pCur->pPage, p
158b0 43 75 72 2d 3e 69 64 78 2c 20 26 69 6e 66 6f 29  Cur->idx, &info)
158c0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65  ;.    assert( me
158d0 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75  mcmp(&info, &pCu
158e0 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28  r->info, sizeof(
158f0 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d  info))==0 );.  }
15900 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65  .#else.  #define
15910 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
15920 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  x).#endif.#ifdef
15930 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55   _MSC_VER.  /* U
15940 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69  se a real functi
15950 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f  on in MSVC to wo
15960 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69  rk around bugs i
15970 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e  n that compiler.
15980 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69   */.  static voi
15990 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74  d getCellInfo(Bt
159a0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
159b0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
159c0 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  o.nSize==0 ){.  
159d0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
159e0 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e  ParseCell(pCur->
159f0 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
15a00 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a  , &pCur->info);.
15a10 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69        pCur->vali
15a20 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d  dNKey = 1;.    }
15a30 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
15a40 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  rtCellInfo(pCur)
15a50 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73  ;.    }.  }.#els
15a60 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d 53 43  e /* if not _MSC
15a70 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55 73 65  _VER */.  /* Use
15a80 20 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c 20   a macro in all 
15a90 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65 72 73 20  other compilers 
15aa0 73 6f 20 74 68 61 74 20 74 68 65 20 66 75 6e 63  so that the func
15ab0 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65 64 20  tion is inlined 
15ac0 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65 74 43 65  */.#define getCe
15ad0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20 20 20 20  llInfo(pCur)    
15ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b00 20 20 20 20 20 20 20 20 20 20 20 5c 0a 20 20 69             \.  i
15b10 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  f( pCur->info.nS
15b20 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20 20 20 20  ize==0 ){       
15b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15b50 20 20 20 20 20 5c 0a 20 20 20 20 73 71 6c 69 74       \.    sqlit
15b60 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
15b70 28 70 43 75 72 2d 3e 70 50 61 67 65 2c 20 70 43  (pCur->pPage, pC
15b80 75 72 2d 3e 69 64 78 2c 20 26 70 43 75 72 2d 3e  ur->idx, &pCur->
15b90 69 6e 66 6f 29 3b 20 20 20 20 20 20 20 20 20 5c  info);         \
15ba0 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  .    pCur->valid
15bb0 4e 4b 65 79 20 3d 20 31 3b 20 20 20 20 20 20 20  NKey = 1;       
15bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15be0 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c           \.  }el
15bf0 73 65 7b 20 20 20 20 20 20 20 20 20 20 20 20 20  se{             
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 20                  
15c30 20 20 20 5c 0a 20 20 20 20 61 73 73 65 72 74 43     \.    assertC
15c40 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20 20  ellInfo(pCur);  
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 20 20 20 20 5c 0a 20               \. 
15c80 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 4d 53   }.#endif /* _MS
15c90 43 5f 56 45 52 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  C_VER */../*.** 
15ca0 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74 68  Set *pSize to th
15cb0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 62 75  e size of the bu
15cc0 66 66 65 72 20 6e 65 65 64 65 64 20 74 6f 20 68  ffer needed to h
15cd0 6f 6c 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  old the value of
15ce0 0a 2a 2a 20 74 68 65 20 6b 65 79 20 66 6f 72 20  .** the key for 
15cf0 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 72  the current entr
15d00 79 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f  y.  If the curso
15d10 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
15d20 67 0a 2a 2a 20 74 6f 20 61 20 76 61 6c 69 64 20  g.** to a valid 
15d30 65 6e 74 72 79 2c 20 2a 70 53 69 7a 65 20 69 73  entry, *pSize is
15d40 20 73 65 74 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a   set to 0. .**.*
15d50 2a 20 46 6f 72 20 61 20 74 61 62 6c 65 20 77 69  * For a table wi
15d60 74 68 20 74 68 65 20 49 4e 54 4b 45 59 20 66 6c  th the INTKEY fl
15d70 61 67 20 73 65 74 2c 20 74 68 69 73 20 72 6f 75  ag set, this rou
15d80 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
15d90 20 6b 65 79 0a 2a 2a 20 69 74 73 65 6c 66 2c 20   key.** itself, 
15da0 6e 6f 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  not the number o
15db0 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6b  f bytes in the k
15dc0 65 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ey..*/.int sqlit
15dd0 65 33 42 74 72 65 65 4b 65 79 53 69 7a 65 28 42  e3BtreeKeySize(B
15de0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
15df0 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e  64 *pSize){.  in
15e00 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
15e10 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
15e20 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
15e30 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  = restoreOrClear
15e40 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
15e50 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
15e60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15e70 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
15e80 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
15e90 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
15ea0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
15eb0 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  LID );.    if( p
15ec0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
15ed0 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
15ee0 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b       *pSize = 0;
15ef0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
15f00 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
15f10 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a  ur);.      *pSiz
15f20 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  e = pCur->info.n
15f30 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Key;.    }.  }. 
15f40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15f50 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20  *.** Set *pSize 
15f60 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
15f70 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 69   bytes of data i
15f80 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a  n the entry the.
15f90 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e  ** cursor curren
15fa0 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  tly points to.  
15fb0 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 53 51  Always return SQ
15fc0 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61 69 6c  LITE_OK..** Fail
15fd0 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69  ure is not possi
15fe0 62 6c 65 2e 20 20 49 66 20 74 68 65 20 63 75 72  ble.  If the cur
15ff0 73 6f 72 20 69 73 20 6e 6f 74 20 63 75 72 72 65  sor is not curre
16000 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67  ntly.** pointing
16010 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 28 77 68   to an entry (wh
16020 69 63 68 20 63 61 6e 20 68 61 70 70 65 6e 2c 20  ich can happen, 
16030 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a  for example, if.
16040 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
16050 69 73 20 65 6d 70 74 79 29 20 74 68 65 6e 20 2a  is empty) then *
16060 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  pSize is set to 
16070 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
16080 33 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 42  3BtreeDataSize(B
16090 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
160a0 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e  32 *pSize){.  in
160b0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
160c0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
160d0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
160e0 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72  = restoreOrClear
160f0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
16100 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
16110 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16120 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
16130 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
16140 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
16150 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
16160 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  LID );.    if( p
16170 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
16180 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
16190 20 20 20 20 20 2f 2a 20 4e 6f 74 20 70 6f 69 6e       /* Not poin
161a0 74 69 6e 67 20 61 74 20 61 20 76 61 6c 69 64 20  ting at a valid 
161b0 65 6e 74 72 79 20 2d 20 73 65 74 20 2a 70 53 69  entry - set *pSi
161c0 7a 65 20 74 6f 20 30 2e 20 2a 2f 0a 20 20 20 20  ze to 0. */.    
161d0 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20    *pSize = 0;.  
161e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67    }else{.      g
161f0 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
16200 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d  ;.      *pSize =
16210 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74   pCur->info.nDat
16220 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  a;.    }.  }.  r
16230 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
16240 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 70 61 67  ** Given the pag
16250 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f  e number of an o
16260 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
16270 74 68 65 20 64 61 74 61 62 61 73 65 20 28 70 61  the database (pa
16280 72 61 6d 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29  rameter.** ovfl)
16290 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
162a0 66 69 6e 64 73 20 74 68 65 20 70 61 67 65 20 6e  finds the page n
162b0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65 78  umber of the nex
162c0 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  t page in the .*
162d0 2a 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66  * linked list of
162e0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
162f0 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20 69 74   If possible, it
16300 20 75 73 65 73 20 74 68 65 20 61 75 74 6f 2d 76   uses the auto-v
16310 61 63 75 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72  acuum.** pointer
16320 2d 6d 61 70 20 64 61 74 61 20 69 6e 73 74 65 61  -map data instea
16330 64 20 6f 66 20 72 65 61 64 69 6e 67 20 74 68 65  d of reading the
16340 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65   content of page
16350 20 6f 76 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20   ovfl to do so. 
16360 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
16370 6f 72 20 6f 63 63 75 72 73 20 61 6e 20 53 51 4c  or occurs an SQL
16380 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
16390 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
163a0 72 77 69 73 65 3a 0a 2a 2a 0a 2a 2a 20 55 6e 6c  rwise:.**.** Unl
163b0 65 73 73 20 70 50 67 6e 6f 4e 65 78 74 20 69 73  ess pPgnoNext is
163c0 20 4e 55 4c 4c 2c 20 74 68 65 20 70 61 67 65 20   NULL, the page 
163d0 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e 65  number of the ne
163e0 78 74 20 6f 76 65 72 66 6c 6f 77 20 0a 2a 2a 20  xt overflow .** 
163f0 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b  page in the link
16400 65 64 20 6c 69 73 74 20 69 73 20 77 72 69 74 74  ed list is writt
16410 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78 74  en to *pPgnoNext
16420 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 0a 2a  . If page ovfl.*
16430 2a 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61  * is the last pa
16440 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64  ge in its linked
16450 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e 65 78   list, *pPgnoNex
16460 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72 6f  t is set to zero
16470 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70 50 61  . .**.** If ppPa
16480 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ge is not NULL, 
16490 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
164a0 6f 20 74 68 65 20 4d 65 6d 50 61 67 65 2a 20 68  o the MemPage* h
164b0 61 6e 64 6c 65 0a 2a 2a 20 66 6f 72 20 70 61 67  andle.** for pag
164c0 65 20 6f 76 66 6c 2e 20 54 68 65 20 75 6e 64 65  e ovfl. The unde
164d0 72 6c 79 69 6e 67 20 70 61 67 65 72 20 70 61 67  rlying pager pag
164e0 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  e may have been 
164f0 72 65 71 75 65 73 74 65 64 0a 2a 2a 20 77 69 74  requested.** wit
16500 68 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20  h the noContent 
16510 66 6c 61 67 20 73 65 74 2c 20 73 6f 20 74 68 65  flag set, so the
16520 20 70 61 67 65 20 64 61 74 61 20 61 63 63 65 73   page data acces
16530 73 61 62 6c 65 20 76 69 61 0a 2a 2a 20 74 68 69  sable via.** thi
16540 73 20 68 61 6e 64 6c 65 20 6d 61 79 20 6e 6f 74  s handle may not
16550 20 62 65 20 74 72 75 73 74 65 64 2e 0a 2a 2f 0a   be trusted..*/.
16560 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 4f 76  static int getOv
16570 65 72 66 6c 6f 77 50 61 67 65 28 0a 20 20 42 74  erflowPage(.  Bt
16580 53 68 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20  Shared *pBt, .  
16590 50 67 6e 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20  Pgno ovfl,      
165a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
165b0 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 2a 2f  Overflow page */
165c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
165d0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
165e0 2f 2a 20 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20  /* OUT: MemPage 
165f0 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  handle */.  Pgno
16600 20 2a 70 50 67 6e 6f 4e 65 78 74 20 20 20 20 20   *pPgnoNext     
16610 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
16620 20 4e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70   Next overflow p
16630 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b  age number */.){
16640 0a 20 20 50 67 6e 6f 20 6e 65 78 74 20 3d 20 30  .  Pgno next = 0
16650 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
16660 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
16670 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
16680 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 4f 6e  utex) );.  /* On
16690 65 20 6f 66 20 74 68 65 73 65 20 6d 75 73 74 20  e of these must 
166a0 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 4f 74 68  not be NULL. Oth
166b0 65 72 77 69 73 65 2c 20 77 68 79 20 63 61 6c 6c  erwise, why call
166c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 3f 20   this function? 
166d0 2a 2f 0a 20 20 61 73 73 65 72 74 28 70 70 50 61  */.  assert(ppPa
166e0 67 65 20 7c 7c 20 70 50 67 6e 6f 4e 65 78 74 29  ge || pPgnoNext)
166f0 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 50 67 6e 6f  ;..  /* If pPgno
16700 4e 65 78 74 20 69 73 20 4e 55 4c 4c 2c 20 74 68  Next is NULL, th
16710 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
16720 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64   is being called
16730 20 74 6f 20 6f 62 74 61 69 6e 0a 20 20 2a 2a 20   to obtain.  ** 
16740 61 20 4d 65 6d 50 61 67 65 2a 20 72 65 66 65 72  a MemPage* refer
16750 65 6e 63 65 20 6f 6e 6c 79 2e 20 4e 6f 20 70 61  ence only. No pa
16760 67 65 2d 64 61 74 61 20 69 73 20 72 65 71 75 69  ge-data is requi
16770 72 65 64 20 69 6e 20 74 68 69 73 20 63 61 73 65  red in this case
16780 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 50  ..  */.  if( !pP
16790 67 6e 6f 4e 65 78 74 20 29 7b 0a 20 20 20 20 72  gnoNext ){.    r
167a0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 74 72  eturn sqlite3Btr
167b0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f  eeGetPage(pBt, o
167c0 76 66 6c 2c 20 70 70 50 61 67 65 2c 20 31 29 3b  vfl, ppPage, 1);
167d0 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
167e0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
167f0 43 55 55 4d 0a 20 20 2f 2a 20 54 72 79 20 74 6f  CUUM.  /* Try to
16800 20 66 69 6e 64 20 74 68 65 20 6e 65 78 74 20 70   find the next p
16810 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66  age in the overf
16820 6c 6f 77 20 6c 69 73 74 20 75 73 69 6e 67 20 74  low list using t
16830 68 65 0a 20 20 2a 2a 20 61 75 74 6f 76 61 63 75  he.  ** autovacu
16840 75 6d 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  um pointer-map p
16850 61 67 65 73 2e 20 47 75 65 73 73 20 74 68 61 74  ages. Guess that
16860 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20 69   the next page i
16870 6e 20 0a 20 20 2a 2a 20 74 68 65 20 6f 76 65 72  n .  ** the over
16880 66 6c 6f 77 20 6c 69 73 74 20 69 73 20 70 61 67  flow list is pag
16890 65 20 6e 75 6d 62 65 72 20 28 6f 76 66 6c 2b 31  e number (ovfl+1
168a0 29 2e 20 49 66 20 74 68 61 74 20 67 75 65 73 73  ). If that guess
168b0 20 74 75 72 6e 73 20 0a 20 20 2a 2a 20 6f 75 74   turns .  ** out
168c0 20 74 6f 20 62 65 20 77 72 6f 6e 67 2c 20 66 61   to be wrong, fa
168d0 6c 6c 20 62 61 63 6b 20 74 6f 20 6c 6f 61 64 69  ll back to loadi
168e0 6e 67 20 74 68 65 20 64 61 74 61 20 6f 66 20 70  ng the data of p
168f0 61 67 65 20 0a 20 20 2a 2a 20 6e 75 6d 62 65 72  age .  ** number
16900 20 6f 76 66 6c 20 74 6f 20 64 65 74 65 72 6d 69   ovfl to determi
16910 6e 65 20 74 68 65 20 6e 65 78 74 20 70 61 67 65  ne the next page
16920 20 6e 75 6d 62 65 72 2e 0a 20 20 2a 2f 0a 20 20   number..  */.  
16930 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
16940 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  uum ){.    Pgno 
16950 70 67 6e 6f 3b 0a 20 20 20 20 50 67 6e 6f 20 69  pgno;.    Pgno i
16960 47 75 65 73 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a  Guess = ovfl+1;.
16970 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 0a 20      u8 eType;.. 
16980 20 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50     while( PTRMAP
16990 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69 47 75  _ISPAGE(pBt, iGu
169a0 65 73 73 29 20 7c 7c 20 69 47 75 65 73 73 3d 3d  ess) || iGuess==
169b0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
169c0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
169d0 69 47 75 65 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a  iGuess++;.    }.
169e0 0a 20 20 20 20 69 66 28 20 69 47 75 65 73 73 3c  .    if( iGuess<
169f0 3d 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  =pagerPagecount(
16a00 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a  pBt->pPager) ){.
16a10 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
16a20 70 47 65 74 28 70 42 74 2c 20 69 47 75 65 73 73  pGet(pBt, iGuess
16a30 2c 20 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29  , &eType, &pgno)
16a40 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
16a50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16a60 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
16a70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
16a80 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
16a90 4f 56 45 52 46 4c 4f 57 32 20 26 26 20 70 67 6e  OVERFLOW2 && pgn
16aa0 6f 3d 3d 6f 76 66 6c 20 29 7b 0a 20 20 20 20 20  o==ovfl ){.     
16ab0 20 20 20 6e 65 78 74 20 3d 20 69 47 75 65 73 73     next = iGuess
16ac0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
16ad0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66    }.#endif..  if
16ae0 28 20 6e 65 78 74 3d 3d 30 20 7c 7c 20 70 70 50  ( next==0 || ppP
16af0 61 67 65 20 29 7b 0a 20 20 20 20 4d 65 6d 50 61  age ){.    MemPa
16b00 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 0a  ge *pPage = 0;..
16b10 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16b20 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
16b30 2c 20 6f 76 66 6c 2c 20 26 70 50 61 67 65 2c 20  , ovfl, &pPage, 
16b40 6e 65 78 74 21 3d 30 29 3b 0a 20 20 20 20 61 73  next!=0);.    as
16b50 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f  sert(rc==SQLITE_
16b60 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 29 3b  OK || pPage==0);
16b70 0a 20 20 20 20 69 66 28 20 6e 65 78 74 3d 3d 30  .    if( next==0
16b80 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
16b90 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20  K ){.      next 
16ba0 3d 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65  = get4byte(pPage
16bb0 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  ->aData);.    }.
16bc0 0a 20 20 20 20 69 66 28 20 70 70 50 61 67 65 20  .    if( ppPage 
16bd0 29 7b 0a 20 20 20 20 20 20 2a 70 70 50 61 67 65  ){.      *ppPage
16be0 20 3d 20 70 50 61 67 65 3b 0a 20 20 20 20 7d 65   = pPage;.    }e
16bf0 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  lse{.      relea
16c00 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
16c10 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 50 67 6e     }.  }.  *pPgn
16c20 6f 4e 65 78 74 20 3d 20 6e 65 78 74 3b 0a 0a 20  oNext = next;.. 
16c30 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
16c40 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74 61 20 66  *.** Copy data f
16c50 72 6f 6d 20 61 20 62 75 66 66 65 72 20 74 6f 20  rom a buffer to 
16c60 61 20 70 61 67 65 2c 20 6f 72 20 66 72 6f 6d 20  a page, or from 
16c70 61 20 70 61 67 65 20 74 6f 20 61 20 62 75 66 66  a page to a buff
16c80 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f  er..**.** pPaylo
16c90 61 64 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  ad is a pointer 
16ca0 74 6f 20 64 61 74 61 20 73 74 6f 72 65 64 20 6f  to data stored o
16cb0 6e 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  n database page 
16cc0 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49 66 20 61  pDbPage..** If a
16cd0 72 67 75 6d 65 6e 74 20 65 4f 70 20 69 73 20 66  rgument eOp is f
16ce0 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42 79 74 65  alse, then nByte
16cf0 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 61   bytes of data a
16d00 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20 66 72 6f  re copied.** fro
16d10 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f 20 74 68  m pPayload to th
16d20 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
16d30 20 61 74 20 62 79 20 70 42 75 66 2e 20 49 66 20   at by pBuf. If 
16d40 65 4f 70 20 69 73 20 74 72 75 65 2c 0a 2a 2a 20  eOp is true,.** 
16d50 74 68 65 6e 20 73 71 6c 69 74 65 33 50 61 67 65  then sqlite3Page
16d60 72 57 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c  rWrite() is call
16d70 65 64 20 6f 6e 20 70 44 62 50 61 67 65 20 61 6e  ed on pDbPage an
16d80 64 20 6e 42 79 74 65 20 62 79 74 65 73 0a 2a 2a  d nByte bytes.**
16d90 20 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70   of data are cop
16da0 69 65 64 20 66 72 6f 6d 20 74 68 65 20 62 75 66  ied from the buf
16db0 66 65 72 20 70 42 75 66 20 74 6f 20 70 50 61 79  fer pBuf to pPay
16dc0 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  load..**.** SQLI
16dd0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
16de0 64 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 74  d on success, ot
16df0 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72  herwise an error
16e00 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
16e10 20 69 6e 74 20 63 6f 70 79 50 61 79 6c 6f 61 64   int copyPayload
16e20 28 0a 20 20 76 6f 69 64 20 2a 70 50 61 79 6c 6f  (.  void *pPaylo
16e30 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ad,           /*
16e40 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
16e50 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20   data */.  void 
16e60 2a 70 42 75 66 2c 20 20 20 20 20 20 20 20 20 20  *pBuf,          
16e70 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
16e80 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69  to buffer */.  i
16e90 6e 74 20 6e 42 79 74 65 2c 20 20 20 20 20 20 20  nt nByte,       
16ea0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
16eb0 65 72 20 6f 66 20 62 79 74 65 73 20 74 6f 20 63  er of bytes to c
16ec0 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70  opy */.  int eOp
16ed0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16ee0 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f 70 79 20     /* 0 -> copy 
16ef0 66 72 6f 6d 20 70 61 67 65 2c 20 31 20 2d 3e 20  from page, 1 -> 
16f00 63 6f 70 79 20 74 6f 20 70 61 67 65 20 2a 2f 0a  copy to page */.
16f10 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
16f20 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e           /* P
16f30 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70  age containing p
16f40 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20  Payload */.){.  
16f50 69 66 28 20 65 4f 70 20 29 7b 0a 20 20 20 20 2f  if( eOp ){.    /
16f60 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d  * Copy data from
16f70 20 62 75 66 66 65 72 20 74 6f 20 70 61 67 65 20   buffer to page 
16f80 28 61 20 77 72 69 74 65 20 6f 70 65 72 61 74 69  (a write operati
16f90 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72  on) */.    int r
16fa0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
16fb0 57 72 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a  Write(pDbPage);.
16fc0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
16fd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
16fe0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
16ff0 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 79 6c      memcpy(pPayl
17000 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42 79 74 65  oad, pBuf, nByte
17010 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
17020 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f  /* Copy data fro
17030 6d 20 70 61 67 65 20 74 6f 20 62 75 66 66 65 72  m page to buffer
17040 20 28 61 20 72 65 61 64 20 6f 70 65 72 61 74 69   (a read operati
17050 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65 6d 63 70  on) */.    memcp
17060 79 28 70 42 75 66 2c 20 70 50 61 79 6c 6f 61 64  y(pBuf, pPayload
17070 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20  , nByte);.  }.  
17080 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
17090 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
170a0 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
170b0 20 74 6f 20 72 65 61 64 20 6f 72 20 6f 76 65 72   to read or over
170c0 77 72 69 74 65 20 70 61 79 6c 6f 61 64 20 69 6e  write payload in
170d0 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72  formation.** for
170e0 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
170f0 74 68 65 20 70 43 75 72 20 63 75 72 73 6f 72 20  the pCur cursor 
17100 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
17110 49 66 20 74 68 65 20 65 4f 70 0a 2a 2a 20 70 61  If the eOp.** pa
17120 72 61 6d 65 74 65 72 20 69 73 20 30 2c 20 74 68  rameter is 0, th
17130 69 73 20 69 73 20 61 20 72 65 61 64 20 6f 70 65  is is a read ope
17140 72 61 74 69 6f 6e 20 28 64 61 74 61 20 63 6f 70  ration (data cop
17150 69 65 64 20 69 6e 74 6f 0a 2a 2a 20 62 75 66 66  ied into.** buff
17160 65 72 20 70 42 75 66 29 2e 20 49 66 20 69 74 20  er pBuf). If it 
17170 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 77  is non-zero, a w
17180 72 69 74 65 20 28 64 61 74 61 20 63 6f 70 69 65  rite (data copie
17190 64 20 66 72 6f 6d 0a 2a 2a 20 62 75 66 66 65 72  d from.** buffer
171a0 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a 20 41 20   pBuf)..**.** A 
171b0 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74 22 20 62  total of "amt" b
171c0 79 74 65 73 20 61 72 65 20 72 65 61 64 20 6f 72  ytes are read or
171d0 20 77 72 69 74 74 65 6e 20 62 65 67 69 6e 6e 69   written beginni
171e0 6e 67 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ng at "offset"..
171f0 2a 2a 20 44 61 74 61 20 69 73 20 72 65 61 64 20  ** Data is read 
17200 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68 65 20 62  to or from the b
17210 75 66 66 65 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a  uffer pBuf..**.*
17220 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
17230 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20 61 20 64  oes not make a d
17240 69 73 74 69 6e 63 74 69 6f 6e 20 62 65 74 77 65  istinction betwe
17250 65 6e 20 6b 65 79 20 61 6e 64 20 64 61 74 61 2e  en key and data.
17260 0a 2a 2a 20 49 74 20 6a 75 73 74 20 72 65 61 64  .** It just read
17270 73 20 6f 72 20 77 72 69 74 65 73 20 62 79 74 65  s or writes byte
17280 73 20 66 72 6f 6d 20 74 68 65 20 70 61 79 6c 6f  s from the paylo
17290 61 64 20 61 72 65 61 2e 20 20 44 61 74 61 20 6d  ad area.  Data m
172a0 69 67 68 74 20 0a 2a 2a 20 61 70 70 65 61 72 20  ight .** appear 
172b0 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70 61 67 65  on the main page
172c0 20 6f 72 20 62 65 20 73 63 61 74 74 65 72 65 64   or be scattered
172d0 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69 70 6c 65   out on multiple
172e0 20 6f 76 65 72 66 6c 6f 77 20 0a 2a 2a 20 70 61   overflow .** pa
172f0 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ges..**.** If th
17300 65 20 42 74 43 75 72 73 6f 72 2e 69 73 49 6e 63  e BtCursor.isInc
17310 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66 6c 61 67  rblobHandle flag
17320 20 69 73 20 73 65 74 2c 20 61 6e 64 20 74 68 65   is set, and the
17330 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63 75 72 73   current.** curs
17340 6f 72 20 65 6e 74 72 79 20 75 73 65 73 20 6f 6e  or entry uses on
17350 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
17360 6f 77 20 70 61 67 65 73 2c 20 74 68 69 73 20 66  ow pages, this f
17370 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63  unction.** alloc
17380 61 74 65 73 20 73 70 61 63 65 20 66 6f 72 20 61  ates space for a
17390 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70 6c 75 61  nd lazily poplua
173a0 74 65 73 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  tes the overflow
173b0 20 70 61 67 65 2d 6c 69 73 74 20 0a 2a 2a 20 63   page-list .** c
173c0 61 63 68 65 20 61 72 72 61 79 20 28 42 74 43 75  ache array (BtCu
173d0 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 29 2e  rsor.aOverflow).
173e0 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   Subsequent call
173f0 73 20 75 73 65 20 74 68 69 73 0a 2a 2a 20 63 61  s use this.** ca
17400 63 68 65 20 74 6f 20 6d 61 6b 65 20 73 65 65 6b  che to make seek
17410 69 6e 67 20 74 6f 20 74 68 65 20 73 75 70 70 6c  ing to the suppl
17420 69 65 64 20 6f 66 66 73 65 74 20 6d 6f 72 65 20  ied offset more 
17430 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a  efficient..**.**
17440 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72 66 6c 6f   Once an overflo
17450 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
17460 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
17470 61 74 65 64 2c 20 69 74 20 6d 61 79 20 62 65 0a  ated, it may be.
17480 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64 20 69  ** invalidated i
17490 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 75 72  f some other cur
174a0 73 6f 72 20 77 72 69 74 65 73 20 74 6f 20 74 68  sor writes to th
174b0 65 20 73 61 6d 65 20 74 61 62 6c 65 2c 20 6f 72  e same table, or
174c0 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 73 6f   if.** the curso
174d0 72 20 69 73 20 6d 6f 76 65 64 20 74 6f 20 61 20  r is moved to a 
174e0 64 69 66 66 65 72 65 6e 74 20 72 6f 77 2e 20 41  different row. A
174f0 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20  dditionally, in 
17500 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d  auto-vacuum.** m
17510 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ode, the followi
17520 6e 67 20 65 76 65 6e 74 73 20 6d 61 79 20 69 6e  ng events may in
17530 76 61 6c 69 64 61 74 65 20 61 6e 20 6f 76 65 72  validate an over
17540 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
17550 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ache..**.**   * 
17560 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  An incremental v
17570 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20  acuum,.**   * A 
17580 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74 6f 5f 76  commit in auto_v
17590 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64  acuum="full" mod
175a0 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65 61 74 69  e,.**   * Creati
175b0 6e 67 20 61 20 74 61 62 6c 65 20 28 6d 61 79 20  ng a table (may 
175c0 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20 61  require moving a
175d0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 29  n overflow page)
175e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
175f0 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 0a 20  accessPayload(. 
17600 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c   BtCursor *pCur,
17610 20 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20        /* Cursor 
17620 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65 6e 74 72  pointing to entr
17630 79 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20 2a  y to read from *
17640 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 2c 20  /.  int offset, 
17650 20 20 20 20 20 20 20 20 20 2f 2a 20 42 65 67 69           /* Begi
17660 6e 20 72 65 61 64 69 6e 67 20 74 68 69 73 20 66  n reading this f
17670 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f 61 64 20  ar into payload 
17680 2a 2f 0a 20 20 69 6e 74 20 61 6d 74 2c 20 20 20  */.  int amt,   
17690 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 61            /* Rea
176a0 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65  d this many byte
176b0 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  s */.  unsigned 
176c0 63 68 61 72 20 2a 70 42 75 66 2c 20 2f 2a 20 57  char *pBuf, /* W
176d0 72 69 74 65 20 74 68 65 20 62 79 74 65 73 20 69  rite the bytes i
176e0 6e 74 6f 20 74 68 69 73 20 62 75 66 66 65 72 20  nto this buffer 
176f0 2a 2f 20 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65  */ .  int skipKe
17700 79 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 6f 66  y,         /* of
17710 66 73 65 74 20 62 65 67 69 6e 73 20 61 74 20 64  fset begins at d
17720 61 74 61 20 69 66 20 74 68 69 73 20 69 73 20 74  ata if this is t
17730 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20 65 4f 70  rue */.  int eOp
17740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17750 20 7a 65 72 6f 20 74 6f 20 72 65 61 64 2e 20 6e   zero to read. n
17760 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72 69 74 65  on-zero to write
17770 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  . */.){.  unsign
17780 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61  ed char *aPayloa
17790 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  d;.  int rc = SQ
177a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e  LITE_OK;.  u32 n
177b0 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49 64 78 20  Key;.  int iIdx 
177c0 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  = 0;.  MemPage *
177d0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
177e0 61 67 65 3b 20 20 20 20 20 2f 2a 20 42 74 72 65  age;     /* Btre
177f0 65 20 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e  e page of curren
17800 74 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20 2a  t cursor entry *
17810 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
17820 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
17830 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74 68       /* Btree th
17840 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e 67  is cursor belong
17850 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65 72  s to */..  asser
17860 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61 73  t( pPage );.  as
17870 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
17880 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
17890 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
178a0 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43  ur->idx>=0 && pC
178b0 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d 3e 6e  ur->idx<pPage->n
178c0 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
178d0 28 20 6f 66 66 73 65 74 3e 3d 30 20 29 3b 0a 20  ( offset>=0 );. 
178e0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
178f0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
17900 29 3b 0a 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66  );..  getCellInf
17910 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c  o(pCur);.  aPayl
17920 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  oad = pCur->info
17930 2e 70 43 65 6c 6c 20 2b 20 70 43 75 72 2d 3e 69  .pCell + pCur->i
17940 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 6e  nfo.nHeader;.  n
17950 4b 65 79 20 3d 20 28 70 50 61 67 65 2d 3e 69 6e  Key = (pPage->in
17960 74 4b 65 79 20 3f 20 30 20 3a 20 70 43 75 72 2d  tKey ? 0 : pCur-
17970 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20  >info.nKey);..  
17980 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20  if( skipKey ){. 
17990 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 4b 65     offset += nKe
179a0 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 66 66  y;.  }.  if( off
179b0 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70  set+amt > nKey+p
179c0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 20  Cur->info.nData 
179d0 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 69 6e 67  ){.    /* Trying
179e0 20 74 6f 20 72 65 61 64 20 6f 72 20 77 72 69 74   to read or writ
179f0 65 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f  e past the end o
17a00 66 20 74 68 65 20 64 61 74 61 20 69 73 20 61 6e  f the data is an
17a10 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 72 65   error */.    re
17a20 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
17a30 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  R;.  }..  /* Che
17a40 63 6b 20 69 66 20 64 61 74 61 20 6d 75 73 74 20  ck if data must 
17a50 62 65 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20  be read/written 
17a60 74 6f 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65  to/from the btre
17a70 65 20 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a  e page itself. *
17a80 2f 0a 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70  /.  if( offset<p
17a90 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
17aa0 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20   ){.    int a = 
17ab0 61 6d 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f  amt;.    if( a+o
17ac0 66 66 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f  ffset>pCur->info
17ad0 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20  .nLocal ){.     
17ae0 20 61 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   a = pCur->info.
17af0 6e 4c 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b  nLocal - offset;
17b00 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
17b10 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61  copyPayload(&aPa
17b20 79 6c 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70  yload[offset], p
17b30 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61  Buf, a, eOp, pPa
17b40 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
17b50 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20    offset = 0;.  
17b60 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20    pBuf += a;.   
17b70 20 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c   amt -= a;.  }el
17b80 73 65 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d  se{.    offset -
17b90 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
17ba0 63 61 6c 3b 0a 20 20 7d 0a 0a 20 20 70 42 74 20  cal;.  }..  pBt 
17bb0 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20 20 69  = pCur->pBt;.  i
17bc0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17bd0 20 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20   && amt>0 ){.   
17be0 20 63 6f 6e 73 74 20 69 6e 74 20 6f 76 66 6c 53   const int ovflS
17bf0 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ize = pBt->usabl
17c00 65 53 69 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42  eSize - 4;  /* B
17c10 79 74 65 73 20 63 6f 6e 74 65 6e 74 20 70 65 72  ytes content per
17c20 20 6f 76 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20   ovfl page */.  
17c30 20 20 50 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b    Pgno nextPage;
17c40 0a 0a 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d  ..    nextPage =
17c50 20 67 65 74 34 62 79 74 65 28 26 61 50 61 79 6c   get4byte(&aPayl
17c60 6f 61 64 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  oad[pCur->info.n
17c70 4c 6f 63 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65  Local]);..#ifnde
17c80 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
17c90 43 52 42 4c 4f 42 0a 20 20 20 20 2f 2a 20 49 66  CRBLOB.    /* If
17ca0 20 74 68 65 20 69 73 49 6e 63 72 62 6c 6f 62 48   the isIncrblobH
17cb0 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65  andle flag is se
17cc0 74 20 61 6e 64 20 74 68 65 20 42 74 43 75 72 73  t and the BtCurs
17cd0 6f 72 2e 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20  or.aOverflow[]. 
17ce0 20 20 20 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65     ** has not be
17cf0 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c  en allocated, al
17d00 6c 6f 63 61 74 65 20 69 74 20 6e 6f 77 2e 20 54  locate it now. T
17d10 68 65 20 61 72 72 61 79 20 69 73 20 73 69 7a 65  he array is size
17d20 64 20 61 74 0a 20 20 20 20 2a 2a 20 6f 6e 65 20  d at.    ** one 
17d30 65 6e 74 72 79 20 66 6f 72 20 65 61 63 68 20 6f  entry for each o
17d40 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 20  verflow page in 
17d50 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 68 61  the overflow cha
17d60 69 6e 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70  in. The.    ** p
17d70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
17d80 65 20 66 69 72 73 74 20 6f 76 65 72 66 6c 6f 77  e first overflow
17d90 20 70 61 67 65 20 69 73 20 73 74 6f 72 65 64 20   page is stored 
17da0 69 6e 20 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c  in aOverflow[0],
17db0 0a 20 20 20 20 2a 2a 20 65 74 63 2e 20 41 20 76  .    ** etc. A v
17dc0 61 6c 75 65 20 6f 66 20 30 20 69 6e 20 74 68 65  alue of 0 in the
17dd0 20 61 4f 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72   aOverflow[] arr
17de0 61 79 20 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65  ay means "not ye
17df0 74 20 6b 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a 20  t known".    ** 
17e00 28 74 68 65 20 63 61 63 68 65 20 69 73 20 6c 61  (the cache is la
17e10 7a 69 6c 79 20 70 6f 70 75 6c 61 74 65 64 29 2e  zily populated).
17e20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
17e30 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62  pCur->isIncrblob
17e40 48 61 6e 64 6c 65 20 26 26 20 21 70 43 75 72 2d  Handle && !pCur-
17e50 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20  >aOverflow ){.  
17e60 20 20 20 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20      int nOvfl = 
17e70 28 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79  (pCur->info.nPay
17e80 6c 6f 61 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e  load-pCur->info.
17e90 6e 4c 6f 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d  nLocal+ovflSize-
17ea0 31 29 2f 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20  1)/ovflSize;.   
17eb0 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
17ec0 6f 77 20 3d 20 28 50 67 6e 6f 20 2a 29 73 71 6c  ow = (Pgno *)sql
17ed0 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
17ee0 69 7a 65 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76 66  izeof(Pgno)*nOvf
17ef0 6c 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f  l);.      if( nO
17f00 76 66 6c 20 26 26 20 21 70 43 75 72 2d 3e 61 4f  vfl && !pCur->aO
17f10 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
17f20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
17f30 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
17f40 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
17f50 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
17f60 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20  -list cache has 
17f70 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61  been allocated a
17f80 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e  nd the.    ** en
17f90 74 72 79 20 66 6f 72 20 74 68 65 20 66 69 72 73  try for the firs
17fa0 74 20 72 65 71 75 69 72 65 64 20 6f 76 65 72 66  t required overf
17fb0 6c 6f 77 20 70 61 67 65 20 69 73 20 76 61 6c 69  low page is vali
17fc0 64 2c 20 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64  d, skip.    ** d
17fd0 69 72 65 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20  irectly to it.. 
17fe0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43     */.    if( pC
17ff0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26  ur->aOverflow &&
18000 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
18010 5b 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65  [offset/ovflSize
18020 5d 20 29 7b 0a 20 20 20 20 20 20 69 49 64 78 20  ] ){.      iIdx 
18030 3d 20 28 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69  = (offset/ovflSi
18040 7a 65 29 3b 0a 20 20 20 20 20 20 6e 65 78 74 50  ze);.      nextP
18050 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65  age = pCur->aOve
18060 72 66 6c 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20  rflow[iIdx];.   
18070 20 20 20 6f 66 66 73 65 74 20 3d 20 28 6f 66 66     offset = (off
18080 73 65 74 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20  set%ovflSize);. 
18090 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
180a0 20 66 6f 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49   for( ; rc==SQLI
180b0 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26  TE_OK && amt>0 &
180c0 26 20 6e 65 78 74 50 61 67 65 3b 20 69 49 64 78  & nextPage; iIdx
180d0 2b 2b 29 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51  ++){..#ifndef SQ
180e0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
180f0 4f 42 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72  OB.      /* If r
18100 65 71 75 69 72 65 64 2c 20 70 6f 70 75 6c 61 74  equired, populat
18110 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70  e the overflow p
18120 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 20  age-list cache. 
18130 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 75  */.      if( pCu
18140 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a  r->aOverflow ){.
18150 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 21          assert(!
18160 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
18170 69 49 64 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61  iIdx] || pCur->a
18180 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d  Overflow[iIdx]==
18190 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20 20 20  nextPage);.     
181a0 20 20 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c     pCur->aOverfl
181b0 6f 77 5b 69 49 64 78 5d 20 3d 20 6e 65 78 74 50  ow[iIdx] = nextP
181c0 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  age;.      }.#en
181d0 64 69 66 0a 0a 20 20 20 20 20 20 69 66 28 20 6f  dif..      if( o
181e0 66 66 73 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20  ffset>=ovflSize 
181f0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ){.        /* Th
18200 65 20 6f 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f  e only reason to
18210 20 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20   read this page 
18220 69 73 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  is to obtain the
18230 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
18240 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
18250 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
18260 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e   overflow chain.
18270 20 54 68 65 20 70 61 67 65 0a 20 20 20 20 20 20   The page.      
18280 20 20 2a 2a 20 64 61 74 61 20 69 73 20 6e 6f 74    ** data is not
18290 20 72 65 71 75 69 72 65 64 2e 20 53 6f 20 66 69   required. So fi
182a0 72 73 74 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75  rst try to looku
182b0 70 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20  p the overflow. 
182c0 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c         ** page-l
182d0 69 73 74 20 63 61 63 68 65 2c 20 69 66 20 61 6e  ist cache, if an
182e0 79 2c 20 74 68 65 6e 20 66 61 6c 6c 20 62 61 63  y, then fall bac
182f0 6b 20 74 6f 20 74 68 65 20 67 65 74 4f 76 65 72  k to the getOver
18300 66 6c 6f 77 50 61 67 65 28 29 0a 20 20 20 20 20  flowPage().     
18310 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a     ** function..
18320 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 6e 64          */.#ifnd
18330 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
18340 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 20 20 20  NCRBLOB.        
18350 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  if( pCur->aOverf
18360 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e 61 4f 76  low && pCur->aOv
18370 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29  erflow[iIdx+1] )
18380 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78 74  {.          next
18390 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76  Page = pCur->aOv
183a0 65 72 66 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a  erflow[iIdx+1];.
183b0 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 0a          } else .
183c0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
183d0 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f   rc = getOverflo
183e0 77 50 61 67 65 28 70 42 74 2c 20 6e 65 78 74 50  wPage(pBt, nextP
183f0 61 67 65 2c 20 30 2c 20 26 6e 65 78 74 50 61 67  age, 0, &nextPag
18400 65 29 3b 0a 20 20 20 20 20 20 20 20 6f 66 66 73  e);.        offs
18410 65 74 20 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a  et -= ovflSize;.
18420 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
18430 20 20 20 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20       /* Need to 
18440 72 65 61 64 20 74 68 69 73 20 70 61 67 65 20 70  read this page p
18450 72 6f 70 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74  roperly. It cont
18460 61 69 6e 73 20 73 6f 6d 65 20 6f 66 20 74 68 65  ains some of the
18470 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 61 6e 67  .        ** rang
18480 65 20 6f 66 20 64 61 74 61 20 74 68 61 74 20 69  e of data that i
18490 73 20 62 65 69 6e 67 20 72 65 61 64 20 28 65 4f  s being read (eO
184a0 70 3d 3d 30 29 20 6f 72 20 77 72 69 74 74 65 6e  p==0) or written
184b0 20 28 65 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20   (eOp!=0)..     
184c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 44 62     */.        Db
184d0 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
184e0 20 20 20 20 20 20 20 69 6e 74 20 61 20 3d 20 61         int a = a
184f0 6d 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  mt;.        rc =
18500 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
18510 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65  (pBt->pPager, ne
18520 78 74 50 61 67 65 2c 20 26 70 44 62 50 61 67 65  xtPage, &pDbPage
18530 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
18540 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
18550 20 20 20 20 20 20 20 20 20 20 61 50 61 79 6c 6f            aPaylo
18560 61 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ad = sqlite3Page
18570 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
18580 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 78  );.          nex
18590 74 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  tPage = get4byte
185a0 28 61 50 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20  (aPayload);.    
185b0 20 20 20 20 20 20 69 66 28 20 61 20 2b 20 6f 66        if( a + of
185c0 66 73 65 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20  fset > ovflSize 
185d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
185e0 20 3d 20 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66   = ovflSize - of
185f0 66 73 65 74 3b 0a 20 20 20 20 20 20 20 20 20 20  fset;.          
18600 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  }.          rc =
18610 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 26 61 50   copyPayload(&aP
18620 61 79 6c 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d  ayload[offset+4]
18630 2c 20 70 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20  , pBuf, a, eOp, 
18640 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
18650 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
18660 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
18670 20 20 20 20 20 20 20 20 20 20 6f 66 66 73 65 74            offset
18680 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
18690 61 6d 74 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20  amt -= a;.      
186a0 20 20 20 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20      pBuf += a;. 
186b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
186c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
186d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
186e0 26 26 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20  && amt>0 ){.    
186f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
18700 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
18710 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
18720 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72 74 20  /*.** Read part 
18730 6f 66 20 74 68 65 20 6b 65 79 20 61 73 73 6f 63  of the key assoc
18740 69 61 74 65 64 20 77 69 74 68 20 63 75 72 73 6f  iated with curso
18750 72 20 70 43 75 72 2e 20 20 45 78 61 63 74 6c 79  r pCur.  Exactly
18760 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74 65 73 20  .** "amt" bytes 
18770 77 69 6c 6c 20 62 65 20 74 72 61 6e 73 66 65 72  will be transfer
18780 65 64 20 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20  ed into pBuf[]. 
18790 20 54 68 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a   The transfer.**
187a0 20 62 65 67 69 6e 73 20 61 74 20 22 6f 66 66 73   begins at "offs
187b0 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  et"..**.** Retur
187c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
187d0 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
187e0 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
187f0 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e  ing goes.** wron
18800 67 2e 20 20 41 6e 20 65 72 72 6f 72 20 69 73 20  g.  An error is 
18810 72 65 74 75 72 6e 65 64 20 69 66 20 22 6f 66 66  returned if "off
18820 73 65 74 2b 61 6d 74 22 20 69 73 20 6c 61 72 67  set+amt" is larg
18830 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61  er than.** the a
18840 76 61 69 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64  vailable payload
18850 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18860 42 74 72 65 65 4b 65 79 28 42 74 43 75 72 73 6f  BtreeKey(BtCurso
18870 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6f 66 66  r *pCur, u32 off
18880 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f  set, u32 amt, vo
18890 69 64 20 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74  id *pBuf){.  int
188a0 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
188b0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
188c0 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
188d0 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43   restoreOrClearC
188e0 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
188f0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ur);.  if( rc==S
18900 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18910 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
18920 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
18930 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ID );.    assert
18940 28 20 70 43 75 72 2d 3e 70 50 61 67 65 21 3d 30  ( pCur->pPage!=0
18950 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72   );.    if( pCur
18960 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ->pPage->intKey 
18970 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
18980 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
18990 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  KPT;.    }.    a
189a0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
189b0 67 65 2d 3e 69 6e 74 4b 65 79 3d 3d 30 20 29 3b  ge->intKey==0 );
189c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
189d0 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70 43 75  r->idx>=0 && pCu
189e0 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70 50 61  r->idx<pCur->pPa
189f0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
18a00 20 72 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c   rc = accessPayl
18a10 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74  oad(pCur, offset
18a20 2c 20 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64  , amt, (unsigned
18a30 20 63 68 61 72 2a 29 70 42 75 66 2c 20 30 2c 20   char*)pBuf, 0, 
18a40 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
18a50 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
18a60 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  ad part of the d
18a70 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  ata associated w
18a80 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e  ith cursor pCur.
18a90 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d    Exactly.** "am
18aa0 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65  t" bytes will be
18ab0 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f   transfered into
18ac0 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72   pBuf[].  The tr
18ad0 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73  ansfer.** begins
18ae0 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
18af0 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
18b00 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
18b10 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
18b20 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
18b30 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20  s.** wrong.  An 
18b40 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
18b50 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74  d if "offset+amt
18b60 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  " is larger than
18b70 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c  .** the availabl
18b80 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e  e payload..*/.in
18b90 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 61  t sqlite3BtreeDa
18ba0 74 61 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ta(BtCursor *pCu
18bb0 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75  r, u32 offset, u
18bc0 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42  32 amt, void *pB
18bd0 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  uf){.  int rc;..
18be0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
18bf0 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69  MIT_INCRBLOB.  i
18c00 66 20 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  f ( pCur->eState
18c10 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
18c20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
18c30 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d  QLITE_ABORT;.  }
18c40 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
18c50 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
18c60 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72  tex(pCur) );.  r
18c70 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65  c = restoreOrCle
18c80 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
18c90 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
18ca0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18cb0 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
18cc0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
18cd0 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73  VALID );.    ass
18ce0 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
18cf0 21 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  !=0 );.    asser
18d00 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20  t( pCur->idx>=0 
18d10 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75  && pCur->idx<pCu
18d20 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r->pPage->nCell 
18d30 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65  );.    rc = acce
18d40 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20  ssPayload(pCur, 
18d50 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75  offset, amt, pBu
18d60 66 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  f, 1, 0);.  }.  
18d70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
18d80 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
18d90 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20  nter to payload 
18da0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d  information from
18db0 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20   the entry that 
18dc0 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72  the .** pCur cur
18dd0 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
18de0 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72  to.  The pointer
18df0 20 69 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e   is to the begin
18e00 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b  ning of.** the k
18e10 65 79 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d 30  ey if skipKey==0
18e20 20 61 6e 64 20 69 74 20 70 6f 69 6e 74 73 20 74   and it points t
18e30 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  o the beginning 
18e40 6f 66 20 64 61 74 61 20 69 66 0a 2a 2a 20 73 6b  of data if.** sk
18e50 69 70 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20 6e  ipKey==1.  The n
18e60 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
18e70 66 20 61 76 61 69 6c 61 62 6c 65 20 6b 65 79 2f  f available key/
18e80 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 0a  data is written.
18e90 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20  ** into *pAmt.  
18ea0 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65  If *pAmt==0, the
18eb0 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
18ec0 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65  rned will not be
18ed0 0a 2a 2a 20 61 20 76 61 6c 69 64 20 70 6f 69 6e  .** a valid poin
18ee0 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ter..**.** This 
18ef0 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70  routine is an op
18f00 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20  timization.  It 
18f10 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68  is common for th
18f20 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20  e entire key.** 
18f30 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74 20  and data to fit 
18f40 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67  on the local pag
18f50 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20  e and for there 
18f60 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f  to be no overflo
18f70 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65  w.** pages.  Whe
18f80 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68  n that is so, th
18f90 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62  is routine can b
18fa0 65 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73  e used to access
18fb0 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20   the.** key and 
18fc0 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b  data without mak
18fd0 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20  ing a copy.  If 
18fe0 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64  the key and/or d
18ff0 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e  ata spills.** on
19000 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  to overflow page
19010 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50 61  s, then accessPa
19020 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20  yload() must be 
19030 75 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62  used to reassemb
19040 6c 79 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61  ly.** the key/da
19050 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69  ta and copy it i
19060 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74  nto a preallocat
19070 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a  ed buffer..**.**
19080 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74   The pointer ret
19090 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f  urned by this ro
190a0 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65  utine looks dire
190b0 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61  ctly into the ca
190c0 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20  ched.** page of 
190d0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
190e0 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 63 68  he data might ch
190f0 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65  ange or move the
19100 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e   next time.** an
19110 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20  y btree routine 
19120 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74  is called..*/.st
19130 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
19140 6e 65 64 20 63 68 61 72 20 2a 66 65 74 63 68 50  ned char *fetchP
19150 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73  ayload(.  BtCurs
19160 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f  or *pCur,      /
19170 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  * Cursor pointin
19180 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65  g to entry to re
19190 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ad from */.  int
191a0 20 2a 70 41 6d 74 2c 20 20 20 20 20 20 20 20 20   *pAmt,         
191b0 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
191c0 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62  umber of availab
191d0 6c 65 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f  le bytes here */
191e0 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 20 20  .  int skipKey  
191f0 20 20 20 20 20 20 20 20 2f 2a 20 72 65 61 64 20          /* read 
19200 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 64 61 74  beginning at dat
19210 61 20 69 66 20 74 68 69 73 20 69 73 20 74 72 75  a if this is tru
19220 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  e */.){.  unsign
19230 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61  ed char *aPayloa
19240 64 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  d;.  MemPage *pP
19250 61 67 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b  age;.  u32 nKey;
19260 0a 20 20 69 6e 74 20 6e 4c 6f 63 61 6c 3b 0a 0a  .  int nLocal;..
19270 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d    assert( pCur!=
19280 30 20 26 26 20 70 43 75 72 2d 3e 70 50 61 67 65  0 && pCur->pPage
19290 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
192a0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
192b0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
192c0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
192d0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
192e0 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  );.  pPage = pCu
192f0 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65  r->pPage;.  asse
19300 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30  rt( pCur->idx>=0
19310 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 50   && pCur->idx<pP
19320 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
19330 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  getCellInfo(pCur
19340 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20  );.  aPayload = 
19350 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c  pCur->info.pCell
19360 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20  ;.  aPayload += 
19370 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64  pCur->info.nHead
19380 65 72 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  er;.  if( pPage-
19390 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 6e  >intKey ){.    n
193a0 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Key = 0;.  }else
193b0 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 70 43 75  {.    nKey = pCu
193c0 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20  r->info.nKey;.  
193d0 7d 0a 20 20 69 66 28 20 73 6b 69 70 4b 65 79 20  }.  if( skipKey 
193e0 29 7b 0a 20 20 20 20 61 50 61 79 6c 6f 61 64 20  ){.    aPayload 
193f0 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f  += nKey;.    nLo
19400 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  cal = pCur->info
19410 2e 6e 4c 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a  .nLocal - nKey;.
19420 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f    }else{.    nLo
19430 63 61 6c 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  cal = pCur->info
19440 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 69 66 28  .nLocal;.    if(
19450 20 6e 4c 6f 63 61 6c 3e 6e 4b 65 79 20 29 7b 0a   nLocal>nKey ){.
19460 20 20 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 6e        nLocal = n
19470 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Key;.    }.  }. 
19480 20 2a 70 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b   *pAmt = nLocal;
19490 0a 20 20 72 65 74 75 72 6e 20 61 50 61 79 6c 6f  .  return aPaylo
194a0 61 64 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f  ad;.}.../*.** Fo
194b0 72 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  r the entry that
194c0 20 63 75 72 73 6f 72 20 70 43 75 72 20 69 73 20   cursor pCur is 
194d0 70 6f 69 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e  point to, return
194e0 20 61 73 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65   as.** many byte
194f0 73 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 72 20  s of the key or 
19500 64 61 74 61 20 61 73 20 61 72 65 20 61 76 61 69  data as are avai
19510 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63  lable on the loc
19520 61 6c 0a 2a 2a 20 62 2d 74 72 65 65 20 70 61 67  al.** b-tree pag
19530 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 6e 75  e.  Write the nu
19540 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
19550 65 20 62 79 74 65 73 20 69 6e 74 6f 20 2a 70 41  e bytes into *pA
19560 6d 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f  mt..**.** The po
19570 69 6e 74 65 72 20 72 65 74 75 72 6e 65 64 20 69  inter returned i
19580 73 20 65 70 68 65 6d 65 72 61 6c 2e 20 20 54 68  s ephemeral.  Th
19590 65 20 6b 65 79 2f 64 61 74 61 20 6d 61 79 20 6d  e key/data may m
195a0 6f 76 65 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73  ove.** or be des
195b0 74 72 6f 79 65 64 20 6f 6e 20 74 68 65 20 6e 65  troyed on the ne
195c0 78 74 20 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42  xt call to any B
195d0 74 72 65 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a  tree routine,.**
195e0 20 69 6e 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73   including calls
195f0 20 66 72 6f 6d 20 6f 74 68 65 72 20 74 68 72 65   from other thre
19600 61 64 73 20 61 67 61 69 6e 73 74 20 74 68 65 20  ads against the 
19610 73 61 6d 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48  same cache..** H
19620 65 6e 63 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e  ence, a mutex on
19630 20 74 68 65 20 42 74 53 68 61 72 65 64 20 73 68   the BtShared sh
19640 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 70 72 69  ould be held pri
19650 6f 72 20 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a  or to calling.**
19660 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
19670 2a 0a 2a 2a 20 54 68 65 73 65 20 72 6f 75 74 69  *.** These routi
19680 6e 65 73 20 69 73 20 75 73 65 64 20 74 6f 20 67  nes is used to g
19690 65 74 20 71 75 69 63 6b 20 61 63 63 65 73 73 20  et quick access 
196a0 74 6f 20 6b 65 79 20 61 6e 64 20 64 61 74 61 0a  to key and data.
196b0 2a 2a 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  ** in the common
196c0 20 63 61 73 65 20 77 68 65 72 65 20 6e 6f 20 6f   case where no o
196d0 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
196e0 65 20 75 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74  e used..*/.const
196f0 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74   void *sqlite3Bt
19700 72 65 65 4b 65 79 46 65 74 63 68 28 42 74 43 75  reeKeyFetch(BtCu
19710 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
19720 2a 70 41 6d 74 29 7b 0a 20 20 61 73 73 65 72 74  *pAmt){.  assert
19730 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
19740 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 69 66  ex(pCur) );.  if
19750 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
19760 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a  CURSOR_VALID ){.
19770 20 20 20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73      return (cons
19780 74 20 76 6f 69 64 2a 29 66 65 74 63 68 50 61 79  t void*)fetchPay
19790 6c 6f 61 64 28 70 43 75 72 2c 20 70 41 6d 74 2c  load(pCur, pAmt,
197a0 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
197b0 6e 20 30 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69  n 0;.}.const voi
197c0 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 44  d *sqlite3BtreeD
197d0 61 74 61 46 65 74 63 68 28 42 74 43 75 72 73 6f  ataFetch(BtCurso
197e0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41  r *pCur, int *pA
197f0 6d 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  mt){.  assert( c
19800 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
19810 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70  pCur) );.  if( p
19820 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
19830 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
19840 20 72 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76   return (const v
19850 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61  oid*)fetchPayloa
19860 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 31 29  d(pCur, pAmt, 1)
19870 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
19880 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ;.}.../*.** Move
19890 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
198a0 20 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20   to a new child 
198b0 70 61 67 65 2e 20 20 54 68 65 20 6e 65 77 50 67  page.  The newPg
198c0 6e 6f 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  no argument is t
198d0 68 65 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65  he.** page numbe
198e0 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70  r of the child p
198f0 61 67 65 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a  age to move to..
19900 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
19910 76 65 54 6f 43 68 69 6c 64 28 42 74 43 75 72 73  veToChild(BtCurs
19920 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 6e 65  or *pCur, u32 ne
19930 77 50 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63  wPgno){.  int rc
19940 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65  ;.  MemPage *pNe
19950 77 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65  wPage;.  MemPage
19960 20 2a 70 4f 6c 64 50 61 67 65 3b 0a 20 20 42 74   *pOldPage;.  Bt
19970 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43  Shared *pBt = pC
19980 75 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65  ur->pBt;..  asse
19990 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
199a0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
199b0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
199c0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
199d0 49 44 20 29 3b 0a 20 20 72 63 20 3d 20 67 65 74  ID );.  rc = get
199e0 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
199f0 20 6e 65 77 50 67 6e 6f 2c 20 26 70 4e 65 77 50   newPgno, &pNewP
19a00 61 67 65 2c 20 70 43 75 72 2d 3e 70 50 61 67 65  age, pCur->pPage
19a10 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
19a20 74 75 72 6e 20 72 63 3b 0a 20 20 70 4e 65 77 50  turn rc;.  pNewP
19a30 61 67 65 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d  age->idxParent =
19a40 20 70 43 75 72 2d 3e 69 64 78 3b 0a 20 20 70 4f   pCur->idx;.  pO
19a50 6c 64 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70  ldPage = pCur->p
19a60 50 61 67 65 3b 0a 20 20 70 4f 6c 64 50 61 67 65  Page;.  pOldPage
19a70 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 30 3b 0a  ->idxShift = 0;.
19a80 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f    releasePage(pO
19a90 6c 64 50 61 67 65 29 3b 0a 20 20 70 43 75 72 2d  ldPage);.  pCur-
19aa0 3e 70 50 61 67 65 20 3d 20 70 4e 65 77 50 61 67  >pPage = pNewPag
19ab0 65 3b 0a 20 20 70 43 75 72 2d 3e 69 64 78 20 3d  e;.  pCur->idx =
19ac0 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   0;.  pCur->info
19ad0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
19ae0 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
19af0 30 3b 0a 20 20 69 66 28 20 70 4e 65 77 50 61 67  0;.  if( pNewPag
19b00 65 2d 3e 6e 43 65 6c 6c 3c 31 20 29 7b 0a 20 20  e->nCell<1 ){.  
19b10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19b20 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
19b30 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
19b40 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
19b50 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
19b60 65 20 70 61 67 65 20 69 73 20 74 68 65 20 76 69  e page is the vi
19b70 72 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20 69 74  rtual root of it
19b80 73 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  s table..**.** T
19b90 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20  he virtual root 
19ba0 70 61 67 65 20 69 73 20 74 68 65 20 72 6f 6f 74  page is the root
19bb0 20 70 61 67 65 20 66 6f 72 20 6d 6f 73 74 20 74   page for most t
19bc0 61 62 6c 65 73 2e 20 20 42 75 74 0a 2a 2a 20 66  ables.  But.** f
19bd0 6f 72 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f  or the table roo
19be0 74 65 64 20 6f 6e 20 70 61 67 65 20 31 2c 20 73  ted on page 1, s
19bf0 6f 6d 65 74 69 6d 65 20 74 68 65 20 72 65 61 6c  ometime the real
19c00 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73   root page.** is
19c10 20 65 6d 70 74 79 20 65 78 63 65 70 74 20 66 6f   empty except fo
19c20 72 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e  r the right-poin
19c30 74 65 72 2e 20 20 49 6e 20 73 75 63 68 20 63 61  ter.  In such ca
19c40 73 65 73 20 74 68 65 0a 2a 2a 20 76 69 72 74 75  ses the.** virtu
19c50 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  al root page is 
19c60 74 68 65 20 70 61 67 65 20 74 68 61 74 20 74 68  the page that th
19c70 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20  e right-pointer 
19c80 6f 66 20 70 61 67 65 0a 2a 2a 20 31 20 69 73 20  of page.** 1 is 
19c90 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a  pointing to..*/.
19ca0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
19cb0 49 73 52 6f 6f 74 50 61 67 65 28 4d 65 6d 50 61  IsRootPage(MemPa
19cc0 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d 65  ge *pPage){.  Me
19cd0 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 0a  mPage *pParent;.
19ce0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
19cf0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
19d00 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
19d10 20 29 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20   );.  pParent = 
19d20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a  pPage->pParent;.
19d30 20 20 69 66 28 20 70 50 61 72 65 6e 74 3d 3d 30    if( pParent==0
19d40 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69   ) return 1;.  i
19d50 66 28 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  f( pParent->pgno
19d60 3e 31 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  >1 ) return 0;. 
19d70 20 69 66 28 20 67 65 74 32 62 79 74 65 28 26 70   if( get2byte(&p
19d80 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
19d90 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
19da0 2b 33 5d 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  +3])==0 ) return
19db0 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   1;.  return 0;.
19dc0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
19dd0 65 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74  e cursor up to t
19de0 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
19df0 2a 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20  **.** pCur->idx 
19e00 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 65  is set to the ce
19e10 6c 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f  ll index that co
19e20 6e 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74  ntains the point
19e30 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67  er.** to the pag
19e40 65 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20  e we are coming 
19e50 66 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65  from.  If we are
19e60 20 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65   coming from the
19e70 0a 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63  .** right-most c
19e80 68 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70  hild page then p
19e90 43 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20  Cur->idx is set 
19ea0 74 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e  to one more than
19eb0 0a 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20  .** the largest 
19ec0 63 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76  cell index..*/.v
19ed0 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65  oid sqlite3Btree
19ee0 4d 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43  MoveToParent(BtC
19ef0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
19f00 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
19f10 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
19f20 67 65 3b 0a 20 20 69 6e 74 20 69 64 78 50 61 72  ge;.  int idxPar
19f30 65 6e 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ent;..  assert( 
19f40 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
19f50 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
19f60 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
19f70 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
19f80 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ;.  pPage = pCur
19f90 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72  ->pPage;.  asser
19fa0 74 28 20 70 50 61 67 65 21 3d 30 20 29 3b 0a 20  t( pPage!=0 );. 
19fb0 20 61 73 73 65 72 74 28 20 21 73 71 6c 69 74 65   assert( !sqlite
19fc0 33 42 74 72 65 65 49 73 52 6f 6f 74 50 61 67 65  3BtreeIsRootPage
19fd0 28 70 50 61 67 65 29 20 29 3b 0a 20 20 70 50 61  (pPage) );.  pPa
19fe0 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50  rent = pPage->pP
19ff0 61 72 65 6e 74 3b 0a 20 20 61 73 73 65 72 74 28  arent;.  assert(
1a000 20 70 50 61 72 65 6e 74 21 3d 30 20 29 3b 0a 20   pParent!=0 );. 
1a010 20 69 64 78 50 61 72 65 6e 74 20 3d 20 70 50 61   idxParent = pPa
1a020 67 65 2d 3e 69 64 78 50 61 72 65 6e 74 3b 0a 20  ge->idxParent;. 
1a030 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
1a040 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
1a050 65 29 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67  e);.  releasePag
1a060 65 28 70 50 61 67 65 29 3b 0a 20 20 70 43 75 72  e(pPage);.  pCur
1a070 2d 3e 70 50 61 67 65 20 3d 20 70 50 61 72 65 6e  ->pPage = pParen
1a080 74 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  t;.  pCur->info.
1a090 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75  nSize = 0;.  pCu
1a0a0 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
1a0b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
1a0c0 65 6e 74 2d 3e 69 64 78 53 68 69 66 74 3d 3d 30  ent->idxShift==0
1a0d0 20 29 3b 0a 20 20 70 43 75 72 2d 3e 69 64 78 20   );.  pCur->idx 
1a0e0 3d 20 69 64 78 50 61 72 65 6e 74 3b 0a 7d 0a 0a  = idxParent;.}..
1a0f0 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
1a100 75 72 73 6f 72 20 74 6f 20 74 68 65 20 72 6f 6f  ursor to the roo
1a110 74 20 70 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63  t page.*/.static
1a120 20 69 6e 74 20 6d 6f 76 65 54 6f 52 6f 6f 74 28   int moveToRoot(
1a130 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1a140 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f 6f  .  MemPage *pRoo
1a150 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
1a160 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 72 65 65  LITE_OK;.  Btree
1a170 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72   *p = pCur->pBtr
1a180 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ee;.  BtShared *
1a190 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
1a1a0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1a1b0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1a1c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55 52  );.  assert( CUR
1a1d0 53 4f 52 5f 49 4e 56 41 4c 49 44 20 3c 20 43 55  SOR_INVALID < CU
1a1e0 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b  RSOR_REQUIRESEEK
1a1f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43 55   );.  assert( CU
1a200 52 53 4f 52 5f 56 41 4c 49 44 20 20 20 3c 20 43  RSOR_VALID   < C
1a210 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
1a220 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 43  K );.  assert( C
1a230 55 52 53 4f 52 5f 46 41 55 4c 54 20 20 20 3e 20  URSOR_FAULT   > 
1a240 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
1a250 45 4b 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  EK );.  if( pCur
1a260 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52  ->eState>=CURSOR
1a270 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 7b 0a  _REQUIRESEEK ){.
1a280 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
1a290 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
1a2a0 4c 54 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  LT ){.      retu
1a2b0 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20  rn pCur->skip;. 
1a2c0 20 20 20 7d 0a 20 20 20 20 63 6c 65 61 72 43 75     }.    clearCu
1a2d0 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
1a2e0 72 29 3b 0a 20 20 7d 0a 20 20 70 52 6f 6f 74 20  r);.  }.  pRoot 
1a2f0 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20  = pCur->pPage;. 
1a300 20 69 66 28 20 70 52 6f 6f 74 20 26 26 20 70 52   if( pRoot && pR
1a310 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d  oot->pgno==pCur-
1a320 3e 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20  >pgnoRoot ){.   
1a330 20 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e   assert( pRoot->
1a340 69 73 49 6e 69 74 20 29 3b 0a 20 20 7d 65 6c 73  isInit );.  }els
1a350 65 7b 0a 20 20 20 20 69 66 28 20 0a 20 20 20 20  e{.    if( .    
1a360 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63    SQLITE_OK!=(rc
1a370 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67   = getAndInitPag
1a380 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e  e(pBt, pCur->pgn
1a390 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20 30  oRoot, &pRoot, 0
1a3a0 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
1a3b0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
1a3c0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
1a3d0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1a3e0 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73      }.    releas
1a3f0 65 50 61 67 65 28 70 43 75 72 2d 3e 70 50 61 67  ePage(pCur->pPag
1a400 65 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 50  e);.    pCur->pP
1a410 61 67 65 20 3d 20 70 52 6f 6f 74 3b 0a 20 20 7d  age = pRoot;.  }
1a420 0a 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 30  .  pCur->idx = 0
1a430 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ;.  pCur->info.n
1a440 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
1a450 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20  ->atLast = 0;.  
1a460 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1a470 3d 20 30 3b 0a 20 20 69 66 28 20 70 52 6f 6f 74  = 0;.  if( pRoot
1a480 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26 20 21 70  ->nCell==0 && !p
1a490 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Root->leaf ){.  
1a4a0 20 20 50 67 6e 6f 20 73 75 62 70 61 67 65 3b 0a    Pgno subpage;.
1a4b0 20 20 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f      assert( pRoo
1a4c0 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20  t->pgno==1 );.  
1a4d0 20 20 73 75 62 70 61 67 65 20 3d 20 67 65 74 34    subpage = get4
1a4e0 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e 61 44 61  byte(&pRoot->aDa
1a4f0 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72 4f 66 66  ta[pRoot->hdrOff
1a500 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73  set+8]);.    ass
1a510 65 72 74 28 20 73 75 62 70 61 67 65 3e 30 20 29  ert( subpage>0 )
1a520 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61  ;.    pCur->eSta
1a530 74 65 20 3d 20 43 55 52 53 4f 52 5f 56 41 4c 49  te = CURSOR_VALI
1a540 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  D;.    rc = move
1a550 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 73 75  ToChild(pCur, su
1a560 62 70 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70 43  bpage);.  }.  pC
1a570 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 28 70  ur->eState = ((p
1a580 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c  Cur->pPage->nCel
1a590 6c 3e 30 29 3f 43 55 52 53 4f 52 5f 56 41 4c 49  l>0)?CURSOR_VALI
1a5a0 44 3a 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  D:CURSOR_INVALID
1a5b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
1a5c0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  }../*.** Move th
1a5d0 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
1a5e0 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c   the left-most l
1a5f0 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74  eaf entry beneat
1a600 68 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74  h the.** entry t
1a610 6f 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75  o which it is cu
1a620 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
1a630 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74  ..**.** The left
1a640 2d 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68  -most leaf is th
1a650 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73  e one with the s
1a660 6d 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68  mallest key - th
1a670 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73  e first.** in as
1a680 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
1a690 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
1a6a0 65 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75  eToLeftmost(BtCu
1a6b0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50  rsor *pCur){.  P
1a6c0 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20  gno pgno;.  int 
1a6d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1a6e0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1a6f0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
1a700 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1a710 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
1a720 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1a730 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1a740 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
1a750 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65  TE_OK && !(pPage
1a760 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 29 2d   = pCur->pPage)-
1a770 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 61 73 73  >leaf ){.    ass
1a780 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d  ert( pCur->idx>=
1a790 30 20 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70  0 && pCur->idx<p
1a7a0 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
1a7b0 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79     pgno = get4by
1a7c0 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
1a7d0 65 2c 20 70 43 75 72 2d 3e 69 64 78 29 29 3b 0a  e, pCur->idx));.
1a7e0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
1a7f0 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
1a800 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
1a810 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  c;.}../*.** Move
1a820 20 74 68 65 20 63 75 72 73 6f 72 20 64 6f 77 6e   the cursor down
1a830 20 74 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f   to the right-mo
1a840 73 74 20 6c 65 61 66 20 65 6e 74 72 79 20 62 65  st leaf entry be
1a850 6e 65 61 74 68 20 74 68 65 0a 2a 2a 20 70 61 67  neath the.** pag
1a860 65 20 74 6f 20 77 68 69 63 68 20 69 74 20 69 73  e to which it is
1a870 20 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74   currently point
1a880 69 6e 67 2e 20 20 4e 6f 74 69 63 65 20 74 68 65  ing.  Notice the
1a890 20 64 69 66 66 65 72 65 6e 63 65 0a 2a 2a 20 62   difference.** b
1a8a0 65 74 77 65 65 6e 20 6d 6f 76 65 54 6f 4c 65 66  etween moveToLef
1a8b0 74 6d 6f 73 74 28 29 20 61 6e 64 20 6d 6f 76 65  tmost() and move
1a8c0 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 2e 20 20  ToRightmost().  
1a8d0 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
1a8e0 0a 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 6c 65  .** finds the le
1a8f0 66 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ft-most entry be
1a900 6e 65 61 74 68 20 74 68 65 20 2a 65 6e 74 72 79  neath the *entry
1a910 2a 20 77 68 65 72 65 61 73 20 6d 6f 76 65 54 6f  * whereas moveTo
1a920 52 69 67 68 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  Rightmost().** f
1a930 69 6e 64 73 20 74 68 65 20 72 69 67 68 74 2d 6d  inds the right-m
1a940 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
1a950 68 20 74 68 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a  h the *page*..**
1a960 0a 2a 2a 20 54 68 65 20 72 69 67 68 74 2d 6d 6f  .** The right-mo
1a970 73 74 20 65 6e 74 72 79 20 69 73 20 74 68 65 20  st entry is the 
1a980 6f 6e 65 20 77 69 74 68 20 74 68 65 20 6c 61 72  one with the lar
1a990 67 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 6c  gest key - the l
1a9a0 61 73 74 0a 2a 2a 20 6b 65 79 20 69 6e 20 61 73  ast.** key in as
1a9b0 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a  cending order..*
1a9c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76  /.static int mov
1a9d0 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 42 74 43  eToRightmost(BtC
1a9e0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1a9f0 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74  Pgno pgno;.  int
1aa00 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1aa10 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1aa20 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
1aa30 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1aa40 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
1aa50 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
1aa60 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
1aa70 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
1aa80 49 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67  ITE_OK && !(pPag
1aa90 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 29  e = pCur->pPage)
1aaa0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70 67  ->leaf ){.    pg
1aab0 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
1aac0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1aad0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
1aae0 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20  ;.    pCur->idx 
1aaf0 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
1ab00 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
1ab10 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f 29  hild(pCur, pgno)
1ab20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1ab30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1ab40 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 70 50 61   pCur->idx = pPa
1ab50 67 65 2d 3e 6e 43 65 6c 6c 20 2d 20 31 3b 0a 20  ge->nCell - 1;. 
1ab60 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
1ab70 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75  ize = 0;.    pCu
1ab80 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
1ab90 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
1aba0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20  QLITE_OK;.}../* 
1abb0 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1abc0 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
1abd0 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ry in the table.
1abe0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
1abf0 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
1ac00 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20  .  Set *pRes to 
1ac10 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  0 if the cursor 
1ac20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20  actually points 
1ac30 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  to something.** 
1ac40 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  or set *pRes to 
1ac50 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  1 if the table i
1ac60 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
1ac70 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72 73  sqlite3BtreeFirs
1ac80 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
1ac90 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
1aca0 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
1acb0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1acc0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
1acd0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1ace0 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
1acf0 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
1ad00 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76  x) );.  rc = mov
1ad10 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
1ad20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1ad30 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  OK ){.    if( pC
1ad40 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1ad50 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
1ad60 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1ad70 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ->pPage->nCell==
1ad80 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
1ad90 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 1;.      rc =
1ada0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1adb0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
1adc0 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65  ert( pCur->pPage
1add0 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20  ->nCell>0 );.   
1ade0 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
1adf0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c      rc = moveToL
1ae00 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
1ae10 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1ae20 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  n rc;.}../* Move
1ae30 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
1ae40 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
1ae50 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74   the table.  Ret
1ae60 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a  urn SQLITE_OK.**
1ae70 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65   on success.  Se
1ae80 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20  t *pRes to 0 if 
1ae90 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75 61  the cursor actua
1aea0 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f  lly points to so
1aeb0 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65  mething.** or se
1aec0 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20  t *pRes to 1 if 
1aed0 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70  the table is emp
1aee0 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ty..*/.int sqlit
1aef0 65 33 42 74 72 65 65 4c 61 73 74 28 42 74 43 75  e3BtreeLast(BtCu
1af00 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20  rsor *pCur, int 
1af10 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63  *pRes){.  int rc
1af20 3b 0a 20 0a 20 20 61 73 73 65 72 74 28 20 63 75  ;. .  assert( cu
1af30 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1af40 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74  Cur) );.  assert
1af50 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
1af60 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65  held(pCur->pBtre
1af70 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  e->db->mutex) );
1af80 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
1af90 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  ot(pCur);.  if( 
1afa0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1afb0 0a 20 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f  .    if( CURSOR_
1afc0 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65  INVALID==pCur->e
1afd0 53 74 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61  State ){.      a
1afe0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61  ssert( pCur->pPa
1aff0 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  ge->nCell==0 );.
1b000 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b        *pRes = 1;
1b010 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b020 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1b030 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1b040 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a 70  ALID );.      *p
1b050 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Res = 0;.      r
1b060 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  c = moveToRightm
1b070 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ost(pCur);.     
1b080 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
1b090 72 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e  r);.      pCur->
1b0a0 61 74 4c 61 73 74 20 3d 20 72 63 3d 3d 53 51 4c  atLast = rc==SQL
1b0b0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1b0c0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1b0d0 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  ../* Move the cu
1b0e0 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20  rsor so that it 
1b0f0 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74  points to an ent
1b100 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20  ry near the key 
1b110 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79  .** specified by
1b120 20 70 4b 65 79 2f 6e 4b 65 79 2f 70 55 6e 4b 65   pKey/nKey/pUnKe
1b130 79 2e 20 52 65 74 75 72 6e 20 61 20 73 75 63 63  y. Return a succ
1b140 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  ess code..**.** 
1b150 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62 6c 65  For INTKEY table
1b160 73 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79  s, only the nKey
1b170 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75 73   parameter is us
1b180 65 64 2e 20 20 70 4b 65 79 20 0a 2a 2a 20 61 6e  ed.  pKey .** an
1b190 64 20 70 55 6e 4b 65 79 20 6d 75 73 74 20 62 65  d pUnKey must be
1b1a0 20 4e 55 4c 4c 2e 20 20 46 6f 72 20 69 6e 64 65   NULL.  For inde
1b1b0 78 20 74 61 62 6c 65 73 2c 20 65 69 74 68 65 72  x tables, either
1b1c0 20 70 55 6e 4b 65 79 0a 2a 2a 20 6d 75 73 74 20   pUnKey.** must 
1b1d0 70 6f 69 6e 74 20 74 6f 20 61 20 6b 65 79 20 74  point to a key t
1b1e0 68 61 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  hat has already 
1b1f0 62 65 65 6e 20 75 6e 70 61 63 6b 65 64 2c 20 6f  been unpacked, o
1b200 72 20 65 6c 73 65 0a 2a 2a 20 70 4b 65 79 2f 6e  r else.** pKey/n
1b210 4b 65 79 20 64 65 73 63 72 69 62 65 73 20 61 20  Key describes a 
1b220 62 6c 6f 62 20 63 6f 6e 74 61 69 6e 69 6e 67 20  blob containing 
1b230 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 49  the key..**.** I
1b240 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74 63 68  f an exact match
1b250 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c 20 74   is not found, t
1b260 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 69  hen the cursor i
1b270 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65 66 74  s always.** left
1b280 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 6c   pointing at a l
1b290 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20 77  eaf page which w
1b2a0 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20 65 6e  ould hold the en
1b2b0 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77 65 72  try if it.** wer
1b2c0 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20  e present.  The 
1b2d0 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70 6f 69  cursor might poi
1b2e0 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 74  nt to an entry t
1b2f0 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62 65 66  hat comes.** bef
1b300 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74 68 65  ore or after the
1b310 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20   key..**.** The 
1b320 72 65 73 75 6c 74 20 6f 66 20 63 6f 6d 70 61 72  result of compar
1b330 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74 68  ing the key with
1b340 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68   the entry to wh
1b350 69 63 68 20 74 68 65 0a 2a 2a 20 63 75 72 73 6f  ich the.** curso
1b360 72 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  r is written to 
1b370 2a 70 52 65 73 20 69 66 20 70 52 65 73 21 3d 4e  *pRes if pRes!=N
1b380 55 4c 4c 2e 20 20 54 68 65 20 6d 65 61 6e 69 6e  ULL.  The meanin
1b390 67 20 6f 66 0a 2a 2a 20 74 68 69 73 20 76 61 6c  g of.** this val
1b3a0 75 65 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  ue is as follows
1b3b0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  :.**.**     *pRe
1b3c0 73 3c 30 20 20 20 20 20 20 54 68 65 20 63 75 72  s<0      The cur
1b3d0 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
1b3e0 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
1b3f0 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
1b400 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61            is sma
1b410 6c 6c 65 72 20 74 68 61 6e 20 70 4b 65 79 20 6f  ller than pKey o
1b420 72 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  r if the table i
1b430 73 20 65 6d 70 74 79 0a 2a 2a 20 20 20 20 20 20  s empty.**      
1b440 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 64 20              and 
1b450 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 74 68  the cursor is th
1b460 65 72 65 66 6f 72 65 20 6c 65 66 74 20 70 6f 69  erefore left poi
1b470 6e 74 20 74 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a  nt to nothing..*
1b480 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3d 3d  *.**     *pRes==
1b490 30 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72  0     The cursor
1b4a0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
1b4b0 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
1b4c0 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
1b4d0 20 20 20 20 20 20 20 65 78 61 63 74 6c 79 20 6d         exactly m
1b4e0 61 74 63 68 65 73 20 70 4b 65 79 2e 0a 2a 2a 0a  atches pKey..**.
1b4f0 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30 20 20  **     *pRes>0  
1b500 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20 69      The cursor i
1b510 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
1b520 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74  at an entry that
1b530 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1b540 20 20 20 20 20 69 73 20 6c 61 72 67 65 72 20 74       is larger t
1b550 68 61 6e 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a  han pKey..**.*/.
1b560 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1b570 4d 6f 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73  Moveto(.  BtCurs
1b580 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20  or *pCur,       
1b590 20 2f 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74   /* The cursor t
1b5a0 6f 20 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20  o be moved */.  
1b5b0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
1b5c0 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6b 65  ,      /* The ke
1b5d0 79 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 69 6e  y content for in
1b5e0 64 69 63 65 73 2e 20 20 4e 6f 74 20 75 73 65 64  dices.  Not used
1b5f0 20 62 79 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20   by tables */.  
1b600 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a  UnpackedRecord *
1b610 70 55 6e 4b 65 79 2c 2f 2a 20 55 6e 70 61 63 6b  pUnKey,/* Unpack
1b620 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 70 4b  ed version of pK
1b630 65 79 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79  ey */.  i64 nKey
1b640 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
1b650 2a 20 53 69 7a 65 20 6f 66 20 70 4b 65 79 2e 20  * Size of pKey. 
1b660 20 4f 72 20 74 68 65 20 6b 65 79 20 66 6f 72 20   Or the key for 
1b670 74 61 62 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20  tables */.  int 
1b680 62 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20  biasRight,      
1b690 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62     /* If true, b
1b6a0 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20 74  ias the search t
1b6b0 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a  o the high end *
1b6c0 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20  /.  int *pRes   
1b6d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
1b6e0 61 72 63 68 20 72 65 73 75 6c 74 20 66 6c 61 67  arch result flag
1b6f0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
1b700 0a 20 20 63 68 61 72 20 61 53 70 61 63 65 5b 32  .  char aSpace[2
1b710 30 30 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  00];..  assert( 
1b720 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1b730 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
1b740 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1b750 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74  x_held(pCur->pBt
1b760 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  ree->db->mutex) 
1b770 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1b780 63 75 72 73 6f 72 20 69 73 20 61 6c 72 65 61 64  cursor is alread
1b790 79 20 70 6f 73 69 74 69 6f 6e 65 64 20 61 74 20  y positioned at 
1b7a0 74 68 65 20 70 6f 69 6e 74 20 77 65 20 61 72 65  the point we are
1b7b0 20 74 72 79 69 6e 67 0a 20 20 2a 2a 20 74 6f 20   trying.  ** to 
1b7c0 6d 6f 76 65 20 74 6f 2c 20 74 68 65 6e 20 6a 75  move to, then ju
1b7d0 73 74 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  st return withou
1b7e0 74 20 64 6f 69 6e 67 20 61 6e 79 20 77 6f 72 6b  t doing any work
1b7f0 20 2a 2f 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   */.  if( pCur->
1b800 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1b810 41 4c 49 44 20 26 26 20 70 43 75 72 2d 3e 76 61  ALID && pCur->va
1b820 6c 69 64 4e 4b 65 79 20 26 26 20 70 43 75 72 2d  lidNKey && pCur-
1b830 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29  >pPage->intKey )
1b840 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
1b850 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20  info.nKey==nKey 
1b860 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  ){.      *pRes =
1b870 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
1b880 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1b890 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
1b8a0 61 74 4c 61 73 74 20 26 26 20 70 43 75 72 2d 3e  atLast && pCur->
1b8b0 69 6e 66 6f 2e 6e 4b 65 79 3c 6e 4b 65 79 20 29  info.nKey<nKey )
1b8c0 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  {.      *pRes = 
1b8d0 2d 31 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  -1;.      return
1b8e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1b8f0 7d 0a 20 20 7d 0a 0a 0a 20 20 72 63 20 3d 20 6d  }.  }...  rc = m
1b900 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
1b910 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
1b920 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
1b930 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1b940 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72  pPage );.  asser
1b950 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t( pCur->pPage->
1b960 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20  isInit );.  if( 
1b970 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1b980 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
1b990 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
1b9a0 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1b9b0 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ->pPage->nCell==
1b9c0 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 );.    return 
1b9d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1b9e0 20 69 66 28 20 70 43 75 72 2d 3e 70 50 61 67 65   if( pCur->pPage
1b9f0 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
1ba00 2f 2a 20 57 65 20 61 72 65 20 67 69 76 65 6e 20  /* We are given 
1ba10 61 6e 20 53 51 4c 20 74 61 62 6c 65 20 74 6f 20  an SQL table to 
1ba20 73 65 61 72 63 68 2e 20 20 54 68 65 20 6b 65 79  search.  The key
1ba30 20 69 73 20 74 68 65 20 69 6e 74 65 67 65 72 0a   is the integer.
1ba40 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 63 6f 6e      ** rowid con
1ba50 74 61 69 6e 65 64 20 69 6e 20 6e 4b 65 79 2e 20  tained in nKey. 
1ba60 20 70 4b 65 79 20 61 6e 64 20 70 55 6e 4b 65 79   pKey and pUnKey
1ba70 20 73 68 6f 75 6c 64 20 62 6f 74 68 20 62 65 20   should both be 
1ba80 4e 55 4c 4c 20 2a 2f 0a 20 20 20 20 61 73 73 65  NULL */.    asse
1ba90 72 74 28 20 70 55 6e 4b 65 79 3d 3d 30 20 29 3b  rt( pUnKey==0 );
1baa0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65  .    assert( pKe
1bab0 79 3d 3d 30 20 29 3b 0a 20 20 7d 65 6c 73 65 20  y==0 );.  }else 
1bac0 69 66 28 20 70 55 6e 4b 65 79 3d 3d 30 20 29 7b  if( pUnKey==0 ){
1bad0 0a 20 20 20 20 2f 2a 20 57 65 20 61 72 65 20 74  .    /* We are t
1bae0 6f 20 73 65 61 72 63 68 20 61 6e 20 53 51 4c 20  o search an SQL 
1baf0 69 6e 64 65 78 20 75 73 69 6e 67 20 61 20 6b 65  index using a ke
1bb00 79 20 65 6e 63 6f 64 65 64 20 61 73 20 61 20 62  y encoded as a b
1bb10 6c 6f 62 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20  lob..    ** The 
1bb20 62 6c 6f 62 20 69 73 20 66 6f 75 6e 64 20 61 74  blob is found at
1bb30 20 70 4b 65 79 20 61 6e 64 20 69 73 20 6e 4b 65   pKey and is nKe
1bb40 79 20 62 79 74 65 73 20 69 6e 20 6c 65 6e 67 74  y bytes in lengt
1bb50 68 2e 20 20 55 6e 70 61 63 6b 0a 20 20 20 20 2a  h.  Unpack.    *
1bb60 2a 20 74 68 69 73 20 6b 65 79 20 73 6f 20 74 68  * this key so th
1bb70 61 74 20 77 65 20 63 61 6e 20 75 73 65 20 69 74  at we can use it
1bb80 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
1bb90 20 70 4b 65 79 21 3d 30 20 29 3b 0a 20 20 20 20   pKey!=0 );.    
1bba0 70 55 6e 4b 65 79 20 3d 20 73 71 6c 69 74 65 33  pUnKey = sqlite3
1bbb0 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61 63 6b  VdbeRecordUnpack
1bbc0 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c  (pCur->pKeyInfo,
1bbd0 20 6e 4b 65 79 2c 20 70 4b 65 79 2c 0a 20 20 20   nKey, pKey,.   
1bbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bc00 61 53 70 61 63 65 2c 20 73 69 7a 65 6f 66 28 61  aSpace, sizeof(a
1bc10 53 70 61 63 65 29 29 3b 0a 20 20 20 20 69 66 28  Space));.    if(
1bc20 20 70 55 6e 4b 65 79 3d 3d 30 20 29 20 72 65 74   pUnKey==0 ) ret
1bc30 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1bc40 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1bc50 2a 20 57 65 20 61 72 65 20 74 6f 20 73 65 61 72  * We are to sear
1bc60 63 68 20 61 6e 20 53 51 4c 20 69 6e 64 65 78 20  ch an SQL index 
1bc70 75 73 69 6e 67 20 61 20 6b 65 79 20 74 68 61 74  using a key that
1bc80 20 69 73 20 61 6c 72 65 61 64 79 20 75 6e 70 61   is already unpa
1bc90 63 6b 65 64 0a 20 20 20 20 2a 2a 20 61 6e 64 20  cked.    ** and 
1bca0 68 61 6e 64 65 64 20 74 6f 20 75 73 20 69 6e 20  handed to us in 
1bcb0 70 55 6e 4b 65 79 2e 20 2a 2f 0a 20 20 20 20 61  pUnKey. */.    a
1bcc0 73 73 65 72 74 28 20 70 4b 65 79 3d 3d 30 20 29  ssert( pKey==0 )
1bcd0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 3b 3b 29 7b  ;.  }.  for(;;){
1bce0 0a 20 20 20 20 69 6e 74 20 6c 77 72 2c 20 75 70  .    int lwr, up
1bcf0 72 3b 0a 20 20 20 20 50 67 6e 6f 20 63 68 6c 64  r;.    Pgno chld
1bd00 50 67 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20  Pg;.    MemPage 
1bd10 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70  *pPage = pCur->p
1bd20 50 61 67 65 3b 0a 20 20 20 20 69 6e 74 20 63 20  Page;.    int c 
1bd30 3d 20 2d 31 3b 20 20 2f 2a 20 70 52 65 73 20 72  = -1;  /* pRes r
1bd40 65 74 75 72 6e 20 69 66 20 74 61 62 6c 65 20 69  eturn if table i
1bd50 73 20 65 6d 70 74 79 20 6d 75 73 74 20 62 65 20  s empty must be 
1bd60 2d 31 20 2a 2f 0a 20 20 20 20 6c 77 72 20 3d 20  -1 */.    lwr = 
1bd70 30 3b 0a 20 20 20 20 75 70 72 20 3d 20 70 50 61  0;.    upr = pPa
1bd80 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20  ge->nCell-1;.   
1bd90 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69 6e 74   if( !pPage->int
1bda0 4b 65 79 20 26 26 20 70 55 6e 4b 65 79 3d 3d 30  Key && pUnKey==0
1bdb0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
1bdc0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1bdd0 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  PT;.      goto m
1bde0 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
1bdf0 20 20 7d 0a 20 20 20 20 69 66 28 20 62 69 61 73    }.    if( bias
1be00 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70  Right ){.      p
1be10 43 75 72 2d 3e 69 64 78 20 3d 20 75 70 72 3b 0a  Cur->idx = upr;.
1be20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1be30 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 28 75 70   pCur->idx = (up
1be40 72 2b 6c 77 72 29 2f 32 3b 0a 20 20 20 20 7d 0a  r+lwr)/2;.    }.
1be50 20 20 20 20 69 66 28 20 6c 77 72 3c 3d 75 70 72      if( lwr<=upr
1be60 20 29 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20   ) for(;;){.    
1be70 20 20 76 6f 69 64 20 2a 70 43 65 6c 6c 4b 65 79    void *pCellKey
1be80 3b 0a 20 20 20 20 20 20 69 36 34 20 6e 43 65 6c  ;.      i64 nCel
1be90 6c 4b 65 79 3b 0a 20 20 20 20 20 20 70 43 75 72  lKey;.      pCur
1bea0 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
1beb0 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61  ;.      pCur->va
1bec0 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20  lidNKey = 1;.   
1bed0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e     if( pPage->in
1bee0 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20  tKey ){.        
1bef0 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20 20  u8 *pCell;.     
1bf00 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
1bf10 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
1bf20 3e 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63  >idx) + pPage->c
1bf30 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20  hildPtrSize;.   
1bf40 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
1bf50 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20  hasData ){.     
1bf60 20 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a       u32 dummy;.
1bf70 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20            pCell 
1bf80 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70  += getVarint32(p
1bf90 43 65 6c 6c 2c 20 64 75 6d 6d 79 29 3b 0a 20 20  Cell, dummy);.  
1bfa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1bfb0 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c  getVarint(pCell,
1bfc0 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79   (u64*)&nCellKey
1bfd0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
1bfe0 43 65 6c 6c 4b 65 79 3d 3d 6e 4b 65 79 20 29 7b  CellKey==nKey ){
1bff0 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 30  .          c = 0
1c000 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
1c010 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 6e 4b 65  if( nCellKey<nKe
1c020 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  y ){.          c
1c030 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d   = -1;.        }
1c040 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1c050 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b 65 79  assert( nCellKey
1c060 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20 20 20 20  >nKey );.       
1c070 20 20 20 63 20 3d 20 2b 31 3b 0a 20 20 20 20 20     c = +1;.     
1c080 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
1c090 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61 76  {.        int av
1c0a0 61 69 6c 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  ailable;.       
1c0b0 20 70 43 65 6c 6c 4b 65 79 20 3d 20 28 76 6f 69   pCellKey = (voi
1c0c0 64 20 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64  d *)fetchPayload
1c0d0 28 70 43 75 72 2c 20 26 61 76 61 69 6c 61 62 6c  (pCur, &availabl
1c0e0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 6e  e, 0);.        n
1c0f0 43 65 6c 6c 4b 65 79 20 3d 20 70 43 75 72 2d 3e  CellKey = pCur->
1c100 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 20  info.nKey;.     
1c110 20 20 20 69 66 28 20 61 76 61 69 6c 61 62 6c 65     if( available
1c120 3e 3d 6e 43 65 6c 6c 4b 65 79 20 29 7b 0a 20 20  >=nCellKey ){.  
1c130 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69          c = sqli
1c140 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1c150 70 61 72 65 28 6e 43 65 6c 6c 4b 65 79 2c 20 70  pare(nCellKey, p
1c160 43 65 6c 6c 4b 65 79 2c 20 70 55 6e 4b 65 79 29  CellKey, pUnKey)
1c170 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1c180 0a 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c  .          pCell
1c190 4b 65 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  Key = sqlite3Mal
1c1a0 6c 6f 63 28 20 6e 43 65 6c 6c 4b 65 79 20 29 3b  loc( nCellKey );
1c1b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
1c1c0 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20  CellKey==0 ){.  
1c1d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
1c1e0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
1c1f0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f           goto mo
1c200 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
1c210 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c220 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1c230 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c  treeKey(pCur, 0,
1c240 20 6e 43 65 6c 6c 4b 65 79 2c 20 28 76 6f 69 64   nCellKey, (void
1c250 20 2a 29 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20   *)pCellKey);.  
1c260 20 20 20 20 20 20 20 20 63 20 3d 20 73 71 6c 69          c = sqli
1c270 74 65 33 56 64 62 65 52 65 63 6f 72 64 43 6f 6d  te3VdbeRecordCom
1c280 70 61 72 65 28 6e 43 65 6c 6c 4b 65 79 2c 20 70  pare(nCellKey, p
1c290 43 65 6c 6c 4b 65 79 2c 20 70 55 6e 4b 65 79 29  CellKey, pUnKey)
1c2a0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1c2b0 74 65 33 5f 66 72 65 65 28 70 43 65 6c 6c 4b 65  te3_free(pCellKe
1c2c0 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  y);.          if
1c2d0 28 20 72 63 20 29 20 67 6f 74 6f 20 6d 6f 76 65  ( rc ) goto move
1c2e0 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20  to_finish;.     
1c2f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1c300 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20     if( c==0 ){. 
1c310 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66         pCur->inf
1c320 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65  o.nKey = nCellKe
1c330 79 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  y;.        if( p
1c340 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 26  Page->leafData &
1c350 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  & !pPage->leaf )
1c360 7b 0a 20 20 20 20 20 20 20 20 20 20 6c 77 72 20  {.          lwr 
1c370 3d 20 70 43 75 72 2d 3e 69 64 78 3b 0a 20 20 20  = pCur->idx;.   
1c380 20 20 20 20 20 20 20 75 70 72 20 3d 20 6c 77 72         upr = lwr
1c390 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   - 1;.          
1c3a0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
1c3b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1c3c0 69 66 28 20 70 52 65 73 20 29 20 2a 70 52 65 73  if( pRes ) *pRes
1c3d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1c3e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1c3f0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
1c400 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
1c410 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1c420 20 20 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b        if( c<0 ){
1c430 0a 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 70  .        lwr = p
1c440 43 75 72 2d 3e 69 64 78 2b 31 3b 0a 20 20 20 20  Cur->idx+1;.    
1c450 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1c460 20 75 70 72 20 3d 20 70 43 75 72 2d 3e 69 64 78   upr = pCur->idx
1c470 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  -1;.      }.    
1c480 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20 29 7b    if( lwr>upr ){
1c490 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 69  .        pCur->i
1c4a0 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c  nfo.nKey = nCell
1c4b0 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 62 72 65  Key;.        bre
1c4c0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1c4d0 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 28 6c    pCur->idx = (l
1c4e0 77 72 2b 75 70 72 29 2f 32 3b 0a 20 20 20 20 7d  wr+upr)/2;.    }
1c4f0 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72  .    assert( lwr
1c500 3d 3d 75 70 72 2b 31 20 29 3b 0a 20 20 20 20 61  ==upr+1 );.    a
1c510 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
1c520 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20  Init );.    if( 
1c530 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
1c540 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 30 3b       chldPg = 0;
1c550 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
1c560 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  wr>=pPage->nCell
1c570 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67   ){.      chldPg
1c580 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
1c590 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
1c5a0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
1c5b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c5c0 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79   chldPg = get4by
1c5d0 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
1c5e0 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a  e, lwr));.    }.
1c5f0 20 20 20 20 69 66 28 20 63 68 6c 64 50 67 3d 3d      if( chldPg==
1c600 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
1c610 74 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20  t( pCur->idx>=0 
1c620 26 26 20 70 43 75 72 2d 3e 69 64 78 3c 70 43 75  && pCur->idx<pCu
1c630 72 2d 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  r->pPage->nCell 
1c640 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65  );.      if( pRe
1c650 73 20 29 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20  s ) *pRes = c;. 
1c660 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1c670 5f 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  _OK;.      goto 
1c680 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
1c690 20 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69     }.    pCur->i
1c6a0 64 78 20 3d 20 6c 77 72 3b 0a 20 20 20 20 70 43  dx = lwr;.    pC
1c6b0 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d  ur->info.nSize =
1c6c0 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61   0;.    pCur->va
1c6d0 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 20  lidNKey = 0;.   
1c6e0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
1c6f0 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b  d(pCur, chldPg);
1c700 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
1c710 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
1c720 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e  ;.  }.moveto_fin
1c730 69 73 68 3a 0a 20 20 69 66 28 20 70 4b 65 79 20  ish:.  if( pKey 
1c740 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  ){.    /* If we 
1c750 63 72 65 61 74 65 64 20 6f 75 72 20 6f 77 6e 20  created our own 
1c760 75 6e 70 61 63 6b 65 64 20 6b 65 79 20 61 74 20  unpacked key at 
1c770 74 68 65 20 74 6f 70 20 6f 66 20 74 68 69 73 0a  the top of this.
1c780 20 20 20 20 2a 2a 20 70 72 6f 63 65 64 75 72 65      ** procedure
1c790 2c 20 74 68 65 6e 20 64 65 73 74 72 6f 79 20 74  , then destroy t
1c7a0 68 61 74 20 6b 65 79 20 62 65 66 6f 72 65 20 72  hat key before r
1c7b0 65 74 75 72 6e 69 6e 67 2e 20 2a 2f 0a 20 20 20  eturning. */.   
1c7c0 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
1c7d0 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  teUnpackedRecord
1c7e0 28 70 55 6e 4b 65 79 29 3b 0a 20 20 7d 0a 20 20  (pUnKey);.  }.  
1c7f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
1c800 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
1c810 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
1c820 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61  s not pointing a
1c830 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74 68  t an entry of th
1c840 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  e table..**.** T
1c850 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74 75  RUE will be retu
1c860 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61 6c  rned after a cal
1c870 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
1c880 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a 2a  eNext() moves.**
1c890 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 65   past the last e
1c8a0 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
1c8b0 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65  e or sqlite3Btre
1c8c0 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70 61  ePrev() moves pa
1c8d0 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  st.** the first 
1c8e0 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73 20  entry.  TRUE is 
1c8f0 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69 66  also returned if
1c900 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
1c910 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
1c920 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43 75  te3BtreeEof(BtCu
1c930 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f  rsor *pCur){.  /
1c940 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66 20  * TODO: What if 
1c950 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69 6e  the cursor is in
1c960 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
1c970 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62 6c  EEK but all tabl
1c980 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20 68  e entries.  ** h
1c990 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65 64  ave been deleted
1c9a0 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c 20  ? This API will 
1c9b0 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74  need to change t
1c9c0 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  o return an erro
1c9d0 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20 77  r code.  ** as w
1c9e0 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c 65  ell as the boole
1c9f0 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e  an result value.
1ca00 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 28  .  */.  return (
1ca10 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70 43  CURSOR_VALID!=pC
1ca20 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a 0a  ur->eState);.}..
1ca30 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1ca40 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1ca50 74 69 6f 6e 20 68 61 6e 64 6c 65 20 66 6f 72 20  tion handle for 
1ca60 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 71 6c  a cursor..*/.sql
1ca70 69 74 65 33 20 2a 73 71 6c 69 74 65 33 42 74 72  ite3 *sqlite3Btr
1ca80 65 65 43 75 72 73 6f 72 44 62 28 63 6f 6e 73 74  eeCursorDb(const
1ca90 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29   BtCursor *pCur)
1caa0 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  {.  assert( sqli
1cab0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
1cac0 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d  Cur->pBtree->db-
1cad0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74  >mutex) );.  ret
1cae0 75 72 6e 20 70 43 75 72 2d 3e 70 42 74 72 65 65  urn pCur->pBtree
1caf0 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ->db;.}../*.** A
1cb00 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73 6f  dvance the curso
1cb10 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65 6e  r to the next en
1cb20 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62  try in the datab
1cb30 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63 63  ase.  If.** succ
1cb40 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74 20  essful then set 
1cb50 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68 65  *pRes=0.  If the
1cb60 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20 61   cursor.** was a
1cb70 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67 20  lready pointing 
1cb80 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72  to the last entr
1cb90 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
1cba0 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69 73  e before.** this
1cbb0 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c   routine was cal
1cbc0 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a 70  led, then set *p
1cbd0 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71  Res=1..*/.int sq
1cbe0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 42  lite3BtreeNext(B
1cbf0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
1cc00 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
1cc10 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a   rc;.  MemPage *
1cc20 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
1cc30 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1cc40 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63  ex(pCur) );.  rc
1cc50 20 3d 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61   = restoreOrClea
1cc60 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
1cc70 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21  pCur);.  if( rc!
1cc80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1cc90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1cca0 0a 20 20 61 73 73 65 72 74 28 20 70 52 65 73 21  .  assert( pRes!
1ccb0 3d 30 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20  =0 );.  pPage = 
1ccc0 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69  pCur->pPage;.  i
1ccd0 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
1cce0 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
1ccf0 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31  ){.    *pRes = 1
1cd00 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1cd10 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
1cd20 28 20 70 43 75 72 2d 3e 73 6b 69 70 3e 30 20 29  ( pCur->skip>0 )
1cd30 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70  {.    pCur->skip
1cd40 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20   = 0;.    *pRes 
1cd50 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
1cd60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1cd70 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b   pCur->skip = 0;
1cd80 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
1cd90 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  e->isInit );.  a
1cda0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64 78  ssert( pCur->idx
1cdb0 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
1cdc0 0a 0a 20 20 70 43 75 72 2d 3e 69 64 78 2b 2b 3b  ..  pCur->idx++;
1cdd0 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  .  pCur->info.nS
1cde0 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  ize = 0;.  pCur-
1cdf0 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
1ce00 20 20 69 66 28 20 70 43 75 72 2d 3e 69 64 78 3e    if( pCur->idx>
1ce10 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
1ce20 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
1ce30 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
1ce40 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
1ce50 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26  pCur, get4byte(&
1ce60 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
1ce70 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
1ce80 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ));.      if( rc
1ce90 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1cea0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c      rc = moveToL
1ceb0 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
1cec0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
1ced0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1cee0 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20  .    }.    do{. 
1cef0 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1cf00 42 74 72 65 65 49 73 52 6f 6f 74 50 61 67 65 28  BtreeIsRootPage(
1cf10 70 50 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20  pPage) ){.      
1cf20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
1cf30 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
1cf40 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
1cf50 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ID;.        retu
1cf60 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1cf70 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1cf80 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61  te3BtreeMoveToPa
1cf90 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20  rent(pCur);.    
1cfa0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
1cfb0 70 50 61 67 65 3b 0a 20 20 20 20 7d 77 68 69 6c  pPage;.    }whil
1cfc0 65 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 70 50  e( pCur->idx>=pP
1cfd0 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
1cfe0 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
1cff0 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
1d000 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 72 63  Data ){.      rc
1d010 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e   = sqlite3BtreeN
1d020 65 78 74 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ext(pCur, pRes);
1d030 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1d040 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1d050 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
1d060 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 2a 70 52  rn rc;.  }.  *pR
1d070 65 73 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  es = 0;.  if( pP
1d080 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
1d090 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d0a0 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 6d 6f  K;.  }.  rc = mo
1d0b0 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75  veToLeftmost(pCu
1d0c0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
1d0d0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20  .}.../*.** Step 
1d0e0 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68  the cursor to th
1d0f0 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 72  e back to the pr
1d100 65 76 69 6f 75 73 20 65 6e 74 72 79 20 69 6e 20  evious entry in 
1d110 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
1d120 66 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20  f.** successful 
1d130 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 30  then set *pRes=0
1d140 2e 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72  .  If the cursor
1d150 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61 64 79 20  .** was already 
1d160 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 20  pointing to the 
1d170 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74  first entry in t
1d180 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66 6f  he database befo
1d190 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  re.** this routi
1d1a0 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 74  ne was called, t
1d1b0 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d 31 2e  hen set *pRes=1.
1d1c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1d1d0 74 72 65 65 50 72 65 76 69 6f 75 73 28 42 74 43  treePrevious(BtC
1d1e0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74  ursor *pCur, int
1d1f0 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72   *pRes){.  int r
1d200 63 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a  c;.  Pgno pgno;.
1d210 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1d220 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
1d230 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1d240 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
1d250 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73  storeOrClearCurs
1d260 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
1d270 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1d280 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
1d290 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 43  urn rc;.  }.  pC
1d2a0 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a  ur->atLast = 0;.
1d2b0 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56    if( CURSOR_INV
1d2c0 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61  ALID==pCur->eSta
1d2d0 74 65 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  te ){.    *pRes 
1d2e0 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
1d2f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1d300 20 69 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3c   if( pCur->skip<
1d310 30 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73  0 ){.    pCur->s
1d320 6b 69 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52  kip = 0;.    *pR
1d330 65 73 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75  es = 0;.    retu
1d340 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1d350 7d 0a 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d  }.  pCur->skip =
1d360 20 30 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70   0;..  pPage = p
1d370 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73  Cur->pPage;.  as
1d380 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
1d390 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nit );.  assert(
1d3a0 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 29 3b   pCur->idx>=0 );
1d3b0 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
1d3c0 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20  eaf ){.    pgno 
1d3d0 3d 20 67 65 74 34 62 79 74 65 28 20 66 69 6e 64  = get4byte( find
1d3e0 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72  Cell(pPage, pCur
1d3f0 2d 3e 69 64 78 29 20 29 3b 0a 20 20 20 20 72 63  ->idx) );.    rc
1d400 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
1d410 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  Cur, pgno);.    
1d420 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1d430 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1d440 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
1d450 52 69 67 68 74 6d 6f 73 74 28 70 43 75 72 29 3b  Rightmost(pCur);
1d460 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68  .  }else{.    wh
1d470 69 6c 65 28 20 70 43 75 72 2d 3e 69 64 78 3d 3d  ile( pCur->idx==
1d480 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  0 ){.      if( s
1d490 71 6c 69 74 65 33 42 74 72 65 65 49 73 52 6f 6f  qlite3BtreeIsRoo
1d4a0 74 50 61 67 65 28 70 50 61 67 65 29 20 29 7b 0a  tPage(pPage) ){.
1d4b0 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53          pCur->eS
1d4c0 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
1d4d0 56 41 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 2a  VALID;.        *
1d4e0 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  pRes = 1;.      
1d4f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d500 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
1d510 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f    sqlite3BtreeMo
1d520 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
1d530 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20  ;.      pPage = 
1d540 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 20  pCur->pPage;.   
1d550 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78   }.    pCur->idx
1d560 2d 2d 3b 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e  --;.    pCur->in
1d570 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1d580 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
1d590 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70  y = 0;.    if( p
1d5a0 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 26  Page->leafData &
1d5b0 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  & !pPage->leaf )
1d5c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
1d5d0 69 74 65 33 42 74 72 65 65 50 72 65 76 69 6f 75  ite3BtreePreviou
1d5e0 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20  s(pCur, pRes);. 
1d5f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1d600 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1d610 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 52 65      }.  }.  *pRe
1d620 73 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  s = 0;.  return 
1d630 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  rc;.}../*.** All
1d640 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
1d650 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
1d660 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  se file..**.** T
1d670 68 65 20 6e 65 77 20 70 61 67 65 20 69 73 20 6d  he new page is m
1d680 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 20  arked as dirty. 
1d690 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73   (In other words
1d6a0 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  , sqlite3PagerWr
1d6b0 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61 6c 72  ite().** has alr
1d6c0 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
1d6d0 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61 67 65   on the new page
1d6e0 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61 67 65  .)  The new page
1d6f0 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62 65 65   has also.** bee
1d700 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61 6e 64  n referenced and
1d710 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
1d720 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e 73 69  tine is responsi
1d730 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e 67 0a  ble for calling.
1d740 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  ** sqlite3PagerU
1d750 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20 6e 65  nref() on the ne
1d760 77 20 70 61 67 65 20 77 68 65 6e 20 69 74 20 69  w page when it i
1d770 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  s done..**.** SQ
1d780 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
1d790 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
1d7a0 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74 75 72   Any other retur
1d7b0 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61 74 65  n value indicate
1d7c0 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e 20 20  s.** an error.  
1d7d0 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70 50 67  *ppPage and *pPg
1d7e0 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64  no are undefined
1d7f0 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   in the event of
1d800 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f   an error..** Do
1d810 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71 6c 69   not invoke sqli
1d820 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20  te3PagerUnref() 
1d830 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20 61 6e  on *ppPage if an
1d840 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e   error is return
1d850 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
1d860 20 22 6e 65 61 72 62 79 22 20 70 61 72 61 6d 65   "nearby" parame
1d870 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 74 68  ter is not 0, th
1d880 65 6e 20 61 20 28 66 65 65 62 6c 65 29 20 65 66  en a (feeble) ef
1d890 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74 6f 20  fort is made to 
1d8a0 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70 61 67  .** locate a pag
1d8b0 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65 20 70  e close to the p
1d8c0 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65 61 72  age number "near
1d8d0 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e 20 62  by".  This can b
1d8e0 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a 2a 20  e used in an.** 
1d8f0 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65 70 20  attempt to keep 
1d900 72 65 6c 61 74 65 64 20 70 61 67 65 73 20 63 6c  related pages cl
1d910 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74 68 65  ose to each othe
1d920 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  r in the databas
1d930 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69 63 68  e file,.** which
1d940 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d 61 6b   in turn can mak
1d950 65 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73  e database acces
1d960 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  s faster..**.** 
1d970 49 66 20 74 68 65 20 22 65 78 61 63 74 22 20 70  If the "exact" p
1d980 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
1d990 30 2c 20 61 6e 64 20 74 68 65 20 70 61 67 65 2d  0, and the page-
1d9a0 6e 75 6d 62 65 72 20 6e 65 61 72 62 79 20 65 78  number nearby ex
1d9b0 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77 68 65 72  ists .** anywher
1d9c0 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69  e on the free-li
1d9d0 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73 20 67  st, then it is g
1d9e0 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62 65 20  uarenteed to be 
1d9f0 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 0a 2a  returned. This.*
1da00 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 62  * is only used b
1da10 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  y auto-vacuum da
1da20 74 61 62 61 73 65 73 20 77 68 65 6e 20 61 6c 6c  tabases when all
1da30 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61  ocating a new ta
1da40 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
1da50 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
1da60 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64  Page(.  BtShared
1da70 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50 61 67   *pBt, .  MemPag
1da80 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20 20 50  e **ppPage, .  P
1da90 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20 20 50  gno *pPgno, .  P
1daa0 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20 75 38  gno nearby,.  u8
1dab0 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65 6d 50   exact.){.  MemP
1dac0 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20 20 69  age *pPage1;.  i
1dad0 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 3b 20  nt rc;.  int n; 
1dae0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1daf0 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72   pages on the fr
1db00 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20  eelist */.  int 
1db10 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  k;     /* Number
1db20 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20 74 68   of leaves on th
1db30 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65 20 66  e trunk of the f
1db40 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d 65 6d  reelist */.  Mem
1db50 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d 20 30  Page *pTrunk = 0
1db60 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 72  ;.  MemPage *pPr
1db70 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 0a 20 20  evTrunk = 0;..  
1db80 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1db90 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
1dba0 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67  mutex) );.  pPag
1dbb0 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  e1 = pBt->pPage1
1dbc0 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79 74 65  ;.  n = get4byte
1dbd0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1dbe0 33 36 5d 29 3b 0a 20 20 69 66 28 20 6e 3e 30 20  36]);.  if( n>0 
1dbf0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20  ){.    /* There 
1dc00 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74 68 65  are pages on the
1dc10 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 75 73   freelist.  Reus
1dc20 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70  e one of those p
1dc30 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50 67 6e  ages. */.    Pgn
1dc40 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 75 38  o iTrunk;.    u8
1dc50 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30 3b   searchList = 0;
1dc60 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65 65 2d   /* If the free-
1dc70 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73 65 61  list must be sea
1dc80 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61 72 62  rched for 'nearb
1dc90 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20 20 2f  y' */.    .    /
1dca0 2a 20 49 66 20 74 68 65 20 27 65 78 61 63 74 27  * If the 'exact'
1dcb0 20 70 61 72 61 6d 65 74 65 72 20 77 61 73 20 74   parameter was t
1dcc0 72 75 65 20 61 6e 64 20 61 20 71 75 65 72 79 20  rue and a query 
1dcd0 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  of the pointer-m
1dce0 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77 73 20  ap.    ** shows 
1dcf0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 27 6e  that the page 'n
1dd00 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65 77 68  earby' is somewh
1dd10 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ere on the free-
1dd20 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20 20 2a  list, then.    *
1dd30 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c 69 73  * the entire-lis
1dd40 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72 63 68  t will be search
1dd50 65 64 20 66 6f 72 20 74 68 61 74 20 70 61 67 65  ed for that page
1dd60 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ..    */.#ifndef
1dd70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
1dd80 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
1dd90 65 78 61 63 74 20 26 26 20 6e 65 61 72 62 79 3c  exact && nearby<
1dda0 3d 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  =pagerPagecount(
1ddb0 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a  pBt->pPager) ){.
1ddc0 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a        u8 eType;.
1ddd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 65        assert( ne
1dde0 61 72 62 79 3e 30 20 29 3b 0a 20 20 20 20 20 20  arby>0 );.      
1ddf0 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74  assert( pBt->aut
1de00 6f 56 61 63 75 75 6d 20 29 3b 0a 20 20 20 20 20  oVacuum );.     
1de10 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
1de20 70 42 74 2c 20 6e 65 61 72 62 79 2c 20 26 65 54  pBt, nearby, &eT
1de30 79 70 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ype, 0);.      i
1de40 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1de50 63 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  c;.      if( eTy
1de60 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
1de70 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 73  AGE ){.        s
1de80 65 61 72 63 68 4c 69 73 74 20 3d 20 31 3b 0a 20  earchList = 1;. 
1de90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 50       }.      *pP
1dea0 67 6e 6f 20 3d 20 6e 65 61 72 62 79 3b 0a 20 20  gno = nearby;.  
1deb0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
1dec0 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65  /* Decrement the
1ded0 20 66 72 65 65 2d 6c 69 73 74 20 63 6f 75 6e 74   free-list count
1dee0 20 62 79 20 31 2e 20 53 65 74 20 69 54 72 75 6e   by 1. Set iTrun
1def0 6b 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  k to the index o
1df00 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 66 69 72  f the.    ** fir
1df10 73 74 20 66 72 65 65 2d 6c 69 73 74 20 74 72 75  st free-list tru
1df20 6e 6b 20 70 61 67 65 2e 20 69 50 72 65 76 54 72  nk page. iPrevTr
1df30 75 6e 6b 20 69 73 20 69 6e 69 74 69 61 6c 6c 79  unk is initially
1df40 20 31 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72   1..    */.    r
1df50 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1df60 57 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44  Write(pPage1->pD
1df70 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
1df80 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
1df90 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
1dfa0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c  age1->aData[36],
1dfb0 20 6e 2d 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 54   n-1);..    /* T
1dfc0 68 65 20 63 6f 64 65 20 77 69 74 68 69 6e 20 74  he code within t
1dfd0 68 69 73 20 6c 6f 6f 70 20 69 73 20 72 75 6e 20  his loop is run 
1dfe0 6f 6e 6c 79 20 6f 6e 63 65 20 69 66 20 74 68 65  only once if the
1dff0 20 27 73 65 61 72 63 68 4c 69 73 74 27 20 76 61   'searchList' va
1e000 72 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 69 73  riable.    ** is
1e010 20 6e 6f 74 20 74 72 75 65 2e 20 4f 74 68 65 72   not true. Other
1e020 77 69 73 65 2c 20 69 74 20 72 75 6e 73 20 6f 6e  wise, it runs on
1e030 63 65 20 66 6f 72 20 65 61 63 68 20 74 72 75 6e  ce for each trun
1e040 6b 2d 70 61 67 65 20 6f 6e 20 74 68 65 0a 20 20  k-page on the.  
1e050 20 20 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 75    ** free-list u
1e060 6e 74 69 6c 20 74 68 65 20 70 61 67 65 20 27 6e  ntil the page 'n
1e070 65 61 72 62 79 27 20 69 73 20 6c 6f 63 61 74 65  earby' is locate
1e080 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 6f  d..    */.    do
1e090 20 7b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72   {.      pPrevTr
1e0a0 75 6e 6b 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20  unk = pTrunk;.  
1e0b0 20 20 20 20 69 66 28 20 70 50 72 65 76 54 72 75      if( pPrevTru
1e0c0 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 54  nk ){.        iT
1e0d0 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28  runk = get4byte(
1e0e0 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
1e0f0 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 65  ta[0]);.      }e
1e100 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 54 72  lse{.        iTr
1e110 75 6e 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26  unk = get4byte(&
1e120 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32  pPage1->aData[32
1e130 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
1e140 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1e150 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
1e160 69 54 72 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c  iTrunk, &pTrunk,
1e170 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
1e180 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 54 72  c ){.        pTr
1e190 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  unk = 0;.       
1e1a0 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61   goto end_alloca
1e1b0 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 7d  te_page;.      }
1e1c0 0a 0a 20 20 20 20 20 20 6b 20 3d 20 67 65 74 34  ..      k = get4
1e1d0 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
1e1e0 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 69  ata[4]);.      i
1e1f0 66 28 20 6b 3d 3d 30 20 26 26 20 21 73 65 61 72  f( k==0 && !sear
1e200 63 68 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  chList ){.      
1e210 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 68    /* The trunk h
1e220 61 73 20 6e 6f 20 6c 65 61 76 65 73 20 61 6e 64  as no leaves and
1e230 20 74 68 65 20 6c 69 73 74 20 69 73 20 6e 6f 74   the list is not
1e240 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64 2e   being searched.
1e250 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20   .        ** So 
1e260 65 78 74 72 61 63 74 20 74 68 65 20 74 72 75 6e  extract the trun
1e270 6b 20 70 61 67 65 20 69 74 73 65 6c 66 20 61 6e  k page itself an
1e280 64 20 75 73 65 20 69 74 20 61 73 20 74 68 65 20  d use it as the 
1e290 6e 65 77 6c 79 20 0a 20 20 20 20 20 20 20 20 2a  newly .        *
1e2a0 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  * allocated page
1e2b0 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65   */.        asse
1e2c0 72 74 28 20 70 50 72 65 76 54 72 75 6e 6b 3d 3d  rt( pPrevTrunk==
1e2d0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
1e2e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1e2f0 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
1e300 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
1e310 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
1e320 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
1e330 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
1e340 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 70 50 67    }.        *pPg
1e350 6e 6f 20 3d 20 69 54 72 75 6e 6b 3b 0a 20 20 20  no = iTrunk;.   
1e360 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
1e370 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
1e380 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
1e390 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 2a  ], 4);.        *
1e3a0 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
1e3b0 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
1e3c0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41  = 0;.        TRA
1e3d0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
1e3e0 64 20 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65  d trunk - %d fre
1e3f0 65 20 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c  e pages left\n",
1e400 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a   *pPgno, n-1));.
1e410 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1e420 6b 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  k>pBt->usableSiz
1e430 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20  e/4 - 8 ){.     
1e440 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 6b     /* Value of k
1e450 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65   is out of range
1e460 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  .  Database corr
1e470 75 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  uption */.      
1e480 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f    rc = SQLITE_CO
1e490 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
1e4a0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
1e4b0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 23 69 66 6e  ocate_page;.#ifn
1e4c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1e4d0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
1e4e0 20 7d 65 6c 73 65 20 69 66 28 20 73 65 61 72 63   }else if( searc
1e4f0 68 4c 69 73 74 20 26 26 20 6e 65 61 72 62 79 3d  hList && nearby=
1e500 3d 69 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  =iTrunk ){.     
1e510 20 20 20 2f 2a 20 54 68 65 20 6c 69 73 74 20 69     /* The list i
1e520 73 20 62 65 69 6e 67 20 73 65 61 72 63 68 65 64  s being searched
1e530 20 61 6e 64 20 74 68 69 73 20 74 72 75 6e 6b 20   and this trunk 
1e540 70 61 67 65 20 69 73 20 74 68 65 20 70 61 67 65  page is the page
1e550 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 61  .        ** to a
1e560 6c 6c 6f 63 61 74 65 2c 20 72 65 67 61 72 64 6c  llocate, regardl
1e570 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 69  ess of whether i
1e580 74 20 68 61 73 20 6c 65 61 76 65 73 2e 0a 20 20  t has leaves..  
1e590 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1e5a0 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 3d   assert( *pPgno=
1e5b0 3d 69 54 72 75 6e 6b 20 29 3b 0a 20 20 20 20 20  =iTrunk );.     
1e5c0 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54 72     *ppPage = pTr
1e5d0 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 73 65 61  unk;.        sea
1e5e0 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20 20  rchList = 0;.   
1e5f0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1e600 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72 75  3PagerWrite(pTru
1e610 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
1e620 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
1e630 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
1e640 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
1e650 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1e660 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 29 7b 0a      if( k==0 ){.
1e670 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
1e680 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20  PrevTrunk ){.   
1e690 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
1e6a0 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
1e6b0 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61  2], &pTrunk->aDa
1e6c0 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20  ta[0], 4);.     
1e6d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1e6e0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
1e6f0 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74  pPrevTrunk->aDat
1e700 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61  a[0], &pTrunk->a
1e710 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20  Data[0], 4);.   
1e720 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e730 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e740 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 70    /* The trunk p
1e750 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64 20  age is required 
1e760 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 62 75  by the caller bu
1e770 74 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 0a 20  t it contains . 
1e780 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e           ** poin
1e790 74 65 72 73 20 74 6f 20 66 72 65 65 2d 6c 69 73  ters to free-lis
1e7a0 74 20 6c 65 61 76 65 73 2e 20 54 68 65 20 66 69  t leaves. The fi
1e7b0 72 73 74 20 6c 65 61 66 20 62 65 63 6f 6d 65 73  rst leaf becomes
1e7c0 20 61 20 74 72 75 6e 6b 0a 20 20 20 20 20 20 20   a trunk.       
1e7d0 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
1e7e0 69 73 20 63 61 73 65 2e 0a 20 20 20 20 20 20 20  is case..       
1e7f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20     */.          
1e800 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 54 72 75  MemPage *pNewTru
1e810 6e 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67  nk;.          Pg
1e820 6e 6f 20 69 4e 65 77 54 72 75 6e 6b 20 3d 20 67  no iNewTrunk = g
1e830 65 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d  et4byte(&pTrunk-
1e840 3e 61 44 61 74 61 5b 38 5d 29 3b 0a 20 20 20 20  >aData[8]);.    
1e850 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1e860 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
1e870 42 74 2c 20 69 4e 65 77 54 72 75 6e 6b 2c 20 26  Bt, iNewTrunk, &
1e880 70 4e 65 77 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  pNewTrunk, 0);. 
1e890 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1e8a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e8b0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
1e8c0 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65  nd_allocate_page
1e8d0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1e8e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1e8f0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1e900 4e 65 77 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  NewTrunk->pDbPag
1e910 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
1e920 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1e930 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1e940 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54  eleasePage(pNewT
1e950 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
1e960 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f     goto end_allo
1e970 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20  cate_page;.     
1e980 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1e990 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54 72 75   memcpy(&pNewTru
1e9a0 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70  nk->aData[0], &p
1e9b0 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
1e9c0 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   4);.          p
1e9d0 75 74 34 62 79 74 65 28 26 70 4e 65 77 54 72 75  ut4byte(&pNewTru
1e9e0 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2d  nk->aData[4], k-
1e9f0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  1);.          me
1ea00 6d 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d  mcpy(&pNewTrunk-
1ea10 3e 61 44 61 74 61 5b 38 5d 2c 20 26 70 54 72 75  >aData[8], &pTru
1ea20 6e 6b 2d 3e 61 44 61 74 61 5b 31 32 5d 2c 20 28  nk->aData[12], (
1ea30 6b 2d 31 29 2a 34 29 3b 0a 20 20 20 20 20 20 20  k-1)*4);.       
1ea40 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
1ea50 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20  NewTrunk);.     
1ea60 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54       if( !pPrevT
1ea70 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  runk ){.        
1ea80 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50      put4byte(&pP
1ea90 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c  age1->aData[32],
1eaa0 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20   iNewTrunk);.   
1eab0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
1eac0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1ead0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1eae0 28 70 50 72 65 76 54 72 75 6e 6b 2d 3e 70 44 62  (pPrevTrunk->pDb
1eaf0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
1eb00 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1eb10 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
1eb20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
1eb30 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  e;.            }
1eb40 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75 74  .            put
1eb50 34 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e  4byte(&pPrevTrun
1eb60 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 69 4e 65  k->aData[0], iNe
1eb70 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
1eb80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1eb90 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
1eba0 30 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  0;.        TRACE
1ebb0 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20  (("ALLOCATE: %d 
1ebc0 74 72 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20  trunk - %d free 
1ebd0 70 61 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a  pages left\n", *
1ebe0 70 50 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65  pPgno, n-1));.#e
1ebf0 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65  ndif.      }else
1ec00 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74  {.        /* Ext
1ec10 72 61 63 74 20 61 20 6c 65 61 66 20 66 72 6f 6d  ract a leaf from
1ec20 20 74 68 65 20 74 72 75 6e 6b 20 2a 2f 0a 20 20   the trunk */.  
1ec30 20 20 20 20 20 20 69 6e 74 20 63 6c 6f 73 65 73        int closes
1ec40 74 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  t;.        Pgno 
1ec50 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20 75  iPage;.        u
1ec60 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44  nsigned char *aD
1ec70 61 74 61 20 3d 20 70 54 72 75 6e 6b 2d 3e 61 44  ata = pTrunk->aD
1ec80 61 74 61 3b 0a 20 20 20 20 20 20 20 20 72 63 20  ata;.        rc 
1ec90 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1eca0 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ite(pTrunk->pDbP
1ecb0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  age);.        if
1ecc0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
1ecd0 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63    goto end_alloc
1ece0 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20  ate_page;.      
1ecf0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1ed00 6e 65 61 72 62 79 3e 30 20 29 7b 0a 20 20 20 20  nearby>0 ){.    
1ed10 20 20 20 20 20 20 69 6e 74 20 69 2c 20 64 69 73        int i, dis
1ed20 74 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f  t;.          clo
1ed30 73 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  sest = 0;.      
1ed40 20 20 20 20 64 69 73 74 20 3d 20 67 65 74 34 62      dist = get4b
1ed50 79 74 65 28 26 61 44 61 74 61 5b 38 5d 29 20 2d  yte(&aData[8]) -
1ed60 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20   nearby;.       
1ed70 20 20 20 69 66 28 20 64 69 73 74 3c 30 20 29 20     if( dist<0 ) 
1ed80 64 69 73 74 20 3d 20 2d 64 69 73 74 3b 0a 20 20  dist = -dist;.  
1ed90 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b          for(i=1;
1eda0 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
1edb0 20 20 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d          int d2 =
1edc0 20 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61   get4byte(&aData
1edd0 5b 38 2b 69 2a 34 5d 29 20 2d 20 6e 65 61 72 62  [8+i*4]) - nearb
1ede0 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  y;.            i
1edf0 66 28 20 64 32 3c 30 20 29 20 64 32 20 3d 20 2d  f( d2<0 ) d2 = -
1ee00 64 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d2;.            
1ee10 69 66 28 20 64 32 3c 64 69 73 74 20 29 7b 0a 20  if( d2<dist ){. 
1ee20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f               clo
1ee30 73 65 73 74 20 3d 20 69 3b 0a 20 20 20 20 20 20  sest = i;.      
1ee40 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20 64          dist = d
1ee50 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  2;.            }
1ee60 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1ee70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1ee80 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d 20        closest = 
1ee90 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  0;.        }..  
1eea0 20 20 20 20 20 20 69 50 61 67 65 20 3d 20 67 65        iPage = ge
1eeb0 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b  t4byte(&aData[8+
1eec0 63 6c 6f 73 65 73 74 2a 34 5d 29 3b 0a 20 20 20  closest*4]);.   
1eed0 20 20 20 20 20 69 66 28 20 21 73 65 61 72 63 68       if( !search
1eee0 4c 69 73 74 20 7c 7c 20 69 50 61 67 65 3d 3d 6e  List || iPage==n
1eef0 65 61 72 62 79 20 29 7b 0a 20 20 20 20 20 20 20  earby ){.       
1ef00 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20 20     int nPage;.  
1ef10 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
1ef20 20 69 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20   iPage;.        
1ef30 20 20 6e 50 61 67 65 20 3d 20 70 61 67 65 72 50    nPage = pagerP
1ef40 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
1ef50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
1ef60 20 69 66 28 20 2a 70 50 67 6e 6f 3e 6e 50 61 67   if( *pPgno>nPag
1ef70 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
1ef80 20 2f 2a 20 46 72 65 65 20 70 61 67 65 20 6f 66   /* Free page of
1ef90 66 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  f the end of the
1efa0 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20   file */.       
1efb0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1efc0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1efd0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
1efe0 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
1eff0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
1f000 20 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28           TRACE((
1f010 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61  "ALLOCATE: %d wa
1f020 73 20 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20  s leaf %d of %d 
1f030 6f 6e 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20  on trunk %d".   
1f040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 3a                ":
1f050 20 25 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61   %d more free pa
1f060 67 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  ges\n",.        
1f070 20 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c           *pPgno,
1f080 20 63 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70   closest+1, k, p
1f090 54 72 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31  Trunk->pgno, n-1
1f0a0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ));.          if
1f0b0 28 20 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b  ( closest<k-1 ){
1f0c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
1f0d0 63 70 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f  cpy(&aData[8+clo
1f0e0 73 65 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b  sest*4], &aData[
1f0f0 34 2b 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20  4+k*4], 4);.    
1f100 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f110 20 20 70 75 74 34 62 79 74 65 28 26 61 44 61 74    put4byte(&aDat
1f120 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20  a[4], k-1);.    
1f130 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1f140 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
1f150 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
1f160 67 65 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  ge, 1);.        
1f170 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f180 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
1f190 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 44     sqlite3PagerD
1f1a0 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 28 2a 70 70  ontRollback((*pp
1f1b0 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b  Page)->pDbPage);
1f1c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
1f1d0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1f1e0 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ite((*ppPage)->p
1f1f0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1f200 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1f210 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f220 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
1f230 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
1f240 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1f250 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f260 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
1f270 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1f280 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73    }.      releas
1f290 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
1f2a0 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72  );.      pPrevTr
1f2b0 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68  unk = 0;.    }wh
1f2c0 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20  ile( searchList 
1f2d0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1f2e0 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20  /* There are no 
1f2f0 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
1f300 65 6c 69 73 74 2c 20 73 6f 20 63 72 65 61 74 65  elist, so create
1f310 20 61 20 6e 65 77 20 70 61 67 65 20 61 74 20 74   a new page at t
1f320 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66  he.    ** end of
1f330 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20   the file */.   
1f340 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 70 61 67   int nPage = pag
1f350 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
1f360 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 2a 70  >pPager);.    *p
1f370 50 67 6e 6f 20 3d 20 6e 50 61 67 65 20 2b 20 31  Pgno = nPage + 1
1f380 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1f390 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1f3a0 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e  M.    if( pBt->n
1f3b0 54 72 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 2f  Trunc ){.      /
1f3c0 2a 20 41 6e 20 69 6e 63 72 2d 76 61 63 75 75 6d  * An incr-vacuum
1f3d0 20 68 61 73 20 61 6c 72 65 61 64 79 20 72 75 6e   has already run
1f3e0 20 77 69 74 68 69 6e 20 74 68 69 73 20 74 72 61   within this tra
1f3f0 6e 73 61 63 74 69 6f 6e 2e 20 53 6f 20 74 68 65  nsaction. So the
1f400 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 74  .      ** page t
1f410 6f 20 61 6c 6c 6f 63 61 74 65 20 69 73 20 6e 6f  o allocate is no
1f420 74 20 66 72 6f 6d 20 74 68 65 20 70 68 79 73 69  t from the physi
1f430 63 61 6c 20 65 6e 64 20 6f 66 20 74 68 65 20 66  cal end of the f
1f440 69 6c 65 2c 20 62 75 74 0a 20 20 20 20 20 20 2a  ile, but.      *
1f450 2a 20 61 74 20 70 42 74 2d 3e 6e 54 72 75 6e 63  * at pBt->nTrunc
1f460 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  . .      */.    
1f470 20 20 2a 70 50 67 6e 6f 20 3d 20 70 42 74 2d 3e    *pPgno = pBt->
1f480 6e 54 72 75 6e 63 2b 31 3b 0a 20 20 20 20 20 20  nTrunc+1;.      
1f490 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44  if( *pPgno==PEND
1f4a0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1f4b0 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 28 2a  t) ){.        (*
1f4c0 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 20  pPgno)++;.      
1f4d0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1f4e0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
1f4f0 26 26 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  && PTRMAP_ISPAGE
1f500 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 20 29 7b  (pBt, *pPgno) ){
1f510 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 2a 70 50  .      /* If *pP
1f520 67 6e 6f 20 72 65 66 65 72 73 20 74 6f 20 61 20  gno refers to a 
1f530 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
1f540 2c 20 61 6c 6c 6f 63 61 74 65 20 74 77 6f 20 6e  , allocate two n
1f550 65 77 20 70 61 67 65 73 0a 20 20 20 20 20 20 2a  ew pages.      *
1f560 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20  * at the end of 
1f570 74 68 65 20 66 69 6c 65 20 69 6e 73 74 65 61 64  the file instead
1f580 20 6f 66 20 6f 6e 65 2e 20 54 68 65 20 66 69 72   of one. The fir
1f590 73 74 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  st allocated pag
1f5a0 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 63 6f 6d  e.      ** becom
1f5b0 65 73 20 61 20 6e 65 77 20 70 6f 69 6e 74 65 72  es a new pointer
1f5c0 2d 6d 61 70 20 70 61 67 65 2c 20 74 68 65 20 73  -map page, the s
1f5d0 65 63 6f 6e 64 20 69 73 20 75 73 65 64 20 62 79  econd is used by
1f5e0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20   the caller..   
1f5f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 54 52 41 43     */.      TRAC
1f600 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64  E(("ALLOCATE: %d
1f610 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69 6c   from end of fil
1f620 65 20 28 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70  e (pointer-map p
1f630 61 67 65 29 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29  age)\n", *pPgno)
1f640 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1f650 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47   *pPgno!=PENDING
1f660 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
1f670 29 3b 0a 20 20 20 20 20 20 28 2a 70 50 67 6e 6f  );.      (*pPgno
1f680 29 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 2a  )++;.      if( *
1f690 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42  pPgno==PENDING_B
1f6a0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
1f6b0 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 20 7d 0a 20   (*pPgno)++; }. 
1f6c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74     }.    if( pBt
1f6d0 2d 3e 6e 54 72 75 6e 63 20 29 7b 0a 20 20 20 20  ->nTrunc ){.    
1f6e0 20 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20    pBt->nTrunc = 
1f6f0 2a 70 50 67 6e 6f 3b 0a 20 20 20 20 7d 0a 23 65  *pPgno;.    }.#e
1f700 6e 64 69 66 0a 0a 20 20 20 20 61 73 73 65 72 74  ndif..    assert
1f710 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
1f720 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
1f730 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
1f740 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
1f750 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70  (pBt, *pPgno, pp
1f760 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66  Page, 0);.    if
1f770 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1f780 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1f790 65 33 50 61 67 65 72 57 72 69 74 65 28 28 2a 70  e3PagerWrite((*p
1f7a0 70 50 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29  pPage)->pDbPage)
1f7b0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1f7c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1f7d0 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
1f7e0 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  Page);.    }.   
1f7f0 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
1f800 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f  E: %d from end o
1f810 66 20 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e  f file\n", *pPgn
1f820 6f 29 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65  o));.  }..  asse
1f830 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44  rt( *pPgno!=PEND
1f840 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1f850 74 29 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63  t) );..end_alloc
1f860 61 74 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65  ate_page:.  rele
1f870 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
1f880 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70  .  releasePage(p
1f890 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20 20 72 65  PrevTrunk);.  re
1f8a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1f8b0 2a 20 41 64 64 20 61 20 70 61 67 65 20 6f 66 20  * Add a page of 
1f8c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1f8d0 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73  e to the freelis
1f8e0 74 2e 0a 2a 2a 0a 2a 2a 20 73 71 6c 69 74 65 33  t..**.** sqlite3
1f8f0 50 61 67 65 72 55 6e 72 65 66 28 29 20 69 73 20  PagerUnref() is 
1f900 4e 4f 54 20 63 61 6c 6c 65 64 20 66 6f 72 20 70  NOT called for p
1f910 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Page..*/.static 
1f920 69 6e 74 20 66 72 65 65 50 61 67 65 28 4d 65 6d  int freePage(Mem
1f930 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
1f940 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
1f950 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 4d 65  pPage->pBt;.  Me
1f960 6d 50 61 67 65 20 2a 70 50 61 67 65 31 20 3d 20  mPage *pPage1 = 
1f970 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 69  pBt->pPage1;.  i
1f980 6e 74 20 72 63 2c 20 6e 2c 20 6b 3b 0a 0a 20 20  nt rc, n, k;..  
1f990 2f 2a 20 50 72 65 70 61 72 65 20 74 68 65 20 70  /* Prepare the p
1f9a0 61 67 65 20 66 6f 72 20 66 72 65 65 69 6e 67 20  age for freeing 
1f9b0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  */.  assert( sql
1f9c0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1f9d0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
1f9e0 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
1f9f0 70 50 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b  pPage->pgno>1 );
1fa00 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
1fa10 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61 73 65 50   = 0;.  releaseP
1fa20 61 67 65 28 70 50 61 67 65 2d 3e 70 50 61 72 65  age(pPage->pPare
1fa30 6e 74 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 50  nt);.  pPage->pP
1fa40 61 72 65 6e 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a  arent = 0;..  /*
1fa50 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 66   Increment the f
1fa60 72 65 65 20 70 61 67 65 20 63 6f 75 6e 74 20 6f  ree page count o
1fa70 6e 20 70 50 61 67 65 31 20 2a 2f 0a 20 20 72 63  n pPage1 */.  rc
1fa80 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
1fa90 72 69 74 65 28 70 50 61 67 65 31 2d 3e 70 44 62  rite(pPage1->pDb
1faa0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
1fab0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6e  ) return rc;.  n
1fac0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
1fad0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
1fae0 0a 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61  .  put4byte(&pPa
1faf0 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20  ge1->aData[36], 
1fb00 6e 2b 31 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  n+1);..#ifdef SQ
1fb10 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45  LITE_SECURE_DELE
1fb20 54 45 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 53  TE.  /* If the S
1fb30 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
1fb40 45 54 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65  ETE compile-time
1fb50 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c   option is enabl
1fb60 65 64 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 61 6c  ed, then.  ** al
1fb70 77 61 79 73 20 66 75 6c 6c 79 20 6f 76 65 72 77  ways fully overw
1fb80 72 69 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66  rite deleted inf
1fb90 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65  ormation with ze
1fba0 72 6f 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  ros..  */.  rc =
1fbb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1fbc0 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
1fbd0 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  e);.  if( rc ) r
1fbe0 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d 73  eturn rc;.  mems
1fbf0 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  et(pPage->aData,
1fc00 20 30 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e   0, pPage->pBt->
1fc10 70 61 67 65 53 69 7a 65 29 3b 0a 23 65 6e 64 69  pageSize);.#endi
1fc20 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
1fc30 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
1fc40 4d 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 64 61  M.  /* If the da
1fc50 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20  tabase supports 
1fc60 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 77 72 69  auto-vacuum, wri
1fc70 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74  te an entry in t
1fc80 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
1fc90 20 2a 2a 20 74 6f 20 69 6e 64 69 63 61 74 65 20   ** to indicate 
1fca0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73  that the page is
1fcb0 20 66 72 65 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   free..  */.  if
1fcc0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
1fcd0 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 74  m ){.    rc = pt
1fce0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 50 61  rmapPut(pBt, pPa
1fcf0 67 65 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50  ge->pgno, PTRMAP
1fd00 5f 46 52 45 45 50 41 47 45 2c 20 30 29 3b 0a 20  _FREEPAGE, 0);. 
1fd10 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1fd20 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn rc;.  }.#endi
1fd30 66 0a 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b  f..  if( n==0 ){
1fd40 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20  .    /* This is 
1fd50 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70  the first free p
1fd60 61 67 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  age */.    rc = 
1fd70 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1fd80 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
1fd90 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
1fda0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6d  return rc;.    m
1fdb0 65 6d 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61  emset(pPage->aDa
1fdc0 74 61 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20 70  ta, 0, 8);.    p
1fdd0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
1fde0 3e 61 44 61 74 61 5b 33 32 5d 2c 20 70 50 61 67  >aData[32], pPag
1fdf0 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 54 52  e->pgno);.    TR
1fe00 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
1fe10 20 25 64 20 66 69 72 73 74 5c 6e 22 2c 20 70 50   %d first\n", pP
1fe20 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d  age->pgno));.  }
1fe30 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 74 68  else{.    /* Oth
1fe40 65 72 20 66 72 65 65 20 70 61 67 65 73 20 61 6c  er free pages al
1fe50 72 65 61 64 79 20 65 78 69 73 74 2e 20 20 52 65  ready exist.  Re
1fe60 74 72 69 76 65 20 74 68 65 20 66 69 72 73 74 20  trive the first 
1fe70 74 72 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 2a  trunk page.    *
1fe80 2a 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  * of the freelis
1fe90 74 20 61 6e 64 20 66 69 6e 64 20 6f 75 74 20 68  t and find out h
1fea0 6f 77 20 6d 61 6e 79 20 6c 65 61 76 65 73 20 69  ow many leaves i
1feb0 74 20 68 61 73 2e 20 2a 2f 0a 20 20 20 20 4d 65  t has. */.    Me
1fec0 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 3b 0a 20  mPage *pTrunk;. 
1fed0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
1fee0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
1fef0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1ff00 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 2c 20 26  1->aData[32]), &
1ff10 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20  pTrunk, 0);.    
1ff20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1ff30 72 63 3b 0a 20 20 20 20 6b 20 3d 20 67 65 74 34  rc;.    k = get4
1ff40 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
1ff50 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28  ata[4]);.    if(
1ff60 20 6b 3e 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53   k>=pBt->usableS
1ff70 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20  ize/4 - 8 ){.   
1ff80 20 20 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20     /* The trunk 
1ff90 69 73 20 66 75 6c 6c 2e 20 20 54 75 72 6e 20 74  is full.  Turn t
1ffa0 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72  he page being fr
1ffb0 65 65 64 20 69 6e 74 6f 20 61 20 6e 65 77 0a 20  eed into a new. 
1ffc0 20 20 20 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61       ** trunk pa
1ffd0 67 65 20 77 69 74 68 20 6e 6f 20 6c 65 61 76 65  ge with no leave
1ffe0 73 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d  s. */.      rc =
1fff0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
20000 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
20010 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
20020 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
20030 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
20040 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 70 54  pPage->aData, pT
20050 72 75 6e 6b 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  runk->pgno);.   
20060 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
20070 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  Page->aData[4], 
20080 30 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34  0);.        put4
20090 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
200a0 61 74 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e  ata[32], pPage->
200b0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 54  pgno);.        T
200c0 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45  RACE(("FREE-PAGE
200d0 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70  : %d new trunk p
200e0 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64  age replacing %d
200f0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
20100 20 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f       pPage->pgno
20110 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29  , pTrunk->pgno))
20120 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
20130 6c 73 65 20 69 66 28 20 6b 3c 30 20 29 7b 0a 20  lse if( k<0 ){. 
20140 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
20150 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 7d 65  _CORRUPT;.    }e
20160 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 64  lse{.      /* Ad
20170 64 20 74 68 65 20 6e 65 77 6c 79 20 66 72 65 65  d the newly free
20180 64 20 70 61 67 65 20 61 73 20 61 20 6c 65 61 66  d page as a leaf
20190 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
201a0 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 72  trunk */.      r
201b0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
201c0 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
201d0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
201e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
201f0 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  ){.        put4b
20200 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
20210 74 61 5b 34 5d 2c 20 6b 2b 31 29 3b 0a 20 20 20  ta[4], k+1);.   
20220 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
20230 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b 6b  Trunk->aData[8+k
20240 2a 34 5d 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  *4], pPage->pgno
20250 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
20260 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a  E_SECURE_DELETE.
20270 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
20280 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50  agerDontWrite(pP
20290 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 23  age->pDbPage);.#
202a0 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20  endif.      }.  
202b0 20 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45      TRACE(("FREE
202c0 2d 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f  -PAGE: %d leaf o
202d0 6e 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c  n trunk page %d\
202e0 6e 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70  n",pPage->pgno,p
202f0 54 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20  Trunk->pgno));. 
20300 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65     }.    release
20310 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20  Page(pTrunk);.  
20320 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
20330 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79  ../*.** Free any
20340 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20   overflow pages 
20350 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
20360 74 68 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a  the given Cell..
20370 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c  */.static int cl
20380 65 61 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  earCell(MemPage 
20390 2a 70 50 61 67 65 2c 20 75 6e 73 69 67 6e 65 64  *pPage, unsigned
203a0 20 63 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20   char *pCell){. 
203b0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
203c0 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43   pPage->pBt;.  C
203d0 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
203e0 50 67 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20  Pgno ovflPgno;. 
203f0 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
20400 4f 76 66 6c 3b 0a 20 20 69 6e 74 20 6f 76 66 6c  Ovfl;.  int ovfl
20410 50 61 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73  PageSize;..  ass
20420 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
20430 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
20440 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
20450 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
20460 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
20470 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
20480 20 69 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66   if( info.iOverf
20490 6c 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  low==0 ){.    re
204a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  turn SQLITE_OK; 
204b0 20 2f 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20   /* No overflow 
204c0 70 61 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69  pages. Return wi
204d0 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74  thout doing anyt
204e0 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76  hing */.  }.  ov
204f0 66 6c 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74  flPgno = get4byt
20500 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
20510 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 6f 76 66  verflow]);.  ovf
20520 6c 50 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d  lPageSize = pBt-
20530 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
20540 0a 20 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f  .  nOvfl = (info
20550 2e 6e 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f  .nPayload - info
20560 2e 6e 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61  .nLocal + ovflPa
20570 67 65 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c  geSize - 1)/ovfl
20580 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65  PageSize;.  asse
20590 72 74 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20  rt( ovflPgno==0 
205a0 7c 7c 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20  || nOvfl>0 );.  
205b0 77 68 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29  while( nOvfl-- )
205c0 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
205d0 4f 76 66 6c 3b 0a 20 20 20 20 69 66 28 20 6f 76  Ovfl;.    if( ov
205e0 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6f 76 66  flPgno==0 || ovf
205f0 6c 50 67 6e 6f 3e 70 61 67 65 72 50 61 67 65 63  lPgno>pagerPagec
20600 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
20610 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  ) ){.      retur
20620 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
20630 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20  _BKPT;.    }..  
20640 20 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c    rc = getOverfl
20650 6f 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c  owPage(pBt, ovfl
20660 50 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 28 6e  Pgno, &pOvfl, (n
20670 4f 76 66 6c 3d 3d 30 29 3f 30 3a 26 6f 76 66 6c  Ovfl==0)?0:&ovfl
20680 50 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72  Pgno);.    if( r
20690 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
206a0 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
206b0 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 73 71 6c  (pOvfl);.    sql
206c0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
206d0 4f 76 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Ovfl->pDbPage);.
206e0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
206f0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65  urn rc;.  }.  re
20700 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
20710 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
20720 74 68 65 20 62 79 74 65 20 73 65 71 75 65 6e 63  the byte sequenc
20730 65 20 75 73 65 64 20 74 6f 20 72 65 70 72 65 73  e used to repres
20740 65 6e 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61  ent a cell on pa
20750 67 65 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20  ge pPage.** and 
20760 77 72 69 74 65 20 74 68 61 74 20 62 79 74 65 20  write that byte 
20770 73 65 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43  sequence into pC
20780 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77  ell[].  Overflow
20790 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c   pages are.** al
207a0 6c 6f 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c  located and fill
207b0 65 64 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61  ed in as necessa
207c0 72 79 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67  ry.  The calling
207d0 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73   procedure.** is
207e0 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
207f0 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66   making sure suf
20800 66 69 63 69 65 6e 74 20 73 70 61 63 65 20 68 61  ficient space ha
20810 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
20820 0a 2a 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e  .** for pCell[].
20830 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
20840 20 70 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20   pCell does not 
20850 6e 65 63 65 73 73 61 72 79 20 6e 65 65 64 20 74  necessary need t
20860 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70  o point to the p
20870 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61  Page->aData.** a
20880 72 65 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68  rea.  pCell migh
20890 74 20 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20  t point to some 
208a0 74 65 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67  temporary storag
208b0 65 2e 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c  e.  The cell wil
208c0 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63  l.** be construc
208d0 74 65 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70  ted in this temp
208e0 6f 72 61 72 79 20 61 72 65 61 20 74 68 65 6e 20  orary area then 
208f0 63 6f 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67  copied into pPag
20900 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65  e->aData.** late
20910 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
20920 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d   fillInCell(.  M
20930 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
20940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
20950 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
20960 6f 6e 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c  ontains the cell
20970 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   */.  unsigned c
20980 68 61 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20  har *pCell,     
20990 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65       /* Complete
209a0 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c   text of the cel
209b0 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  l */.  const voi
209c0 64 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65  d *pKey, i64 nKe
209d0 79 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79  y,    /* The key
209e0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
209f0 20 2a 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74   *pData,int nDat
20a00 61 2c 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61  a,   /* The data
20a10 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c   */.  int nZero,
20a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a30 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65       /* Extra ze
20a40 72 6f 20 62 79 74 65 73 20 74 6f 20 61 70 70 65  ro bytes to appe
20a50 6e 64 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20  nd to pData */. 
20a60 20 69 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20   int *pnSize    
20a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20a80 2f 2a 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69  /* Write cell si
20a90 7a 65 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20  ze here */.){.  
20aa0 69 6e 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  int nPayload;.  
20ab0 63 6f 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a  const u8 *pSrc;.
20ac0 20 20 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72    int nSrc, n, r
20ad0 63 3b 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65  c;.  int spaceLe
20ae0 66 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ft;.  MemPage *p
20af0 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  Ovfl = 0;.  MemP
20b00 61 67 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20  age *pToRelease 
20b10 3d 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  = 0;.  unsigned 
20b20 63 68 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20  char *pPrior;.  
20b30 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
20b40 50 61 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61  Payload;.  BtSha
20b50 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
20b60 2d 3e 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67  ->pBt;.  Pgno pg
20b70 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e  noOvfl = 0;.  in
20b80 74 20 6e 48 65 61 64 65 72 3b 0a 20 20 43 65 6c  t nHeader;.  Cel
20b90 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61  lInfo info;..  a
20ba0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
20bb0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
20bc0 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
20bd0 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68  .  /* Fill in th
20be0 65 20 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e  e header. */.  n
20bf0 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 69 66  Header = 0;.  if
20c00 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
20c10 7b 0a 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d  {.    nHeader +=
20c20 20 34 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50   4;.  }.  if( pP
20c30 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a  age->hasData ){.
20c40 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70      nHeader += p
20c50 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b  utVarint(&pCell[
20c60 6e 48 65 61 64 65 72 5d 2c 20 6e 44 61 74 61 2b  nHeader], nData+
20c70 6e 5a 65 72 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b  nZero);.  }else{
20c80 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a 65  .    nData = nZe
20c90 72 6f 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 48  ro = 0;.  }.  nH
20ca0 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69  eader += putVari
20cb0 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65  nt(&pCell[nHeade
20cc0 72 5d 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79  r], *(u64*)&nKey
20cd0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
20ce0 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
20cf0 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
20d00 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e  o);.  assert( in
20d10 66 6f 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61  fo.nHeader==nHea
20d20 64 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28  der );.  assert(
20d30 20 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79   info.nKey==nKey
20d40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e   );.  assert( in
20d50 66 6f 2e 6e 44 61 74 61 3d 3d 6e 44 61 74 61 2b  fo.nData==nData+
20d60 6e 5a 65 72 6f 20 29 3b 0a 20 20 0a 20 20 2f 2a  nZero );.  .  /*
20d70 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79   Fill in the pay
20d80 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f  load */.  nPaylo
20d90 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65  ad = nData + nZe
20da0 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d  ro;.  if( pPage-
20db0 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70  >intKey ){.    p
20dc0 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20  Src = pData;.   
20dd0 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20   nSrc = nData;. 
20de0 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20     nData = 0;.  
20df0 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 50 61 79 6c  }else{.    nPayl
20e00 6f 61 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20  oad += nKey;.   
20e10 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20   pSrc = pKey;.  
20e20 20 20 6e 53 72 63 20 3d 20 6e 4b 65 79 3b 0a 20    nSrc = nKey;. 
20e30 20 7d 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69   }.  *pnSize = i
20e40 6e 66 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61  nfo.nSize;.  spa
20e50 63 65 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c  ceLeft = info.nL
20e60 6f 63 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64  ocal;.  pPayload
20e70 20 3d 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65   = &pCell[nHeade
20e80 72 5d 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 26  r];.  pPrior = &
20e90 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
20ea0 66 6c 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28  flow];..  while(
20eb0 20 6e 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20   nPayload>0 ){. 
20ec0 20 20 20 69 66 28 20 73 70 61 63 65 4c 65 66 74     if( spaceLeft
20ed0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ==0 ){.      int
20ee0 20 69 73 45 78 61 63 74 20 3d 20 30 3b 0a 23 69   isExact = 0;.#i
20ef0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
20f00 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
20f10 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d     Pgno pgnoPtrm
20f20 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f  ap = pgnoOvfl; /
20f30 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  * Overflow page 
20f40 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72  pointer-map entr
20f50 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20  y page */.      
20f60 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
20f70 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64  uum ){.        d
20f80 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e  o{.          pgn
20f90 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20  oOvfl++;.       
20fa0 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20   } while( .     
20fb0 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41       PTRMAP_ISPA
20fc0 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  GE(pBt, pgnoOvfl
20fd0 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50  ) || pgnoOvfl==P
20fe0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
20ff0 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29  (pBt) .        )
21000 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67  ;.        if( pg
21010 6e 6f 4f 76 66 6c 3e 31 20 29 7b 0a 20 20 20 20  noOvfl>1 ){.    
21020 20 20 20 20 20 20 2f 2a 20 69 73 45 78 61 63 74        /* isExact
21030 20 3d 20 31 3b 20 2a 2f 0a 20 20 20 20 20 20 20   = 1; */.       
21040 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
21050 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c  f.      rc = all
21060 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
21070 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e  Bt, &pOvfl, &pgn
21080 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c  oOvfl, pgnoOvfl,
21090 20 69 73 45 78 61 63 74 29 3b 0a 23 69 66 6e 64   isExact);.#ifnd
210a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
210b0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
210c0 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
210d0 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
210e0 2d 76 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65  -vacuum, and the
210f0 20 73 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65   second or subse
21100 71 75 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f  quent.      ** o
21110 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20  verflow page is 
21120 62 65 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c  being allocated,
21130 20 61 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f   add an entry to
21140 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
21150 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68  .      ** for th
21160 61 74 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20  at page now. .  
21170 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
21180 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
21190 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  irst overflow pa
211a0 67 65 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61  ge, then write a
211b0 20 70 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a   partial entry .
211c0 20 20 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20        ** to the 
211d0 70 6f 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20  pointer-map. If 
211e0 77 65 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67  we write nothing
211f0 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72   to this pointer
21200 2d 6d 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20  -map slot,.     
21210 20 2a 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74   ** then the opt
21220 69 6d 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77  imistic overflow
21230 20 63 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e   chain processin
21240 67 20 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29  g in clearCell()
21250 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69  .      ** may mi
21260 73 69 6e 74 65 72 70 72 65 74 20 74 68 65 20 75  sinterpret the u
21270 6e 69 6e 69 74 69 61 6c 69 73 65 64 20 76 61 6c  ninitialised val
21280 75 65 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74  ues and delete t
21290 68 65 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e  he.      ** wron
212a0 67 20 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65  g pages from the
212b0 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
212c0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42   */.      if( pB
212d0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26  t->autoVacuum &&
212e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
212f0 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 54 79  {.        u8 eTy
21300 70 65 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70  pe = (pgnoPtrmap
21310 3f 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  ?PTRMAP_OVERFLOW
21320 32 3a 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  2:PTRMAP_OVERFLO
21330 57 31 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  W1);.        rc 
21340 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
21350 20 70 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65   pgnoOvfl, eType
21360 2c 20 70 67 6e 6f 50 74 72 6d 61 70 29 3b 0a 20  , pgnoPtrmap);. 
21370 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
21380 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61  .          relea
21390 73 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20  sePage(pOvfl);. 
213a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
213b0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
213c0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
213d0 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
213e0 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20  elease);.       
213f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
21400 20 20 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79    }.      put4by
21410 74 65 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f  te(pPrior, pgnoO
21420 76 66 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65  vfl);.      rele
21430 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61  asePage(pToRelea
21440 73 65 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65  se);.      pToRe
21450 6c 65 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20  lease = pOvfl;. 
21460 20 20 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f       pPrior = pO
21470 76 66 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  vfl->aData;.    
21480 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f    put4byte(pPrio
21490 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61  r, 0);.      pPa
214a0 79 6c 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e  yload = &pOvfl->
214b0 61 44 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20  aData[4];.      
214c0 73 70 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d  spaceLeft = pBt-
214d0 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b  >usableSize - 4;
214e0 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e  .    }.    n = n
214f0 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28  Payload;.    if(
21500 20 6e 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e   n>spaceLeft ) n
21510 20 3d 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20   = spaceLeft;.  
21520 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a    if( nSrc>0 ){.
21530 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63        if( n>nSrc
21540 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20   ) n = nSrc;.   
21550 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20     assert( pSrc 
21560 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
21570 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20  pPayload, pSrc, 
21580 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
21590 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79       memset(pPay
215a0 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20  load, 0, n);.   
215b0 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20   }.    nPayload 
215c0 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f  -= n;.    pPaylo
215d0 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72  ad += n;.    pSr
215e0 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63  c += n;.    nSrc
215f0 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65   -= n;.    space
21600 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69  Left -= n;.    i
21610 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20  f( nSrc==0 ){.  
21620 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61      nSrc = nData
21630 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70  ;.      pSrc = p
21640 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Data;.    }.  }.
21650 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
21660 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74  oRelease);.  ret
21670 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
21680 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
21690 68 65 20 4d 65 6d 50 61 67 65 2e 70 50 61 72 65  he MemPage.pPare
216a0 6e 74 20 70 6f 69 6e 74 65 72 20 6f 6e 20 74 68  nt pointer on th
216b0 65 20 70 61 67 65 20 77 68 6f 73 65 20 6e 75 6d  e page whose num
216c0 62 65 72 20 69 73 0a 2a 2a 20 67 69 76 65 6e 20  ber is.** given 
216d0 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  in the second ar
216e0 67 75 6d 65 6e 74 20 73 6f 20 74 68 61 74 20 4d  gument so that M
216f0 65 6d 50 61 67 65 2e 70 50 61 72 65 6e 74 20 68  emPage.pParent h
21700 6f 6c 64 73 20 74 68 65 0a 2a 2a 20 70 6f 69 6e  olds the.** poin
21710 74 65 72 20 69 6e 20 74 68 65 20 74 68 69 72 64  ter in the third
21720 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
21730 61 74 69 63 20 69 6e 74 20 72 65 70 61 72 65 6e  atic int reparen
21740 74 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a  tPage(BtShared *
21750 70 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  pBt, Pgno pgno, 
21760 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 72  MemPage *pNewPar
21770 65 6e 74 2c 20 69 6e 74 20 69 64 78 29 7b 0a 20  ent, int idx){. 
21780 20 4d 65 6d 50 61 67 65 20 2a 70 54 68 69 73 3b   MemPage *pThis;
21790 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
217a0 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ge;..  assert( s
217b0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
217c0 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
217d0 0a 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 50  .  assert( pNewP
217e0 61 72 65 6e 74 21 3d 30 20 29 3b 0a 20 20 69 66  arent!=0 );.  if
217f0 28 20 70 67 6e 6f 3d 3d 30 20 29 20 72 65 74 75  ( pgno==0 ) retu
21800 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
21810 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61  assert( pBt->pPa
21820 67 65 72 21 3d 30 20 29 3b 0a 20 20 70 44 62 50  ger!=0 );.  pDbP
21830 61 67 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  age = sqlite3Pag
21840 65 72 4c 6f 6f 6b 75 70 28 70 42 74 2d 3e 70 50  erLookup(pBt->pP
21850 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ager, pgno);.  i
21860 66 28 20 70 44 62 50 61 67 65 20 29 7b 0a 20 20  f( pDbPage ){.  
21870 20 20 70 54 68 69 73 20 3d 20 28 4d 65 6d 50 61    pThis = (MemPa
21880 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ge *)sqlite3Page
21890 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67  rGetExtra(pDbPag
218a0 65 29 3b 0a 20 20 20 20 69 66 28 20 70 54 68 69  e);.    if( pThi
218b0 73 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  s->isInit ){.   
218c0 20 20 20 61 73 73 65 72 74 28 20 70 54 68 69 73     assert( pThis
218d0 2d 3e 61 44 61 74 61 3d 3d 73 71 6c 69 74 65 33  ->aData==sqlite3
218e0 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
218f0 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 69  Page) );.      i
21900 66 28 20 70 54 68 69 73 2d 3e 70 50 61 72 65 6e  f( pThis->pParen
21910 74 21 3d 70 4e 65 77 50 61 72 65 6e 74 20 29 7b  t!=pNewParent ){
21920 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54 68  .        if( pTh
21930 69 73 2d 3e 70 50 61 72 65 6e 74 20 29 20 73 71  is->pParent ) sq
21940 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
21950 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74 2d 3e  pThis->pParent->
21960 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
21970 20 20 70 54 68 69 73 2d 3e 70 50 61 72 65 6e 74    pThis->pParent
21980 20 3d 20 70 4e 65 77 50 61 72 65 6e 74 3b 0a 20   = pNewParent;. 
21990 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
219a0 67 65 72 52 65 66 28 70 4e 65 77 50 61 72 65 6e  gerRef(pNewParen
219b0 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  t->pDbPage);.   
219c0 20 20 20 7d 0a 20 20 20 20 20 20 70 54 68 69 73     }.      pThis
219d0 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 69 64  ->idxParent = id
219e0 78 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  x;.    }.    sql
219f0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
21a00 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 23 69  DbPage);.  }..#i
21a10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
21a20 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69  T_AUTOVACUUM.  i
21a30 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
21a40 75 6d 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  um ){.    return
21a50 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
21a60 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  pgno, PTRMAP_BTR
21a70 45 45 2c 20 70 4e 65 77 50 61 72 65 6e 74 2d 3e  EE, pNewParent->
21a80 70 67 6e 6f 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  pgno);.  }.#endi
21a90 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
21aa0 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  E_OK;.}..../*.**
21ab0 20 43 68 61 6e 67 65 20 74 68 65 20 70 50 61 72   Change the pPar
21ac0 65 6e 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 61  ent pointer of a
21ad0 6c 6c 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70  ll children of p
21ae0 50 61 67 65 20 74 6f 20 70 6f 69 6e 74 20 62 61  Page to point ba
21af0 63 6b 0a 2a 2a 20 74 6f 20 70 50 61 67 65 2e 0a  ck.** to pPage..
21b00 2a 2a 0a 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77  **.** In other w
21b10 6f 72 64 73 2c 20 66 6f 72 20 65 76 65 72 79 20  ords, for every 
21b20 63 68 69 6c 64 20 6f 66 20 70 50 61 67 65 2c 20  child of pPage, 
21b30 69 6e 76 6f 6b 65 20 72 65 70 61 72 65 6e 74 50  invoke reparentP
21b40 61 67 65 28 29 0a 2a 2a 20 74 6f 20 6d 61 6b 65  age().** to make
21b50 20 73 75 72 65 20 74 68 61 74 20 65 61 63 68 20   sure that each 
21b60 63 68 69 6c 64 20 6b 6e 6f 77 73 20 74 68 61 74  child knows that
21b70 20 70 50 61 67 65 20 69 73 20 69 74 73 20 70 61   pPage is its pa
21b80 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rent..**.** This
21b90 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 63 61   routine gets ca
21ba0 6c 6c 65 64 20 61 66 74 65 72 20 79 6f 75 20 6d  lled after you m
21bb0 65 6d 63 70 79 28 29 20 6f 6e 65 20 70 61 67 65  emcpy() one page
21bc0 20 69 6e 74 6f 0a 2a 2a 20 61 6e 6f 74 68 65 72   into.** another
21bd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21be0 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67  reparentChildPag
21bf0 65 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  es(MemPage *pPag
21c00 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 42  e){.  int i;.  B
21c10 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
21c20 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74  Page->pBt;.  int
21c30 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
21c40 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
21c50 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
21c60 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
21c70 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
21c80 2d 3e 6c 65 61 66 20 29 20 72 65 74 75 72 6e 20  ->leaf ) return 
21c90 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 66 6f  SQLITE_OK;..  fo
21ca0 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e  r(i=0; i<pPage->
21cb0 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
21cc0 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e   u8 *pCell = fin
21cd0 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
21ce0 0a 20 20 20 20 72 63 20 3d 20 72 65 70 61 72 65  .    rc = repare
21cf0 6e 74 50 61 67 65 28 70 42 74 2c 20 67 65 74 34  ntPage(pBt, get4
21d00 62 79 74 65 28 70 43 65 6c 6c 29 2c 20 70 50 61  byte(pCell), pPa
21d10 67 65 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20  ge, i);.    if( 
21d20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
21d30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
21d40 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74 50 61   rc = reparentPa
21d50 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65  ge(pBt, get4byte
21d60 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
21d70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
21d80 38 5d 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20  8]), .          
21d90 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2c            pPage,
21da0 20 69 29 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64   i);.  pPage->id
21db0 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 72 65  xShift = 0;.  re
21dc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
21dd0 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 69 2d 74  * Remove the i-t
21de0 68 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67  h cell from pPag
21df0 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
21e00 20 65 66 66 65 63 74 73 20 70 50 61 67 65 20 6f   effects pPage o
21e10 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c  nly..** The cell
21e20 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f 74 20   content is not 
21e30 66 72 65 65 64 20 6f 72 20 64 65 61 6c 6c 6f 63  freed or dealloc
21e40 61 74 65 64 2e 20 20 49 74 20 69 73 20 61 73 73  ated.  It is ass
21e50 75 6d 65 64 20 74 68 61 74 0a 2a 2a 20 74 68 65  umed that.** the
21e60 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 61   cell content ha
21e70 73 20 62 65 65 6e 20 63 6f 70 69 65 64 20 73 6f  s been copied so
21e80 6d 65 70 6c 61 63 65 20 65 6c 73 65 2e 20 20 54  meplace else.  T
21e90 68 69 73 20 72 6f 75 74 69 6e 65 20 6a 75 73 74  his routine just
21ea0 0a 2a 2a 20 72 65 6d 6f 76 65 73 20 74 68 65 20  .** removes the 
21eb0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
21ec0 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
21ed0 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22 20 6d 75 73  ..**.** "sz" mus
21ee0 74 20 62 65 20 74 68 65 20 6e 75 6d 62 65 72 20  t be the number 
21ef0 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  of bytes in the 
21f00 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cell..*/.static 
21f10 76 6f 69 64 20 64 72 6f 70 43 65 6c 6c 28 4d 65  void dropCell(Me
21f20 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e  mPage *pPage, in
21f30 74 20 69 64 78 2c 20 69 6e 74 20 73 7a 29 7b 0a  t idx, int sz){.
21f40 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
21f50 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
21f60 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20  r */.  int pc;  
21f70 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
21f80 20 74 6f 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74   to cell content
21f90 20 6f 66 20 63 65 6c 6c 20 62 65 69 6e 67 20 64   of cell being d
21fa0 65 6c 65 74 65 64 20 2a 2f 0a 20 20 75 38 20 2a  eleted */.  u8 *
21fb0 64 61 74 61 3b 20 20 20 20 20 20 20 2f 2a 20 70  data;       /* p
21fc0 50 61 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20  Page->aData */. 
21fd0 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20 20   u8 *ptr;       
21fe0 20 2f 2a 20 55 73 65 64 20 74 6f 20 6d 6f 76 65   /* Used to move
21ff0 20 62 79 74 65 73 20 61 72 6f 75 6e 64 20 77 69   bytes around wi
22000 74 68 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a  thin data[] */..
22010 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30    assert( idx>=0
22020 20 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e   && idx<pPage->n
22030 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
22040 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70  ( sz==cellSize(p
22050 50 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20  Page, idx) );.  
22060 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
22070 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
22080 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
22090 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
220a0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
220b0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
220c0 78 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70  x) );.  data = p
220d0 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70  Page->aData;.  p
220e0 74 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65  tr = &data[pPage
220f0 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  ->cellOffset + 2
22100 2a 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65  *idx];.  pc = ge
22110 74 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20 61  t2byte(ptr);.  a
22120 73 73 65 72 74 28 20 70 63 3e 31 30 20 26 26 20  ssert( pc>10 && 
22130 70 63 2b 73 7a 3c 3d 70 50 61 67 65 2d 3e 70 42  pc+sz<=pPage->pB
22140 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b  t->usableSize );
22150 0a 20 20 66 72 65 65 53 70 61 63 65 28 70 50 61  .  freeSpace(pPa
22160 67 65 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 66  ge, pc, sz);.  f
22170 6f 72 28 69 3d 69 64 78 2b 31 3b 20 69 3c 70 50  or(i=idx+1; i<pP
22180 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 2c  age->nCell; i++,
22190 20 70 74 72 2b 3d 32 29 7b 0a 20 20 20 20 70 74   ptr+=2){.    pt
221a0 72 5b 30 5d 20 3d 20 70 74 72 5b 32 5d 3b 0a 20  r[0] = ptr[2];. 
221b0 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b     ptr[1] = ptr[
221c0 33 5d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d  3];.  }.  pPage-
221d0 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20 70 75 74 32  >nCell--;.  put2
221e0 62 79 74 65 28 26 64 61 74 61 5b 70 50 61 67 65  byte(&data[pPage
221f0 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 2c 20  ->hdrOffset+3], 
22200 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20  pPage->nCell);. 
22210 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d   pPage->nFree +=
22220 20 32 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64 78   2;.  pPage->idx
22230 53 68 69 66 74 20 3d 20 31 3b 0a 7d 0a 0a 2f 2a  Shift = 1;.}../*
22240 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20 6e 65 77  .** Insert a new
22250 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61   cell on pPage a
22260 74 20 63 65 6c 6c 20 69 6e 64 65 78 20 22 69 22  t cell index "i"
22270 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20  .  pCell points 
22280 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  to the.** conten
22290 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a  t of the cell..*
222a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 65 6c 6c  *.** If the cell
222b0 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69   content will fi
222c0 74 20 6f 6e 20 74 68 65 20 70 61 67 65 2c 20 74  t on the page, t
222d0 68 65 6e 20 70 75 74 20 69 74 20 74 68 65 72 65  hen put it there
222e0 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c  .  If it.** will
222f0 20 6e 6f 74 20 66 69 74 2c 20 74 68 65 6e 20 6d   not fit, then m
22300 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
22310 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  e cell content i
22320 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20  nto pTemp if.** 
22330 70 54 65 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c  pTemp is not nul
22340 6c 2e 20 20 52 65 67 61 72 64 6c 65 73 73 20 6f  l.  Regardless o
22350 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74  f pTemp, allocat
22360 65 20 61 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a  e a new entry.**
22370 20 69 6e 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c   in pPage->aOvfl
22380 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69 74 20 70  [] and make it p
22390 6f 69 6e 74 20 74 6f 20 74 68 65 20 63 65 6c 6c  oint to the cell
223a0 20 63 6f 6e 74 65 6e 74 20 28 65 69 74 68 65 72   content (either
223b0 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20 6f 72 20  .** in pTemp or 
223c0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 43 65  the original pCe
223d0 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20 72 65 63  ll) and also rec
223e0 6f 72 64 20 69 74 73 20 69 6e 64 65 78 2e 20 0a  ord its index. .
223f0 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20  ** Allocating a 
22400 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 50 61  new entry in pPa
22410 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c  ge->aCell[] impl
22420 69 65 73 20 74 68 61 74 20 0a 2a 2a 20 70 50 61  ies that .** pPa
22430 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73  ge->nOverflow is
22440 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a   incremented..**
22450 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20 69 73 20  .** If nSkip is 
22460 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64  non-zero, then d
22470 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68 65 20 66  o not copy the f
22480 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73  irst nSkip bytes
22490 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e   of the.** cell.
224a0 20 54 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c   The caller will
224b0 20 6f 76 65 72 77 72 69 74 65 20 74 68 65 6d 20   overwrite them 
224c0 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
224d0 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 49 66 0a  ion returns. If.
224e0 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d  ** nSkip is non-
224f0 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c  zero, then pCell
22500 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74   may not point t
22510 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d  o an invalid mem
22520 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a  ory location .**
22530 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69   (but pCell+nSki
22540 70 20 69 73 20 61 6c 77 61 79 73 20 76 61 6c 69  p is always vali
22550 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  d)..*/.static in
22560 74 20 69 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20  t insertCell(.  
22570 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
22580 20 20 2f 2a 20 50 61 67 65 20 69 6e 74 6f 20 77    /* Page into w
22590 68 69 63 68 20 77 65 20 61 72 65 20 63 6f 70 79  hich we are copy
225a0 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  ing */.  int i, 
225b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
225c0 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74  w cell becomes t
225d0 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20  he i-th cell of 
225e0 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  the page */.  u8
225f0 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20   *pCell,        
22600 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68  /* Content of th
22610 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20  e new cell */.  
22620 69 6e 74 20 73 7a 2c 20 20 20 20 20 20 20 20 20  int sz,         
22630 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 63 6f    /* Bytes of co
22640 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a  ntent in pCell *
22650 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70 2c 20 20  /.  u8 *pTemp,  
22660 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74        /* Temp st
22670 6f 72 61 67 65 20 73 70 61 63 65 20 66 6f 72 20  orage space for 
22680 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64  pCell, if needed
22690 20 2a 2f 0a 20 20 75 38 20 6e 53 6b 69 70 20 20   */.  u8 nSkip  
226a0 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
226b0 74 20 77 72 69 74 65 20 74 68 65 20 66 69 72 73  t write the firs
226c0 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66  t nSkip bytes of
226d0 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a   the cell */.){.
226e0 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20    int idx;      
226f0 20 20 20 20 2f 2a 20 57 68 65 72 65 20 74 6f 20      /* Where to 
22700 77 72 69 74 65 20 6e 65 77 20 63 65 6c 6c 20 63  write new cell c
22710 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d  ontent in data[]
22720 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20   */.  int j;    
22730 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
22740 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74  counter */.  int
22750 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20 2f   top;          /
22760 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f 66 20  * First byte of 
22770 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61 6e 79 20  content for any 
22780 63 65 6c 6c 20 69 6e 20 64 61 74 61 5b 5d 20 2a  cell in data[] *
22790 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20 20 20 20  /.  int end;    
227a0 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
227b0 79 74 65 20 70 61 73 74 20 74 68 65 20 6c 61 73  yte past the las
227c0 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  t cell pointer i
227d0 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e  n data[] */.  in
227e0 74 20 69 6e 73 3b 20 20 20 20 20 20 20 20 20 20  t ins;          
227f0 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64 61 74 61  /* Index in data
22800 5b 5d 20 77 68 65 72 65 20 6e 65 77 20 63 65 6c  [] where new cel
22810 6c 20 70 6f 69 6e 74 65 72 20 69 73 20 69 6e 73  l pointer is ins
22820 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 68  erted */.  int h
22830 64 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dr;          /* 
22840 4f 66 66 73 65 74 20 69 6e 74 6f 20 64 61 74 61  Offset into data
22850 5b 5d 20 6f 66 20 74 68 65 20 70 61 67 65 20 68  [] of the page h
22860 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63  eader */.  int c
22870 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20  ellOffset;   /* 
22880 41 64 64 72 65 73 73 20 6f 66 20 66 69 72 73 74  Address of first
22890 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e   cell pointer in
228a0 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20   data[] */.  u8 
228b0 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 2f  *data;         /
228c0 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * The content of
228d0 20 74 68 65 20 77 68 6f 6c 65 20 70 61 67 65 20   the whole page 
228e0 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20  */.  u8 *ptr;   
228f0 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66         /* Used f
22900 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d  or moving inform
22910 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20  ation around in 
22920 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73  data[] */..  ass
22930 65 72 74 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d  ert( i>=0 && i<=
22940 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61  pPage->nCell+pPa
22950 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b  ge->nOverflow );
22960 0a 20 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63  .  assert( sz==c
22970 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
22980 2c 20 70 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73  , pCell) );.  as
22990 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
229a0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
229b0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
229c0 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65   if( pPage->nOve
229d0 72 66 6c 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50  rflow || sz+2>pP
229e0 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20  age->nFree ){.  
229f0 20 20 69 66 28 20 70 54 65 6d 70 20 29 7b 0a 20    if( pTemp ){. 
22a00 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d       memcpy(pTem
22a10 70 2b 6e 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e  p+nSkip, pCell+n
22a20 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b  Skip, sz-nSkip);
22a30 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70  .      pCell = p
22a40 54 65 6d 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Temp;.    }.    
22a50 6a 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  j = pPage->nOver
22a60 66 6c 6f 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65  flow++;.    asse
22a70 72 74 28 20 6a 3c 73 69 7a 65 6f 66 28 70 50 61  rt( j<sizeof(pPa
22a80 67 65 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65 6f  ge->aOvfl)/sizeo
22a90 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30  f(pPage->aOvfl[0
22aa0 5d 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  ]) );.    pPage-
22ab0 3e 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20  >aOvfl[j].pCell 
22ac0 3d 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61  = pCell;.    pPa
22ad0 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78  ge->aOvfl[j].idx
22ae0 20 3d 20 69 3b 0a 20 20 20 20 70 50 61 67 65 2d   = i;.    pPage-
22af0 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65  >nFree = 0;.  }e
22b00 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  lse{.    int rc 
22b10 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
22b20 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
22b30 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
22b40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22b50 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
22b60 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
22b70 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
22b80 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e  riteable(pPage->
22b90 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20  pDbPage) );.    
22ba0 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
22bb0 61 74 61 3b 0a 20 20 20 20 68 64 72 20 3d 20 70  ata;.    hdr = p
22bc0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b  Page->hdrOffset;
22bd0 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
22be0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
22bf0 29 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66 73 65  );.    cellOffse
22c00 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f  t = pPage->cellO
22c10 66 66 73 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d  ffset;.    end =
22c20 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
22c30 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2b 20 32  pPage->nCell + 2
22c40 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c  ;.    ins = cell
22c50 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20  Offset + 2*i;.  
22c60 20 20 69 66 28 20 65 6e 64 20 3e 20 74 6f 70 20    if( end > top 
22c70 2d 20 73 7a 20 29 7b 0a 20 20 20 20 20 20 72 63  - sz ){.      rc
22c80 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67   = defragmentPag
22c90 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
22ca0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
22cb0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
22cc0 20 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62       top = get2b
22cd0 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
22ce0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
22cf0 20 65 6e 64 20 2b 20 73 7a 20 3c 3d 20 74 6f 70   end + sz <= top
22d00 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 64   );.    }.    id
22d10 78 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63  x = allocateSpac
22d20 65 28 70 50 61 67 65 2c 20 73 7a 29 3b 0a 20 20  e(pPage, sz);.  
22d30 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 30 20    assert( idx>0 
22d40 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 65  );.    assert( e
22d50 6e 64 20 3c 3d 20 67 65 74 32 62 79 74 65 28 26  nd <= get2byte(&
22d60 64 61 74 61 5b 68 64 72 2b 35 5d 29 20 29 3b 0a  data[hdr+5]) );.
22d70 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c      pPage->nCell
22d80 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e  ++;.    pPage->n
22d90 46 72 65 65 20 2d 3d 20 32 3b 0a 20 20 20 20 6d  Free -= 2;.    m
22da0 65 6d 63 70 79 28 26 64 61 74 61 5b 69 64 78 2b  emcpy(&data[idx+
22db0 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c 2b 6e 53  nSkip], pCell+nS
22dc0 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a  kip, sz-nSkip);.
22dd0 20 20 20 20 66 6f 72 28 6a 3d 65 6e 64 2d 32 2c      for(j=end-2,
22de0 20 70 74 72 3d 26 64 61 74 61 5b 6a 5d 3b 20 6a   ptr=&data[j]; j
22df0 3e 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70 74 72 2d  >ins; j-=2, ptr-
22e00 3d 32 29 7b 0a 20 20 20 20 20 20 70 74 72 5b 30  =2){.      ptr[0
22e10 5d 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a 20 20 20  ] = ptr[-2];.   
22e20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70 74 72 5b     ptr[1] = ptr[
22e30 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  -1];.    }.    p
22e40 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 6e  ut2byte(&data[in
22e50 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20 20 70 75  s], idx);.    pu
22e60 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
22e70 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  +3], pPage->nCel
22e80 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69  l);.    pPage->i
22e90 64 78 53 68 69 66 74 20 3d 20 31 3b 0a 23 69 66  dxShift = 1;.#if
22ea0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
22eb0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
22ec0 69 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  if( pPage->pBt->
22ed0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
22ee0 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
22ef0 6d 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f  may contain a po
22f00 69 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72  inter to an over
22f10 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f  flow page. If so
22f20 2c 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a  , write.      **
22f30 20 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74   the entry for t
22f40 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
22f50 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
22f60 72 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a  r map..      */.
22f70 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69        CellInfo i
22f80 6e 66 6f 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nfo;.      sqlit
22f90 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
22fa0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
22fb0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
22fc0 61 73 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44  assert( (info.nD
22fd0 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b  ata+(pPage->intK
22fe0 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29  ey?0:info.nKey))
22ff0 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20  ==info.nPayload 
23000 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 6e  );.      if( (in
23010 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d  fo.nData+(pPage-
23020 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e  >intKey?0:info.n
23030 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  Key))>info.nLoca
23040 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e  l ){.        Pgn
23050 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74  o pgnoOvfl = get
23060 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66  4byte(&pCell[inf
23070 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20  o.iOverflow]);. 
23080 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
23090 61 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74  apPut(pPage->pBt
230a0 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d  , pgnoOvfl, PTRM
230b0 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50  AP_OVERFLOW1, pP
230c0 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
230d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
230e0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
230f0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
23100 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 72  .#endif.  }..  r
23110 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
23120 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
23130 6c 69 73 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f  list of cells to
23140 20 61 20 70 61 67 65 2e 20 20 54 68 65 20 70 61   a page.  The pa
23150 67 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69  ge should be ini
23160 74 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a  tially empty..**
23170 20 54 68 65 20 63 65 6c 6c 73 20 61 72 65 20 67   The cells are g
23180 75 61 72 61 6e 74 65 65 64 20 74 6f 20 66 69 74  uaranteed to fit
23190 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   on the page..*/
231a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73  .static void ass
231b0 65 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d  emblePage(.  Mem
231c0 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f  Page *pPage,   /
231d0 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 62 65  * The page to be
231e0 20 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20   assemblied */. 
231f0 20 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20   int nCell,     
23200 20 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72     /* The number
23210 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64   of cells to add
23220 20 74 6f 20 74 68 69 73 20 70 61 67 65 20 2a 2f   to this page */
23230 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20  .  u8 **apCell, 
23240 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73       /* Pointers
23250 20 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73 20   to cell bodies 
23260 2a 2f 0a 20 20 75 31 36 20 2a 61 53 69 7a 65 20  */.  u16 *aSize 
23270 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20         /* Sizes 
23280 6f 66 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a  of the cells */.
23290 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  ){.  int i;     
232a0 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
232b0 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
232c0 74 6f 74 61 6c 53 69 7a 65 3b 20 20 20 20 2f 2a  totalSize;    /*
232d0 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 61   Total size of a
232e0 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 69 6e  ll cells */.  in
232f0 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  t hdr;          
23300 2f 2a 20 49 6e 64 65 78 20 6f 66 20 70 61 67 65  /* Index of page
23310 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
23320 20 63 65 6c 6c 70 74 72 3b 20 20 20 20 20 20 2f   cellptr;      /
23330 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78  * Address of nex
23340 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a  t cell pointer *
23350 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79  /.  int cellbody
23360 3b 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73  ;     /* Address
23370 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f   of next cell bo
23380 64 79 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  dy */.  u8 *data
23390 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74  ;         /* Dat
233a0 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a  a for the page *
233b0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
233c0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
233d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
233e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
233f0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
23400 65 78 29 20 29 3b 0a 20 20 74 6f 74 61 6c 53 69  ex) );.  totalSi
23410 7a 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  ze = 0;.  for(i=
23420 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
23430 7b 0a 20 20 20 20 74 6f 74 61 6c 53 69 7a 65 20  {.    totalSize 
23440 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 7d  += aSize[i];.  }
23450 0a 20 20 61 73 73 65 72 74 28 20 74 6f 74 61 6c  .  assert( total
23460 53 69 7a 65 2b 32 2a 6e 43 65 6c 6c 3c 3d 70 50  Size+2*nCell<=pP
23470 61 67 65 2d 3e 6e 46 72 65 65 20 29 3b 0a 20 20  age->nFree );.  
23480 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
23490 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 63 65 6c  Cell==0 );.  cel
234a0 6c 70 74 72 20 3d 20 70 50 61 67 65 2d 3e 63 65  lptr = pPage->ce
234b0 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 64 61 74 61  llOffset;.  data
234c0 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
234d0 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
234e0 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 70 75 74  hdrOffset;.  put
234f0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
23500 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20 20 69 66  3], nCell);.  if
23510 28 20 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 63  ( nCell ){.    c
23520 65 6c 6c 62 6f 64 79 20 3d 20 61 6c 6c 6f 63 61  ellbody = alloca
23530 74 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 74  teSpace(pPage, t
23540 6f 74 61 6c 53 69 7a 65 29 3b 0a 20 20 20 20 61  otalSize);.    a
23550 73 73 65 72 74 28 20 63 65 6c 6c 62 6f 64 79 3e  ssert( cellbody>
23560 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
23570 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3e 3d   pPage->nFree >=
23580 20 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20   2*nCell );.    
23590 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20  pPage->nFree -= 
235a0 32 2a 6e 43 65 6c 6c 3b 0a 20 20 20 20 66 6f 72  2*nCell;.    for
235b0 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69  (i=0; i<nCell; i
235c0 2b 2b 29 7b 0a 20 20 20 20 20 20 70 75 74 32 62  ++){.      put2b
235d0 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c 70 74  yte(&data[cellpt
235e0 72 5d 2c 20 63 65 6c 6c 62 6f 64 79 29 3b 0a 20  r], cellbody);. 
235f0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74       memcpy(&dat
23600 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20 61 70 43  a[cellbody], apC
23610 65 6c 6c 5b 69 5d 2c 20 61 53 69 7a 65 5b 69 5d  ell[i], aSize[i]
23620 29 3b 0a 20 20 20 20 20 20 63 65 6c 6c 70 74 72  );.      cellptr
23630 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 63 65 6c   += 2;.      cel
23640 6c 62 6f 64 79 20 2b 3d 20 61 53 69 7a 65 5b 69  lbody += aSize[i
23650 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  ];.    }.    ass
23660 65 72 74 28 20 63 65 6c 6c 62 6f 64 79 3d 3d 70  ert( cellbody==p
23670 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
23680 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 20 20 70  eSize );.  }.  p
23690 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 6e 43  Page->nCell = nC
236a0 65 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ell;.}../*.** Th
236b0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61 72 61  e following para
236c0 6d 65 74 65 72 73 20 64 65 74 65 72 6d 69 6e 65  meters determine
236d0 20 68 6f 77 20 6d 61 6e 79 20 61 64 6a 61 63 65   how many adjace
236e0 6e 74 20 70 61 67 65 73 20 67 65 74 20 69 6e 76  nt pages get inv
236f0 6f 6c 76 65 64 0a 2a 2a 20 69 6e 20 61 20 62 61  olved.** in a ba
23700 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f  lancing operatio
23710 6e 2e 20 20 4e 4e 20 69 73 20 74 68 65 20 6e 75  n.  NN is the nu
23720 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62 6f 72  mber of neighbor
23730 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65  s on either side
23740 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20  .** of the page 
23750 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74 65  that participate
23760 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 69 6e   in the balancin
23770 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 42  g operation.  NB
23780 20 69 73 20 74 68 65 0a 2a 2a 20 74 6f 74 61 6c   is the.** total
23790 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
237a0 20 74 68 61 74 20 70 61 72 74 69 63 69 70 61 74   that participat
237b0 65 2c 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  e, including the
237c0 20 74 61 72 67 65 74 20 70 61 67 65 20 61 6e 64   target page and
237d0 0a 2a 2a 20 4e 4e 20 6e 65 69 67 68 62 6f 72 73  .** NN neighbors
237e0 20 6f 6e 20 65 69 74 68 65 72 20 73 69 64 65 2e   on either side.
237f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 69 6e 69 6d  .**.** The minim
23800 75 6d 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20 69  um value of NN i
23810 73 20 31 20 28 6f 66 20 63 6f 75 72 73 65 29 2e  s 1 (of course).
23820 20 20 49 6e 63 72 65 61 73 69 6e 67 20 4e 4e 20    Increasing NN 
23830 61 62 6f 76 65 20 31 0a 2a 2a 20 28 74 6f 20 32  above 1.** (to 2
23840 20 6f 72 20 33 29 20 67 69 76 65 73 20 61 20 6d   or 3) gives a m
23850 6f 64 65 73 74 20 69 6d 70 72 6f 76 65 6d 65 6e  odest improvemen
23860 74 20 69 6e 20 53 45 4c 45 43 54 20 61 6e 64 20  t in SELECT and 
23870 44 45 4c 45 54 45 20 70 65 72 66 6f 72 6d 61 6e  DELETE performan
23880 63 65 0a 2a 2a 20 69 6e 20 65 78 63 68 61 6e 67  ce.** in exchang
23890 65 20 66 6f 72 20 61 20 6c 61 72 67 65 72 20 64  e for a larger d
238a0 65 67 72 61 64 61 74 69 6f 6e 20 69 6e 20 49 4e  egradation in IN
238b0 53 45 52 54 20 61 6e 64 20 55 50 44 41 54 45 20  SERT and UPDATE 
238c0 70 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 2a 2a 20  performance..** 
238d0 54 68 65 20 76 61 6c 75 65 20 6f 66 20 4e 4e 20  The value of NN 
238e0 61 70 70 65 61 72 73 20 74 6f 20 67 69 76 65 20  appears to give 
238f0 74 68 65 20 62 65 73 74 20 72 65 73 75 6c 74 73  the best results
23900 20 6f 76 65 72 61 6c 6c 2e 0a 2a 2f 0a 23 64 65   overall..*/.#de
23910 66 69 6e 65 20 4e 4e 20 31 20 20 20 20 20 20 20  fine NN 1       
23920 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
23930 6f 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20  of neighbors on 
23940 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70  either side of p
23950 50 61 67 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20  Page */.#define 
23960 4e 42 20 28 4e 4e 2a 32 2b 31 29 20 20 20 20 20  NB (NN*2+1)     
23970 20 2f 2a 20 54 6f 74 61 6c 20 70 61 67 65 73 20   /* Total pages 
23980 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20  involved in the 
23990 62 61 6c 61 6e 63 65 20 2a 2f 0a 0a 2f 2a 20 46  balance */../* F
239a0 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
239b0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62   */.static int b
239c0 61 6c 61 6e 63 65 28 4d 65 6d 50 61 67 65 2a 2c  alance(MemPage*,
239d0 20 69 6e 74 29 3b 0a 0a 23 69 66 6e 64 65 66 20   int);..#ifndef 
239e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43  SQLITE_OMIT_QUIC
239f0 4b 42 41 4c 41 4e 43 45 0a 2f 2a 0a 2a 2a 20 54  KBALANCE./*.** T
23a00 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 62  his version of b
23a10 61 6c 61 6e 63 65 28 29 20 68 61 6e 64 6c 65 73  alance() handles
23a20 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 73 70 65 63   the common spec
23a30 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 0a 2a  ial case where.*
23a40 2a 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 73  * a new entry is
23a50 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20   being inserted 
23a60 6f 6e 20 74 68 65 20 65 78 74 72 65 6d 65 20 72  on the extreme r
23a70 69 67 68 74 2d 65 6e 64 20 6f 66 20 74 68 65 0a  ight-end of the.
23a80 2a 2a 20 74 72 65 65 2c 20 69 6e 20 6f 74 68 65  ** tree, in othe
23a90 72 20 77 6f 72 64 73 2c 20 77 68 65 6e 20 74 68  r words, when th
23aa0 65 20 6e 65 77 20 65 6e 74 72 79 20 77 69 6c 6c  e new entry will
23ab0 20 62 65 63 6f 6d 65 20 74 68 65 20 6c 61 72 67   become the larg
23ac0 65 73 74 0a 2a 2a 20 65 6e 74 72 79 20 69 6e 20  est.** entry in 
23ad0 74 68 65 20 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20  the tree..**.** 
23ae0 49 6e 73 74 65 61 64 20 6f 66 20 74 72 79 69 6e  Instead of tryin
23af0 67 20 62 61 6c 61 6e 63 65 20 74 68 65 20 33 20  g balance the 3 
23b00 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66 20  right-most leaf 
23b10 70 61 67 65 73 2c 20 6a 75 73 74 20 61 64 64 0a  pages, just add.
23b20 2a 2a 20 61 20 6e 65 77 20 70 61 67 65 20 74 6f  ** a new page to
23b30 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20   the right-hand 
23b40 73 69 64 65 20 61 6e 64 20 70 75 74 20 74 68 65  side and put the
23b50 20 6f 6e 65 20 6e 65 77 20 65 6e 74 72 79 20 69   one new entry i
23b60 6e 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 2e 20  n.** that page. 
23b70 20 54 68 69 73 20 6c 65 61 76 65 73 20 74 68 65   This leaves the
23b80 20 72 69 67 68 74 20 73 69 64 65 20 6f 66 20 74   right side of t
23b90 68 65 20 74 72 65 65 20 73 6f 6d 65 77 68 61 74  he tree somewhat
23ba0 0a 2a 2a 20 75 6e 62 61 6c 61 6e 63 65 64 2e 20  .** unbalanced. 
23bb0 20 42 75 74 20 6f 64 64 73 20 61 72 65 20 74 68   But odds are th
23bc0 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 69 6e  at we will be in
23bd0 73 65 72 74 69 6e 67 20 6e 65 77 20 65 6e 74 72  serting new entr
23be0 69 65 73 0a 2a 2a 20 61 74 20 74 68 65 20 65 6e  ies.** at the en
23bf0 64 20 73 6f 6f 6e 20 61 66 74 65 72 77 61 72 64  d soon afterward
23c00 73 20 73 6f 20 74 68 65 20 6e 65 61 72 6c 79 20  s so the nearly 
23c10 65 6d 70 74 79 20 70 61 67 65 20 77 69 6c 6c 20  empty page will 
23c20 71 75 69 63 6b 6c 79 0a 2a 2a 20 66 69 6c 6c 20  quickly.** fill 
23c30 75 70 2e 20 20 4f 6e 20 61 76 65 72 61 67 65 2e  up.  On average.
23c40 0a 2a 2a 0a 2a 2a 20 70 50 61 67 65 20 69 73 20  .**.** pPage is 
23c50 74 68 65 20 6c 65 61 66 20 70 61 67 65 20 77 68  the leaf page wh
23c60 69 63 68 20 69 73 20 74 68 65 20 72 69 67 68 74  ich is the right
23c70 2d 6d 6f 73 74 20 70 61 67 65 20 69 6e 20 74 68  -most page in th
23c80 65 20 74 72 65 65 2e 0a 2a 2a 20 70 50 61 72 65  e tree..** pPare
23c90 6e 74 20 69 73 20 69 74 73 20 70 61 72 65 6e 74  nt is its parent
23ca0 2e 20 20 70 50 61 67 65 20 6d 75 73 74 20 68 61  .  pPage must ha
23cb0 76 65 20 61 20 73 69 6e 67 6c 65 20 6f 76 65 72  ve a single over
23cc0 66 6c 6f 77 20 65 6e 74 72 79 0a 2a 2a 20 77 68  flow entry.** wh
23cd0 69 63 68 20 69 73 20 61 6c 73 6f 20 74 68 65 20  ich is also the 
23ce0 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
23cf0 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   on the page..*/
23d00 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
23d10 6e 63 65 5f 71 75 69 63 6b 28 4d 65 6d 50 61 67  nce_quick(MemPag
23d20 65 20 2a 70 50 61 67 65 2c 20 4d 65 6d 50 61 67  e *pPage, MemPag
23d30 65 20 2a 70 50 61 72 65 6e 74 29 7b 0a 20 20 69  e *pParent){.  i
23d40 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
23d50 20 2a 70 4e 65 77 3b 0a 20 20 50 67 6e 6f 20 70   *pNew;.  Pgno p
23d60 67 6e 6f 4e 65 77 3b 0a 20 20 75 38 20 2a 70 43  gnoNew;.  u8 *pC
23d70 65 6c 6c 3b 0a 20 20 75 31 36 20 73 7a 43 65 6c  ell;.  u16 szCel
23d80 6c 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  l;.  CellInfo in
23d90 66 6f 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  fo;.  BtShared *
23da0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
23db0 3b 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 49 64  ;.  int parentId
23dc0 78 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65  x = pParent->nCe
23dd0 6c 6c 3b 20 20 20 2f 2a 20 70 50 61 72 65 6e 74  ll;   /* pParent
23de0 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c   new divider cel
23df0 6c 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74  l index */.  int
23e00 20 70 61 72 65 6e 74 53 69 7a 65 3b 20 20 20 20   parentSize;    
23e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
23e20 2a 20 53 69 7a 65 20 6f 66 20 6e 65 77 20 64 69  * Size of new di
23e30 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20  vider cell */.  
23e40 75 38 20 70 61 72 65 6e 74 43 65 6c 6c 5b 36 34  u8 parentCell[64
23e50 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ];              
23e60 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 74    /* Space for t
23e70 68 65 20 6e 65 77 20 64 69 76 69 64 65 72 20 63  he new divider c
23e80 65 6c 6c 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ell */..  assert
23e90 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
23ea0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
23eb0 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a  >mutex) );..  /*
23ec0 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
23ed0 70 61 67 65 2e 20 49 6e 73 65 72 74 20 74 68 65  page. Insert the
23ee0 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 66   overflow cell f
23ef0 72 6f 6d 20 70 50 61 67 65 0a 20 20 2a 2a 20 69  rom pPage.  ** i
23f00 6e 74 6f 20 69 74 2e 20 54 68 65 6e 20 72 65 6d  nto it. Then rem
23f10 6f 76 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ove the overflow
23f20 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
23f30 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c  ..  */.  rc = al
23f40 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
23f50 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e  pBt, &pNew, &pgn
23f60 6f 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20 69  oNew, 0, 0);.  i
23f70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
23f80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
23f90 63 3b 0a 20 20 7d 0a 20 20 70 43 65 6c 6c 20 3d  c;.  }.  pCell =
23fa0 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d   pPage->aOvfl[0]
23fb0 2e 70 43 65 6c 6c 3b 0a 20 20 73 7a 43 65 6c 6c  .pCell;.  szCell
23fc0 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
23fd0 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  Page, pCell);.  
23fe0 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70  zeroPage(pNew, p
23ff0 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 29 3b  Page->aData[0]);
24000 0a 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28  .  assemblePage(
24010 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c 6c 2c  pNew, 1, &pCell,
24020 20 26 73 7a 43 65 6c 6c 29 3b 0a 20 20 70 50 61   &szCell);.  pPa
24030 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ge->nOverflow = 
24040 30 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  0;..  /* Set the
24050 20 70 61 72 65 6e 74 20 6f 66 20 74 68 65 20 6e   parent of the n
24060 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 70  ewly allocated p
24070 61 67 65 20 74 6f 20 70 50 61 72 65 6e 74 2e 20  age to pParent. 
24080 2a 2f 0a 20 20 70 4e 65 77 2d 3e 70 50 61 72 65  */.  pNew->pPare
24090 6e 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20 20  nt = pParent;.  
240a0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
240b0 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65  pParent->pDbPage
240c0 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20 69  );..  /* pPage i
240d0 73 20 63 75 72 72 65 6e 74 6c 79 20 74 68 65 20  s currently the 
240e0 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 70  right-child of p
240f0 50 61 72 65 6e 74 2e 20 43 68 61 6e 67 65 20 74  Parent. Change t
24100 68 69 73 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  his.  ** so that
24110 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
24120 20 69 73 20 74 68 65 20 6e 65 77 20 70 61 67 65   is the new page
24130 20 61 6c 6c 6f 63 61 74 65 64 20 61 62 6f 76 65   allocated above
24140 20 61 6e 64 0a 20 20 2a 2a 20 70 50 61 67 65 20   and.  ** pPage 
24150 69 73 20 74 68 65 20 6e 65 78 74 2d 74 6f 2d 72  is the next-to-r
24160 69 67 68 74 20 63 68 69 6c 64 2e 20 0a 20 20 2a  ight child. .  *
24170 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
24180 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20  e->nCell>0 );.  
24190 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
241a0 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e  (pPage, pPage->n
241b0 43 65 6c 6c 2d 31 29 3b 0a 20 20 73 71 6c 69 74  Cell-1);.  sqlit
241c0 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
241d0 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
241e0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72 63 20 3d  , &info);.  rc =
241f0 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72   fillInCell(pPar
24200 65 6e 74 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c  ent, parentCell,
24210 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30   0, info.nKey, 0
24220 2c 20 30 2c 20 30 2c 20 26 70 61 72 65 6e 74 53  , 0, 0, &parentS
24230 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ize);.  if( rc!=
24240 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24250 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
24260 20 20 61 73 73 65 72 74 28 20 70 61 72 65 6e 74    assert( parent
24270 53 69 7a 65 3c 36 34 20 29 3b 0a 20 20 72 63 20  Size<64 );.  rc 
24280 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61  = insertCell(pPa
24290 72 65 6e 74 2c 20 70 61 72 65 6e 74 49 64 78 2c  rent, parentIdx,
242a0 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20 70 61 72   parentCell, par
242b0 65 6e 74 53 69 7a 65 2c 20 30 2c 20 34 29 3b 0a  entSize, 0, 4);.
242c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
242d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
242e0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 75 74 34  n rc;.  }.  put4
242f0 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f  byte(findOverflo
24300 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 70 61  wCell(pParent,pa
24310 72 65 6e 74 49 64 78 29 2c 20 70 50 61 67 65 2d  rentIdx), pPage-
24320 3e 70 67 6e 6f 29 3b 0a 20 20 70 75 74 34 62 79  >pgno);.  put4by
24330 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
24340 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
24350 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65  ffset+8], pgnoNe
24360 77 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  w);..#ifndef SQL
24370 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
24380 55 55 4d 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  UUM.  /* If this
24390 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
243a0 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64  um database, upd
243b0 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20  ate the pointer 
243c0 6d 61 70 0a 20 20 2a 2a 20 77 69 74 68 20 65 6e  map.  ** with en
243d0 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6e 65  tries for the ne
243e0 77 20 70 61 67 65 2c 20 61 6e 64 20 61 6e 79 20  w page, and any 
243f0 70 6f 69 6e 74 65 72 20 66 72 6f 6d 20 74 68 65  pointer from the
24400 20 0a 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74   .  ** cell on t
24410 68 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76  he page to an ov
24420 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a  erflow page..  *
24430 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  /.  if( pBt->aut
24440 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
24450 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
24460 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d  t, pgnoNew, PTRM
24470 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e  AP_BTREE, pParen
24480 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66  t->pgno);.    if
24490 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
244a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74  ){.      rc = pt
244b0 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 4e 65 77  rmapPutOvfl(pNew
244c0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
244d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
244e0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
244f0 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20  sePage(pNew);.  
24500 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
24510 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
24520 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68  .  /* Release th
24530 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  e reference to t
24540 68 65 20 6e 65 77 20 70 61 67 65 20 61 6e 64 20  he new page and 
24550 62 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65  balance the pare
24560 6e 74 20 70 61 67 65 2c 0a 20 20 2a 2a 20 69 6e  nt page,.  ** in
24570 20 63 61 73 65 20 74 68 65 20 64 69 76 69 64 65   case the divide
24580 72 20 63 65 6c 6c 20 69 6e 73 65 72 74 65 64 20  r cell inserted 
24590 63 61 75 73 65 64 20 69 74 20 74 6f 20 62 65 63  caused it to bec
245a0 6f 6d 65 20 6f 76 65 72 66 75 6c 6c 2e 0a 20 20  ome overfull..  
245b0 2a 2f 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  */.  releasePage
245c0 28 70 4e 65 77 29 3b 0a 20 20 72 65 74 75 72 6e  (pNew);.  return
245d0 20 62 61 6c 61 6e 63 65 28 70 50 61 72 65 6e 74   balance(pParent
245e0 2c 20 30 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  , 0);.}.#endif /
245f0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55  * SQLITE_OMIT_QU
24600 49 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 2f  ICKBALANCE */../
24610 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
24620 65 20 72 65 64 69 73 74 72 69 62 75 74 65 73 20  e redistributes 
24630 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 20 61  Cells on pPage a
24640 6e 64 20 75 70 20 74 6f 20 4e 4e 2a 32 20 73 69  nd up to NN*2 si
24650 62 6c 69 6e 67 73 0a 2a 2a 20 6f 66 20 70 50 61  blings.** of pPa
24660 67 65 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70  ge so that all p
24670 61 67 65 73 20 68 61 76 65 20 61 62 6f 75 74 20  ages have about 
24680 74 68 65 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20  the same amount 
24690 6f 66 20 66 72 65 65 20 73 70 61 63 65 2e 0a 2a  of free space..*
246a0 2a 20 55 73 75 61 6c 6c 79 20 4e 4e 20 73 69 62  * Usually NN sib
246b0 6c 69 6e 67 73 20 6f 6e 20 65 69 74 68 65 72 20  lings on either 
246c0 73 69 64 65 20 6f 66 20 70 50 61 67 65 20 69 73  side of pPage is
246d0 20 75 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c   used in the bal
246e0 61 6e 63 69 6e 67 2c 0a 2a 2a 20 74 68 6f 75 67  ancing,.** thoug
246f0 68 20 6d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20  h more siblings 
24700 6d 69 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d 20  might come from 
24710 6f 6e 65 20 73 69 64 65 20 69 66 20 70 50 61 67  one side if pPag
24720 65 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a  e is the first.*
24730 2a 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64 20  * or last child 
24740 6f 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20  of its parent.  
24750 49 66 20 70 50 61 67 65 20 68 61 73 20 66 65 77  If pPage has few
24760 65 72 20 74 68 61 6e 20 32 2a 4e 4e 20 73 69 62  er than 2*NN sib
24770 6c 69 6e 67 73 0a 2a 2a 20 28 73 6f 6d 65 74 68  lings.** (someth
24780 69 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f 6e  ing which can on
24790 6c 79 20 68 61 70 70 65 6e 20 69 66 20 70 50 61  ly happen if pPa
247a0 67 65 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  ge is the root p
247b0 61 67 65 20 6f 72 20 61 20 0a 2a 2a 20 63 68 69  age or a .** chi
247c0 6c 64 20 6f 66 20 72 6f 6f 74 29 20 74 68 65 6e  ld of root) then
247d0 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 73   all available s
247e0 69 62 6c 69 6e 67 73 20 70 61 72 74 69 63 69 70  iblings particip
247f0 61 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e  ate in the balan
24800 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  cing..**.** The 
24810 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e  number of siblin
24820 67 73 20 6f 66 20 70 50 61 67 65 20 6d 69 67 68  gs of pPage migh
24830 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 6f  t be increased o
24840 72 20 64 65 63 72 65 61 73 65 64 20 62 79 20 6f  r decreased by o
24850 6e 65 20 6f 72 0a 2a 2a 20 74 77 6f 20 69 6e 20  ne or.** two in 
24860 61 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b 65 65  an effort to kee
24870 70 20 70 61 67 65 73 20 6e 65 61 72 6c 79 20 66  p pages nearly f
24880 75 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76 65 72  ull but not over
24890 20 66 75 6c 6c 2e 20 54 68 65 20 72 6f 6f 74 20   full. The root 
248a0 70 61 67 65 0a 2a 2a 20 69 73 20 73 70 65 63 69  page.** is speci
248b0 61 6c 20 61 6e 64 20 69 73 20 61 6c 6c 6f 77 65  al and is allowe
248c0 64 20 74 6f 20 62 65 20 6e 65 61 72 6c 79 20 65  d to be nearly e
248d0 6d 70 74 79 2e 20 49 66 20 70 50 61 67 65 20 69  mpty. If pPage i
248e0 73 20 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70  s .** the root p
248f0 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 64 65  age, then the de
24900 70 74 68 20 6f 66 20 74 68 65 20 74 72 65 65 20  pth of the tree 
24910 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65 61 73  might be increas
24920 65 64 0a 2a 2a 20 6f 72 20 64 65 63 72 65 61 73  ed.** or decreas
24930 65 64 20 62 79 20 6f 6e 65 2c 20 61 73 20 6e 65  ed by one, as ne
24940 63 65 73 73 61 72 79 2c 20 74 6f 20 6b 65 65 70  cessary, to keep
24950 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 66   the root page f
24960 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 6f 76 65  rom being.** ove
24970 72 66 75 6c 6c 20 6f 72 20 63 6f 6d 70 6c 65 74  rfull or complet
24980 65 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a  ely empty..**.**
24990 20 4e 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20   Note that when 
249a0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
249b0 63 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20  called, some of 
249c0 74 68 65 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61  the Cells on pPa
249d0 67 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20  ge.** might not 
249e0 61 63 74 75 61 6c 6c 79 20 62 65 20 73 74 6f 72  actually be stor
249f0 65 64 20 69 6e 20 70 50 61 67 65 2d 3e 61 44 61  ed in pPage->aDa
24a00 74 61 5b 5d 2e 20 20 54 68 69 73 20 63 61 6e 20  ta[].  This can 
24a10 68 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65  happen.** if the
24a20 20 70 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c   page is overful
24a30 6c 2e 20 20 50 61 72 74 20 6f 66 20 74 68 65 20  l.  Part of the 
24a40 6a 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74  job of this rout
24a50 69 6e 65 20 69 73 20 74 6f 0a 2a 2a 20 6d 61 6b  ine is to.** mak
24a60 65 20 73 75 72 65 20 61 6c 6c 20 43 65 6c 6c 73  e sure all Cells
24a70 20 66 6f 72 20 70 50 61 67 65 20 6f 6e 63 65 20   for pPage once 
24a80 61 67 61 69 6e 20 66 69 74 20 69 6e 20 70 50 61  again fit in pPa
24a90 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 0a 2a 2a 0a  ge->aData[]..**.
24aa0 2a 2a 20 49 6e 20 74 68 65 20 63 6f 75 72 73 65  ** In the course
24ab0 20 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20 74 68   of balancing th
24ac0 65 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 70 50  e siblings of pP
24ad0 61 67 65 2c 20 74 68 65 20 70 61 72 65 6e 74 20  age, the parent 
24ae0 6f 66 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68  of pPage.** migh
24af0 74 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c  t become overful
24b00 6c 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20  l or underfull. 
24b10 20 49 66 20 74 68 61 74 20 68 61 70 70 65 6e 73   If that happens
24b20 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
24b30 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ine.** is called
24b40 20 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20   recursively on 
24b50 74 68 65 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a  the parent..**.*
24b60 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e  * If this routin
24b70 65 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20  e fails for any 
24b80 72 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68 74  reason, it might
24b90 20 6c 65 61 76 65 20 74 68 65 20 64 61 74 61 62   leave the datab
24ba0 61 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72 72  ase.** in a corr
24bb0 75 70 74 65 64 20 73 74 61 74 65 2e 20 20 53 6f  upted state.  So
24bc0 20 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   if this routine
24bd0 20 66 61 69 6c 73 2c 20 74 68 65 20 64 61 74 61   fails, the data
24be0 62 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  base should.** b
24bf0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  e rolled back..*
24c00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c  /.static int bal
24c10 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 4d 65 6d  ance_nonroot(Mem
24c20 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
24c30 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
24c40 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
24c50 54 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70 50  The parent of pP
24c60 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65  age */.  BtShare
24c70 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20  d *pBt;         
24c80 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f        /* The who
24c90 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  le database */. 
24ca0 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 20   int nCell = 0; 
24cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24cc0 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
24cd0 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a   in apCell[] */.
24ce0 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73 20    int nMaxCells 
24cf0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
24d00 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65  * Allocated size
24d10 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65   of apCell, szCe
24d20 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20  ll, aFrom. */.  
24d30 69 6e 74 20 6e 4f 6c 64 3b 20 20 20 20 20 20 20  int nOld;       
24d40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24d50 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
24d60 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20  in apOld[] */.  
24d70 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20 20  int nNew;       
24d80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24d90 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
24da0 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20  in apNew[] */.  
24db0 69 6e 74 20 6e 44 69 76 3b 20 20 20 20 20 20 20  int nDiv;       
24dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24dd0 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
24de0 69 6e 20 61 70 44 69 76 5b 5d 20 2a 2f 0a 20 20  in apDiv[] */.  
24df0 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20 20  int i, j, k;    
24e00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24e10 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
24e20 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20  .  int idx;     
24e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e40 2f 2a 20 49 6e 64 65 78 20 6f 66 20 70 50 61 67  /* Index of pPag
24e50 65 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43  e in pParent->aC
24e60 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e  ell[] */.  int n
24e70 78 44 69 76 3b 20 20 20 20 20 20 20 20 20 20 20  xDiv;           
24e80 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20          /* Next 
24e90 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69 6e 20  divider slot in 
24ea0 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d  pParent->aCell[]
24eb0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
24ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24ed0 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e     /* The return
24ee0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6c   code */.  int l
24ef0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20  eafCorrection;  
24f00 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69 66 20          /* 4 if 
24f10 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e  pPage is a leaf.
24f20 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20    0 if not */.  
24f30 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20 20 20  int leafData;   
24f40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24f50 54 72 75 65 20 69 66 20 70 50 61 67 65 20 69 73  True if pPage is
24f60 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c 45 41   a leaf of a LEA
24f70 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a 20 20  FDATA tree */.  
24f80 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63 65 3b  int usableSpace;
24f90 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24fa0 42 79 74 65 73 20 69 6e 20 70 50 61 67 65 20 62  Bytes in pPage b
24fb0 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64 65 72  eyond the header
24fc0 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 46 6c   */.  int pageFl
24fd0 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
24fe0 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70     /* Value of p
24ff0 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a  Page->aData[0] *
25000 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74 61 6c  /.  int subtotal
25010 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25020 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66 20   /* Subtotal of 
25030 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f  bytes in cells o
25040 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20  n one page */.  
25050 69 6e 74 20 69 53 70 61 63 65 31 20 3d 20 30 3b  int iSpace1 = 0;
25060 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25070 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74  First unused byt
25080 65 20 6f 66 20 61 53 70 61 63 65 31 5b 5d 20 2a  e of aSpace1[] *
25090 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65 32 20  /.  int iSpace2 
250a0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
250b0 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64   /* First unused
250c0 20 62 79 74 65 20 6f 66 20 61 53 70 61 63 65 32   byte of aSpace2
250d0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 63  [] */.  int szSc
250e0 72 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20  ratch;          
250f0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
25100 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 72  scratch memory r
25110 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d 65  equested */.  Me
25120 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d  mPage *apOld[NB]
25130 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50  ;          /* pP
25140 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77  age and up to tw
25150 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20  o siblings */.  
25160 50 67 6e 6f 20 70 67 6e 6f 4f 6c 64 5b 4e 42 5d  Pgno pgnoOld[NB]
25170 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
25180 50 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72  Page numbers for
25190 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 61 70   each page in ap
251a0 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61  Old[] */.  MemPa
251b0 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b 20  ge *apCopy[NB]; 
251c0 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69 76 61          /* Priva
251d0 74 65 20 63 6f 70 69 65 73 20 6f 66 20 61 70 4f  te copies of apO
251e0 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20 20  ld[] pages */.  
251f0 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e  MemPage *apNew[N
25200 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20  B+2];        /* 
25210 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20  pPage and up to 
25220 4e 42 20 73 69 62 6c 69 6e 67 73 20 61 66 74 65  NB siblings afte
25230 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20  r balancing */. 
25240 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 5b 4e 42   Pgno pgnoNew[NB
25250 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  +2];          /*
25260 20 50 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f   Page numbers fo
25270 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 61  r each page in a
25280 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a  pNew[] */.  u8 *
25290 61 70 44 69 76 5b 4e 42 5d 3b 20 20 20 20 20 20  apDiv[NB];      
252a0 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69           /* Divi
252b0 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61  der cells in pPa
252c0 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  rent */.  int cn
252d0 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  tNew[NB+2];     
252e0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
252f0 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65  in aCell[] of ce
25300 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70 61  ll after i-th pa
25310 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65  ge */.  int szNe
25320 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20  w[NB+2];        
25330 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64       /* Combined
25340 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70   size of cells p
25350 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67  lace on i-th pag
25360 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65  e */.  u8 **apCe
25370 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ll = 0;         
25380 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73      /* All cells
25390 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20   begin balanced 
253a0 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c  */.  u16 *szCell
253b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
253c0 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20    /* Local size 
253d0 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20  of all cells in 
253e0 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38  apCell[] */.  u8
253f0 20 2a 61 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20   *aCopy[NB];    
25400 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f       /* Space fo
25410 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 6f  r holding data o
25420 66 20 61 70 43 6f 70 79 5b 5d 20 2a 2f 0a 20 20  f apCopy[] */.  
25430 75 38 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20  u8 *aSpace1;    
25440 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
25450 66 6f 72 20 63 6f 70 69 65 73 20 6f 66 20 64 69  for copies of di
25460 76 69 64 65 72 73 20 63 65 6c 6c 73 20 62 65 66  viders cells bef
25470 6f 72 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 20  ore balance */. 
25480 20 75 38 20 2a 61 53 70 61 63 65 32 20 3d 20 30   u8 *aSpace2 = 0
25490 3b 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65  ;       /* Space
254a0 20 66 6f 72 20 6f 76 65 72 66 6c 6f 77 20 64 69   for overflow di
254b0 76 69 64 65 72 73 20 63 65 6c 6c 73 20 61 66 74  viders cells aft
254c0 65 72 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 23 69  er balance */.#i
254d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
254e0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 75  T_AUTOVACUUM.  u
254f0 38 20 2a 61 46 72 6f 6d 20 3d 20 30 3b 0a 23 65  8 *aFrom = 0;.#e
25500 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
25510 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
25520 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
25530 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 0a  utex) );..  /* .
25540 20 20 2a 2a 20 46 69 6e 64 20 74 68 65 20 70 61    ** Find the pa
25550 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a  rent page..  */.
25560 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
25570 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
25580 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
25590 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
255a0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 7c 7c 20  ge->pDbPage) || 
255b0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
255c0 3d 3d 31 20 29 3b 0a 20 20 70 42 74 20 3d 20 70  ==1 );.  pBt = p
255d0 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 70 50 61  Page->pBt;.  pPa
255e0 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50  rent = pPage->pP
255f0 61 72 65 6e 74 3b 0a 20 20 61 73 73 65 72 74 28  arent;.  assert(
25600 20 70 50 61 72 65 6e 74 20 29 3b 0a 20 20 69 66   pParent );.  if
25610 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
25620 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
25630 72 69 74 65 28 70 50 61 72 65 6e 74 2d 3e 70 44  rite(pParent->pD
25640 62 50 61 67 65 29 29 20 29 7b 0a 20 20 20 20 72  bPage)) ){.    r
25650 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
25660 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
25670 20 62 65 67 69 6e 20 70 61 67 65 20 25 64 20 63   begin page %d c
25680 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  hild of %d\n", p
25690 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50 61 72  Page->pgno, pPar
256a0 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 0a 23 69  ent->pgno));..#i
256b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
256c0 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a 20  T_QUICKBALANCE. 
256d0 20 2f 2a 0a 20 20 2a 2a 20 41 20 73 70 65 63 69   /*.  ** A speci
256e0 61 6c 20 63 61 73 65 3a 20 20 49 66 20 61 20 6e  al case:  If a n
256f0 65 77 20 65 6e 74 72 79 20 68 61 73 20 6a 75 73  ew entry has jus
25700 74 20 62 65 65 6e 20 69 6e 73 65 72 74 65 64 20  t been inserted 
25710 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 61 62 6c  into a.  ** tabl
25720 65 20 28 74 68 61 74 20 69 73 2c 20 61 20 62 74  e (that is, a bt
25730 72 65 65 20 77 69 74 68 20 69 6e 74 65 67 65 72  ree with integer
25740 20 6b 65 79 73 20 61 6e 64 20 61 6c 6c 20 64 61   keys and all da
25750 74 61 20 61 74 20 74 68 65 20 6c 65 61 76 65 73  ta at the leaves
25760 29 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6e  ).  ** and the n
25770 65 77 20 65 6e 74 72 79 20 69 73 20 74 68 65 20  ew entry is the 
25780 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79  right-most entry
25790 20 69 6e 20 74 68 65 20 74 72 65 65 20 28 69 74   in the tree (it
257a0 20 68 61 73 20 74 68 65 0a 20 20 2a 2a 20 6c 61   has the.  ** la
257b0 72 67 65 73 74 20 6b 65 79 29 20 74 68 65 6e 20  rgest key) then 
257c0 75 73 65 20 74 68 65 20 73 70 65 63 69 61 6c 20  use the special 
257d0 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20  balance_quick() 
257e0 72 6f 75 74 69 6e 65 20 66 6f 72 0a 20 20 2a 2a  routine for.  **
257f0 20 62 61 6c 61 6e 63 69 6e 67 2e 20 20 62 61 6c   balancing.  bal
25800 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69 73 20  ance_quick() is 
25810 6d 75 63 68 20 66 61 73 74 65 72 20 61 6e 64 20  much faster and 
25820 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74 69 67  results in a tig
25830 68 74 65 72 0a 20 20 2a 2a 20 70 61 63 6b 69 6e  hter.  ** packin
25840 67 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68 65  g of data in the
25850 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a 20 20   common case..  
25860 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  */.  if( pPage->
25870 6c 65 61 66 20 26 26 0a 20 20 20 20 20 20 70 50  leaf &&.      pP
25880 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26 0a 20  age->intKey &&. 
25890 20 20 20 20 20 70 50 61 67 65 2d 3e 6c 65 61 66       pPage->leaf
258a0 44 61 74 61 20 26 26 0a 20 20 20 20 20 20 70 50  Data &&.      pP
258b0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
258c0 31 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65  1 &&.      pPage
258d0 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d  ->aOvfl[0].idx==
258e0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26 26 0a  pPage->nCell &&.
258f0 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61        pPage->pPa
25900 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20 26 26  rent->pgno!=1 &&
25910 0a 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28  .      get4byte(
25920 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b  &pParent->aData[
25930 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73  pParent->hdrOffs
25940 65 74 2b 38 5d 29 3d 3d 70 50 61 67 65 2d 3e 70  et+8])==pPage->p
25950 67 6e 6f 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 0a  gno.  ){.    /*.
25960 20 20 20 20 2a 2a 20 54 4f 44 4f 3a 20 43 68 65      ** TODO: Che
25970 63 6b 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  ck the siblings 
25980 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 70  to the left of p
25990 50 61 67 65 2e 20 49 74 20 6d 61 79 20 62 65 20  Page. It may be 
259a0 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 79  that.    ** they
259b0 20 61 72 65 20 6e 6f 74 20 66 75 6c 6c 20 61 6e   are not full an
259c0 64 20 6e 6f 20 6e 65 77 20 70 61 67 65 20 69 73  d no new page is
259d0 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
259e0 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 62 61 6c  /.    return bal
259f0 61 6e 63 65 5f 71 75 69 63 6b 28 70 50 61 67 65  ance_quick(pPage
25a00 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a  , pParent);.  }.
25a10 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 53 51  #endif..  if( SQ
25a20 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
25a30 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
25a40 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
25a50 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
25a60 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  rc;.  }..  /*.  
25a70 2a 2a 20 46 69 6e 64 20 74 68 65 20 63 65 6c 6c  ** Find the cell
25a80 20 69 6e 20 74 68 65 20 70 61 72 65 6e 74 20 70   in the parent p
25a90 61 67 65 20 77 68 6f 73 65 20 6c 65 66 74 20 63  age whose left c
25aa0 68 69 6c 64 20 70 6f 69 6e 74 73 20 62 61 63 6b  hild points back
25ab0 0a 20 20 2a 2a 20 74 6f 20 70 50 61 67 65 2e 20  .  ** to pPage. 
25ac0 20 54 68 65 20 22 69 64 78 22 20 76 61 72 69 61   The "idx" varia
25ad0 62 6c 65 20 69 73 20 74 68 65 20 69 6e 64 65 78  ble is the index
25ae0 20 6f 66 20 74 68 61 74 20 63 65 6c 6c 2e 20 20   of that cell.  
25af0 49 66 20 70 50 61 67 65 0a 20 20 2a 2a 20 69 73  If pPage.  ** is
25b00 20 74 68 65 20 72 69 67 68 74 6d 6f 73 74 20 63   the rightmost c
25b10 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 20  hild of pParent 
25b20 74 68 65 6e 20 73 65 74 20 69 64 78 20 74 6f 20  then set idx to 
25b30 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 0a  pParent->nCell .
25b40 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 72 65    */.  if( pPare
25b50 6e 74 2d 3e 69 64 78 53 68 69 66 74 20 29 7b 0a  nt->idxShift ){.
25b60 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20      Pgno pgno;. 
25b70 20 20 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d     pgno = pPage-
25b80 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72  >pgno;.    asser
25b90 74 28 20 70 67 6e 6f 3d 3d 73 71 6c 69 74 65 33  t( pgno==sqlite3
25ba0 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
25bb0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
25bc0 29 3b 0a 20 20 20 20 66 6f 72 28 69 64 78 3d 30  );.    for(idx=0
25bd0 3b 20 69 64 78 3c 70 50 61 72 65 6e 74 2d 3e 6e  ; idx<pParent->n
25be0 43 65 6c 6c 3b 20 69 64 78 2b 2b 29 7b 0a 20 20  Cell; idx++){.  
25bf0 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74 65      if( get4byte
25c00 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e  (findCell(pParen
25c10 74 2c 20 69 64 78 29 29 3d 3d 70 67 6e 6f 20 29  t, idx))==pgno )
25c20 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
25c30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
25c40 20 20 20 61 73 73 65 72 74 28 20 69 64 78 3c 70     assert( idx<p
25c50 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 0a 20 20  Parent->nCell.  
25c60 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 67 65             || ge
25c70 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
25c80 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
25c90 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 70  hdrOffset+8])==p
25ca0 67 6e 6f 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gno );.  }else{.
25cb0 20 20 20 20 69 64 78 20 3d 20 70 50 61 67 65 2d      idx = pPage-
25cc0 3e 69 64 78 50 61 72 65 6e 74 3b 0a 20 20 7d 0a  >idxParent;.  }.
25cd0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 6e 69 74 69  .  /*.  ** Initi
25ce0 61 6c 69 7a 65 20 76 61 72 69 61 62 6c 65 73 20  alize variables 
25cf0 73 6f 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20  so that it will 
25d00 62 65 20 73 61 66 65 20 74 6f 20 6a 75 6d 70 0a  be safe to jump.
25d10 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f    ** directly to
25d20 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
25d30 20 61 74 20 61 6e 79 20 6d 6f 6d 65 6e 74 2e 0a   at any moment..
25d40 20 20 2a 2f 0a 20 20 6e 4f 6c 64 20 3d 20 6e 4e    */.  nOld = nN
25d50 65 77 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  ew = 0;.  sqlite
25d60 33 50 61 67 65 72 52 65 66 28 70 50 61 72 65 6e  3PagerRef(pParen
25d70 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 0a 20 20  t->pDbPage);..  
25d80 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 73 69 62  /*.  ** Find sib
25d90 6c 69 6e 67 20 70 61 67 65 73 20 74 6f 20 70 50  ling pages to pP
25da0 61 67 65 20 61 6e 64 20 74 68 65 20 63 65 6c 6c  age and the cell
25db0 73 20 69 6e 20 70 50 61 72 65 6e 74 20 74 68 61  s in pParent tha
25dc0 74 20 64 69 76 69 64 65 0a 20 20 2a 2a 20 74 68  t divide.  ** th
25dd0 65 20 73 69 62 6c 69 6e 67 73 2e 20 20 41 6e 20  e siblings.  An 
25de0 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20  attempt is made 
25df0 74 6f 20 66 69 6e 64 20 4e 4e 20 73 69 62 6c 69  to find NN sibli
25e00 6e 67 73 20 6f 6e 20 65 69 74 68 65 72 0a 20 20  ngs on either.  
25e10 2a 2a 20 73 69 64 65 20 6f 66 20 70 50 61 67 65  ** side of pPage
25e20 2e 20 20 4d 6f 72 65 20 73 69 62 6c 69 6e 67 73  .  More siblings
25e30 20 61 72 65 20 74 61 6b 65 6e 20 66 72 6f 6d 20   are taken from 
25e40 6f 6e 65 20 73 69 64 65 2c 20 68 6f 77 65 76 65  one side, howeve
25e50 72 2c 20 69 66 0a 20 20 2a 2a 20 70 50 61 67 65  r, if.  ** pPage
25e60 20 74 68 65 72 65 20 61 72 65 20 66 65 77 65 72   there are fewer
25e70 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c 69 6e 67   than NN sibling
25e80 73 20 6f 6e 20 74 68 65 20 6f 74 68 65 72 20 73  s on the other s
25e90 69 64 65 2e 20 20 49 66 20 70 50 61 72 65 6e 74  ide.  If pParent
25ea0 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20 6f 72 20  .  ** has NB or 
25eb0 66 65 77 65 72 20 63 68 69 6c 64 72 65 6e 20 74  fewer children t
25ec0 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e  hen all children
25ed0 20 6f 66 20 70 50 61 72 65 6e 74 20 61 72 65 20   of pParent are 
25ee0 74 61 6b 65 6e 2e 0a 20 20 2a 2f 0a 20 20 6e 78  taken..  */.  nx
25ef0 44 69 76 20 3d 20 69 64 78 20 2d 20 4e 4e 3b 0a  Div = idx - NN;.
25f00 20 20 69 66 28 20 6e 78 44 69 76 20 2b 20 4e 42    if( nxDiv + NB
25f10 20 3e 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c   > pParent->nCel
25f20 6c 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d  l ){.    nxDiv =
25f30 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20   pParent->nCell 
25f40 2d 20 4e 42 20 2b 20 31 3b 0a 20 20 7d 0a 20 20  - NB + 1;.  }.  
25f50 69 66 28 20 6e 78 44 69 76 3c 30 20 29 7b 0a 20  if( nxDiv<0 ){. 
25f60 20 20 20 6e 78 44 69 76 20 3d 20 30 3b 0a 20 20     nxDiv = 0;.  
25f70 7d 0a 20 20 6e 44 69 76 20 3d 20 30 3b 0a 20 20  }.  nDiv = 0;.  
25f80 66 6f 72 28 69 3d 30 2c 20 6b 3d 6e 78 44 69 76  for(i=0, k=nxDiv
25f90 3b 20 69 3c 4e 42 3b 20 69 2b 2b 2c 20 6b 2b 2b  ; i<NB; i++, k++
25fa0 29 7b 0a 20 20 20 20 69 66 28 20 6b 3c 70 50 61  ){.    if( k<pPa
25fb0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
25fc0 20 20 20 20 20 61 70 44 69 76 5b 69 5d 20 3d 20       apDiv[i] = 
25fd0 66 69 6e 64 43 65 6c 6c 28 70 50 61 72 65 6e 74  findCell(pParent
25fe0 2c 20 6b 29 3b 0a 20 20 20 20 20 20 6e 44 69 76  , k);.      nDiv
25ff0 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ++;.      assert
26000 28 20 21 70 50 61 72 65 6e 74 2d 3e 6c 65 61 66  ( !pParent->leaf
26010 20 29 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c   );.      pgnoOl
26020 64 5b 69 5d 20 3d 20 67 65 74 34 62 79 74 65 28  d[i] = get4byte(
26030 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 7d  apDiv[i]);.    }
26040 65 6c 73 65 20 69 66 28 20 6b 3d 3d 70 50 61 72  else if( k==pPar
26050 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
26060 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d      pgnoOld[i] =
26070 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65   get4byte(&pPare
26080 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
26090 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  t->hdrOffset+8])
260a0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
260b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
260c0 20 20 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49      rc = getAndI
260d0 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  nitPage(pBt, pgn
260e0 6f 4f 6c 64 5b 69 5d 2c 20 26 61 70 4f 6c 64 5b  oOld[i], &apOld[
260f0 69 5d 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20  i], pParent);.  
26100 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
26110 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
26120 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 2d 3e 69  .    apOld[i]->i
26130 64 78 50 61 72 65 6e 74 20 3d 20 6b 3b 0a 20 20  dxParent = k;.  
26140 20 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 30 3b    apCopy[i] = 0;
26150 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d  .    assert( i==
26160 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 6e 4f 6c 64  nOld );.    nOld
26170 2b 2b 3b 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c  ++;.    nMaxCell
26180 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d  s += 1+apOld[i]-
26190 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d  >nCell+apOld[i]-
261a0 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 7d 0a  >nOverflow;.  }.
261b0 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43  .  /* Make nMaxC
261c0 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20  ells a multiple 
261d0 6f 66 20 34 20 69 6e 20 6f 72 64 65 72 20 74 6f  of 4 in order to
261e0 20 70 72 65 73 65 72 76 65 20 38 2d 62 79 74 65   preserve 8-byte
261f0 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20  .  ** alignment 
26200 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d  */.  nMaxCells =
26210 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33 29   (nMaxCells + 3)
26220 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  &~3;..  /*.  ** 
26230 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
26240 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  or memory struct
26250 75 72 65 73 0a 20 20 2a 2f 0a 20 20 73 7a 53 63  ures.  */.  szSc
26260 72 61 74 63 68 20 3d 0a 20 20 20 20 20 20 20 6e  ratch =.       n
26270 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28  MaxCells*sizeof(
26280 75 38 2a 29 20 20 20 20 20 20 20 20 20 20 20 20  u8*)            
26290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70             /* ap
262a0 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e  Cell */.     + n
262b0 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28  MaxCells*sizeof(
262c0 75 31 36 29 20 20 20 20 20 20 20 20 20 20 20 20  u16)            
262d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a             /* sz
262e0 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 28  Cell */.     + (
262f0 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65  ROUND8(sizeof(Me
26300 6d 50 61 67 65 29 29 2b 70 42 74 2d 3e 70 61 67  mPage))+pBt->pag
26310 65 53 69 7a 65 29 2a 4e 42 20 20 2f 2a 20 61 43  eSize)*NB  /* aC
26320 6f 70 79 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42  opy */.     + pB
26330 74 2d 3e 70 61 67 65 53 69 7a 65 20 20 20 20 20  t->pageSize     
26340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26350 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70            /* aSp
26360 61 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b 20 28  ace1 */.     + (
26370 49 53 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 6e  ISAUTOVACUUM ? n
26380 4d 61 78 43 65 6c 6c 73 20 3a 20 30 29 3b 20 20  MaxCells : 0);  
26390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 46             /* aF
263a0 72 6f 6d 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20  rom */.  apCell 
263b0 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68  = sqlite3Scratch
263c0 4d 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74 63  Malloc( szScratc
263d0 68 20 29 3b 20 0a 20 20 69 66 28 20 61 70 43 65  h ); .  if( apCe
263e0 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ll==0 ){.    rc 
263f0 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
26400 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
26410 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
26420 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26  szCell = (u16*)&
26430 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73  apCell[nMaxCells
26440 5d 3b 0a 20 20 61 43 6f 70 79 5b 30 5d 20 3d 20  ];.  aCopy[0] = 
26450 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61  (u8*)&szCell[nMa
26460 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72  xCells];.  asser
26470 74 28 20 28 28 61 43 6f 70 79 5b 30 5d 20 2d 20  t( ((aCopy[0] - 
26480 28 75 38 2a 29 61 70 43 65 6c 6c 29 20 26 20 37  (u8*)apCell) & 7
26490 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74  )==0 ); /* 8-byt
264a0 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75  e alignment requ
264b0 69 72 65 64 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  ired */.  for(i=
264c0 31 3b 20 69 3c 4e 42 3b 20 69 2b 2b 29 7b 0a 20  1; i<NB; i++){. 
264d0 20 20 20 61 43 6f 70 79 5b 69 5d 20 3d 20 26 61     aCopy[i] = &a
264e0 43 6f 70 79 5b 69 2d 31 5d 5b 70 42 74 2d 3e 70  Copy[i-1][pBt->p
264f0 61 67 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73  ageSize+ROUND8(s
26500 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d  izeof(MemPage))]
26510 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 28  ;.    assert( ((
26520 61 43 6f 70 79 5b 69 5d 20 2d 20 28 75 38 2a 29  aCopy[i] - (u8*)
26530 61 70 43 65 6c 6c 29 20 26 20 37 29 3d 3d 30 20  apCell) & 7)==0 
26540 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69  ); /* 8-byte ali
26550 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20  gnment required 
26560 2a 2f 0a 20 20 7d 0a 20 20 61 53 70 61 63 65 31  */.  }.  aSpace1
26570 20 3d 20 26 61 43 6f 70 79 5b 4e 42 2d 31 5d 5b   = &aCopy[NB-1][
26580 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f  pBt->pageSize+RO
26590 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50  UND8(sizeof(MemP
265a0 61 67 65 29 29 5d 3b 0a 20 20 61 73 73 65 72 74  age))];.  assert
265b0 28 20 28 28 61 53 70 61 63 65 31 20 2d 20 28 75  ( ((aSpace1 - (u
265c0 38 2a 29 61 70 43 65 6c 6c 29 20 26 20 37 29 3d  8*)apCell) & 7)=
265d0 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20  =0 ); /* 8-byte 
265e0 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72  alignment requir
265f0 65 64 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  ed */.#ifndef SQ
26600 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
26610 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e  CUUM.  if( pBt->
26620 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
26630 20 20 61 46 72 6f 6d 20 3d 20 26 61 53 70 61 63    aFrom = &aSpac
26640 65 31 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e1[pBt->pageSize
26650 5d 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  ];.  }.#endif.  
26660 61 53 70 61 63 65 32 20 3d 20 73 71 6c 69 74 65  aSpace2 = sqlite
26670 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70 42 74 2d  3PageMalloc(pBt-
26680 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66  >pageSize);.  if
26690 28 20 61 53 70 61 63 65 32 3d 3d 30 20 29 7b 0a  ( aSpace2==0 ){.
266a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
266b0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20  NOMEM;.    goto 
266c0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
266d0 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a  .  }.  .  /*.  *
266e0 2a 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66  * Make copies of
266f0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
26700 70 50 61 67 65 20 61 6e 64 20 69 74 73 20 73 69  pPage and its si
26710 62 6c 69 6e 67 73 20 69 6e 74 6f 20 61 4f 6c 64  blings into aOld
26720 5b 5d 2e 0a 20 20 2a 2a 20 54 68 65 20 72 65 73  []..  ** The res
26730 74 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  t of this functi
26740 6f 6e 20 77 69 6c 6c 20 75 73 65 20 64 61 74 61  on will use data
26750 20 66 72 6f 6d 20 74 68 65 20 63 6f 70 69 65 73   from the copies
26760 20 72 61 74 68 65 72 0a 20 20 2a 2a 20 74 68 61   rather.  ** tha
26770 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  t the original p
26780 61 67 65 73 20 73 69 6e 63 65 20 74 68 65 20 6f  ages since the o
26790 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 77 69  riginal pages wi
267a0 6c 6c 20 62 65 20 69 6e 20 74 68 65 0a 20 20 2a  ll be in the.  *
267b0 2a 20 70 72 6f 63 65 73 73 20 6f 66 20 62 65 69  * process of bei
267c0 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a  ng overwritten..
267d0 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
267e0 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20  i<nOld; i++){.  
267f0 20 20 4d 65 6d 50 61 67 65 20 2a 70 20 3d 20 61    MemPage *p = a
26800 70 43 6f 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50  pCopy[i] = (MemP
26810 61 67 65 2a 29 61 43 6f 70 79 5b 69 5d 3b 0a 20  age*)aCopy[i];. 
26820 20 20 20 6d 65 6d 63 70 79 28 70 2c 20 61 70 4f     memcpy(p, apO
26830 6c 64 5b 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65  ld[i], sizeof(Me
26840 6d 50 61 67 65 29 29 3b 0a 20 20 20 20 70 2d 3e  mPage));.    p->
26850 61 44 61 74 61 20 3d 20 28 76 6f 69 64 2a 29 26  aData = (void*)&
26860 70 5b 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  p[1];.    memcpy
26870 28 70 2d 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64  (p->aData, apOld
26880 5b 69 5d 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d  [i]->aData, pBt-
26890 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a  >pageSize);.  }.
268a0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20  .  /*.  ** Load 
268b0 70 6f 69 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20  pointers to all 
268c0 63 65 6c 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67  cells on sibling
268d0 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 20 64   pages and the d
268e0 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a  ivider cells.  *
268f0 2a 20 69 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c  * into the local
26900 20 61 70 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e   apCell[] array.
26910 20 20 4d 61 6b 65 20 63 6f 70 69 65 73 20 6f 66    Make copies of
26920 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
26930 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61  ls.  ** into spa
26940 63 65 20 6f 62 74 61 69 6e 65 64 20 66 6f 72 6d  ce obtained form
26950 20 61 53 70 61 63 65 31 5b 5d 20 61 6e 64 20 72   aSpace1[] and r
26960 65 6d 6f 76 65 20 74 68 65 20 74 68 65 20 64 69  emove the the di
26970 76 69 64 65 72 20 43 65 6c 6c 73 0a 20 20 2a 2a  vider Cells.  **
26980 20 66 72 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20   from pParent.. 
26990 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20   **.  ** If the 
269a0 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20  siblings are on 
269b0 6c 65 61 66 20 70 61 67 65 73 2c 20 74 68 65 6e  leaf pages, then
269c0 20 74 68 65 20 63 68 69 6c 64 20 70 6f 69 6e 74   the child point
269d0 65 72 73 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20  ers of the.  ** 
269e0 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 61 72  divider cells ar
269f0 65 20 73 74 72 69 70 70 65 64 20 66 72 6f 6d 20  e stripped from 
26a00 74 68 65 20 63 65 6c 6c 73 20 62 65 66 6f 72 65  the cells before
26a10 20 74 68 65 79 20 61 72 65 20 63 6f 70 69 65 64   they are copied
26a20 0a 20 20 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63  .  ** into aSpac
26a30 65 31 5b 5d 2e 20 20 49 6e 20 74 68 69 73 20 77  e1[].  In this w
26a40 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e  ay, all cells in
26a50 20 61 70 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69   apCell[] are wi
26a60 74 68 6f 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64  thout.  ** child
26a70 20 70 6f 69 6e 74 65 72 73 2e 20 20 49 66 20 73   pointers.  If s
26a80 69 62 6c 69 6e 67 73 20 61 72 65 20 6e 6f 74 20  iblings are not 
26a90 6c 65 61 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c  leaves, then all
26aa0 20 63 65 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70   cell in.  ** ap
26ab0 43 65 6c 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63  Cell[] include c
26ac0 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 2e 20 20  hild pointers.  
26ad0 45 69 74 68 65 72 20 77 61 79 2c 20 61 6c 6c 20  Either way, all 
26ae0 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
26af0 5d 0a 20 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65  ].  ** are alike
26b00 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66  ..  **.  ** leaf
26b10 43 6f 72 72 65 63 74 69 6f 6e 3a 20 20 34 20 69  Correction:  4 i
26b20 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61  f pPage is a lea
26b30 66 2e 20 20 30 20 69 66 20 70 50 61 67 65 20 69  f.  0 if pPage i
26b40 73 20 6e 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20  s not a leaf..  
26b50 2a 2a 20 20 20 20 20 20 20 6c 65 61 66 44 61 74  **       leafDat
26b60 61 3a 20 20 31 20 69 66 20 70 50 61 67 65 20 68  a:  1 if pPage h
26b70 6f 6c 64 73 20 6b 65 79 2b 64 61 74 61 20 61 6e  olds key+data an
26b80 64 20 70 50 61 72 65 6e 74 20 68 6f 6c 64 73 20  d pParent holds 
26b90 6f 6e 6c 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a  only keys..  */.
26ba0 20 20 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 6c    nCell = 0;.  l
26bb0 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 20 3d 20  eafCorrection = 
26bc0 70 50 61 67 65 2d 3e 6c 65 61 66 2a 34 3b 0a 20  pPage->leaf*4;. 
26bd0 20 6c 65 61 66 44 61 74 61 20 3d 20 70 50 61 67   leafData = pPag
26be0 65 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 20 70  e->leafData && p
26bf0 50 61 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 66 6f  Page->leaf;.  fo
26c00 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69  r(i=0; i<nOld; i
26c10 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  ++){.    MemPage
26c20 20 2a 70 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b   *pOld = apCopy[
26c30 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69  i];.    int limi
26c40 74 20 3d 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b  t = pOld->nCell+
26c50 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b  pOld->nOverflow;
26c60 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
26c70 6c 69 6d 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20  limit; j++){.   
26c80 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
26c90 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
26ca0 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c      apCell[nCell
26cb0 5d 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77  ] = findOverflow
26cc0 43 65 6c 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20  Cell(pOld, j);. 
26cd0 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c       szCell[nCel
26ce0 6c 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  l] = cellSizePtr
26cf0 28 70 4f 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43  (pOld, apCell[nC
26d00 65 6c 6c 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53  ell]);.#ifndef S
26d10 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
26d20 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20  ACUUM.      if( 
26d30 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
26d40 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 61  ){.        int a
26d50 3b 0a 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b  ;.        aFrom[
26d60 6e 43 65 6c 6c 5d 20 3d 20 69 3b 0a 20 20 20 20  nCell] = i;.    
26d70 20 20 20 20 66 6f 72 28 61 3d 30 3b 20 61 3c 70      for(a=0; a<p
26d80 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 20  Old->nOverflow; 
26d90 61 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  a++){.          
26da0 69 66 28 20 70 4f 6c 64 2d 3e 61 4f 76 66 6c 5b  if( pOld->aOvfl[
26db0 61 5d 2e 70 43 65 6c 6c 3d 3d 61 70 43 65 6c 6c  a].pCell==apCell
26dc0 5b 6e 43 65 6c 6c 5d 20 29 7b 0a 20 20 20 20 20  [nCell] ){.     
26dd0 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65         aFrom[nCe
26de0 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20 20  ll] = 0xFF;.    
26df0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
26e00 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26e10 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
26e20 64 69 66 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b  dif.      nCell+
26e30 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  +;.    }.    if(
26e40 20 69 3c 6e 4f 6c 64 2d 31 20 29 7b 0a 20 20 20   i<nOld-1 ){.   
26e50 20 20 20 75 31 36 20 73 7a 20 3d 20 63 65 6c 6c     u16 sz = cell
26e60 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c  SizePtr(pParent,
26e70 20 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20   apDiv[i]);.    
26e80 20 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29    if( leafData )
26e90 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 69 74  {.        /* Wit
26ea0 68 20 74 68 65 20 4c 45 41 46 44 41 54 41 20 66  h the LEAFDATA f
26eb0 6c 61 67 2c 20 70 50 61 72 65 6e 74 20 63 65 6c  lag, pParent cel
26ec0 6c 73 20 68 6f 6c 64 20 6f 6e 6c 79 20 49 4e 54  ls hold only INT
26ed0 4b 45 59 73 20 74 68 61 74 0a 20 20 20 20 20 20  KEYs that.      
26ee0 20 20 2a 2a 20 61 72 65 20 64 75 70 6c 69 63 61    ** are duplica
26ef0 74 65 73 20 6f 66 20 6b 65 79 73 20 6f 6e 20 74  tes of keys on t
26f00 68 65 20 63 68 69 6c 64 20 70 61 67 65 73 2e 20  he child pages. 
26f10 20 57 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 6f   We need to remo
26f20 76 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  ve.        ** th
26f30 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  e divider cells 
26f40 66 72 6f 6d 20 70 50 61 72 65 6e 74 2c 20 62 75  from pParent, bu
26f50 74 20 74 68 65 20 64 69 76 69 64 65 72 73 20 63  t the dividers c
26f60 65 6c 6c 73 20 61 72 65 20 6e 6f 74 0a 20 20 20  ells are not.   
26f70 20 20 20 20 20 2a 2a 20 61 64 64 65 64 20 74 6f       ** added to
26f80 20 61 70 43 65 6c 6c 5b 5d 20 62 65 63 61 75 73   apCell[] becaus
26f90 65 20 74 68 65 79 20 61 72 65 20 64 75 70 6c 69  e they are dupli
26fa0 63 61 74 65 73 20 6f 66 20 63 68 69 6c 64 20 63  cates of child c
26fb0 65 6c 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ells..        */
26fc0 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c  .        dropCel
26fd0 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76  l(pParent, nxDiv
26fe0 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c  , sz);.      }el
26ff0 73 65 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a  se{.        u8 *
27000 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 61  pTemp;.        a
27010 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61  ssert( nCell<nMa
27020 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20  xCells );.      
27030 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
27040 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 70 54  = sz;.        pT
27050 65 6d 70 20 3d 20 26 61 53 70 61 63 65 31 5b 69  emp = &aSpace1[i
27060 53 70 61 63 65 31 5d 3b 0a 20 20 20 20 20 20 20  Space1];.       
27070 20 69 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b 0a   iSpace1 += sz;.
27080 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
27090 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  sz<=pBt->pageSiz
270a0 65 2f 34 20 29 3b 0a 20 20 20 20 20 20 20 20 61  e/4 );.        a
270b0 73 73 65 72 74 28 20 69 53 70 61 63 65 31 3c 3d  ssert( iSpace1<=
270c0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  pBt->pageSize );
270d0 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28  .        memcpy(
270e0 70 54 65 6d 70 2c 20 61 70 44 69 76 5b 69 5d 2c  pTemp, apDiv[i],
270f0 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 61 70   sz);.        ap
27100 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54  Cell[nCell] = pT
27110 65 6d 70 2b 6c 65 61 66 43 6f 72 72 65 63 74 69  emp+leafCorrecti
27120 6f 6e 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  on;.#ifndef SQLI
27130 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
27140 55 4d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  UM.        if( p
27150 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
27160 7b 0a 20 20 20 20 20 20 20 20 20 20 61 46 72 6f  {.          aFro
27170 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46 3b  m[nCell] = 0xFF;
27180 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
27190 66 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43 65  f.        dropCe
271a0 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69  ll(pParent, nxDi
271b0 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20 20 20  v, sz);.        
271c0 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 3d  szCell[nCell] -=
271d0 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
271e0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
271f0 20 67 65 74 34 62 79 74 65 28 70 54 65 6d 70 29   get4byte(pTemp)
27200 3d 3d 70 67 6e 6f 4f 6c 64 5b 69 5d 20 29 3b 0a  ==pgnoOld[i] );.
27210 20 20 20 20 20 20 20 20 69 66 28 20 21 70 4f 6c          if( !pOl
27220 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  d->leaf ){.     
27230 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61       assert( lea
27240 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 29  fCorrection==0 )
27250 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;.          /* T
27260 68 65 20 72 69 67 68 74 20 70 6f 69 6e 74 65 72  he right pointer
27270 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20 70 61   of the child pa
27280 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65 73 20  ge pOld becomes 
27290 74 68 65 20 6c 65 66 74 0a 20 20 20 20 20 20 20  the left.       
272a0 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20 6f 66     ** pointer of
272b0 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
272c0 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6d  l */.          m
272d0 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e 43 65  emcpy(apCell[nCe
272e0 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44 61 74  ll], &pOld->aDat
272f0 61 5b 70 4f 6c 64 2d 3e 68 64 72 4f 66 66 73 65  a[pOld->hdrOffse
27300 74 2b 38 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  t+8], 4);.      
27310 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
27320 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43     assert( leafC
27330 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29 3b 0a  orrection==4 );.
27340 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 7a            if( sz
27350 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20 29 7b  Cell[nCell]<4 ){
27360 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
27370 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61 6e 79  Do not allow any
27380 20 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72 20 74   cells smaller t
27390 68 61 6e 20 34 20 62 79 74 65 73 2e 20 2a 2f 0a  han 4 bytes. */.
273a0 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 43 65              szCe
273b0 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b 0a 20  ll[nCell] = 4;. 
273c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
273d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 43 65     }.        nCe
273e0 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ll++;.      }.  
273f0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20    }.  }..  /*.  
27400 2a 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  ** Figure out th
27410 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
27420 73 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64  s needed to hold
27430 20 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c 6c 73   all nCell cells
27440 2e 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74 68 69  ..  ** Store thi
27450 73 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b 22 2e  s number in "k".
27460 20 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65 20 73    Also compute s
27470 7a 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20  zNew[] which is 
27480 74 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a 20 73  the total.  ** s
27490 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73  ize of all cells
274a0 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 70 61 67   on the i-th pag
274b0 65 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d 20 77  e and cntNew[] w
274c0 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 64 65  hich is the inde
274d0 78 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65 6c 6c  x.  ** in apCell
274e0 5b 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74  [] of the cell t
274f0 68 61 74 20 64 69 76 69 64 65 73 20 70 61 67 65  hat divides page
27500 20 69 20 66 72 6f 6d 20 70 61 67 65 20 69 2b 31   i from page i+1
27510 2e 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65 77 5b  .  .  ** cntNew[
27520 6b 5d 20 73 68 6f 75 6c 64 20 65 71 75 61 6c 20  k] should equal 
27530 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nCell..  **.  **
27540 20 56 61 6c 75 65 73 20 63 6f 6d 70 75 74 65 64   Values computed
27550 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b 3a 0a   by this block:.
27560 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
27570 20 20 20 20 6b 3a 20 54 68 65 20 74 6f 74 61 6c      k: The total
27580 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69   number of sibli
27590 6e 67 20 70 61 67 65 73 0a 20 20 2a 2a 20 20 20  ng pages.  **   
275a0 20 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61 63 65   szNew[i]: Space
275b0 64 20 75 73 65 64 20 6f 6e 20 74 68 65 20 69 2d  d used on the i-
275c0 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e  th sibling page.
275d0 0a 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77 5b 69  .  **   cntNew[i
275e0 5d 3a 20 49 6e 64 65 78 20 69 6e 20 61 70 43 65  ]: Index in apCe
275f0 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c 6c 5b  ll[] and szCell[
27600 5d 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  ] for the first 
27610 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20 20 20  cell to.  **    
27620 20 20 20 20 20 20 20 20 20 20 74 68 65 20 72 69            the ri
27630 67 68 74 20 6f 66 20 74 68 65 20 69 2d 74 68 20  ght of the i-th 
27640 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20  sibling page..  
27650 2a 2a 20 75 73 61 62 6c 65 53 70 61 63 65 3a 20  ** usableSpace: 
27660 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
27670 6f 66 20 73 70 61 63 65 20 61 76 61 69 6c 61 62  of space availab
27680 6c 65 20 6f 6e 20 65 61 63 68 20 73 69 62 6c 69  le on each sibli
27690 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f 0a 20  ng..  ** .  */. 
276a0 20 75 73 61 62 6c 65 53 70 61 63 65 20 3d 20 70   usableSpace = p
276b0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
276c0 20 31 32 20 2b 20 6c 65 61 66 43 6f 72 72 65 63   12 + leafCorrec
276d0 74 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75 62 74  tion;.  for(subt
276e0 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c 6e 43  otal=k=i=0; i<nC
276f0 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  ell; i++){.    a
27700 73 73 65 72 74 28 20 69 3c 6e 4d 61 78 43 65 6c  ssert( i<nMaxCel
27710 6c 73 20 29 3b 0a 20 20 20 20 73 75 62 74 6f 74  ls );.    subtot
27720 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69 5d 20  al += szCell[i] 
27730 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 73 75 62  + 2;.    if( sub
27740 74 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65 53 70  total > usableSp
27750 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73 7a 4e  ace ){.      szN
27760 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c  ew[k] = subtotal
27770 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a 20 20   - szCell[i];.  
27780 20 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20      cntNew[k] = 
27790 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61  i;.      if( lea
277a0 66 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20 7d 0a  fData ){ i--; }.
277b0 20 20 20 20 20 20 73 75 62 74 6f 74 61 6c 20 3d        subtotal =
277c0 20 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b 0a 20   0;.      k++;. 
277d0 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e 65 77     }.  }.  szNew
277e0 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c 3b 0a  [k] = subtotal;.
277f0 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20 6e 43    cntNew[k] = nC
27800 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20 20 2f  ell;.  k++;..  /
27810 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61 63 6b 69  *.  ** The packi
27820 6e 67 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74  ng computed by t
27830 68 65 20 70 72 65 76 69 6f 75 73 20 62 6c 6f 63  he previous bloc
27840 6b 20 69 73 20 62 69 61 73 65 64 20 74 6f 77 61  k is biased towa
27850 72 64 20 74 68 65 20 73 69 62 6c 69 6e 67 73 0a  rd the siblings.
27860 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65 66 74    ** on the left
27870 20 73 69 64 65 2e 20 20 54 68 65 20 6c 65 66 74   side.  The left
27880 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 61 6c   siblings are al
27890 77 61 79 73 20 6e 65 61 72 6c 79 20 66 75 6c 6c  ways nearly full
278a0 2c 20 77 68 69 6c 65 20 74 68 65 0a 20 20 2a 2a  , while the.  **
278b0 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c   right-most sibl
278c0 69 6e 67 20 6d 69 67 68 74 20 62 65 20 6e 65 61  ing might be nea
278d0 72 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73  rly empty.  This
278e0 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65 20 61   block of code a
278f0 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74 6f 20  ttempts.  ** to 
27900 61 64 6a 75 73 74 20 74 68 65 20 70 61 63 6b 69  adjust the packi
27910 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67 73 20 74  ng of siblings t
27920 6f 20 67 65 74 20 61 20 62 65 74 74 65 72 20 62  o get a better b
27930 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20 20 2a  alance..  **.  *
27940 2a 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e  * This adjustmen
27950 74 20 69 73 20 6d 6f 72 65 20 74 68 61 6e 20 61  t is more than a
27960 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
27970 20 54 68 65 20 70 61 63 6b 69 6e 67 20 61 62 6f   The packing abo
27980 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20 62 65  ve might.  ** be
27990 20 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c 61 6e   so out of balan
279a0 63 65 20 61 73 20 74 6f 20 62 65 20 69 6c 6c 65  ce as to be ille
279b0 67 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  gal.  For exampl
279c0 65 2c 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  e, the right-mos
279d0 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67 20 6d  t.  ** sibling m
279e0 69 67 68 74 20 62 65 20 63 6f 6d 70 6c 65 74 65  ight be complete
279f0 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69 73 20  ly empty.  This 
27a00 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20 6e 6f  adjustment is no
27a10 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20 2a 2f  t optional..  */
27a20 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20 69 3e  .  for(i=k-1; i>
27a30 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74  0; i--){.    int
27a40 20 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e 65 77   szRight = szNew
27a50 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20 6f 66  [i];  /* Size of
27a60 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20   sibling on the 
27a70 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 69 6e 74  right */.    int
27a80 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65 77 5b   szLeft = szNew[
27a90 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20 6f 66  i-1]; /* Size of
27aa0 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68 65 20   sibling on the 
27ab0 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20  left */.    int 
27ac0 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r;              
27ad0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 69 67 68  /* Index of righ
27ae0 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e 20 6c  t-most cell in l
27af0 65 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 20  eft sibling */. 
27b00 20 20 20 69 6e 74 20 64 3b 20 20 20 20 20 20 20     int d;       
27b10 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
27b20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f  of first cell to
27b30 20 74 68 65 20 6c 65 66 74 20 6f 66 20 72 69 67   the left of rig
27b40 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a 0a 20  ht sibling */.. 
27b50 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d     r = cntNew[i-
27b60 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20 3d 20  1] - 1;.    d = 
27b70 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61  r + 1 - leafData
27b80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 3c  ;.    assert( d<
27b90 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
27ba0 20 61 73 73 65 72 74 28 20 72 3c 6e 4d 61 78 43   assert( r<nMaxC
27bb0 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68 69 6c  ells );.    whil
27bc0 65 28 20 73 7a 52 69 67 68 74 3d 3d 30 20 7c 7c  e( szRight==0 ||
27bd0 20 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c 6c 5b   szRight+szCell[
27be0 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28 73 7a  d]+2<=szLeft-(sz
27bf0 43 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a 20 20  Cell[r]+2) ){.  
27c00 20 20 20 20 73 7a 52 69 67 68 74 20 2b 3d 20 73      szRight += s
27c10 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a 20 20  zCell[d] + 2;.  
27c20 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20 73 7a      szLeft -= sz
27c30 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20 20 20  Cell[r] + 2;.   
27c40 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 2d 2d     cntNew[i-1]--
27c50 3b 0a 20 20 20 20 20 20 72 20 3d 20 63 6e 74 4e  ;.      r = cntN
27c60 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20  ew[i-1] - 1;.   
27c70 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c     d = r + 1 - l
27c80 65 61 66 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20  eafData;.    }. 
27c90 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20 73 7a     szNew[i] = sz
27ca0 52 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e 65 77  Right;.    szNew
27cb0 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74 3b 0a  [i-1] = szLeft;.
27cc0 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68 65 72    }..  /* Either
27cd0 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20 6f 72   we found one or
27ce0 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63 6e 74   more cells (cnt
27cf0 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20 77 65  new[0])>0) or we
27d00 20 61 72 65 20 74 68 65 0a 20 20 2a 2a 20 61 20   are the.  ** a 
27d10 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67  virtual root pag
27d20 65 2e 20 20 41 20 76 69 72 74 75 61 6c 20 72 6f  e.  A virtual ro
27d30 6f 74 20 70 61 67 65 20 69 73 20 77 68 65 6e 20  ot page is when 
27d40 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a 20 20  the real root.  
27d50 2a 2a 20 70 61 67 65 20 69 73 20 70 61 67 65 20  ** page is page 
27d60 31 20 61 6e 64 20 77 65 20 61 72 65 20 74 68 65  1 and we are the
27d70 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66 20 74   only child of t
27d80 68 61 74 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20  hat page..  */. 
27d90 20 61 73 73 65 72 74 28 20 63 6e 74 4e 65 77 5b   assert( cntNew[
27da0 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65 6e 74  0]>0 || (pParent
27db0 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70 50 61  ->pgno==1 && pPa
27dc0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 29 20  rent->nCell==0) 
27dd0 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 6c  );..  /*.  ** Al
27de0 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20 70 61 67  locate k new pag
27df0 65 73 2e 20 20 52 65 75 73 65 20 6f 6c 64 20 70  es.  Reuse old p
27e00 61 67 65 73 20 77 68 65 72 65 20 70 6f 73 73 69  ages where possi
27e10 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ble..  */.  asse
27e20 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3e  rt( pPage->pgno>
27e30 31 20 29 3b 0a 20 20 70 61 67 65 46 6c 61 67 73  1 );.  pageFlags
27e40 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b   = pPage->aData[
27e50 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  0];.  for(i=0; i
27e60 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65  <k; i++){.    Me
27e70 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20 20 20  mPage *pNew;.   
27e80 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20   if( i<nOld ){. 
27e90 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70 4e 65       pNew = apNe
27ea0 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69 5d 3b  w[i] = apOld[i];
27eb0 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69  .      pgnoNew[i
27ec0 5d 20 3d 20 70 67 6e 6f 4f 6c 64 5b 69 5d 3b 0a  ] = pgnoOld[i];.
27ed0 20 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d        apOld[i] =
27ee0 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
27ef0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
27f00 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 3b  (pNew->pDbPage);
27f10 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20  .      nNew++;. 
27f20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
27f30 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
27f40 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  up;.    }else{. 
27f50 20 20 20 20 20 61 73 73 65 72 74 28 20 69 3e 30       assert( i>0
27f60 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 61   );.      rc = a
27f70 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
27f80 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26 70 67  (pBt, &pNew, &pg
27f90 6e 6f 4e 65 77 5b 69 5d 2c 20 70 67 6e 6f 4e 65  noNew[i], pgnoNe
27fa0 77 5b 69 2d 31 5d 2c 20 30 29 3b 0a 20 20 20 20  w[i-1], 0);.    
27fb0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
27fc0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
27fd0 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20  .      apNew[i] 
27fe0 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 6e 4e  = pNew;.      nN
27ff0 65 77 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ew++;.    }.    
28000 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70  zeroPage(pNew, p
28010 61 67 65 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a  ageFlags);.  }..
28020 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c    /* Free any ol
28030 64 20 70 61 67 65 73 20 74 68 61 74 20 77 65 72  d pages that wer
28040 65 20 6e 6f 74 20 72 65 75 73 65 64 20 61 73 20  e not reused as 
28050 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2f 0a  new pages..  */.
28060 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f 6c 64 20    while( i<nOld 
28070 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65  ){.    rc = free
28080 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a  Page(apOld[i]);.
28090 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
280a0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
280b0 70 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  p;.    releasePa
280c0 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20  ge(apOld[i]);.  
280d0 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a    apOld[i] = 0;.
280e0 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20      i++;.  }..  
280f0 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74 68 65 20  /*.  ** Put the 
28100 6e 65 77 20 70 61 67 65 73 20 69 6e 20 61 63 63  new pages in acc
28110 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 20 20 54  ending order.  T
28120 68 69 73 20 68 65 6c 70 73 20 74 6f 0a 20 20 2a  his helps to.  *
28130 2a 20 6b 65 65 70 20 65 6e 74 72 69 65 73 20 69  * keep entries i
28140 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  n the disk file 
28150 69 6e 20 6f 72 64 65 72 20 73 6f 20 74 68 61 74  in order so that
28160 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20 6f 66 20   a scan.  ** of 
28170 74 68 65 20 74 61 62 6c 65 20 69 73 20 61 20 6c  the table is a l
28180 69 6e 65 61 72 20 73 63 61 6e 20 74 68 72 6f 75  inear scan throu
28190 67 68 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68  gh the file.  Th
281a0 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75 72 6e 20  at.  ** in turn 
281b0 68 65 6c 70 73 20 74 68 65 20 6f 70 65 72 61 74  helps the operat
281c0 69 6e 67 20 73 79 73 74 65 6d 20 74 6f 20 64 65  ing system to de
281d0 6c 69 76 65 72 20 70 61 67 65 73 0a 20 20 2a 2a  liver pages.  **
281e0 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 6d   from the disk m
281f0 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a 20 20 2a  ore rapidly..  *
28200 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29  *.  ** An O(n^2)
28210 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f 72 74 20   insertion sort 
28220 61 6c 67 6f 72 69 74 68 6d 20 69 73 20 75 73 65  algorithm is use
28230 64 2c 20 62 75 74 20 73 69 6e 63 65 0a 20 20 2a  d, but since.  *
28240 2a 20 6e 20 69 73 20 6e 65 76 65 72 20 6d 6f 72  * n is never mor
28250 65 20 74 68 61 6e 20 4e 42 20 28 61 20 73 6d 61  e than NB (a sma
28260 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c 20 74 68  ll constant), th
28270 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e  at should.  ** n
28280 6f 74 20 62 65 20 61 20 70 72 6f 62 6c 65 6d 2e  ot be a problem.
28290 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 65 6e 20  .  **.  ** When 
282a0 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f 6e 65 20  NB==3, this one 
282b0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b  optimization mak
282c0 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  es the database.
282d0 20 20 2a 2a 20 61 62 6f 75 74 20 32 35 25 20 66    ** about 25% f
282e0 61 73 74 65 72 20 66 6f 72 20 6c 61 72 67 65 20  aster for large 
282f0 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e 64 20 64  insertions and d
28300 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20  eletions..  */. 
28310 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b   for(i=0; i<k-1;
28320 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d   i++){.    int m
28330 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d  inV = pgnoNew[i]
28340 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 49 20 3d  ;.    int minI =
28350 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 69 2b   i;.    for(j=i+
28360 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20  1; j<k; j++){.  
28370 20 20 20 20 69 66 28 20 70 67 6e 6f 4e 65 77 5b      if( pgnoNew[
28380 6a 5d 3c 28 75 6e 73 69 67 6e 65 64 29 6d 69 6e  j]<(unsigned)min
28390 56 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 69 6e  V ){.        min
283a0 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 6d  I = j;.        m
283b0 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77 5b 6a 5d  inV = pgnoNew[j]
283c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
283d0 20 20 20 20 69 66 28 20 6d 69 6e 49 3e 69 20 29      if( minI>i )
283e0 7b 0a 20 20 20 20 20 20 69 6e 74 20 74 3b 0a 20  {.      int t;. 
283f0 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 54       MemPage *pT
28400 3b 0a 20 20 20 20 20 20 74 20 3d 20 70 67 6e 6f  ;.      t = pgno
28410 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70 54  New[i];.      pT
28420 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20 20   = apNew[i];.   
28430 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20     pgnoNew[i] = 
28440 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20  pgnoNew[minI];. 
28450 20 20 20 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20       apNew[i] = 
28460 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20  apNew[minI];.   
28470 20 20 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d     pgnoNew[minI]
28480 20 3d 20 74 3b 0a 20 20 20 20 20 20 61 70 4e 65   = t;.      apNe
28490 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b 0a 20 20  w[minI] = pT;.  
284a0 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41 43 45 28    }.  }.  TRACE(
284b0 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20  ("BALANCE: old: 
284c0 25 64 20 25 64 20 25 64 20 20 6e 65 77 3a 20 25  %d %d %d  new: %
284d0 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64 28  d(%d) %d(%d) %d(
284e0 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64  %d) %d(%d) %d(%d
284f0 29 5c 6e 22 2c 0a 20 20 20 20 70 67 6e 6f 4f 6c  )\n",.    pgnoOl
28500 64 5b 30 5d 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e  d[0], .    nOld>
28510 3d 32 20 3f 20 70 67 6e 6f 4f 6c 64 5b 31 5d 20  =2 ? pgnoOld[1] 
28520 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33  : 0,.    nOld>=3
28530 20 3f 20 70 67 6e 6f 4f 6c 64 5b 32 5d 20 3a 20   ? pgnoOld[2] : 
28540 30 2c 0a 20 20 20 20 70 67 6e 6f 4e 65 77 5b 30  0,.    pgnoNew[0
28550 5d 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20  ], szNew[0],.   
28560 20 6e 4e 65 77 3e 3d 32 20 3f 20 70 67 6e 6f 4e   nNew>=2 ? pgnoN
28570 65 77 5b 31 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e  ew[1] : 0, nNew>
28580 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d 20 3a 20  =2 ? szNew[1] : 
28590 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 33 20 3f  0,.    nNew>=3 ?
285a0 20 70 67 6e 6f 4e 65 77 5b 32 5d 20 3a 20 30 2c   pgnoNew[2] : 0,
285b0 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a 4e 65 77   nNew>=3 ? szNew
285c0 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65  [2] : 0,.    nNe
285d0 77 3e 3d 34 20 3f 20 70 67 6e 6f 4e 65 77 5b 33  w>=4 ? pgnoNew[3
285e0 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f  ] : 0, nNew>=4 ?
285f0 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30 2c 0a 20   szNew[3] : 0,. 
28600 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20 70 67 6e     nNew>=5 ? pgn
28610 6f 4e 65 77 5b 34 5d 20 3a 20 30 2c 20 6e 4e 65  oNew[4] : 0, nNe
28620 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b 34 5d 20  w>=5 ? szNew[4] 
28630 3a 20 30 29 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  : 0));..  /*.  *
28640 2a 20 45 76 65 6e 6c 79 20 64 69 73 74 72 69 62  * Evenly distrib
28650 75 74 65 20 74 68 65 20 64 61 74 61 20 69 6e 20  ute the data in 
28660 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f 73 73 20  apCell[] across 
28670 74 68 65 20 6e 65 77 20 70 61 67 65 73 2e 0a 20  the new pages.. 
28680 20 2a 2a 20 49 6e 73 65 72 74 20 64 69 76 69 64   ** Insert divid
28690 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f 20 70 50  er cells into pP
286a0 61 72 65 6e 74 20 61 73 20 6e 65 63 65 73 73 61  arent as necessa
286b0 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20 3d 20 30  ry..  */.  j = 0
286c0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
286d0 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 2f  New; i++){.    /
286e0 2a 20 41 73 73 65 6d 62 6c 65 20 74 68 65 20 6e  * Assemble the n
286f0 65 77 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e  ew sibling page.
28700 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   */.    MemPage 
28710 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d  *pNew = apNew[i]
28720 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c  ;.    assert( j<
28730 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
28740 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 70   assert( pNew->p
28750 67 6e 6f 3d 3d 70 67 6e 6f 4e 65 77 5b 69 5d 20  gno==pgnoNew[i] 
28760 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50  );.    assembleP
28770 61 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e 65 77  age(pNew, cntNew
28780 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c 5b 6a  [i]-j, &apCell[j
28790 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a  ], &szCell[j]);.
287a0 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
287b0 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28 6e 4e  ->nCell>0 || (nN
287c0 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65 77 5b  ew==1 && cntNew[
287d0 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20 61 73  0]==0) );.    as
287e0 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f 76 65  sert( pNew->nOve
287f0 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 23 69 66  rflow==0 );..#if
28800 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
28810 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
28820 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
28830 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
28840 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68  abase, update th
28850 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
28860 74 72 69 65 73 0a 20 20 20 20 2a 2a 20 74 68 61  tries.    ** tha
28870 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73  t point to the s
28880 69 62 6c 69 6e 67 73 20 74 68 61 74 20 77 65 72  iblings that wer
28890 65 20 72 65 61 72 72 61 6e 67 65 64 2e 20 54 68  e rearranged. Th
288a0 65 73 65 20 63 61 6e 20 62 65 3a 20 6c 65 66 74  ese can be: left
288b0 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64 72 65 6e  .    ** children
288c0 20 6f 66 20 63 65 6c 6c 73 2c 20 74 68 65 20 72   of cells, the r
288d0 69 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 74 68  ight-child of th
288e0 65 20 70 61 67 65 2c 20 6f 72 20 6f 76 65 72 66  e page, or overf
288f0 6c 6f 77 20 70 61 67 65 73 0a 20 20 20 20 2a 2a  low pages.    **
28900 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 63   pointed to by c
28910 65 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ells..    */.   
28920 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
28930 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 66 6f  cuum ){.      fo
28940 72 28 6b 3d 6a 3b 20 6b 3c 63 6e 74 4e 65 77 5b  r(k=j; k<cntNew[
28950 69 5d 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; k++){.      
28960 20 20 61 73 73 65 72 74 28 20 6b 3c 6e 4d 61 78    assert( k<nMax
28970 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 20  Cells );.       
28980 20 69 66 28 20 61 46 72 6f 6d 5b 6b 5d 3d 3d 30   if( aFrom[k]==0
28990 78 46 46 20 7c 7c 20 61 70 43 6f 70 79 5b 61 46  xFF || apCopy[aF
289a0 72 6f 6d 5b 6b 5d 5d 2d 3e 70 67 6e 6f 21 3d 70  rom[k]]->pgno!=p
289b0 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  New->pgno ){.   
289c0 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
289d0 61 70 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20  apPutOvfl(pNew, 
289e0 6b 2d 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-j);.          
289f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
28a00 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
28a10 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
28a20 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 20  eanup;.         
28a30 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
28a40 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
28a50 66 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74 4e 65  f..    j = cntNe
28a60 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  w[i];..    /* If
28a70 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70 61 67   the sibling pag
28a80 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62 6f 76  e assembled abov
28a90 65 20 77 61 73 20 6e 6f 74 20 74 68 65 20 72 69  e was not the ri
28aa0 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67  ght-most sibling
28ab0 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 20  ,.    ** insert 
28ac0 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  a divider cell i
28ad0 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 70  nto the parent p
28ae0 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
28af0 69 66 28 20 69 3c 6e 4e 65 77 2d 31 20 26 26 20  if( i<nNew-1 && 
28b00 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  j<nCell ){.     
28b10 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20   u8 *pCell;.    
28b20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20    u8 *pTemp;.   
28b30 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20 20 20     int sz;..    
28b40 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78    assert( j<nMax
28b50 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 70  Cells );.      p
28b60 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b 6a 5d  Cell = apCell[j]
28b70 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 73 7a 43  ;.      sz = szC
28b80 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43 6f 72  ell[j] + leafCor
28b90 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 70  rection;.      p
28ba0 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65 32 5b  Temp = &aSpace2[
28bb0 69 53 70 61 63 65 32 5d 3b 0a 20 20 20 20 20 20  iSpace2];.      
28bc0 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61 66 20  if( !pNew->leaf 
28bd0 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
28be0 79 28 26 70 4e 65 77 2d 3e 61 44 61 74 61 5b 38  y(&pNew->aData[8
28bf0 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a 20 20  ], pCell, 4);.  
28c00 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c 65      }else if( le
28c10 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20  afData ){.      
28c20 20 20 2f 2a 20 49 66 20 74 68 65 20 74 72 65 65    /* If the tree
28c30 20 69 73 20 61 20 6c 65 61 66 2d 64 61 74 61 20   is a leaf-data 
28c40 74 72 65 65 2c 20 61 6e 64 20 74 68 65 20 73 69  tree, and the si
28c50 62 6c 69 6e 67 73 20 61 72 65 20 6c 65 61 76 65  blings are leave
28c60 73 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  s, .        ** t
28c70 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20  hen there is no 
28c80 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 20  divider cell in 
28c90 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74 65 61  apCell[]. Instea
28ca0 64 2c 20 74 68 65 20 64 69 76 69 64 65 72 20 0a  d, the divider .
28cb0 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 20          ** cell 
28cc0 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68 65 20  consists of the 
28cd0 69 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72 20  integer key for 
28ce0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63  the right-most c
28cf0 65 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20 20 20  ell of .        
28d00 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 2d 70  ** the sibling-p
28d10 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62  age assembled ab
28d20 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20 20 20  ove only..      
28d30 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 43 65 6c    */.        Cel
28d40 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
28d50 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20      j--;.       
28d60 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
28d70 73 65 43 65 6c 6c 50 74 72 28 70 4e 65 77 2c 20  seCellPtr(pNew, 
28d80 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e 66 6f  apCell[j], &info
28d90 29 3b 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c  );.        pCell
28da0 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20 20 20   = pTemp;.      
28db0 20 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61    fillInCell(pPa
28dc0 72 65 6e 74 2c 20 70 43 65 6c 6c 2c 20 30 2c 20  rent, pCell, 0, 
28dd0 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c  info.nKey, 0, 0,
28de0 20 30 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20   0, &sz);.      
28df0 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20    pTemp = 0;.   
28e00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28e10 20 20 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20    pCell -= 4;.  
28e20 20 20 20 20 20 20 2f 2a 20 4f 62 73 63 75 72 65        /* Obscure
28e30 20 63 61 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65   case for non-le
28e40 61 66 2d 64 61 74 61 20 74 72 65 65 73 3a 20 49  af-data trees: I
28e50 66 20 74 68 65 20 63 65 6c 6c 20 61 74 20 70 43  f the cell at pC
28e60 65 6c 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20  ell was.        
28e70 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 73 74  ** previously st
28e80 6f 72 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 6e  ored on a leaf n
28e90 6f 64 65 2c 20 61 6e 64 20 69 74 73 20 72 65 70  ode, and its rep
28ea0 6f 72 74 65 64 20 73 69 7a 65 20 77 61 73 20 34  orted size was 4
28eb0 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65  .        ** byte
28ec0 73 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 61  s, then it may a
28ed0 63 74 75 61 6c 6c 79 20 62 65 20 73 6d 61 6c 6c  ctually be small
28ee0 65 72 20 74 68 61 6e 20 74 68 69 73 20 0a 20 20  er than this .  
28ef0 20 20 20 20 20 20 2a 2a 20 28 73 65 65 20 73 71        ** (see sq
28f00 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
28f10 65 6c 6c 50 74 72 28 29 2c 20 34 20 62 79 74 65  ellPtr(), 4 byte
28f20 73 20 69 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d  s is the minimum
28f30 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 20 20 20   size of.       
28f40 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e 20 42   ** any cell). B
28f50 75 74 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61  ut it is importa
28f60 6e 74 20 74 6f 20 70 61 73 73 20 74 68 65 20 63  nt to pass the c
28f70 6f 72 72 65 63 74 20 73 69 7a 65 20 74 6f 20 0a  orrect size to .
28f80 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72          ** inser
28f90 74 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65 70 61  tCell(), so repa
28fa0 72 73 65 20 74 68 65 20 63 65 6c 6c 20 6e 6f 77  rse the cell now
28fb0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
28fc0 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61       ** Note tha
28fd0 74 20 74 68 69 73 20 63 61 6e 20 6e 65 76 65 72  t this can never
28fe0 20 68 61 70 70 65 6e 20 69 6e 20 61 6e 20 53 51   happen in an SQ
28ff0 4c 69 74 65 20 64 61 74 61 20 66 69 6c 65 2c 20  Lite data file, 
29000 61 73 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a  as all.        *
29010 2a 20 63 65 6c 6c 73 20 61 72 65 20 61 74 20 6c  * cells are at l
29020 65 61 73 74 20 34 20 62 79 74 65 73 2e 20 49 74  east 4 bytes. It
29030 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 6e   only happens in
29040 20 62 2d 74 72 65 65 73 20 75 73 65 64 0a 20 20   b-trees used.  
29050 20 20 20 20 20 20 2a 2a 20 74 6f 20 65 76 61 6c        ** to eval
29060 75 61 74 65 20 22 49 4e 20 28 53 45 4c 45 43 54  uate "IN (SELECT
29070 20 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d 69 6c   ...)" and simil
29080 61 72 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20  ar clauses..    
29090 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
290a0 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20  f( szCell[j]==4 
290b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
290c0 65 72 74 28 6c 65 61 66 43 6f 72 72 65 63 74 69  ert(leafCorrecti
290d0 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20 20 20  on==4);.        
290e0 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50    sz = cellSizeP
290f0 74 72 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c  tr(pParent, pCel
29100 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  l);.        }.  
29110 20 20 20 20 7d 0a 20 20 20 20 20 20 69 53 70 61      }.      iSpa
29120 63 65 32 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20  ce2 += sz;.     
29130 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74   assert( sz<=pBt
29140 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20 29 3b 0a  ->pageSize/4 );.
29150 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53        assert( iS
29160 70 61 63 65 32 3c 3d 70 42 74 2d 3e 70 61 67 65  pace2<=pBt->page
29170 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 72 63  Size );.      rc
29180 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50   = insertCell(pP
29190 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43  arent, nxDiv, pC
291a0 65 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20  ell, sz, pTemp, 
291b0 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  4);.      if( rc
291c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
291d0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
291e0 75 70 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  up;.      put4by
291f0 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  te(findOverflowC
29200 65 6c 6c 28 70 50 61 72 65 6e 74 2c 6e 78 44 69  ell(pParent,nxDi
29210 76 29 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29 3b  v), pNew->pgno);
29220 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
29230 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
29240 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
29250 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75   is an auto-vacu
29260 75 6d 20 64 61 74 61 62 61 73 65 2c 20 61 6e 64  um database, and
29270 20 6e 6f 74 20 61 20 6c 65 61 66 2d 64 61 74 61   not a leaf-data
29280 20 74 72 65 65 2c 0a 20 20 20 20 20 20 2a 2a 20   tree,.      ** 
29290 74 68 65 6e 20 75 70 64 61 74 65 20 74 68 65 20  then update the 
292a0 70 6f 69 6e 74 65 72 20 6d 61 70 20 77 69 74 68  pointer map with
292b0 20 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68   an entry for th
292c0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 0a  e overflow page.
292d0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68        ** that th
292e0 65 20 63 65 6c 6c 20 6a 75 73 74 20 69 6e 73 65  e cell just inse
292f0 72 74 65 64 20 70 6f 69 6e 74 73 20 74 6f 20 28  rted points to (
29300 69 66 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a  if any)..      *
29310 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
29320 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 21  >autoVacuum && !
29330 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20  leafData ){.    
29340 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
29350 75 74 4f 76 66 6c 28 70 50 61 72 65 6e 74 2c 20  utOvfl(pParent, 
29360 6e 78 44 69 76 29 3b 0a 20 20 20 20 20 20 20 20  nxDiv);.        
29370 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
29380 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
29390 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
293a0 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nup;.        }. 
293b0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
293c0 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20 6e      j++;.      n
293d0 78 44 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  xDiv++;.    }.  
293e0 7d 0a 20 20 61 73 73 65 72 74 28 20 6a 3d 3d 6e  }.  assert( j==n
293f0 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
29400 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a 20 20 61 73  ( nOld>0 );.  as
29410 73 65 72 74 28 20 6e 4e 65 77 3e 30 20 29 3b 0a  sert( nNew>0 );.
29420 20 20 69 66 28 20 28 70 61 67 65 46 6c 61 67 73    if( (pageFlags
29430 20 26 20 50 54 46 5f 4c 45 41 46 29 3d 3d 30 20   & PTF_LEAF)==0 
29440 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61  ){.    memcpy(&a
29450 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44  pNew[nNew-1]->aD
29460 61 74 61 5b 38 5d 2c 20 26 61 70 43 6f 70 79 5b  ata[8], &apCopy[
29470 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b 38  nOld-1]->aData[8
29480 5d 2c 20 34 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ], 4);.  }.  if(
29490 20 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d   nxDiv==pParent-
294a0 3e 6e 43 65 6c 6c 2b 70 50 61 72 65 6e 74 2d 3e  >nCell+pParent->
294b0 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  nOverflow ){.   
294c0 20 2f 2a 20 52 69 67 68 74 2d 6d 6f 73 74 20 73   /* Right-most s
294d0 69 62 6c 69 6e 67 20 69 73 20 74 68 65 20 72 69  ibling is the ri
294e0 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64 20 6f  ght-most child o
294f0 66 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20 20 20  f pParent */.   
29500 20 70 75 74 34 62 79 74 65 28 26 70 50 61 72 65   put4byte(&pPare
29510 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
29520 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  t->hdrOffset+8],
29530 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d   pgnoNew[nNew-1]
29540 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
29550 2f 2a 20 52 69 67 68 74 2d 6d 6f 73 74 20 73 69  /* Right-most si
29560 62 6c 69 6e 67 20 69 73 20 74 68 65 20 6c 65 66  bling is the lef
29570 74 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 66  t child of the f
29580 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20 70 50  irst entry in pP
29590 61 72 65 6e 74 0a 20 20 20 20 2a 2a 20 70 61 73  arent.    ** pas
295a0 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  t the right-most
295b0 20 64 69 76 69 64 65 72 20 65 6e 74 72 79 20 2a   divider entry *
295c0 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 66  /.    put4byte(f
295d0 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28  indOverflowCell(
295e0 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 29 2c  pParent, nxDiv),
295f0 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d   pgnoNew[nNew-1]
29600 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  );.  }..  /*.  *
29610 2a 20 52 65 70 61 72 65 6e 74 20 63 68 69 6c 64  * Reparent child
29620 72 65 6e 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73  ren of all cells
29630 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
29640 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a  ; i<nNew; i++){.
29650 20 20 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e      rc = reparen
29660 74 43 68 69 6c 64 50 61 67 65 73 28 61 70 4e 65  tChildPages(apNe
29670 77 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72  w[i]);.    if( r
29680 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
29690 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
296a0 6e 75 70 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  nup;.  }.  rc = 
296b0 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67  reparentChildPag
296c0 65 73 28 70 50 61 72 65 6e 74 29 3b 0a 20 20 69  es(pParent);.  i
296d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
296e0 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f   ) goto balance_
296f0 63 6c 65 61 6e 75 70 3b 0a 0a 20 20 2f 2a 0a 20  cleanup;..  /*. 
29700 20 2a 2a 20 42 61 6c 61 6e 63 65 20 74 68 65 20   ** Balance the 
29710 70 61 72 65 6e 74 20 70 61 67 65 2e 20 20 4e 6f  parent page.  No
29720 74 65 20 74 68 61 74 20 74 68 65 20 63 75 72 72  te that the curr
29730 65 6e 74 20 70 61 67 65 20 28 70 50 61 67 65 29  ent page (pPage)
29740 20 6d 69 67 68 74 0a 20 20 2a 2a 20 68 61 76 65   might.  ** have
29750 20 62 65 65 6e 20 61 64 64 65 64 20 74 6f 20 74   been added to t
29760 68 65 20 66 72 65 65 6c 69 73 74 20 73 6f 20 69  he freelist so i
29770 74 20 6d 69 67 68 74 20 6e 6f 20 6c 6f 6e 67 65  t might no longe
29780 72 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  r be initialized
29790 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 70  ..  ** But the p
297a0 61 72 65 6e 74 20 70 61 67 65 20 77 69 6c 6c 20  arent page will 
297b0 61 6c 77 61 79 73 20 62 65 20 69 6e 69 74 69 61  always be initia
297c0 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  lized..  */.  as
297d0 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69  sert( pParent->i
297e0 73 49 6e 69 74 20 29 3b 0a 20 20 73 71 6c 69 74  sInit );.  sqlit
297f0 65 33 53 63 72 61 74 63 68 46 72 65 65 28 61 70  e3ScratchFree(ap
29800 43 65 6c 6c 29 3b 0a 20 20 61 70 43 65 6c 6c 20  Cell);.  apCell 
29810 3d 20 30 3b 0a 20 20 72 63 20 3d 20 62 61 6c 61  = 0;.  rc = bala
29820 6e 63 65 28 70 50 61 72 65 6e 74 2c 20 30 29 3b  nce(pParent, 0);
29830 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c  .  .  /*.  ** Cl
29840 65 61 6e 75 70 20 62 65 66 6f 72 65 20 72 65 74  eanup before ret
29850 75 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c  urning..  */.bal
29860 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20  ance_cleanup:.  
29870 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28  sqlite3PageFree(
29880 61 53 70 61 63 65 32 29 3b 0a 20 20 73 71 6c 69  aSpace2);.  sqli
29890 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28 61  te3ScratchFree(a
298a0 70 43 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d  pCell);.  for(i=
298b0 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b  0; i<nOld; i++){
298c0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
298d0 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a  (apOld[i]);.  }.
298e0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65    for(i=0; i<nNe
298f0 77 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c  w; i++){.    rel
29900 65 61 73 65 50 61 67 65 28 61 70 4e 65 77 5b 69  easePage(apNew[i
29910 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73  ]);.  }.  releas
29920 65 50 61 67 65 28 70 50 61 72 65 6e 74 29 3b 0a  ePage(pParent);.
29930 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
29940 45 3a 20 66 69 6e 69 73 68 65 64 20 77 69 74 68  E: finished with
29950 20 25 64 3a 20 6f 6c 64 3d 25 64 20 6e 65 77 3d   %d: old=%d new=
29960 25 64 20 63 65 6c 6c 73 3d 25 64 5c 6e 22 2c 0a  %d cells=%d\n",.
29970 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 2d            pPage-
29980 3e 70 67 6e 6f 2c 20 6e 4f 6c 64 2c 20 6e 4e 65  >pgno, nOld, nNe
29990 77 2c 20 6e 43 65 6c 6c 29 29 3b 0a 20 20 72 65  w, nCell));.  re
299a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
299b0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
299c0 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68 65  s called for the
299d0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20   root page of a 
299e0 62 74 72 65 65 20 77 68 65 6e 20 74 68 65 20 72  btree when the r
299f0 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74  oot.** page cont
29a00 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20 20  ains no cells.  
29a10 54 68 69 73 20 69 73 20 61 6e 20 6f 70 70 6f 72  This is an oppor
29a20 74 75 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20 74  tunity to make t
29a30 68 65 20 74 72 65 65 0a 2a 2a 20 73 68 61 6c 6c  he tree.** shall
29a40 6f 77 65 72 20 62 79 20 6f 6e 65 20 6c 65 76 65  ower by one leve
29a50 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
29a60 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77   balance_shallow
29a70 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  er(MemPage *pPag
29a80 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  e){.  MemPage *p
29a90 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20  Child;          
29aa0 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 63     /* The only c
29ab0 68 69 6c 64 20 70 61 67 65 20 6f 66 20 70 50 61  hild page of pPa
29ac0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ge */.  Pgno pgn
29ad0 6f 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20  oChild;         
29ae0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
29af0 62 65 72 20 66 6f 72 20 70 43 68 69 6c 64 20 2a  ber for pChild *
29b00 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
29b10 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
29b20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
29b30 66 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72  from subprocedur
29b40 65 73 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  es */.  BtShared
29b50 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20   *pBt;          
29b60 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
29b70 61 69 6e 20 42 54 72 65 65 20 73 74 72 75 63 74  ain BTree struct
29b80 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 43  ure */.  int mxC
29b90 65 6c 6c 50 65 72 50 61 67 65 3b 20 20 20 20 20  ellPerPage;     
29ba0 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
29bb0 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
29bc0 20 70 65 72 20 70 61 67 65 20 2a 2f 0a 20 20 75   per page */.  u
29bd0 38 20 2a 2a 61 70 43 65 6c 6c 3b 20 20 20 20 20  8 **apCell;     
29be0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
29bf0 6c 6c 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 61  ll cells from pa
29c00 67 65 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63  ges being balanc
29c10 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43  ed */.  u16 *szC
29c20 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
29c30 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69       /* Local si
29c40 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
29c50 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
29c60 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20  age->pParent==0 
29c70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
29c80 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a  ge->nCell==0 );.
29c90 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
29ca0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
29cb0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
29cc0 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67 65  );.  pBt = pPage
29cd0 2d 3e 70 42 74 3b 0a 20 20 6d 78 43 65 6c 6c 50  ->pBt;.  mxCellP
29ce0 65 72 50 61 67 65 20 3d 20 4d 58 5f 43 45 4c 4c  erPage = MX_CELL
29cf0 28 70 42 74 29 3b 0a 20 20 61 70 43 65 6c 6c 20  (pBt);.  apCell 
29d00 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
29d10 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 2a 28   mxCellPerPage*(
29d20 73 69 7a 65 6f 66 28 75 38 2a 29 2b 73 69 7a 65  sizeof(u8*)+size
29d30 6f 66 28 75 31 36 29 29 20 29 3b 0a 20 20 69 66  of(u16)) );.  if
29d40 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 20 72 65  ( apCell==0 ) re
29d50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
29d60 4d 3b 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75  M;.  szCell = (u
29d70 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6d 78 43 65  16*)&apCell[mxCe
29d80 6c 6c 50 65 72 50 61 67 65 5d 3b 0a 20 20 69 66  llPerPage];.  if
29d90 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
29da0 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  .    /* The tabl
29db0 65 20 69 73 20 63 6f 6d 70 6c 65 74 65 6c 79 20  e is completely 
29dc0 65 6d 70 74 79 20 2a 2f 0a 20 20 20 20 54 52 41  empty */.    TRA
29dd0 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 65 6d  CE(("BALANCE: em
29de0 70 74 79 20 74 61 62 6c 65 20 25 64 5c 6e 22 2c  pty table %d\n",
29df0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a   pPage->pgno));.
29e00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
29e10 54 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73  The root page is
29e20 20 65 6d 70 74 79 20 62 75 74 20 68 61 73 20 6f   empty but has o
29e30 6e 65 20 63 68 69 6c 64 2e 20 20 54 72 61 6e 73  ne child.  Trans
29e40 66 65 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 69  fer the.    ** i
29e50 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
29e60 74 68 61 74 20 6f 6e 65 20 63 68 69 6c 64 20 69  that one child i
29e70 6e 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67  nto the root pag
29e80 65 20 69 66 20 69 74 20 0a 20 20 20 20 2a 2a 20  e if it .    ** 
29e90 77 69 6c 6c 20 66 69 74 2e 20 20 54 68 69 73 20  will fit.  This 
29ea0 72 65 64 75 63 65 73 20 74 68 65 20 64 65 70 74  reduces the dept
29eb0 68 20 6f 66 20 74 68 65 20 74 72 65 65 20 62 79  h of the tree by
29ec0 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20   one..    **.   
29ed0 20 2a 2a 20 49 66 20 74 68 65 20 72 6f 6f 74 20   ** If the root 
29ee0 70 61 67 65 20 69 73 20 70 61 67 65 20 31 2c 20  page is page 1, 
29ef0 69 74 20 68 61 73 20 6c 65 73 73 20 73 70 61 63  it has less spac
29f00 65 20 61 76 61 69 6c 61 62 6c 65 20 74 68 61 6e  e available than
29f10 0a 20 20 20 20 2a 2a 20 69 74 73 20 63 68 69 6c  .    ** its chil
29f20 64 20 28 64 75 65 20 74 6f 20 74 68 65 20 31 30  d (due to the 10
29f30 30 20 62 79 74 65 20 68 65 61 64 65 72 20 74 68  0 byte header th
29f40 61 74 20 6f 63 63 75 72 73 20 61 74 20 74 68 65  at occurs at the
29f50 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 2a   beginning.    *
29f60 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  * of the databas
29f70 65 20 66 6c 65 29 2c 20 73 6f 20 69 74 20 6d 69  e fle), so it mi
29f80 67 68 74 20 6e 6f 74 20 62 65 20 61 62 6c 65 20  ght not be able 
29f90 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6f 66 20 74  to hold all of t
29fa0 68 65 20 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72  he .    ** infor
29fb0 6d 61 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79  mation currently
29fc0 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
29fd0 65 20 63 68 69 6c 64 2e 20 20 49 66 20 74 68 69  e child.  If thi
29fe0 73 20 69 73 20 74 68 65 20 0a 20 20 20 20 2a 2a  s is the .    **
29ff0 20 63 61 73 65 2c 20 74 68 65 6e 20 64 6f 20 6e   case, then do n
2a000 6f 74 20 64 6f 20 74 68 65 20 74 72 61 6e 73 66  ot do the transf
2a010 65 72 2e 20 20 4c 65 61 76 65 20 70 61 67 65 20  er.  Leave page 
2a020 31 20 65 6d 70 74 79 20 65 78 63 65 70 74 0a 20  1 empty except. 
2a030 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 72 69     ** for the ri
2a040 67 68 74 2d 70 6f 69 6e 74 65 72 20 74 6f 20 74  ght-pointer to t
2a050 68 65 20 63 68 69 6c 64 20 70 61 67 65 2e 20 20  he child page.  
2a060 54 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 62  The child page b
2a070 65 63 6f 6d 65 73 0a 20 20 20 20 2a 2a 20 74 68  ecomes.    ** th
2a080 65 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 6f  e virtual root o
2a090 66 20 74 68 65 20 74 72 65 65 2e 0a 20 20 20 20  f the tree..    
2a0a0 2a 2f 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c 64  */.    pgnoChild
2a0b0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
2a0c0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
2a0d0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
2a0e0 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f      assert( pgno
2a0f0 43 68 69 6c 64 3e 30 20 29 3b 0a 20 20 20 20 61  Child>0 );.    a
2a100 73 73 65 72 74 28 20 70 67 6e 6f 43 68 69 6c 64  ssert( pgnoChild
2a110 3c 3d 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  <=pagerPagecount
2a120 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 50 61  (pPage->pBt->pPa
2a130 67 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  ger) );.    rc =
2a140 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
2a150 50 61 67 65 28 70 50 61 67 65 2d 3e 70 42 74 2c  Page(pPage->pBt,
2a160 20 70 67 6e 6f 43 68 69 6c 64 2c 20 26 70 43 68   pgnoChild, &pCh
2a170 69 6c 64 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ild, 0);.    if(
2a180 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73   rc ) goto end_s
2a190 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a  hallow_balance;.
2a1a0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 70      if( pPage->p
2a1b0 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
2a1c0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2a1d0 65 49 6e 69 74 50 61 67 65 28 70 43 68 69 6c 64  eInitPage(pChild
2a1e0 2c 20 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , pPage);.      
2a1f0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
2a200 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63  d_shallow_balanc
2a210 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e;.      assert(
2a220 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c   pChild->nOverfl
2a230 6f 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69  ow==0 );.      i
2a240 66 28 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65  f( pChild->nFree
2a250 3e 3d 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20  >=100 ){.       
2a260 20 2f 2a 20 54 68 65 20 63 68 69 6c 64 20 69 6e   /* The child in
2a270 66 6f 72 6d 61 74 69 6f 6e 20 77 69 6c 6c 20 66  formation will f
2a280 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 70  it on the root p
2a290 61 67 65 2c 20 73 6f 20 64 6f 20 74 68 65 0a 20  age, so do the. 
2a2a0 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 2a         ** copy *
2a2b0 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  /.        int i;
2a2c0 0a 20 20 20 20 20 20 20 20 7a 65 72 6f 50 61 67  .        zeroPag
2a2d0 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d  e(pPage, pChild-
2a2e0 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20  >aData[0]);.    
2a2f0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
2a300 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  Child->nCell; i+
2a310 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70  +){.          ap
2a320 43 65 6c 6c 5b 69 5d 20 3d 20 66 69 6e 64 43 65  Cell[i] = findCe
2a330 6c 6c 28 70 43 68 69 6c 64 2c 69 29 3b 0a 20 20  ll(pChild,i);.  
2a340 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 69          szCell[i
2a350 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  ] = cellSizePtr(
2a360 70 43 68 69 6c 64 2c 20 61 70 43 65 6c 6c 5b 69  pChild, apCell[i
2a370 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
2a380 20 20 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61        assemblePa
2a390 67 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64  ge(pPage, pChild
2a3a0 2d 3e 6e 43 65 6c 6c 2c 20 61 70 43 65 6c 6c 2c  ->nCell, apCell,
2a3b0 20 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20   szCell);.      
2a3c0 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 72 69    /* Copy the ri
2a3d0 67 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66 20 74  ght-pointer of t
2a3e0 68 65 20 63 68 69 6c 64 20 74 6f 20 74 68 65 20  he child to the 
2a3f0 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20  parent. */.     
2a400 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
2a410 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
2a420 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 0a  >hdrOffset+8], .
2a430 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74 34              get4
2a440 62 79 74 65 28 26 70 43 68 69 6c 64 2d 3e 61 44  byte(&pChild->aD
2a450 61 74 61 5b 70 43 68 69 6c 64 2d 3e 68 64 72 4f  ata[pChild->hdrO
2a460 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20 20 20  ffset+8]));.    
2a470 20 20 20 20 66 72 65 65 50 61 67 65 28 70 43 68      freePage(pCh
2a480 69 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 54 52  ild);.        TR
2a490 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63  ACE(("BALANCE: c
2a4a0 68 69 6c 64 20 25 64 20 74 72 61 6e 73 66 65 72  hild %d transfer
2a4b0 20 74 6f 20 70 61 67 65 20 31 5c 6e 22 2c 20 70   to page 1\n", p
2a4c0 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20  Child->pgno));. 
2a4d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2a4e0 20 20 20 20 2f 2a 20 54 68 65 20 63 68 69 6c 64      /* The child
2a4f0 20 68 61 73 20 6d 6f 72 65 20 69 6e 66 6f 72 6d   has more inform
2a500 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20  ation that will 
2a510 66 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74 2e  fit on the root.
2a520 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20  .        ** The 
2a530 74 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20  tree is already 
2a540 62 61 6c 61 6e 63 65 64 2e 20 20 44 6f 20 6e 6f  balanced.  Do no
2a550 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20  thing. */.      
2a560 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
2a570 45 3a 20 63 68 69 6c 64 20 25 64 20 77 69 6c 6c  E: child %d will
2a580 20 6e 6f 74 20 66 69 74 20 6f 6e 20 70 61 67 65   not fit on page
2a590 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70   1\n", pChild->p
2a5a0 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  gno));.      }. 
2a5b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a5c0 6d 65 6d 63 70 79 28 70 50 61 67 65 2d 3e 61 44  memcpy(pPage->aD
2a5d0 61 74 61 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61  ata, pChild->aDa
2a5e0 74 61 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  ta, pPage->pBt->
2a5f0 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20  usableSize);.   
2a600 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74     pPage->isInit
2a610 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
2a620 65 2d 3e 70 50 61 72 65 6e 74 20 3d 20 30 3b 0a  e->pParent = 0;.
2a630 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2a640 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
2a650 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 20  pPage, 0);.     
2a660 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
2a670 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
2a680 66 72 65 65 50 61 67 65 28 70 43 68 69 6c 64 29  freePage(pChild)
2a690 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  ;.      TRACE(("
2a6a0 42 41 4c 41 4e 43 45 3a 20 74 72 61 6e 73 66 65  BALANCE: transfe
2a6b0 72 20 63 68 69 6c 64 20 25 64 20 69 6e 74 6f 20  r child %d into 
2a6c0 72 6f 6f 74 20 25 64 5c 6e 22 2c 0a 20 20 20 20  root %d\n",.    
2a6d0 20 20 20 20 20 20 20 20 20 20 70 43 68 69 6c 64            pChild
2a6e0 2d 3e 70 67 6e 6f 2c 20 70 50 61 67 65 2d 3e 70  ->pgno, pPage->p
2a6f0 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  gno));.    }.   
2a700 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74 43 68   rc = reparentCh
2a710 69 6c 64 50 61 67 65 73 28 70 50 61 67 65 29 3b  ildPages(pPage);
2a720 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2a730 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
2a740 20 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   );.#ifndef SQLI
2a750 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2a760 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
2a770 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
2a780 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
2a790 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67   for(i=0; i<pPag
2a7a0 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 20  e->nCell; i++){ 
2a7b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74  .        rc = pt
2a7c0 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 50 61 67  rmapPutOvfl(pPag
2a7d0 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 69  e, i);.        i
2a7e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2a7f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
2a800 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62  to end_shallow_b
2a810 61 6c 61 6e 63 65 3b 0a 20 20 20 20 20 20 20 20  alance;.        
2a820 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2a830 23 65 6e 64 69 66 0a 20 20 20 20 72 65 6c 65 61  #endif.    relea
2a840 73 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a  sePage(pChild);.
2a850 20 20 7d 0a 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f    }.end_shallow_
2a860 62 61 6c 61 6e 63 65 3a 0a 20 20 73 71 6c 69 74  balance:.  sqlit
2a870 65 33 5f 66 72 65 65 28 61 70 43 65 6c 6c 29 3b  e3_free(apCell);
2a880 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2a890 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f 74  ../*.** The root
2a8a0 20 70 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c   page is overful
2a8b0 6c 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  l.**.** When thi
2a8c0 73 20 68 61 70 70 65 6e 73 2c 20 43 72 65 61 74  s happens, Creat
2a8d0 65 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  e a new child pa
2a8e0 67 65 20 61 6e 64 20 63 6f 70 79 20 74 68 65 0a  ge and copy the.
2a8f0 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  ** contents of t
2a900 68 65 20 72 6f 6f 74 20 69 6e 74 6f 20 74 68 65  he root into the
2a910 20 63 68 69 6c 64 2e 20 20 54 68 65 6e 20 6d 61   child.  Then ma
2a920 6b 65 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70  ke the root.** p
2a930 61 67 65 20 61 6e 20 65 6d 70 74 79 20 70 61 67  age an empty pag
2a940 65 20 77 69 74 68 20 72 69 67 68 74 43 68 69 6c  e with rightChil
2a950 64 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68  d pointing to th
2a960 65 20 6e 65 77 0a 2a 2a 20 63 68 69 6c 64 2e 20  e new.** child. 
2a970 20 20 46 69 6e 61 6c 6c 79 2c 20 63 61 6c 6c 20    Finally, call 
2a980 62 61 6c 61 6e 63 65 5f 69 6e 74 65 72 6e 61 6c  balance_internal
2a990 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 63 68  () on the new ch
2a9a0 69 6c 64 0a 2a 2a 20 74 6f 20 63 61 75 73 65 20  ild.** to cause 
2a9b0 69 74 20 74 6f 20 73 70 6c 69 74 2e 0a 2a 2f 0a  it to split..*/.
2a9c0 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
2a9d0 63 65 5f 64 65 65 70 65 72 28 4d 65 6d 50 61 67  ce_deeper(MemPag
2a9e0 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
2a9f0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
2aa00 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65   /* Return value
2aa10 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75   from subprocedu
2aa20 72 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  res */.  MemPage
2aa30 20 2a 70 43 68 69 6c 64 3b 20 20 20 20 2f 2a 20   *pChild;    /* 
2aa40 50 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77  Pointer to a new
2aa50 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20   child page */. 
2aa60 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b   Pgno pgnoChild;
2aa70 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
2aa80 62 65 72 20 6f 66 20 74 68 65 20 6e 65 77 20 63  ber of the new c
2aa90 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 42  hild page */.  B
2aaa0 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
2aab0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 54 72        /* The BTr
2aac0 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62  ee */.  int usab
2aad0 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 54  leSize;     /* T
2aae0 6f 74 61 6c 20 75 73 61 62 6c 65 20 73 69 7a 65  otal usable size
2aaf0 20 6f 66 20 61 20 70 61 67 65 20 2a 2f 0a 20 20   of a page */.  
2ab00 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
2ab10 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f      /* Content o
2ab20 66 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  f the parent pag
2ab30 65 20 2a 2f 0a 20 20 75 38 20 2a 63 64 61 74 61  e */.  u8 *cdata
2ab40 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ;          /* Co
2ab50 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 68 69  ntent of the chi
2ab60 6c 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ld page */.  int
2ab70 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 20   hdr;           
2ab80 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 70 61   /* Offset to pa
2ab90 67 65 20 68 65 61 64 65 72 20 69 6e 20 70 61 72  ge header in par
2aba0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b  ent */.  int brk
2abb0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2abc0 4f 66 66 73 65 74 20 74 6f 20 63 6f 6e 74 65 6e  Offset to conten
2abd0 74 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20  t of first cell 
2abe0 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 0a 20 20  in parent */..  
2abf0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
2ac00 50 61 72 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61  Parent==0 );.  a
2ac10 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
2ac20 76 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 20 20 70  verflow>0 );.  p
2ac30 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
2ac40 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2ac50 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
2ac60 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
2ac70 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
2ac80 65 50 61 67 65 28 70 42 74 2c 20 26 70 43 68 69  ePage(pBt, &pChi
2ac90 6c 64 2c 20 26 70 67 6e 6f 43 68 69 6c 64 2c 20  ld, &pgnoChild, 
2aca0 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 30 29 3b  pPage->pgno, 0);
2acb0 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
2acc0 72 6e 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  rn rc;.  assert(
2acd0 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77   sqlite3PagerIsw
2ace0 72 69 74 65 61 62 6c 65 28 70 43 68 69 6c 64 2d  riteable(pChild-
2acf0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 75  >pDbPage) );.  u
2ad00 73 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d  sableSize = pBt-
2ad10 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 64  >usableSize;.  d
2ad20 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
2ad30 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  ta;.  hdr = pPag
2ad40 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
2ad50 62 72 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26  brk = get2byte(&
2ad60 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20  data[hdr+5]);.  
2ad70 63 64 61 74 61 20 3d 20 70 43 68 69 6c 64 2d 3e  cdata = pChild->
2ad80 61 44 61 74 61 3b 0a 20 20 6d 65 6d 63 70 79 28  aData;.  memcpy(
2ad90 63 64 61 74 61 2c 20 26 64 61 74 61 5b 68 64 72  cdata, &data[hdr
2ada0 5d 2c 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66  ], pPage->cellOf
2adb0 66 73 65 74 2b 32 2a 70 50 61 67 65 2d 3e 6e 43  fset+2*pPage->nC
2adc0 65 6c 6c 2d 68 64 72 29 3b 0a 20 20 6d 65 6d 63  ell-hdr);.  memc
2add0 70 79 28 26 63 64 61 74 61 5b 62 72 6b 5d 2c 20  py(&cdata[brk], 
2ade0 26 64 61 74 61 5b 62 72 6b 5d 2c 20 75 73 61 62  &data[brk], usab
2adf0 6c 65 53 69 7a 65 2d 62 72 6b 29 3b 0a 20 20 61  leSize-brk);.  a
2ae00 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e 69  ssert( pChild->i
2ae10 73 49 6e 69 74 3d 3d 30 20 29 3b 0a 20 20 72 63  sInit==0 );.  rc
2ae20 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
2ae30 6e 69 74 50 61 67 65 28 70 43 68 69 6c 64 2c 20  nitPage(pChild, 
2ae40 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
2ae50 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 64   ) goto balanced
2ae60 65 65 70 65 72 5f 6f 75 74 3b 0a 20 20 6d 65 6d  eeper_out;.  mem
2ae70 63 70 79 28 70 43 68 69 6c 64 2d 3e 61 4f 76 66  cpy(pChild->aOvf
2ae80 6c 2c 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 2c  l, pPage->aOvfl,
2ae90 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
2aea0 77 2a 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  w*sizeof(pPage->
2aeb0 61 4f 76 66 6c 5b 30 5d 29 29 3b 0a 20 20 70 43  aOvfl[0]));.  pC
2aec0 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  hild->nOverflow 
2aed0 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  = pPage->nOverfl
2aee0 6f 77 3b 0a 20 20 69 66 28 20 70 43 68 69 6c 64  ow;.  if( pChild
2aef0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->nOverflow ){. 
2af00 20 20 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65     pChild->nFree
2af10 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73 73 65   = 0;.  }.  asse
2af20 72 74 28 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c  rt( pChild->nCel
2af30 6c 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  l==pPage->nCell 
2af40 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28 70 50  );.  zeroPage(pP
2af50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61  age, pChild->aDa
2af60 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45 41  ta[0] & ~PTF_LEA
2af70 46 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  F);.  put4byte(&
2af80 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
2af90 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
2afa0 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20  , pgnoChild);.  
2afb0 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
2afc0 20 63 6f 70 79 20 72 6f 6f 74 20 25 64 20 69 6e   copy root %d in
2afd0 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  to %d\n", pPage-
2afe0 3e 70 67 6e 6f 2c 20 70 43 68 69 6c 64 2d 3e 70  >pgno, pChild->p
2aff0 67 6e 6f 29 29 3b 0a 23 69 66 6e 64 65 66 20 53  gno));.#ifndef S
2b000 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2b010 41 43 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d  ACUUM.  if( pBt-
2b020 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
2b030 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 72 63     int i;.    rc
2b040 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
2b050 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20  , pChild->pgno, 
2b060 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50  PTRMAP_BTREE, pP
2b070 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
2b080 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
2b090 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f 75 74 3b  lancedeeper_out;
2b0a0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2b0b0 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69  pChild->nCell; i
2b0c0 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ++){.      rc = 
2b0d0 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 43  ptrmapPutOvfl(pC
2b0e0 68 69 6c 64 2c 20 69 29 3b 0a 20 20 20 20 20 20  hild, i);.      
2b0f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2b100 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
2b110 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
2b120 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
2b130 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f  .  rc = balance_
2b140 6e 6f 6e 72 6f 6f 74 28 70 43 68 69 6c 64 29 3b  nonroot(pChild);
2b150 0a 0a 62 61 6c 61 6e 63 65 64 65 65 70 65 72 5f  ..balancedeeper_
2b160 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73 65 50 61  out:.  releasePa
2b170 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 72 65  ge(pChild);.  re
2b180 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2b190 2a 20 44 65 63 69 64 65 20 69 66 20 74 68 65 20  * Decide if the 
2b1a0 70 61 67 65 20 70 50 61 67 65 20 6e 65 65 64 73  page pPage needs
2b1b0 20 74 6f 20 62 65 20 62 61 6c 61 6e 63 65 64 2e   to be balanced.
2b1c0 20 20 49 66 20 62 61 6c 61 6e 63 69 6e 67 20 69    If balancing i
2b1d0 73 0a 2a 2a 20 72 65 71 75 69 72 65 64 2c 20 63  s.** required, c
2b1e0 61 6c 6c 20 74 68 65 20 61 70 70 72 6f 70 72 69  all the appropri
2b1f0 61 74 65 20 62 61 6c 61 6e 63 69 6e 67 20 72 6f  ate balancing ro
2b200 75 74 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  utine..*/.static
2b210 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 4d 65 6d   int balance(Mem
2b220 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
2b230 20 69 6e 73 65 72 74 29 7b 0a 20 20 69 6e 74 20   insert){.  int 
2b240 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2b250 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2b260 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
2b270 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
2b280 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  );.  if( pPage->
2b290 70 50 61 72 65 6e 74 3d 3d 30 20 29 7b 0a 20 20  pParent==0 ){.  
2b2a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2b2b0 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e  gerWrite(pPage->
2b2c0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
2b2d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b2e0 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  && pPage->nOverf
2b2f0 6c 6f 77 3e 30 20 29 7b 0a 20 20 20 20 20 20 72  low>0 ){.      r
2b300 63 20 3d 20 62 61 6c 61 6e 63 65 5f 64 65 65 70  c = balance_deep
2b310 65 72 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  er(pPage);.    }
2b320 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2b330 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d  ITE_OK && pPage-
2b340 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  >nCell==0 ){.   
2b350 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f     rc = balance_
2b360 73 68 61 6c 6c 6f 77 65 72 28 70 50 61 67 65 29  shallower(pPage)
2b370 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
2b380 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e  .    if( pPage->
2b390 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 0a  nOverflow>0 || .
2b3a0 20 20 20 20 20 20 20 20 28 21 69 6e 73 65 72 74          (!insert
2b3b0 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65   && pPage->nFree
2b3c0 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  >pPage->pBt->usa
2b3d0 62 6c 65 53 69 7a 65 2a 32 2f 33 29 20 29 7b 0a  bleSize*2/3) ){.
2b3e0 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
2b3f0 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 50 61 67 65  ce_nonroot(pPage
2b400 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
2b410 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2b420 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2b430 63 68 65 63 6b 73 20 61 6c 6c 20 63 75 72 73 6f  checks all curso
2b440 72 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  rs that point to
2b450 20 74 61 62 6c 65 20 70 67 6e 6f 52 6f 6f 74 2e   table pgnoRoot.
2b460 0a 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68  .** If any of th
2b470 6f 73 65 20 63 75 72 73 6f 72 73 20 77 65 72 65  ose cursors were
2b480 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46   opened with wrF
2b490 6c 61 67 3d 3d 30 20 69 6e 20 61 20 64 69 66 66  lag==0 in a diff
2b4a0 65 72 65 6e 74 0a 2a 2a 20 64 61 74 61 62 61 73  erent.** databas
2b4b0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 28 61 20  e connection (a 
2b4c0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2b4d0 69 6f 6e 20 74 68 61 74 20 73 68 61 72 65 73 20  ion that shares 
2b4e0 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 63 61 63  the pager.** cac
2b4f0 68 65 20 77 69 74 68 20 74 68 65 20 63 75 72 72  he with the curr
2b500 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 20  ent connection) 
2b510 61 6e 64 20 74 68 61 74 20 6f 74 68 65 72 20 63  and that other c
2b520 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 69 73  onnection .** is
2b530 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 65 61 64   not in the Read
2b540 55 6e 63 6f 6d 6d 6d 69 74 74 65 64 20 73 74 61  Uncommmitted sta
2b550 74 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  te, then this ro
2b560 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 0a 2a  utine returns .*
2b570 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e  * SQLITE_LOCKED.
2b580 0a 2a 2a 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61  .**.** As well a
2b590 73 20 63 75 72 73 6f 72 73 20 77 69 74 68 20 77  s cursors with w
2b5a0 72 46 6c 61 67 3d 3d 30 2c 20 63 75 72 73 6f 72  rFlag==0, cursor
2b5b0 73 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 31  s with wrFlag==1
2b5c0 20 61 6e 64 20 0a 2a 2a 20 69 73 49 6e 63 72 62   and .** isIncrb
2b5d0 6c 6f 62 48 61 6e 64 6c 65 3d 3d 31 20 61 72 65  lobHandle==1 are
2b5e0 20 61 6c 73 6f 20 63 6f 6e 73 69 64 65 72 65 64   also considered
2b5f0 20 27 72 65 61 64 27 20 63 75 72 73 6f 72 73 2e   'read' cursors.
2b600 20 49 6e 63 72 65 6d 65 6e 74 61 6c 20 0a 2a 2a   Incremental .**
2b610 20 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 61 72   blob cursors ar
2b620 65 20 75 73 65 64 20 66 6f 72 20 62 6f 74 68 20  e used for both 
2b630 72 65 61 64 69 6e 67 20 61 6e 64 20 77 72 69 74  reading and writ
2b640 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  ing..**.** When 
2b650 70 67 6e 6f 52 6f 6f 74 20 69 73 20 74 68 65 20  pgnoRoot is the 
2b660 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 6e 20  root page of an 
2b670 69 6e 74 6b 65 79 20 74 61 62 6c 65 2c 20 74 68  intkey table, th
2b680 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
2b690 6c 73 6f 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62  lso.** responsib
2b6a0 6c 65 20 66 6f 72 20 69 6e 76 61 6c 69 64 61 74  le for invalidat
2b6b0 69 6e 67 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  ing incremental 
2b6c0 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 77 68 65  blob cursors whe
2b6d0 6e 20 74 68 65 20 74 61 62 6c 65 20 72 6f 77 0a  n the table row.
2b6e0 2a 2a 20 6f 6e 20 77 68 69 63 68 20 74 68 65 79  ** on which they
2b6f0 20 61 72 65 20 6f 70 65 6e 65 64 20 69 73 20 64   are opened is d
2b700 65 6c 65 74 65 64 20 6f 72 20 6d 6f 64 69 66 69  eleted or modifi
2b710 65 64 2e 20 43 75 72 73 6f 72 73 20 61 72 65 20  ed. Cursors are 
2b720 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61  invalidated.** a
2b730 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20  ccording to the 
2b740 66 6f 6c 6c 6f 77 69 6e 67 20 72 75 6c 65 73 3a  following rules:
2b750 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57 68 65 6e  .**.**   1) When
2b760 20 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65   BtreeClearTable
2b770 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  () is called to 
2b780 63 6f 6d 70 6c 65 74 65 6c 79 20 64 65 6c 65 74  completely delet
2b790 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a  e the contents.*
2b7a0 2a 20 20 20 20 20 20 6f 66 20 61 20 42 2d 54 72  *      of a B-Tr
2b7b0 65 65 20 74 61 62 6c 65 2c 20 70 45 78 63 6c 75  ee table, pExclu
2b7c0 64 65 20 69 73 20 73 65 74 20 74 6f 20 7a 65 72  de is set to zer
2b7d0 6f 20 61 6e 64 20 70 61 72 61 6d 65 74 65 72 20  o and parameter 
2b7e0 69 52 6f 77 20 69 73 20 0a 2a 2a 20 20 20 20 20  iRow is .**     
2b7f0 20 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f   set to non-zero
2b800 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61  . In this case a
2b810 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62  ll incremental b
2b820 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  lob cursors open
2b830 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74 68 65 20  .**      on the 
2b840 74 61 62 6c 65 20 72 6f 6f 74 65 64 20 61 74 20  table rooted at 
2b850 70 67 6e 6f 52 6f 6f 74 20 61 72 65 20 69 6e 76  pgnoRoot are inv
2b860 61 6c 69 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  alidated..**.** 
2b870 20 20 32 29 20 57 68 65 6e 20 42 74 72 65 65 49    2) When BtreeI
2b880 6e 73 65 72 74 28 29 2c 20 42 74 72 65 65 44 65  nsert(), BtreeDe
2b890 6c 65 74 65 28 29 20 6f 72 20 42 74 72 65 65 50  lete() or BtreeP
2b8a0 75 74 44 61 74 61 28 29 20 69 73 20 63 61 6c 6c  utData() is call
2b8b0 65 64 20 74 6f 20 0a 2a 2a 20 20 20 20 20 20 6d  ed to .**      m
2b8c0 6f 64 69 66 79 20 61 20 74 61 62 6c 65 20 72 6f  odify a table ro
2b8d0 77 20 76 69 61 20 61 6e 20 53 51 4c 20 73 74 61  w via an SQL sta
2b8e0 74 65 6d 65 6e 74 2c 20 70 45 78 63 6c 75 64 65  tement, pExclude
2b8f0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 0a   is set to the .
2b900 2a 2a 20 20 20 20 20 20 77 72 69 74 65 20 63 75  **      write cu
2b910 72 73 6f 72 20 75 73 65 64 20 74 6f 20 64 6f 20  rsor used to do 
2b920 74 68 65 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e  the modification
2b930 20 61 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69   and parameter i
2b940 52 6f 77 20 69 73 20 73 65 74 0a 2a 2a 20 20 20  Row is set.**   
2b950 20 20 20 74 6f 20 74 68 65 20 69 6e 74 65 67 65     to the intege
2b960 72 20 72 6f 77 20 69 64 20 6f 66 20 74 68 65 20  r row id of the 
2b970 42 2d 54 72 65 65 20 65 6e 74 72 79 20 62 65 69  B-Tree entry bei
2b980 6e 67 20 6d 6f 64 69 66 69 65 64 2e 20 55 6e 6c  ng modified. Unl
2b990 65 73 73 0a 2a 2a 20 20 20 20 20 20 70 45 78 63  ess.**      pExc
2b9a0 6c 75 64 65 20 69 73 20 69 74 73 65 6c 66 20 61  lude is itself a
2b9b0 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c  n incremental bl
2b9c0 6f 62 20 63 75 72 73 6f 72 2c 20 74 68 65 6e 20  ob cursor, then 
2b9d0 61 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 61 6c 0a  all incremental.
2b9e0 2a 2a 20 20 20 20 20 20 62 6c 6f 62 20 63 75 72  **      blob cur
2b9f0 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 72 6f 77  sors open on row
2ba00 20 69 52 6f 77 20 6f 66 20 74 68 65 20 42 2d 54   iRow of the B-T
2ba10 72 65 65 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ree are invalida
2ba20 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 33 29 20  ted..**.**   3) 
2ba30 49 66 20 62 6f 74 68 20 70 45 78 63 6c 75 64 65  If both pExclude
2ba40 20 61 6e 64 20 69 52 6f 77 20 61 72 65 20 73 65   and iRow are se
2ba50 74 20 74 6f 20 7a 65 72 6f 2c 20 6e 6f 20 69 6e  t to zero, no in
2ba60 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 0a  cremental blob .
2ba70 2a 2a 20 20 20 20 20 20 63 75 72 73 6f 72 73 20  **      cursors 
2ba80 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e  are invalidated.
2ba90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
2baa0 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 0a 20  heckReadLocks(. 
2bab0 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20   Btree *pBtree, 
2bac0 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52 6f 6f 74  .  Pgno pgnoRoot
2bad0 2c 20 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  , .  BtCursor *p
2bae0 45 78 63 6c 75 64 65 2c 0a 20 20 69 36 34 20 69  Exclude,.  i64 i
2baf0 52 6f 77 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f  Row.){.  BtCurso
2bb00 72 20 2a 70 3b 0a 20 20 42 74 53 68 61 72 65 64  r *p;.  BtShared
2bb10 20 2a 70 42 74 20 3d 20 70 42 74 72 65 65 2d 3e   *pBt = pBtree->
2bb20 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pBt;.  sqlite3 *
2bb30 64 62 20 3d 20 70 42 74 72 65 65 2d 3e 64 62 3b  db = pBtree->db;
2bb40 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2bb50 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
2bb60 78 28 70 42 74 72 65 65 29 20 29 3b 0a 20 20 66  x(pBtree) );.  f
2bb70 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f  or(p=pBt->pCurso
2bb80 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  r; p; p=p->pNext
2bb90 29 7b 0a 20 20 20 20 69 66 28 20 70 3d 3d 70 45  ){.    if( p==pE
2bba0 78 63 6c 75 64 65 20 29 20 63 6f 6e 74 69 6e 75  xclude ) continu
2bbb0 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 67  e;.    if( p->pg
2bbc0 6e 6f 52 6f 6f 74 21 3d 70 67 6e 6f 52 6f 6f 74  noRoot!=pgnoRoot
2bbd0 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66   ) continue;.#if
2bbe0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2bbf0 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 69 66  _INCRBLOB.    if
2bc00 28 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48  ( p->isIncrblobH
2bc10 61 6e 64 6c 65 20 26 26 20 28 20 0a 20 20 20 20  andle && ( .    
2bc20 20 20 20 20 20 28 21 70 45 78 63 6c 75 64 65 20       (!pExclude 
2bc30 26 26 20 69 52 6f 77 29 0a 20 20 20 20 20 20 7c  && iRow).      |
2bc40 7c 20 28 70 45 78 63 6c 75 64 65 20 26 26 20 21  | (pExclude && !
2bc50 70 45 78 63 6c 75 64 65 2d 3e 69 73 49 6e 63 72  pExclude->isIncr
2bc60 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20 70 2d  blobHandle && p-
2bc70 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77  >info.nKey==iRow
2bc80 29 0a 20 20 20 20 29 29 7b 0a 20 20 20 20 20 20  ).    )){.      
2bc90 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  p->eState = CURS
2bca0 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20  OR_INVALID;.    
2bcb0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  }.#endif.    if(
2bcc0 20 70 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53   p->eState!=CURS
2bcd0 4f 52 5f 56 41 4c 49 44 20 29 20 63 6f 6e 74 69  OR_VALID ) conti
2bce0 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  nue;.    if( p->
2bcf0 77 72 46 6c 61 67 3d 3d 30 20 0a 23 69 66 6e 64  wrFlag==0 .#ifnd
2bd00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
2bd10 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 7c 7c 20  NCRBLOB.     || 
2bd20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  p->isIncrblobHan
2bd30 64 6c 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 29  dle.#endif.    )
2bd40 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  {.      sqlite3 
2bd50 2a 64 62 4f 74 68 65 72 20 3d 20 70 2d 3e 70 42  *dbOther = p->pB
2bd60 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20  tree->db;.      
2bd70 69 66 28 20 64 62 4f 74 68 65 72 3d 3d 30 20 7c  if( dbOther==0 |
2bd80 7c 0a 20 20 20 20 20 20 20 20 20 28 64 62 4f 74  |.         (dbOt
2bd90 68 65 72 21 3d 64 62 20 26 26 20 28 64 62 4f 74  her!=db && (dbOt
2bda0 68 65 72 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c  her->flags & SQL
2bdb0 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74  ITE_ReadUncommit
2bdc0 74 65 64 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20  ted)==0) ){.    
2bdd0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
2bde0 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 20 20  E_LOCKED;.      
2bdf0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
2be00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2be10 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  }../*.** Make su
2be20 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63  re pBt->pTmpSpac
2be30 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61  e points to an a
2be40 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a  llocation of .**
2be50 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
2be60 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61  t) bytes..*/.sta
2be70 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74  tic void allocat
2be80 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68 61  eTempSpace(BtSha
2be90 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 66 28  red *pBt){.  if(
2bea0 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65   !pBt->pTmpSpace
2beb0 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d   ){.    pBt->pTm
2bec0 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65 33  pSpace = sqlite3
2bed0 4d 61 6c 6c 6f 63 28 4d 58 5f 43 45 4c 4c 5f 53  Malloc(MX_CELL_S
2bee0 49 5a 45 28 70 42 74 29 29 3b 0a 20 20 7d 0a 7d  IZE(pBt));.  }.}
2bef0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61  ../*.** Insert a
2bf00 20 6e 65 77 20 72 65 63 6f 72 64 20 69 6e 74 6f   new record into
2bf10 20 74 68 65 20 42 54 72 65 65 2e 20 20 54 68 65   the BTree.  The
2bf20 20 6b 65 79 20 69 73 20 67 69 76 65 6e 20 62 79   key is given by
2bf30 20 28 70 4b 65 79 2c 6e 4b 65 79 29 0a 2a 2a 20   (pKey,nKey).** 
2bf40 61 6e 64 20 74 68 65 20 64 61 74 61 20 69 73 20  and the data is 
2bf50 67 69 76 65 6e 20 62 79 20 28 70 44 61 74 61 2c  given by (pData,
2bf60 6e 44 61 74 61 29 2e 20 20 54 68 65 20 63 75 72  nData).  The cur
2bf70 73 6f 72 20 69 73 20 75 73 65 64 20 6f 6e 6c 79  sor is used only
2bf80 20 74 6f 0a 2a 2a 20 64 65 66 69 6e 65 20 77 68   to.** define wh
2bf90 61 74 20 74 61 62 6c 65 20 74 68 65 20 72 65 63  at table the rec
2bfa0 6f 72 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  ord should be in
2bfb0 73 65 72 74 65 64 20 69 6e 74 6f 2e 20 20 54 68  serted into.  Th
2bfc0 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c  e cursor.** is l
2bfd0 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  eft pointing at 
2bfe0 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f  a random locatio
2bff0 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20  n..**.** For an 
2c000 49 4e 54 4b 45 59 20 74 61 62 6c 65 2c 20 6f 6e  INTKEY table, on
2c010 6c 79 20 74 68 65 20 6e 4b 65 79 20 76 61 6c 75  ly the nKey valu
2c020 65 20 6f 66 20 74 68 65 20 6b 65 79 20 69 73 20  e of the key is 
2c030 75 73 65 64 2e 20 20 70 4b 65 79 20 69 73 0a 2a  used.  pKey is.*
2c040 2a 20 69 67 6e 6f 72 65 64 2e 20 20 46 6f 72 20  * ignored.  For 
2c050 61 20 5a 45 52 4f 44 41 54 41 20 74 61 62 6c 65  a ZERODATA table
2c060 2c 20 74 68 65 20 70 44 61 74 61 20 61 6e 64 20  , the pData and 
2c070 6e 44 61 74 61 20 61 72 65 20 62 6f 74 68 20 69  nData are both i
2c080 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  gnored..*/.int s
2c090 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65 72  qlite3BtreeInser
2c0a0 74 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  t(.  BtCursor *p
2c0b0 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  Cur,            
2c0c0 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61      /* Insert da
2c0d0 74 61 20 69 6e 74 6f 20 74 68 65 20 74 61 62 6c  ta into the tabl
2c0e0 65 20 6f 66 20 74 68 69 73 20 63 75 72 73 6f 72  e of this cursor
2c0f0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
2c100 20 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79   *pKey, i64 nKey
2c110 2c 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20  ,    /* The key 
2c120 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63 6f 72  of the new recor
2c130 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69  d */.  const voi
2c140 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 6e 44  d *pData, int nD
2c150 61 74 61 2c 20 20 2f 2a 20 54 68 65 20 64 61 74  ata,  /* The dat
2c160 61 20 6f 66 20 74 68 65 20 6e 65 77 20 72 65 63  a of the new rec
2c170 6f 72 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a 65  ord */.  int nZe
2c180 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ro,             
2c190 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2c1a0 72 20 6f 66 20 65 78 74 72 61 20 30 20 62 79 74  r of extra 0 byt
2c1b0 65 73 20 74 6f 20 61 70 70 65 6e 64 20 74 6f 20  es to append to 
2c1c0 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 61 70  data */.  int ap
2c1d0 70 65 6e 64 42 69 61 73 20 20 20 20 20 20 20 20  pendBias        
2c1e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2c1f0 20 69 66 20 74 68 69 73 20 69 73 20 6c 69 6b 65   if this is like
2c200 6c 79 20 61 6e 20 61 70 70 65 6e 64 20 2a 2f 0a  ly an append */.
2c210 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
2c220 6e 74 20 6c 6f 63 3b 0a 20 20 69 6e 74 20 73 7a  nt loc;.  int sz
2c230 4e 65 77 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  New;.  MemPage *
2c240 70 50 61 67 65 3b 0a 20 20 42 74 72 65 65 20 2a  pPage;.  Btree *
2c250 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  p = pCur->pBtree
2c260 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
2c270 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e  t = p->pBt;.  un
2c280 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c 64  signed char *old
2c290 43 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e 65 64  Cell;.  unsigned
2c2a0 20 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c 20 3d   char *newCell =
2c2b0 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63   0;..  assert( c
2c2c0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
2c2d0 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70  pCur) );.  if( p
2c2e0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
2c2f0 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29  n!=TRANS_WRITE )
2c300 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74  {.    /* Must st
2c310 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
2c320 6e 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61  n before doing a
2c330 6e 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 20 20  n insert */.    
2c340 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e  rc = pBt->readOn
2c350 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44  ly ? SQLITE_READ
2c360 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52  ONLY : SQLITE_ER
2c370 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ROR;.    return 
2c380 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
2c390 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  ( !pBt->readOnly
2c3a0 20 29 3b 0a 20 20 69 66 28 20 21 70 43 75 72 2d   );.  if( !pCur-
2c3b0 3e 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 72  >wrFlag ){.    r
2c3c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52  eturn SQLITE_PER
2c3d0 4d 3b 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e  M;   /* Cursor n
2c3e0 6f 74 20 6f 70 65 6e 20 66 6f 72 20 77 72 69 74  ot open for writ
2c3f0 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28  ing */.  }.  if(
2c400 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28   checkReadLocks(
2c410 70 43 75 72 2d 3e 70 42 74 72 65 65 2c 20 70 43  pCur->pBtree, pC
2c420 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  ur->pgnoRoot, pC
2c430 75 72 2c 20 6e 4b 65 79 29 20 29 7b 0a 20 20 20  ur, nKey) ){.   
2c440 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c   return SQLITE_L
2c450 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74 61  OCKED; /* The ta
2c460 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20  ble pCur points 
2c470 74 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f  to has a read lo
2c480 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  ck */.  }.  if( 
2c490 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2c4a0 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20  RSOR_FAULT ){.  
2c4b0 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
2c4c0 6b 69 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53  kip;.  }..  /* S
2c4d0 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  ave the position
2c4e0 73 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63  s of any other c
2c4f0 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74  ursors open on t
2c500 68 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63  his table */.  c
2c510 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
2c520 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
2c530 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d  .    SQLITE_OK!=
2c540 28 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72  (rc = saveAllCur
2c550 73 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e  sors(pBt, pCur->
2c560 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29  pgnoRoot, pCur))
2c570 20 7c 7c 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f   ||.    SQLITE_O
2c580 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33  K!=(rc = sqlite3
2c590 42 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72  BtreeMoveto(pCur
2c5a0 2c 20 70 4b 65 79 2c 20 30 2c 20 6e 4b 65 79 2c  , pKey, 0, nKey,
2c5b0 20 61 70 70 65 6e 64 42 69 61 73 2c 20 26 6c 6f   appendBias, &lo
2c5c0 63 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  c)).  ){.    ret
2c5d0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70  urn rc;.  }..  p
2c5e0 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61  Page = pCur->pPa
2c5f0 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ge;.  assert( pP
2c600 61 67 65 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20 6e  age->intKey || n
2c610 4b 65 79 3e 3d 30 20 29 3b 0a 20 20 61 73 73 65  Key>=0 );.  asse
2c620 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  rt( pPage->leaf 
2c630 7c 7c 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 44  || !pPage->leafD
2c640 61 74 61 20 29 3b 0a 20 20 54 52 41 43 45 28 28  ata );.  TRACE((
2c650 22 49 4e 53 45 52 54 3a 20 74 61 62 6c 65 3d 25  "INSERT: table=%
2c660 64 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e 64 61 74  d nkey=%lld ndat
2c670 61 3d 25 64 20 70 61 67 65 3d 25 64 20 25 73 5c  a=%d page=%d %s\
2c680 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 43  n",.          pC
2c690 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 6e 4b  ur->pgnoRoot, nK
2c6a0 65 79 2c 20 6e 44 61 74 61 2c 20 70 50 61 67 65  ey, nData, pPage
2c6b0 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20  ->pgno,.        
2c6c0 20 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f 76 65 72    loc==0 ? "over
2c6d0 77 72 69 74 65 22 20 3a 20 22 6e 65 77 20 65 6e  write" : "new en
2c6e0 74 72 79 22 29 29 3b 0a 20 20 61 73 73 65 72 74  try"));.  assert
2c6f0 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
2c700 29 3b 0a 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d  );.  allocateTem
2c710 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 6e  pSpace(pBt);.  n
2c720 65 77 43 65 6c 6c 20 3d 20 70 42 74 2d 3e 70 54  ewCell = pBt->pT
2c730 6d 70 53 70 61 63 65 3b 0a 20 20 69 66 28 20 6e  mpSpace;.  if( n
2c740 65 77 43 65 6c 6c 3d 3d 30 20 29 20 72 65 74 75  ewCell==0 ) retu
2c750 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2c760 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65  .  rc = fillInCe
2c770 6c 6c 28 70 50 61 67 65 2c 20 6e 65 77 43 65 6c  ll(pPage, newCel
2c780 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 70  l, pKey, nKey, p
2c790 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 6e 5a 65  Data, nData, nZe
2c7a0 72 6f 2c 20 26 73 7a 4e 65 77 29 3b 0a 20 20 69  ro, &szNew);.  i
2c7b0 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
2c7c0 5f 69 6e 73 65 72 74 3b 0a 20 20 61 73 73 65 72  _insert;.  asser
2c7d0 74 28 20 73 7a 4e 65 77 3d 3d 63 65 6c 6c 53 69  t( szNew==cellSi
2c7e0 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6e 65 77  zePtr(pPage, new
2c7f0 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65 72  Cell) );.  asser
2c800 74 28 20 73 7a 4e 65 77 3c 3d 4d 58 5f 43 45 4c  t( szNew<=MX_CEL
2c810 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a 20  L_SIZE(pBt) );. 
2c820 20 69 66 28 20 6c 6f 63 3d 3d 30 20 26 26 20 43   if( loc==0 && C
2c830 55 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75  URSOR_VALID==pCu
2c840 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
2c850 20 75 31 36 20 73 7a 4f 6c 64 3b 0a 20 20 20 20   u16 szOld;.    
2c860 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 64  assert( pCur->id
2c870 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 64  x>=0 && pCur->id
2c880 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  x<pPage->nCell )
2c890 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2c8a0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
2c8b0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
2c8c0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2c8d0 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72    goto end_inser
2c8e0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 6c 64  t;.    }.    old
2c8f0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
2c900 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
2c910 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  );.    if( !pPag
2c920 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
2c930 20 6d 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c 2c   memcpy(newCell,
2c940 20 6f 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20 20   oldCell, 4);.  
2c950 20 20 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d 20    }.    szOld = 
2c960 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67  cellSizePtr(pPag
2c970 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20  e, oldCell);.   
2c980 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28   rc = clearCell(
2c990 70 50 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b  pPage, oldCell);
2c9a0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
2c9b0 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20  to end_insert;. 
2c9c0 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67     dropCell(pPag
2c9d0 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 73 7a  e, pCur->idx, sz
2c9e0 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Old);.  }else if
2c9f0 28 20 6c 6f 63 3c 30 20 26 26 20 70 50 61 67 65  ( loc<0 && pPage
2ca00 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20  ->nCell>0 ){.   
2ca10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2ca20 6c 65 61 66 20 29 3b 0a 20 20 20 20 70 43 75 72  leaf );.    pCur
2ca30 2d 3e 69 64 78 2b 2b 3b 0a 20 20 20 20 70 43 75  ->idx++;.    pCu
2ca40 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
2ca50 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c  0;.    pCur->val
2ca60 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65  idNKey = 0;.  }e
2ca70 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
2ca80 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a   pPage->leaf );.
2ca90 20 20 7d 0a 20 20 72 63 20 3d 20 69 6e 73 65 72    }.  rc = inser
2caa0 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  tCell(pPage, pCu
2cab0 72 2d 3e 69 64 78 2c 20 6e 65 77 43 65 6c 6c 2c  r->idx, newCell,
2cac0 20 73 7a 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20   szNew, 0, 0);. 
2cad0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2cae0 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69 6e  OK ) goto end_in
2caf0 73 65 72 74 3b 0a 20 20 72 63 20 3d 20 62 61 6c  sert;.  rc = bal
2cb00 61 6e 63 65 28 70 50 61 67 65 2c 20 31 29 3b 0a  ance(pPage, 1);.
2cb10 20 20 2f 2a 20 73 71 6c 69 74 65 33 42 74 72 65    /* sqlite3Btre
2cb20 65 50 61 67 65 44 75 6d 70 28 70 43 75 72 2d 3e  ePageDump(pCur->
2cb30 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52  pBt, pCur->pgnoR
2cb40 6f 6f 74 2c 20 31 29 3b 20 2a 2f 0a 20 20 2f 2a  oot, 1); */.  /*
2cb50 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b   fflush(stdout);
2cb60 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
2cb70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d  LITE_OK ){.    m
2cb80 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
2cb90 0a 20 20 7d 0a 65 6e 64 5f 69 6e 73 65 72 74 3a  .  }.end_insert:
2cba0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
2cbb0 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  ./*.** Delete th
2cbc0 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
2cbd0 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74   cursor is point
2cbe0 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 63 75 72  ing to.  The cur
2cbf0 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70  sor.** is left p
2cc00 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72 61 6e  ointing at a ran
2cc10 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f  dom location..*/
2cc20 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
2cc30 65 44 65 6c 65 74 65 28 42 74 43 75 72 73 6f 72  eDelete(BtCursor
2cc40 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61   *pCur){.  MemPa
2cc50 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
2cc60 2d 3e 70 50 61 67 65 3b 0a 20 20 75 6e 73 69 67  ->pPage;.  unsig
2cc70 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 3b  ned char *pCell;
2cc80 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e  .  int rc;.  Pgn
2cc90 6f 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 30 3b  o pgnoChild = 0;
2cca0 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43  .  Btree *p = pC
2ccb0 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74  ur->pBtree;.  Bt
2ccc0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
2ccd0 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
2cce0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
2ccf0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
2cd00 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
2cd10 69 74 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d  it );.  if( pBt-
2cd20 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21 3d  >inTransaction!=
2cd30 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
2cd40 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72 74     /* Must start
2cd50 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62   a transaction b
2cd60 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 20 64 65  efore doing a de
2cd70 6c 65 74 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d  lete */.    rc =
2cd80 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f   pBt->readOnly ?
2cd90 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
2cda0 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   : SQLITE_ERROR;
2cdb0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2cdc0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70    }.  assert( !p
2cdd0 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b 0a  Bt->readOnly );.
2cde0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
2cdf0 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
2ce00 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
2ce10 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 20  Cur->skip;.  }. 
2ce20 20 69 66 28 20 70 43 75 72 2d 3e 69 64 78 20 3e   if( pCur->idx >
2ce30 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  = pPage->nCell )
2ce40 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2ce50 49 54 45 5f 45 52 52 4f 52 3b 20 20 2f 2a 20 54  ITE_ERROR;  /* T
2ce60 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74  he cursor is not
2ce70 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 61 6e 79   pointing to any
2ce80 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69  thing */.  }.  i
2ce90 66 28 20 21 70 43 75 72 2d 3e 77 72 46 6c 61 67  f( !pCur->wrFlag
2cea0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2ceb0 51 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a  QLITE_PERM;   /*
2cec0 20 44 69 64 20 6e 6f 74 20 6f 70 65 6e 20 74 68   Did not open th
2ced0 69 73 20 63 75 72 73 6f 72 20 66 6f 72 20 77 72  is cursor for wr
2cee0 69 74 69 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69  iting */.  }.  i
2cef0 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b  f( checkReadLock
2cf00 73 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2c 20  s(pCur->pBtree, 
2cf10 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCur->pgnoRoot, 
2cf20 70 43 75 72 2c 20 70 43 75 72 2d 3e 69 6e 66 6f  pCur, pCur->info
2cf30 2e 6e 4b 65 79 29 20 29 7b 0a 20 20 20 20 72 65  .nKey) ){.    re
2cf40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
2cf50 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62 6c 65  ED; /* The table
2cf60 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20   pCur points to 
2cf70 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
2cf80 2a 2f 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73  */.  }..  /* Res
2cf90 74 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  tore the current
2cfa0 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
2cfb0 20 28 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65   (a no-op if the
2cfc0 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69   cursor is not i
2cfd0 6e 20 0a 20 20 2a 2a 20 43 55 52 53 4f 52 5f 52  n .  ** CURSOR_R
2cfe0 45 51 55 49 52 45 53 45 45 4b 20 73 74 61 74 65  EQUIRESEEK state
2cff0 29 20 61 6e 64 20 73 61 76 65 20 74 68 65 20 70  ) and save the p
2d000 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20  ositions of any 
2d010 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 0a 20  other cursors . 
2d020 20 2a 2a 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20   ** open on the 
2d030 73 61 6d 65 20 74 61 62 6c 65 2e 20 54 68 65 6e  same table. Then
2d040 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
2d050 65 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 65  erWrite() on the
2d060 20 70 61 67 65 0a 20 20 2a 2a 20 74 68 61 74 20   page.  ** that 
2d070 74 68 65 20 65 6e 74 72 79 20 77 69 6c 6c 20 62  the entry will b
2d080 65 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 2e 0a  e deleted from..
2d090 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20    */.  if( .    
2d0a0 28 72 63 20 3d 20 72 65 73 74 6f 72 65 4f 72 43  (rc = restoreOrC
2d0b0 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
2d0c0 6f 6e 28 70 43 75 72 29 29 21 3d 30 20 7c 7c 0a  on(pCur))!=0 ||.
2d0d0 20 20 20 20 28 72 63 20 3d 20 73 61 76 65 41 6c      (rc = saveAl
2d0e0 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70 43  lCursors(pBt, pC
2d0f0 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43  ur->pgnoRoot, pC
2d100 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28  ur))!=0 ||.    (
2d110 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2d120 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44  rWrite(pPage->pD
2d130 62 50 61 67 65 29 29 21 3d 30 0a 20 20 29 7b 0a  bPage))!=0.  ){.
2d140 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2d150 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20   }..  /* Locate 
2d160 74 68 65 20 63 65 6c 6c 20 77 69 74 68 69 6e 20  the cell within 
2d170 69 74 73 20 70 61 67 65 20 61 6e 64 20 6c 65 61  its page and lea
2d180 76 65 20 70 43 65 6c 6c 20 70 6f 69 6e 74 69 6e  ve pCell pointin
2d190 67 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61  g to the.  ** da
2d1a0 74 61 2e 20 54 68 65 20 63 6c 65 61 72 43 65 6c  ta. The clearCel
2d1b0 6c 28 29 20 63 61 6c 6c 20 66 72 65 65 73 20 61  l() call frees a
2d1c0 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ny overflow page
2d1d0 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
2d1e0 68 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c 2e  h the.  ** cell.
2d1f0 20 54 68 65 20 63 65 6c 6c 20 69 74 73 65 6c 66   The cell itself
2d200 20 69 73 20 73 74 69 6c 6c 20 69 6e 74 61 63 74   is still intact
2d210 2e 0a 20 20 2a 2f 0a 20 20 70 43 65 6c 6c 20 3d  ..  */.  pCell =
2d220 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
2d230 20 70 43 75 72 2d 3e 69 64 78 29 3b 0a 20 20 69   pCur->idx);.  i
2d240 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2d250 29 7b 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c 64  ){.    pgnoChild
2d260 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c   = get4byte(pCel
2d270 6c 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63  l);.  }.  rc = c
2d280 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20  learCell(pPage, 
2d290 70 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20 72 63  pCell);.  if( rc
2d2a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
2d2b0 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70  c;.  }..  if( !p
2d2c0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
2d2d0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    /*.    ** The 
2d2e0 65 6e 74 72 79 20 77 65 20 61 72 65 20 61 62 6f  entry we are abo
2d2f0 75 74 20 74 6f 20 64 65 6c 65 74 65 20 69 73 20  ut to delete is 
2d300 6e 6f 74 20 61 20 6c 65 61 66 20 73 6f 20 69 66  not a leaf so if
2d310 20 77 65 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a   we do not.    *
2d320 2a 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77  * do something w
2d330 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 61 20 68  e will leave a h
2d340 6f 6c 65 20 6f 6e 20 61 6e 20 69 6e 74 65 72 6e  ole on an intern
2d350 61 6c 20 70 61 67 65 2e 0a 20 20 20 20 2a 2a 20  al page..    ** 
2d360 57 65 20 68 61 76 65 20 74 6f 20 66 69 6c 6c 20  We have to fill 
2d370 74 68 65 20 68 6f 6c 65 20 62 79 20 6d 6f 76 69  the hole by movi
2d380 6e 67 20 69 6e 20 61 20 63 65 6c 6c 20 66 72 6f  ng in a cell fro
2d390 6d 20 61 20 6c 65 61 66 2e 20 20 54 68 65 0a 20  m a leaf.  The. 
2d3a0 20 20 20 2a 2a 20 6e 65 78 74 20 43 65 6c 6c 20     ** next Cell 
2d3b0 61 66 74 65 72 20 74 68 65 20 6f 6e 65 20 74 6f  after the one to
2d3c0 20 62 65 20 64 65 6c 65 74 65 64 20 69 73 20 67   be deleted is g
2d3d0 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65 78 69  uaranteed to exi
2d3e0 73 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20 74 6f  st and.    ** to
2d3f0 20 62 65 20 61 20 6c 65 61 66 20 73 6f 20 77 65   be a leaf so we
2d400 20 63 61 6e 20 75 73 65 20 69 74 2e 0a 20 20 20   can use it..   
2d410 20 2a 2f 0a 20 20 20 20 42 74 43 75 72 73 6f 72   */.    BtCursor
2d420 20 6c 65 61 66 43 75 72 3b 0a 20 20 20 20 75 6e   leafCur;.    un
2d430 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4e 65  signed char *pNe
2d440 78 74 3b 0a 20 20 20 20 69 6e 74 20 6e 6f 74 55  xt;.    int notU
2d450 73 65 64 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  sed;.    unsigne
2d460 64 20 63 68 61 72 20 2a 74 65 6d 70 43 65 6c 6c  d char *tempCell
2d470 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
2d480 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 44 61  ( !pPage->leafDa
2d490 74 61 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ta );.    sqlite
2d4a0 33 42 74 72 65 65 47 65 74 54 65 6d 70 43 75 72  3BtreeGetTempCur
2d4b0 73 6f 72 28 70 43 75 72 2c 20 26 6c 65 61 66 43  sor(pCur, &leafC
2d4c0 75 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ur);.    rc = sq
2d4d0 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 26  lite3BtreeNext(&
2d4e0 6c 65 61 66 43 75 72 2c 20 26 6e 6f 74 55 73 65  leafCur, &notUse
2d4f0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  d);.    if( rc==
2d500 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d510 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2d520 61 67 65 72 57 72 69 74 65 28 6c 65 61 66 43 75  agerWrite(leafCu
2d530 72 2e 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  r.pPage->pDbPage
2d540 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
2d550 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2d560 7b 0a 20 20 20 20 20 20 75 31 36 20 73 7a 4e 65  {.      u16 szNe
2d570 78 74 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28  xt;.      TRACE(
2d580 28 22 44 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d  ("DELETE: table=
2d590 25 64 20 64 65 6c 65 74 65 20 69 6e 74 65 72 6e  %d delete intern
2d5a0 61 6c 20 66 72 6f 6d 20 25 64 20 72 65 70 6c 61  al from %d repla
2d5b0 63 65 20 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c  ce from leaf %d\
2d5c0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70 43 75  n",.         pCu
2d5d0 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61  r->pgnoRoot, pPa
2d5e0 67 65 2d 3e 70 67 6e 6f 2c 20 6c 65 61 66 43 75  ge->pgno, leafCu
2d5f0 72 2e 70 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b  r.pPage->pgno));
2d600 0a 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28  .      dropCell(
2d610 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
2d620 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  , cellSizePtr(pP
2d630 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20  age, pCell));.  
2d640 20 20 20 20 70 4e 65 78 74 20 3d 20 66 69 6e 64      pNext = find
2d650 43 65 6c 6c 28 6c 65 61 66 43 75 72 2e 70 50 61  Cell(leafCur.pPa
2d660 67 65 2c 20 6c 65 61 66 43 75 72 2e 69 64 78 29  ge, leafCur.idx)
2d670 3b 0a 20 20 20 20 20 20 73 7a 4e 65 78 74 20 3d  ;.      szNext =
2d680 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 6c 65 61   cellSizePtr(lea
2d690 66 43 75 72 2e 70 50 61 67 65 2c 20 70 4e 65 78  fCur.pPage, pNex
2d6a0 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
2d6b0 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  ( MX_CELL_SIZE(p
2d6c0 42 74 29 3e 3d 73 7a 4e 65 78 74 2b 34 20 29 3b  Bt)>=szNext+4 );
2d6d0 0a 20 20 20 20 20 20 61 6c 6c 6f 63 61 74 65 54  .      allocateT
2d6e0 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
2d6f0 20 20 20 20 20 74 65 6d 70 43 65 6c 6c 20 3d 20       tempCell = 
2d700 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  pBt->pTmpSpace;.
2d710 20 20 20 20 20 20 69 66 28 20 74 65 6d 70 43 65        if( tempCe
2d720 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ll==0 ){.       
2d730 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
2d740 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
2d750 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2d760 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
2d770 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70  c = insertCell(p
2d780 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c  Page, pCur->idx,
2d790 20 70 4e 65 78 74 2d 34 2c 20 73 7a 4e 65 78 74   pNext-4, szNext
2d7a0 2b 34 2c 20 74 65 6d 70 43 65 6c 6c 2c 20 30 29  +4, tempCell, 0)
2d7b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2d7c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2d7d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75 74  K ){.        put
2d7e0 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c  4byte(findOverfl
2d7f0 6f 77 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  owCell(pPage, pC
2d800 75 72 2d 3e 69 64 78 29 2c 20 70 67 6e 6f 43 68  ur->idx), pgnoCh
2d810 69 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ild);.        rc
2d820 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 67 65   = balance(pPage
2d830 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
2d840 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2d850 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2d860 20 64 72 6f 70 43 65 6c 6c 28 6c 65 61 66 43 75   dropCell(leafCu
2d870 72 2e 70 50 61 67 65 2c 20 6c 65 61 66 43 75 72  r.pPage, leafCur
2d880 2e 69 64 78 2c 20 73 7a 4e 65 78 74 29 3b 0a 20  .idx, szNext);. 
2d890 20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61         rc = bala
2d8a0 6e 63 65 28 6c 65 61 66 43 75 72 2e 70 50 61 67  nce(leafCur.pPag
2d8b0 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  e, 0);.      }. 
2d8c0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2d8d0 42 74 72 65 65 52 65 6c 65 61 73 65 54 65 6d 70  BtreeReleaseTemp
2d8e0 43 75 72 73 6f 72 28 26 6c 65 61 66 43 75 72 29  Cursor(&leafCur)
2d8f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54  ;.  }else{.    T
2d900 52 41 43 45 28 28 22 44 45 4c 45 54 45 3a 20 74  RACE(("DELETE: t
2d910 61 62 6c 65 3d 25 64 20 64 65 6c 65 74 65 20 66  able=%d delete f
2d920 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a  rom leaf %d\n",.
2d930 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e         pCur->pgn
2d940 6f 52 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67  oRoot, pPage->pg
2d950 6e 6f 29 29 3b 0a 20 20 20 20 64 72 6f 70 43 65  no));.    dropCe
2d960 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  ll(pPage, pCur->
2d970 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72  idx, cellSizePtr
2d980 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b  (pPage, pCell));
2d990 0a 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63  .    rc = balanc
2d9a0 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 7d  e(pPage, 0);.  }
2d9b0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2d9c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65  E_OK ){.    move
2d9d0 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20  ToRoot(pCur);.  
2d9e0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2d9f0 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
2da00 20 6e 65 77 20 42 54 72 65 65 20 74 61 62 6c 65   new BTree table
2da10 2e 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70  .  Write into *p
2da20 69 54 61 62 6c 65 20 74 68 65 20 70 61 67 65 0a  iTable the page.
2da30 2a 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68  ** number for th
2da40 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  e root page of t
2da50 68 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2a  he new table..**
2da60 0a 2a 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20  .** The type of 
2da70 74 79 70 65 20 69 73 20 64 65 74 65 72 6d 69 6e  type is determin
2da80 65 64 20 62 79 20 74 68 65 20 66 6c 61 67 73 20  ed by the flags 
2da90 70 61 72 61 6d 65 74 65 72 2e 20 20 4f 6e 6c 79  parameter.  Only
2daa0 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   the.** followin
2dab0 67 20 76 61 6c 75 65 73 20 6f 66 20 66 6c 61 67  g values of flag
2dac0 73 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20  s are currently 
2dad0 69 6e 20 75 73 65 2e 20 20 4f 74 68 65 72 20 76  in use.  Other v
2dae0 61 6c 75 65 73 20 66 6f 72 0a 2a 2a 20 66 6c 61  alues for.** fla
2daf0 67 73 20 6d 69 67 68 74 20 6e 6f 74 20 77 6f 72  gs might not wor
2db00 6b 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 42 54 52  k:.**.**     BTR
2db10 45 45 5f 49 4e 54 4b 45 59 7c 42 54 52 45 45 5f  EE_INTKEY|BTREE_
2db20 4c 45 41 46 44 41 54 41 20 20 20 20 20 55 73 65  LEAFDATA     Use
2db30 64 20 66 6f 72 20 53 51 4c 20 74 61 62 6c 65 73  d for SQL tables
2db40 20 77 69 74 68 20 72 6f 77 69 64 20 6b 65 79 73   with rowid keys
2db50 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 5a 45  .**     BTREE_ZE
2db60 52 4f 44 41 54 41 20 20 20 20 20 20 20 20 20 20  RODATA          
2db70 20 20 20 20 20 20 20 20 55 73 65 64 20 66 6f 72          Used for
2db80 20 53 51 4c 20 69 6e 64 69 63 65 73 0a 2a 2f 0a   SQL indices.*/.
2db90 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65  static int btree
2dba0 43 72 65 61 74 65 54 61 62 6c 65 28 42 74 72 65  CreateTable(Btre
2dbb0 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62  e *p, int *piTab
2dbc0 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  le, int flags){.
2dbd0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2dbe0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50  = p->pBt;.  MemP
2dbf0 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 50 67  age *pRoot;.  Pg
2dc00 6e 6f 20 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69  no pgnoRoot;.  i
2dc10 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
2dc20 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2dc30 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
2dc40 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e   if( pBt->inTran
2dc50 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57  saction!=TRANS_W
2dc60 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d  RITE ){.    /* M
2dc70 75 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e  ust start a tran
2dc80 73 61 63 74 69 6f 6e 20 66 69 72 73 74 20 2a 2f  saction first */
2dc90 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72  .    rc = pBt->r
2dca0 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45  eadOnly ? SQLITE
2dcb0 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49  _READONLY : SQLI
2dcc0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 65  TE_ERROR;.    re
2dcd0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
2dce0 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61  ssert( !pBt->rea
2dcf0 64 4f 6e 6c 79 20 29 3b 0a 0a 23 69 66 64 65 66  dOnly );..#ifdef
2dd00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2dd10 4f 56 41 43 55 55 4d 0a 20 20 72 63 20 3d 20 61  OVACUUM.  rc = a
2dd20 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
2dd30 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70  (pBt, &pRoot, &p
2dd40 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a  gnoRoot, 1, 0);.
2dd50 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2dd60 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23  return rc;.  }.#
2dd70 65 6c 73 65 0a 20 20 69 66 28 20 70 42 74 2d 3e  else.  if( pBt->
2dd80 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
2dd90 20 20 50 67 6e 6f 20 70 67 6e 6f 4d 6f 76 65 3b    Pgno pgnoMove;
2dda0 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 61 20        /* Move a 
2ddb0 70 61 67 65 20 68 65 72 65 20 74 6f 20 6d 61 6b  page here to mak
2ddc0 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 72  e room for the r
2ddd0 6f 6f 74 2d 70 61 67 65 20 2a 2f 0a 20 20 20 20  oot-page */.    
2dde0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 4d 6f  MemPage *pPageMo
2ddf0 76 65 3b 20 2f 2a 20 54 68 65 20 70 61 67 65 20  ve; /* The page 
2de00 74 6f 20 6d 6f 76 65 20 74 6f 2e 20 2a 2f 0a 0a  to move to. */..
2de10 20 20 20 20 2f 2a 20 43 72 65 61 74 69 6e 67 20      /* Creating 
2de20 61 20 6e 65 77 20 74 61 62 6c 65 20 6d 61 79 20  a new table may 
2de30 70 72 6f 62 61 62 6c 79 20 72 65 71 75 69 72 65  probably require
2de40 20 6d 6f 76 69 6e 67 20 61 6e 20 65 78 69 73 74   moving an exist
2de50 69 6e 67 20 64 61 74 61 62 61 73 65 0a 20 20 20  ing database.   
2de60 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d   ** to make room
2de70 20 66 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62   for the new tab
2de80 6c 65 73 20 72 6f 6f 74 20 70 61 67 65 2e 20 49  les root page. I
2de90 6e 20 63 61 73 65 20 74 68 69 73 20 70 61 67 65  n case this page
2dea0 20 74 75 72 6e 73 0a 20 20 20 20 2a 2a 20 6f 75   turns.    ** ou
2deb0 74 20 74 6f 20 62 65 20 61 6e 20 6f 76 65 72 66  t to be an overf
2dec0 6c 6f 77 20 70 61 67 65 2c 20 64 65 6c 65 74 65  low page, delete
2ded0 20 61 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 70 61   all overflow pa
2dee0 67 65 2d 6d 61 70 20 63 61 63 68 65 73 0a 20 20  ge-map caches.  
2def0 20 20 2a 2a 20 68 65 6c 64 20 62 79 20 6f 70 65    ** held by ope
2df00 6e 20 63 75 72 73 6f 72 73 2e 0a 20 20 20 20 2a  n cursors..    *
2df10 2f 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  /.    invalidate
2df20 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65  AllOverflowCache
2df30 28 70 42 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 52  (pBt);..    /* R
2df40 65 61 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ead the value of
2df50 20 6d 65 74 61 5b 33 5d 20 66 72 6f 6d 20 74 68   meta[3] from th
2df60 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 65  e database to de
2df70 74 65 72 6d 69 6e 65 20 77 68 65 72 65 20 74 68  termine where th
2df80 65 0a 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61  e.    ** root pa
2df90 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61  ge of the new ta
2dfa0 62 6c 65 20 73 68 6f 75 6c 64 20 67 6f 2e 20 6d  ble should go. m
2dfb0 65 74 61 5b 33 5d 20 69 73 20 74 68 65 20 6c 61  eta[3] is the la
2dfc0 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a  rgest root-page.
2dfd0 20 20 20 20 2a 2a 20 63 72 65 61 74 65 64 20 73      ** created s
2dfe0 6f 20 66 61 72 2c 20 73 6f 20 74 68 65 20 6e 65  o far, so the ne
2dff0 77 20 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 28  w root-page is (
2e000 6d 65 74 61 5b 33 5d 2b 31 29 2e 0a 20 20 20 20  meta[3]+1)..    
2e010 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
2e020 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28  te3BtreeGetMeta(
2e030 70 2c 20 34 2c 20 26 70 67 6e 6f 52 6f 6f 74 29  p, 4, &pgnoRoot)
2e040 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2e050 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2e060 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2e070 7d 0a 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b  }.    pgnoRoot++
2e080 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65  ;..    /* The ne
2e090 77 20 72 6f 6f 74 2d 70 61 67 65 20 6d 61 79 20  w root-page may 
2e0a0 6e 6f 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  not be allocated
2e0b0 20 6f 6e 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61   on a pointer-ma
2e0c0 70 20 70 61 67 65 2c 20 6f 72 20 74 68 65 0a 20  p page, or the. 
2e0d0 20 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59     ** PENDING_BY
2e0e0 54 45 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  TE page..    */.
2e0f0 20 20 20 20 77 68 69 6c 65 28 20 70 67 6e 6f 52      while( pgnoR
2e100 6f 6f 74 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45  oot==PTRMAP_PAGE
2e110 4e 4f 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74  NO(pBt, pgnoRoot
2e120 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 70 67 6e  ) ||.        pgn
2e130 6f 52 6f 6f 74 3d 3d 50 45 4e 44 49 4e 47 5f 42  oRoot==PENDING_B
2e140 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
2e150 0a 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b  .      pgnoRoot+
2e160 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  +;.    }.    ass
2e170 65 72 74 28 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33  ert( pgnoRoot>=3
2e180 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f   );..    /* Allo
2e190 63 61 74 65 20 61 20 70 61 67 65 2e 20 54 68 65  cate a page. The
2e1a0 20 70 61 67 65 20 74 68 61 74 20 63 75 72 72 65   page that curre
2e1b0 6e 74 6c 79 20 72 65 73 69 64 65 73 20 61 74 20  ntly resides at 
2e1c0 70 67 6e 6f 52 6f 6f 74 20 77 69 6c 6c 0a 20 20  pgnoRoot will.  
2e1d0 20 20 2a 2a 20 62 65 20 6d 6f 76 65 64 20 74 6f    ** be moved to
2e1e0 20 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70   the allocated p
2e1f0 61 67 65 20 28 75 6e 6c 65 73 73 20 74 68 65 20  age (unless the 
2e200 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68  allocated page h
2e210 61 70 70 65 6e 73 0a 20 20 20 20 2a 2a 20 74 6f  appens.    ** to
2e220 20 72 65 73 69 64 65 20 61 74 20 70 67 6e 6f 52   reside at pgnoR
2e230 6f 6f 74 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  oot)..    */.   
2e240 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
2e250 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 50  reePage(pBt, &pP
2e260 61 67 65 4d 6f 76 65 2c 20 26 70 67 6e 6f 4d 6f  ageMove, &pgnoMo
2e270 76 65 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 31 29  ve, pgnoRoot, 1)
2e280 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2e290 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2e2a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2e2b0 7d 0a 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 4d  }..    if( pgnoM
2e2c0 6f 76 65 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 7b  ove!=pgnoRoot ){
2e2d0 0a 20 20 20 20 20 20 2f 2a 20 70 67 6e 6f 52 6f  .      /* pgnoRo
2e2e0 6f 74 20 69 73 20 74 68 65 20 70 61 67 65 20 74  ot is the page t
2e2f0 68 61 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64  hat will be used
2e300 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61   for the root-pa
2e310 67 65 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74  ge of.      ** t
2e320 68 65 20 6e 65 77 20 74 61 62 6c 65 20 28 61 73  he new table (as
2e330 73 75 6d 69 6e 67 20 61 6e 20 65 72 72 6f 72 20  suming an error 
2e340 64 69 64 20 6e 6f 74 20 6f 63 63 75 72 29 2e 20  did not occur). 
2e350 42 75 74 20 77 65 20 77 65 72 65 0a 20 20 20 20  But we were.    
2e360 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70    ** allocated p
2e370 67 6e 6f 4d 6f 76 65 2e 20 49 66 20 72 65 71 75  gnoMove. If requ
2e380 69 72 65 64 20 28 69 2e 65 2e 20 69 66 20 69 74  ired (i.e. if it
2e390 20 77 61 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74   was not allocat
2e3a0 65 64 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 65  ed.      ** by e
2e3b0 78 74 65 6e 64 69 6e 67 20 74 68 65 20 66 69 6c  xtending the fil
2e3c0 65 29 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20  e), the current 
2e3d0 70 61 67 65 20 61 74 20 70 6f 73 69 74 69 6f 6e  page at position
2e3e0 20 70 67 6e 6f 4d 6f 76 65 0a 20 20 20 20 20 20   pgnoMove.      
2e3f0 2a 2a 20 69 73 20 61 6c 72 65 61 64 79 20 6a 6f  ** is already jo
2e400 75 72 6e 61 6c 65 64 2e 0a 20 20 20 20 20 20 2a  urnaled..      *
2e410 2f 0a 20 20 20 20 20 20 75 38 20 65 54 79 70 65  /.      u8 eType
2e420 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 69 50 74  ;.      Pgno iPt
2e430 72 50 61 67 65 3b 0a 0a 20 20 20 20 20 20 72 65  rPage;..      re
2e440 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65 4d  leasePage(pPageM
2e450 6f 76 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ove);..      /* 
2e460 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 63 75  Move the page cu
2e470 72 72 65 6e 74 6c 79 20 61 74 20 70 67 6e 6f 52  rrently at pgnoR
2e480 6f 6f 74 20 74 6f 20 70 67 6e 6f 4d 6f 76 65 2e  oot to pgnoMove.
2e490 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
2e4a0 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
2e4b0 67 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74  ge(pBt, pgnoRoot
2e4c0 2c 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20  , &pRoot, 0);.  
2e4d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2e4e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2e4f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
2e500 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70    }.      rc = p
2e510 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 70 67  trmapGet(pBt, pg
2e520 6e 6f 52 6f 6f 74 2c 20 26 65 54 79 70 65 2c 20  noRoot, &eType, 
2e530 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  &iPtrPage);.    
2e540 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2e550 5f 4f 4b 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  _OK || eType==PT
2e560 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 7c 7c  RMAP_ROOTPAGE ||
2e570 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
2e580 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
2e590 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2e5a0 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72  Root);.        r
2e5b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2e5c0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
2e5d0 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f  eType!=PTRMAP_RO
2e5e0 4f 54 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20  OTPAGE );.      
2e5f0 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 50  assert( eType!=P
2e600 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29  TRMAP_FREEPAGE )
2e610 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
2e620 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2e630 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Root->pDbPage);.
2e640 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2e650 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2e660 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
2e670 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72  Root);.        r
2e680 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2e690 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c  }.      rc = rel
2e6a0 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20 70  ocatePage(pBt, p
2e6b0 52 6f 6f 74 2c 20 65 54 79 70 65 2c 20 69 50 74  Root, eType, iPt
2e6c0 72 50 61 67 65 2c 20 70 67 6e 6f 4d 6f 76 65 29  rPage, pgnoMove)
2e6d0 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
2e6e0 61 67 65 28 70 52 6f 6f 74 29 3b 0a 0a 20 20 20  age(pRoot);..   
2e6f0 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 74 68 65     /* Obtain the
2e700 20 70 61 67 65 20 61 74 20 70 67 6e 6f 52 6f 6f   page at pgnoRoo
2e710 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72  t */.      if( r
2e720 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2e730 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2e740 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
2e750 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2e760 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70  eeGetPage(pBt, p
2e770 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c  gnoRoot, &pRoot,
2e780 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
2e790 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2e7a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2e7b0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
2e7c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2e7d0 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70  erWrite(pRoot->p
2e7e0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
2e7f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2e800 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
2e810 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
2e820 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2e830 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
2e840 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 6f 6f  else{.      pRoo
2e850 74 20 3d 20 70 50 61 67 65 4d 6f 76 65 3b 0a 20  t = pPageMove;. 
2e860 20 20 20 7d 20 0a 0a 20 20 20 20 2f 2a 20 55 70     } ..    /* Up
2e870 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
2e880 2d 6d 61 70 20 61 6e 64 20 6d 65 74 61 2d 64 61  -map and meta-da
2e890 74 61 20 77 69 74 68 20 74 68 65 20 6e 65 77 20  ta with the new 
2e8a0 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
2e8b0 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 74  . */.    rc = pt
2e8c0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
2e8d0 6f 52 6f 6f 74 2c 20 50 54 52 4d 41 50 5f 52 4f  oRoot, PTRMAP_RO
2e8e0 4f 54 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20  OTPAGE, 0);.    
2e8f0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2e900 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
2e910 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
2e920 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
2e930 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2e940 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c  UpdateMeta(p, 4,
2e950 20 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20   pgnoRoot);.    
2e960 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2e970 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
2e980 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
2e990 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65   rc;.    }..  }e
2e9a0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c  lse{.    rc = al
2e9b0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
2e9c0 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67  pBt, &pRoot, &pg
2e9d0 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20  noRoot, 1, 0);. 
2e9e0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2e9f0 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn rc;.  }.#endi
2ea00 66 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  f.  assert( sqli
2ea10 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2ea20 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61  ble(pRoot->pDbPa
2ea30 67 65 29 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67  ge) );.  zeroPag
2ea40 65 28 70 52 6f 6f 74 2c 20 66 6c 61 67 73 20 7c  e(pRoot, flags |
2ea50 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 73 71   PTF_LEAF);.  sq
2ea60 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
2ea70 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b  pRoot->pDbPage);
2ea80 0a 20 20 2a 70 69 54 61 62 6c 65 20 3d 20 28 69  .  *piTable = (i
2ea90 6e 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72  nt)pgnoRoot;.  r
2eaa0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2eab0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
2eac0 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 42  reeCreateTable(B
2ead0 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69  tree *p, int *pi
2eae0 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73  Table, int flags
2eaf0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
2eb00 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
2eb10 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 64  (p);.  p->pBt->d
2eb20 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20  b = p->db;.  rc 
2eb30 3d 20 62 74 72 65 65 43 72 65 61 74 65 54 61 62  = btreeCreateTab
2eb40 6c 65 28 70 2c 20 70 69 54 61 62 6c 65 2c 20 66  le(p, piTable, f
2eb50 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33  lags);.  sqlite3
2eb60 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
2eb70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2eb80 2a 0a 2a 2a 20 45 72 61 73 65 20 74 68 65 20 67  *.** Erase the g
2eb90 69 76 65 6e 20 64 61 74 61 62 61 73 65 20 70 61  iven database pa
2eba0 67 65 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 63  ge and all its c
2ebb0 68 69 6c 64 72 65 6e 2e 20 20 52 65 74 75 72 6e  hildren.  Return
2ebc0 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 74 6f 20  .** the page to 
2ebd0 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2f  the freelist..*/
2ebe0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61  .static int clea
2ebf0 72 44 61 74 61 62 61 73 65 50 61 67 65 28 0a 20  rDatabasePage(. 
2ec00 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
2ec10 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2ec20 20 42 54 72 65 65 20 74 68 61 74 20 63 6f 6e 74   BTree that cont
2ec30 61 69 6e 73 20 74 68 65 20 74 61 62 6c 65 20 2a  ains the table *
2ec40 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
2ec50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
2ec60 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 6c 65 61  e number to clea
2ec70 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  r */.  MemPage *
2ec80 70 50 61 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20  pParent,     /* 
2ec90 50 61 72 65 6e 74 20 70 61 67 65 2e 20 20 4e 55  Parent page.  NU
2eca0 4c 4c 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20  LL for the root 
2ecb0 2a 2f 0a 20 20 69 6e 74 20 66 72 65 65 50 61 67  */.  int freePag
2ecc0 65 46 6c 61 67 20 20 20 20 20 20 2f 2a 20 44 65  eFlag      /* De
2ecd0 61 6c 6c 6f 63 61 74 65 20 70 61 67 65 20 69 66  allocate page if
2ece0 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65   true */.){.  Me
2ecf0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
2ed00 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e  ;.  int rc;.  un
2ed10 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
2ed20 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  ll;.  int i;..  
2ed30 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2ed40 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
2ed50 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
2ed60 70 67 6e 6f 3e 70 61 67 65 72 50 61 67 65 63 6f  pgno>pagerPageco
2ed70 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
2ed80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2ed90 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2eda0 50 54 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  PT;.  }..  rc = 
2edb0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
2edc0 42 74 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65  Bt, pgno, &pPage
2edd0 2c 20 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66  , pParent);.  if
2ede0 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61  ( rc ) goto clea
2edf0 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75  rdatabasepage_ou
2ee00 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  t;.  for(i=0; i<
2ee10 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  pPage->nCell; i+
2ee20 2b 29 7b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20  +){.    pCell = 
2ee30 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
2ee40 69 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61  i);.    if( !pPa
2ee50 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
2ee60 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61    rc = clearData
2ee70 62 61 73 65 50 61 67 65 28 70 42 74 2c 20 67 65  basePage(pBt, ge
2ee80 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20 70  t4byte(pCell), p
2ee90 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 2c 20 31  Page->pParent, 1
2eea0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
2eeb0 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61  ) goto cleardata
2eec0 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  basepage_out;.  
2eed0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6c 65    }.    rc = cle
2eee0 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  arCell(pPage, pC
2eef0 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ell);.    if( rc
2ef00 20 29 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74   ) goto cleardat
2ef10 61 62 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20  abasepage_out;. 
2ef20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d   }.  if( !pPage-
2ef30 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 63 20  >leaf ){.    rc 
2ef40 3d 20 63 6c 65 61 72 44 61 74 61 62 61 73 65 50  = clearDatabaseP
2ef50 61 67 65 28 70 42 74 2c 20 67 65 74 34 62 79 74  age(pBt, get4byt
2ef60 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
2ef70 38 5d 29 2c 20 70 50 61 67 65 2d 3e 70 50 61 72  8]), pPage->pPar
2ef80 65 6e 74 2c 20 31 29 3b 0a 20 20 20 20 69 66 28  ent, 1);.    if(
2ef90 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61 72   rc ) goto clear
2efa0 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75 74  databasepage_out
2efb0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 72 65 65  ;.  }.  if( free
2efc0 50 61 67 65 46 6c 61 67 20 29 7b 0a 20 20 20 20  PageFlag ){.    
2efd0 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50  rc = freePage(pP
2efe0 61 67 65 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  age);.  }else if
2eff0 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50  ( (rc = sqlite3P
2f000 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
2f010 3e 70 44 62 50 61 67 65 29 29 3d 3d 30 20 29 7b  >pDbPage))==0 ){
2f020 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 50  .    zeroPage(pP
2f030 61 67 65 2c 20 70 50 61 67 65 2d 3e 61 44 61 74  age, pPage->aDat
2f040 61 5b 30 5d 20 7c 20 50 54 46 5f 4c 45 41 46 29  a[0] | PTF_LEAF)
2f050 3b 0a 20 20 7d 0a 0a 63 6c 65 61 72 64 61 74 61  ;.  }..cleardata
2f060 62 61 73 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20  basepage_out:.  
2f070 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
2f080 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  e);.  return rc;
2f090 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
2f0a0 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
2f0b0 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65 20 74   from a single t
2f0c0 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61  able in the data
2f0d0 62 61 73 65 2e 20 20 69 54 61 62 6c 65 20 69 73  base.  iTable is
2f0e0 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d  .** the page num
2f0f0 62 65 72 20 6f 66 20 74 68 65 20 72 6f 6f 74 20  ber of the root 
2f100 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 41  of the table.  A
2f110 66 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  fter this routin
2f120 65 20 72 65 74 75 72 6e 73 2c 0a 2a 2a 20 74 68  e returns,.** th
2f130 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 65  e root page is e
2f140 6d 70 74 79 2c 20 62 75 74 20 73 74 69 6c 6c 20  mpty, but still 
2f150 65 78 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  exists..**.** Th
2f160 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
2f170 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54 45  fail with SQLITE
2f180 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72 65  _LOCKED if there
2f190 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a   are any open.**
2f1a0 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 6f 6e   read cursors on
2f1b0 20 74 68 65 20 74 61 62 6c 65 2e 20 20 4f 70 65   the table.  Ope
2f1c0 6e 20 77 72 69 74 65 20 63 75 72 73 6f 72 73 20  n write cursors 
2f1d0 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65  are moved to the
2f1e0 0a 2a 2a 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  .** root of the 
2f1f0 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  table..*/.int sq
2f200 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 54  lite3BtreeClearT
2f210 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69  able(Btree *p, i
2f220 6e 74 20 69 54 61 62 6c 65 29 7b 0a 20 20 69 6e  nt iTable){.  in
2f230 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
2f240 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
2f250 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
2f260 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64  ter(p);.  pBt->d
2f270 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28  b = p->db;.  if(
2f280 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41   p->inTrans!=TRA
2f290 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
2f2a0 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e  rc = pBt->readOn
2f2b0 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44  ly ? SQLITE_READ
2f2c0 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52  ONLY : SQLITE_ER
2f2d0 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ROR;.  }else if(
2f2e0 20 28 72 63 20 3d 20 63 68 65 63 6b 52 65 61 64   (rc = checkRead
2f2f0 4c 6f 63 6b 73 28 70 2c 20 69 54 61 62 6c 65 2c  Locks(p, iTable,
2f300 20 30 2c 20 31 29 29 21 3d 53 51 4c 49 54 45 5f   0, 1))!=SQLITE_
2f310 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74  OK ){.    /* not
2f320 68 69 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20  hing to do */.  
2f330 7d 65 6c 73 65 20 69 66 28 20 53 51 4c 49 54 45  }else if( SQLITE
2f340 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76 65 41  _OK!=(rc = saveA
2f350 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 69  llCursors(pBt, i
2f360 54 61 62 6c 65 2c 20 30 29 29 20 29 7b 0a 20 20  Table, 0)) ){.  
2f370 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20    /* nothing to 
2f380 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20  do */.  }else{. 
2f390 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74     rc = clearDat
2f3a0 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20 28  abasePage(pBt, (
2f3b0 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 30 2c 20  Pgno)iTable, 0, 
2f3c0 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  0);.  }.  sqlite
2f3d0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
2f3e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2f3f0 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 61 6c 6c 20  /*.** Erase all 
2f400 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 61  information in a
2f410 20 74 61 62 6c 65 20 61 6e 64 20 61 64 64 20 74   table and add t
2f420 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  he root of the t
2f430 61 62 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 66  able to.** the f
2f440 72 65 65 6c 69 73 74 2e 20 20 45 78 63 65 70 74  reelist.  Except
2f450 2c 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68  , the root of th
2f460 65 20 70 72 69 6e 63 69 70 6c 65 20 74 61 62 6c  e principle tabl
2f470 65 20 28 74 68 65 20 6f 6e 65 20 6f 6e 0a 2a 2a  e (the one on.**
2f480 20 70 61 67 65 20 31 29 20 69 73 20 6e 65 76 65   page 1) is neve
2f490 72 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  r added to the f
2f4a0 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 54  reelist..**.** T
2f4b0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
2f4c0 20 66 61 69 6c 20 77 69 74 68 20 53 51 4c 49 54   fail with SQLIT
2f4d0 45 5f 4c 4f 43 4b 45 44 20 69 66 20 74 68 65 72  E_LOCKED if ther
2f4e0 65 20 61 72 65 20 61 6e 79 20 6f 70 65 6e 0a 2a  e are any open.*
2f4f0 2a 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65  * cursors on the
2f500 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
2f510 20 41 55 54 4f 56 41 43 55 55 4d 20 69 73 20 65   AUTOVACUUM is e
2f520 6e 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20 70  nabled and the p
2f530 61 67 65 20 61 74 20 69 54 61 62 6c 65 20 69 73  age at iTable is
2f540 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 2a 2a   not the last.**
2f550 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68   root page in th
2f560 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
2f570 20 74 68 65 6e 20 74 68 65 20 6c 61 73 74 20 72   then the last r
2f580 6f 6f 74 20 70 61 67 65 20 0a 2a 2a 20 69 6e 20  oot page .** in 
2f590 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2f5a0 65 20 69 73 20 6d 6f 76 65 64 20 69 6e 74 6f 20  e is moved into 
2f5b0 74 68 65 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c  the slot formerl
2f5c0 79 20 6f 63 63 75 70 69 65 64 20 62 79 0a 2a 2a  y occupied by.**
2f5d0 20 69 54 61 62 6c 65 20 61 6e 64 20 74 68 61 74   iTable and that
2f5e0 20 6c 61 73 74 20 73 6c 6f 74 20 66 6f 72 6d 65   last slot forme
2f5f0 72 6c 79 20 6f 63 63 75 70 69 65 64 20 62 79 20  rly occupied by 
2f600 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61  the last root pa
2f610 67 65 0a 2a 2a 20 69 73 20 61 64 64 65 64 20 74  ge.** is added t
2f620 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 69  o the freelist i
2f630 6e 73 74 65 61 64 20 6f 66 20 69 54 61 62 6c 65  nstead of iTable
2f640 2e 20 20 49 6e 20 74 68 69 73 20 73 61 79 2c 20  .  In this say, 
2f650 61 6c 6c 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  all.** root page
2f660 73 20 61 72 65 20 6b 65 70 74 20 61 74 20 74 68  s are kept at th
2f670 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
2f680 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2f690 2c 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 6e 65  , which.** is ne
2f6a0 63 65 73 73 61 72 79 20 66 6f 72 20 41 55 54 4f  cessary for AUTO
2f6b0 56 41 43 55 55 4d 20 74 6f 20 77 6f 72 6b 20 72  VACUUM to work r
2f6c0 69 67 68 74 2e 20 20 2a 70 69 4d 6f 76 65 64 20  ight.  *piMoved 
2f6d0 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 0a 2a  is set to the .*
2f6e0 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 68  * page number th
2f6f0 61 74 20 75 73 65 64 20 74 6f 20 62 65 20 74 68  at used to be th
2f700 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65  e last root page
2f710 20 69 6e 20 74 68 65 20 66 69 6c 65 20 62 65 66   in the file bef
2f720 6f 72 65 0a 2a 2a 20 74 68 65 20 6d 6f 76 65 2e  ore.** the move.
2f730 20 20 49 66 20 6e 6f 20 70 61 67 65 20 67 65 74    If no page get
2f740 73 20 6d 6f 76 65 64 2c 20 2a 70 69 4d 6f 76 65  s moved, *piMove
2f750 64 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a  d is set to 0..*
2f760 2a 20 54 68 65 20 6c 61 73 74 20 72 6f 6f 74 20  * The last root 
2f770 70 61 67 65 20 69 73 20 72 65 63 6f 72 64 65 64  page is recorded
2f780 20 69 6e 20 6d 65 74 61 5b 33 5d 20 61 6e 64 20   in meta[3] and 
2f790 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  the value of.** 
2f7a0 6d 65 74 61 5b 33 5d 20 69 73 20 75 70 64 61 74  meta[3] is updat
2f7b0 65 64 20 62 79 20 74 68 69 73 20 70 72 6f 63 65  ed by this proce
2f7c0 64 75 72 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  dure..*/.static 
2f7d0 69 6e 74 20 62 74 72 65 65 44 72 6f 70 54 61 62  int btreeDropTab
2f7e0 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  le(Btree *p, int
2f7f0 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a 70 69   iTable, int *pi
2f800 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63  Moved){.  int rc
2f810 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
2f820 67 65 20 3d 20 30 3b 0a 20 20 42 74 53 68 61 72  ge = 0;.  BtShar
2f830 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2f840 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
2f850 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75  ite3BtreeHoldsMu
2f860 74 65 78 28 70 29 20 29 3b 0a 20 20 69 66 28 20  tex(p) );.  if( 
2f870 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
2f880 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 72  S_WRITE ){.    r
2f890 65 74 75 72 6e 20 70 42 74 2d 3e 72 65 61 64 4f  eturn pBt->readO
2f8a0 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41  nly ? SQLITE_REA
2f8b0 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45  DONLY : SQLITE_E
2f8c0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  RROR;.  }..  /* 
2f8d0 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f  It is illegal to
2f8e0 20 64 72 6f 70 20 61 20 74 61 62 6c 65 20 69 66   drop a table if
2f8f0 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61 72 65   any cursors are
2f900 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 20 20 2a   open on the.  *
2f910 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73  * database. This
2f920 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 61   is because in a
2f930 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20  uto-vacuum mode 
2f940 74 68 65 20 62 61 63 6b 65 6e 64 20 6d 61 79 0a  the backend may.
2f950 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 6d 6f 76    ** need to mov
2f960 65 20 61 6e 6f 74 68 65 72 20 72 6f 6f 74 2d 70  e another root-p
2f970 61 67 65 20 74 6f 20 66 69 6c 6c 20 61 20 67 61  age to fill a ga
2f980 70 20 6c 65 66 74 20 62 79 20 74 68 65 20 64 65  p left by the de
2f990 6c 65 74 65 64 0a 20 20 2a 2a 20 72 6f 6f 74 20  leted.  ** root 
2f9a0 70 61 67 65 2e 20 49 66 20 61 6e 20 6f 70 65 6e  page. If an open
2f9b0 20 63 75 72 73 6f 72 20 77 61 73 20 75 73 69 6e   cursor was usin
2f9c0 67 20 74 68 69 73 20 70 61 67 65 20 61 20 70 72  g this page a pr
2f9d0 6f 62 6c 65 6d 20 77 6f 75 6c 64 20 0a 20 20 2a  oblem would .  *
2f9e0 2a 20 6f 63 63 75 72 2e 0a 20 20 2a 2f 0a 20 20  * occur..  */.  
2f9f0 69 66 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72  if( pBt->pCursor
2fa00 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2fa10 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20  QLITE_LOCKED;.  
2fa20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  }..  rc = sqlite
2fa30 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42  3BtreeGetPage(pB
2fa40 74 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c  t, (Pgno)iTable,
2fa50 20 26 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 69   &pPage, 0);.  i
2fa60 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
2fa70 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  c;.  rc = sqlite
2fa80 33 42 74 72 65 65 43 6c 65 61 72 54 61 62 6c 65  3BtreeClearTable
2fa90 28 70 2c 20 69 54 61 62 6c 65 29 3b 0a 20 20 69  (p, iTable);.  i
2faa0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 6c  f( rc ){.    rel
2fab0 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
2fac0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2fad0 20 20 7d 0a 0a 20 20 2a 70 69 4d 6f 76 65 64 20    }..  *piMoved 
2fae0 3d 20 30 3b 0a 0a 20 20 69 66 28 20 69 54 61 62  = 0;..  if( iTab
2faf0 6c 65 3e 31 20 29 7b 0a 23 69 66 64 65 66 20 53  le>1 ){.#ifdef S
2fb00 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2fb10 41 43 55 55 4d 0a 20 20 20 20 72 63 20 3d 20 66  ACUUM.    rc = f
2fb20 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  reePage(pPage);.
2fb30 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2fb40 70 50 61 67 65 29 3b 0a 23 65 6c 73 65 0a 20 20  pPage);.#else.  
2fb50 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
2fb60 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 50  acuum ){.      P
2fb70 67 6e 6f 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b  gno maxRootPgno;
2fb80 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2fb90 74 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28  te3BtreeGetMeta(
2fba0 70 2c 20 34 2c 20 26 6d 61 78 52 6f 6f 74 50 67  p, 4, &maxRootPg
2fbb0 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
2fbc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2fbd0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
2fbe0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
2fbf0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2fc00 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
2fc10 28 20 69 54 61 62 6c 65 3d 3d 6d 61 78 52 6f 6f  ( iTable==maxRoo
2fc20 74 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  tPgno ){.       
2fc30 20 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65   /* If the table
2fc40 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20 69   being dropped i
2fc50 73 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68  s the table with
2fc60 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f   the largest roo
2fc70 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  t-page.        *
2fc80 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20  * number in the 
2fc90 64 61 74 61 62 61 73 65 2c 20 70 75 74 20 74 68  database, put th
2fca0 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 6e 20 74  e root page on t
2fcb0 68 65 20 66 72 65 65 20 6c 69 73 74 2e 20 0a 20  he free list. . 
2fcc0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2fcd0 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
2fce0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
2fcf0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
2fd00 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
2fd10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2fd20 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
2fd30 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
2fd40 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2fd50 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
2fd60 65 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20  e being dropped 
2fd70 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 68  does not have th
2fd80 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  e largest root-p
2fd90 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  age.        ** n
2fda0 75 6d 62 65 72 20 69 6e 20 74 68 65 20 64 61 74  umber in the dat
2fdb0 61 62 61 73 65 2e 20 53 6f 20 6d 6f 76 65 20 74  abase. So move t
2fdc0 68 65 20 70 61 67 65 20 74 68 61 74 20 64 6f 65  he page that doe
2fdd0 73 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20  s into the .    
2fde0 20 20 20 20 2a 2a 20 67 61 70 20 6c 65 66 74 20      ** gap left 
2fdf0 62 79 20 74 68 65 20 64 65 6c 65 74 65 64 20 72  by the deleted r
2fe00 6f 6f 74 2d 70 61 67 65 2e 0a 20 20 20 20 20 20  oot-page..      
2fe10 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4d 65 6d    */.        Mem
2fe20 50 61 67 65 20 2a 70 4d 6f 76 65 3b 0a 20 20 20  Page *pMove;.   
2fe30 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
2fe40 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
2fe50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2fe60 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6d  eeGetPage(pBt, m
2fe70 61 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f  axRootPgno, &pMo
2fe80 76 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ve, 0);.        
2fe90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2fea0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
2feb0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
2fec0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d    }.        rc =
2fed0 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42   relocatePage(pB
2fee0 74 2c 20 70 4d 6f 76 65 2c 20 50 54 52 4d 41 50  t, pMove, PTRMAP
2fef0 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20 69 54  _ROOTPAGE, 0, iT
2ff00 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 72  able);.        r
2ff10 65 6c 65 61 73 65 50 61 67 65 28 70 4d 6f 76 65  eleasePage(pMove
2ff20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2ff30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2ff40 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2ff50 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
2ff60 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2ff70 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
2ff80 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f  pBt, maxRootPgno
2ff90 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a 20 20  , &pMove, 0);.  
2ffa0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2ffb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2ffc0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2ffd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ffe0 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
2fff0 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20  pMove);.        
30000 72 65 6c 65 61 73 65 50 61 67 65 28 70 4d 6f 76  releasePage(pMov
30010 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
30020 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
30030 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
30040 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
30050 20 20 20 20 20 20 20 20 2a 70 69 4d 6f 76 65 64          *piMoved
30060 20 3d 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a   = maxRootPgno;.
30070 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
30080 2a 20 53 65 74 20 74 68 65 20 6e 65 77 20 27 6d  * Set the new 'm
30090 61 78 2d 72 6f 6f 74 2d 70 61 67 65 27 20 76 61  ax-root-page' va
300a0 6c 75 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  lue in the datab
300b0 61 73 65 20 68 65 61 64 65 72 2e 20 54 68 69 73  ase header. This
300c0 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65  .      ** is the
300d0 20 6f 6c 64 20 76 61 6c 75 65 20 6c 65 73 73 20   old value less 
300e0 6f 6e 65 2c 20 6c 65 73 73 20 6f 6e 65 20 6d 6f  one, less one mo
300f0 72 65 20 69 66 20 74 68 61 74 20 68 61 70 70 65  re if that happe
30100 6e 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62  ns to.      ** b
30110 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75  e a root-page nu
30120 6d 62 65 72 2c 20 6c 65 73 73 20 6f 6e 65 20 61  mber, less one a
30130 67 61 69 6e 20 69 66 20 74 68 61 74 20 69 73 20  gain if that is 
30140 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 50 45 4e  the.      ** PEN
30150 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 2e 0a  DING_BYTE_PAGE..
30160 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d        */.      m
30170 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20  axRootPgno--;.  
30180 20 20 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50      if( maxRootP
30190 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno==PENDING_BYT
301a0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
301b0 20 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67         maxRootPg
301c0 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  no--;.      }.  
301d0 20 20 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50      if( maxRootP
301e0 67 6e 6f 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45  gno==PTRMAP_PAGE
301f0 4e 4f 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50  NO(pBt, maxRootP
30200 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20  gno) ){.        
30210 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20  maxRootPgno--;. 
30220 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
30230 65 72 74 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f  ert( maxRootPgno
30240 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
30250 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 20 20 20  AGE(pBt) );..   
30260 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
30270 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 70  treeUpdateMeta(p
30280 2c 20 34 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f  , 4, maxRootPgno
30290 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
302a0 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
302b0 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
302c0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
302d0 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
302e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
302f0 20 49 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   If sqlite3Btree
30300 44 72 6f 70 54 61 62 6c 65 20 77 61 73 20 63 61  DropTable was ca
30310 6c 6c 65 64 20 6f 6e 20 70 61 67 65 20 31 2e 20  lled on page 1. 
30320 2a 2f 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28  */.    zeroPage(
30330 70 50 61 67 65 2c 20 50 54 46 5f 49 4e 54 4b 45  pPage, PTF_INTKE
30340 59 7c 50 54 46 5f 4c 45 41 46 20 29 3b 0a 20 20  Y|PTF_LEAF );.  
30350 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
30360 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
30370 72 6e 20 72 63 3b 20 20 0a 7d 0a 69 6e 74 20 73  rn rc;  .}.int s
30380 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54  qlite3BtreeDropT
30390 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69  able(Btree *p, i
303a0 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a  nt iTable, int *
303b0 70 69 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20  piMoved){.  int 
303c0 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
303d0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d  eeEnter(p);.  p-
303e0 3e 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62  >pBt->db = p->db
303f0 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 44 72  ;.  rc = btreeDr
30400 6f 70 54 61 62 6c 65 28 70 2c 20 69 54 61 62 6c  opTable(p, iTabl
30410 65 2c 20 70 69 4d 6f 76 65 64 29 3b 0a 20 20 73  e, piMoved);.  s
30420 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
30430 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
30440 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ;.}.../*.** Read
30450 20 74 68 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d   the meta-inform
30460 61 74 69 6f 6e 20 6f 75 74 20 6f 66 20 61 20 64  ation out of a d
30470 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4d  atabase file.  M
30480 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20 74 68 65  eta[0].** is the
30490 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20   number of free 
304a0 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20  pages currently 
304b0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
304c0 20 20 4d 65 74 61 5b 31 5d 0a 2a 2a 20 74 68 72    Meta[1].** thr
304d0 6f 75 67 68 20 6d 65 74 61 5b 31 35 5d 20 61 72  ough meta[15] ar
304e0 65 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  e available for 
304f0 75 73 65 20 62 79 20 68 69 67 68 65 72 20 6c 61  use by higher la
30500 79 65 72 73 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a  yers.  Meta[0].*
30510 2a 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20  * is read-only, 
30520 74 68 65 20 6f 74 68 65 72 73 20 61 72 65 20 72  the others are r
30530 65 61 64 2f 77 72 69 74 65 2e 0a 2a 2a 20 0a 2a  ead/write..** .*
30540 2a 20 54 68 65 20 73 63 68 65 6d 61 20 6c 61 79  * The schema lay
30550 65 72 20 6e 75 6d 62 65 72 73 20 6d 65 74 61 20  er numbers meta 
30560 76 61 6c 75 65 73 20 64 69 66 66 65 72 65 6e 74  values different
30570 6c 79 2e 20 20 41 74 20 74 68 65 20 73 63 68 65  ly.  At the sche
30580 6d 61 0a 2a 2a 20 6c 61 79 65 72 20 28 61 6e 64  ma.** layer (and
30590 20 74 68 65 20 53 65 74 43 6f 6f 6b 69 65 20 61   the SetCookie a
305a0 6e 64 20 52 65 61 64 43 6f 6f 6b 69 65 20 6f 70  nd ReadCookie op
305b0 63 6f 64 65 73 29 20 74 68 65 20 6e 75 6d 62 65  codes) the numbe
305c0 72 20 6f 66 0a 2a 2a 20 66 72 65 65 20 70 61 67  r of.** free pag
305d0 65 73 20 69 73 20 6e 6f 74 20 76 69 73 69 62 6c  es is not visibl
305e0 65 2e 20 20 53 6f 20 43 6f 6f 6b 69 65 5b 30 5d  e.  So Cookie[0]
305f0 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
30600 4d 65 74 61 5b 31 5d 2e 0a 2a 2f 0a 69 6e 74 20  Meta[1]..*/.int 
30610 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d  sqlite3BtreeGetM
30620 65 74 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  eta(Btree *p, in
30630 74 20 69 64 78 2c 20 75 33 32 20 2a 70 4d 65 74  t idx, u32 *pMet
30640 61 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  a){.  DbPage *pD
30650 62 50 61 67 65 3b 0a 20 20 69 6e 74 20 72 63 3b  bPage;.  int rc;
30660 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
30670 20 2a 70 50 31 3b 0a 20 20 42 74 53 68 61 72 65   *pP1;.  BtShare
30680 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
30690 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ..  sqlite3Btree
306a0 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d  Enter(p);.  pBt-
306b0 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 0a 20 20  >db = p->db;..  
306c0 2f 2a 20 52 65 61 64 69 6e 67 20 61 20 6d 65 74  /* Reading a met
306d0 61 2d 64 61 74 61 20 76 61 6c 75 65 20 72 65 71  a-data value req
306e0 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  uires a read-loc
306f0 6b 20 6f 6e 20 70 61 67 65 20 31 20 28 61 6e 64  k on page 1 (and
30700 20 68 65 6e 63 65 0a 20 20 2a 2a 20 74 68 65 20   hence.  ** the 
30710 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
30720 62 6c 65 2e 20 57 65 20 67 72 61 62 20 74 68 69  ble. We grab thi
30730 73 20 6c 6f 63 6b 20 72 65 67 61 72 64 6c 65 73  s lock regardles
30740 73 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 0a  s of whether or.
30750 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 53 51 4c    ** not the SQL
30760 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69 74  ITE_ReadUncommit
30770 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20  ted flag is set 
30780 28 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65  (the table roote
30790 64 20 61 74 20 70 61 67 65 0a 20 20 2a 2a 20 31  d at page.  ** 1
307a0 20 69 73 20 74 72 65 61 74 65 64 20 61 73 20 61   is treated as a
307b0 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 62 79   special case by
307c0 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28   queryTableLock(
307d0 29 20 61 6e 64 20 6c 6f 63 6b 54 61 62 6c 65 28  ) and lockTable(
307e0 29 29 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ))..  */.  rc = 
307f0 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70  queryTableLock(p
30800 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b  , 1, READ_LOCK);
30810 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
30820 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
30830 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
30840 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
30850 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
30860 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 3d 31  idx>=0 && idx<=1
30870 35 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  5 );.  rc = sqli
30880 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
30890 3e 70 50 61 67 65 72 2c 20 31 2c 20 26 70 44 62  >pPager, 1, &pDb
308a0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Page);.  if( rc 
308b0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  ){.    sqlite3Bt
308c0 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20  reeLeave(p);.   
308d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
308e0 20 20 70 50 31 20 3d 20 28 75 6e 73 69 67 6e 65    pP1 = (unsigne
308f0 64 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33  d char *)sqlite3
30900 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44 62  PagerGetData(pDb
30910 50 61 67 65 29 3b 0a 20 20 2a 70 4d 65 74 61 20  Page);.  *pMeta 
30920 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 31 5b  = get4byte(&pP1[
30930 33 36 20 2b 20 69 64 78 2a 34 5d 29 3b 0a 20 20  36 + idx*4]);.  
30940 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
30950 66 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 2f  f(pDbPage);..  /
30960 2a 20 49 66 20 61 75 74 6f 76 61 63 75 75 6d 65  * If autovacuume
30970 64 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 6e  d is disabled in
30980 20 74 68 69 73 20 62 75 69 6c 64 20 62 75 74 20   this build but 
30990 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f  we are trying to
309a0 20 0a 20 20 2a 2a 20 61 63 63 65 73 73 20 61 6e   .  ** access an
309b0 20 61 75 74 6f 76 61 63 75 75 6d 65 64 20 64 61   autovacuumed da
309c0 74 61 62 61 73 65 2c 20 74 68 65 6e 20 6d 61 6b  tabase, then mak
309d0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72  e the database r
309e0 65 61 64 6f 6e 6c 79 2e 20 0a 20 20 2a 2f 0a 23  eadonly. .  */.#
309f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
30a00 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69  T_AUTOVACUUM.  i
30a10 66 28 20 69 64 78 3d 3d 34 20 26 26 20 2a 70 4d  f( idx==4 && *pM
30a20 65 74 61 3e 30 20 29 20 70 42 74 2d 3e 72 65 61  eta>0 ) pBt->rea
30a30 64 4f 6e 6c 79 20 3d 20 31 3b 0a 23 65 6e 64 69  dOnly = 1;.#endi
30a40 66 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74 68 65  f..  /* Grab the
30a50 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61   read-lock on pa
30a60 67 65 20 31 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  ge 1. */.  rc = 
30a70 6c 6f 63 6b 54 61 62 6c 65 28 70 2c 20 31 2c 20  lockTable(p, 1, 
30a80 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 73 71  READ_LOCK);.  sq
30a90 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
30aa0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
30ab0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
30ac0 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e  meta-information
30ad0 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
30ae0 61 74 61 62 61 73 65 2e 20 20 4d 65 74 61 5b 30  atabase.  Meta[0
30af0 5d 20 69 73 0a 2a 2a 20 72 65 61 64 2d 6f 6e 6c  ] is.** read-onl
30b00 79 20 61 6e 64 20 6d 61 79 20 6e 6f 74 20 62 65  y and may not be
30b10 20 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 69 6e 74   written..*/.int
30b20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64   sqlite3BtreeUpd
30b30 61 74 65 4d 65 74 61 28 42 74 72 65 65 20 2a 70  ateMeta(Btree *p
30b40 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20 69  , int idx, u32 i
30b50 4d 65 74 61 29 7b 0a 20 20 42 74 53 68 61 72 65  Meta){.  BtShare
30b60 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
30b70 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
30b80 20 2a 70 50 31 3b 0a 20 20 69 6e 74 20 72 63 3b   *pP1;.  int rc;
30b90 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d  .  assert( idx>=
30ba0 31 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a  1 && idx<=15 );.
30bb0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
30bc0 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64  ter(p);.  pBt->d
30bd0 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28  b = p->db;.  if(
30be0 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41   p->inTrans!=TRA
30bf0 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
30c00 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e  rc = pBt->readOn
30c10 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44  ly ? SQLITE_READ
30c20 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52  ONLY : SQLITE_ER
30c30 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ROR;.  }else{.  
30c40 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70    assert( pBt->p
30c50 50 61 67 65 31 21 3d 30 20 29 3b 0a 20 20 20 20  Page1!=0 );.    
30c60 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  pP1 = pBt->pPage
30c70 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63  1->aData;.    rc
30c80 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
30c90 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31  rite(pBt->pPage1
30ca0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
30cb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30cc0 4b 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34 62  K ){.      put4b
30cd0 79 74 65 28 26 70 50 31 5b 33 36 20 2b 20 69 64  yte(&pP1[36 + id
30ce0 78 2a 34 5d 2c 20 69 4d 65 74 61 29 3b 0a 23 69  x*4], iMeta);.#i
30cf0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
30d00 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
30d10 20 20 20 69 66 28 20 69 64 78 3d 3d 37 20 29 7b     if( idx==7 ){
30d20 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
30d30 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
30d40 20 7c 7c 20 69 4d 65 74 61 3d 3d 30 20 29 3b 0a   || iMeta==0 );.
30d50 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
30d60 69 4d 65 74 61 3d 3d 30 20 7c 7c 20 69 4d 65 74  iMeta==0 || iMet
30d70 61 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  a==1 );.        
30d80 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
30d90 3d 20 69 4d 65 74 61 3b 0a 20 20 20 20 20 20 7d  = iMeta;.      }
30da0 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
30db0 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
30dc0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
30dd0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
30de0 52 65 74 75 72 6e 20 74 68 65 20 66 6c 61 67 20  Return the flag 
30df0 62 79 74 65 20 61 74 20 74 68 65 20 62 65 67 69  byte at the begi
30e00 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 70 61 67  nning of the pag
30e10 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
30e20 72 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c  r.** is currentl
30e30 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a  y pointing to..*
30e40 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
30e50 65 65 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72  eeFlags(BtCursor
30e60 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f   *pCur){.  /* TO
30e70 44 4f 3a 20 57 68 61 74 20 61 62 6f 75 74 20 43  DO: What about C
30e80 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
30e90 4b 20 73 74 61 74 65 3f 20 50 72 6f 62 61 62 6c  K state? Probabl
30ea0 79 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 0a 20  y need to call. 
30eb0 20 2a 2a 20 72 65 73 74 6f 72 65 4f 72 43 6c 65   ** restoreOrCle
30ec0 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  arCursorPosition
30ed0 28 29 20 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20  () here..  */.  
30ee0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
30ef0 20 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72    restoreOrClear
30f00 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
30f10 43 75 72 29 3b 0a 20 20 70 50 61 67 65 20 3d 20  Cur);.  pPage = 
30f20 70 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61  pCur->pPage;.  a
30f30 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
30f40 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
30f50 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
30f60 2d 3e 70 42 74 3d 3d 70 43 75 72 2d 3e 70 42 74  ->pBt==pCur->pBt
30f70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61   );.  return pPa
30f80 67 65 20 3f 20 70 50 61 67 65 2d 3e 61 44 61 74  ge ? pPage->aDat
30f90 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
30fa0 65 74 5d 20 3a 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  et] : 0;.}.../*.
30fb0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  ** Return the pa
30fc0 67 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77  ger associated w
30fd0 69 74 68 20 61 20 42 54 72 65 65 2e 20 20 54 68  ith a BTree.  Th
30fe0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
30ff0 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
31000 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20  g and debugging 
31010 6f 6e 6c 79 2e 0a 2a 2f 0a 50 61 67 65 72 20 2a  only..*/.Pager *
31020 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
31030 72 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72  r(Btree *p){.  r
31040 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 50  eturn p->pBt->pP
31050 61 67 65 72 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  ager;.}..#ifndef
31060 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54   SQLITE_OMIT_INT
31070 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a  EGRITY_CHECK./*.
31080 2a 2a 20 41 70 70 65 6e 64 20 61 20 6d 65 73 73  ** Append a mess
31090 61 67 65 20 74 6f 20 74 68 65 20 65 72 72 6f 72  age to the error
310a0 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 2e   message string.
310b0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
310c0 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 0a  checkAppendMsg(.
310d0 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70    IntegrityCk *p
310e0 43 68 65 63 6b 2c 0a 20 20 63 68 61 72 20 2a 7a  Check,.  char *z
310f0 4d 73 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68  Msg1,.  const ch
31100 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 0a 20 20 2e  ar *zFormat,.  .
31110 2e 2e 0a 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
31120 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 73 67  ap;.  char *zMsg
31130 32 3b 0a 20 20 69 66 28 20 21 70 43 68 65 63 6b  2;.  if( !pCheck
31140 2d 3e 6d 78 45 72 72 20 29 20 72 65 74 75 72 6e  ->mxErr ) return
31150 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72  ;.  pCheck->mxEr
31160 72 2d 2d 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6e  r--;.  pCheck->n
31170 45 72 72 2b 2b 3b 0a 20 20 76 61 5f 73 74 61 72  Err++;.  va_star
31180 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a  t(ap, zFormat);.
31190 20 20 7a 4d 73 67 32 20 3d 20 73 71 6c 69 74 65    zMsg2 = sqlite
311a0 33 56 4d 50 72 69 6e 74 66 28 30 2c 20 7a 46 6f  3VMPrintf(0, zFo
311b0 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
311c0 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 7a  end(ap);.  if( z
311d0 4d 73 67 31 3d 3d 30 20 29 20 7a 4d 73 67 31 20  Msg1==0 ) zMsg1 
311e0 3d 20 22 22 3b 0a 20 20 69 66 28 20 70 43 68 65  = "";.  if( pChe
311f0 63 6b 2d 3e 7a 45 72 72 4d 73 67 20 29 7b 0a 20  ck->zErrMsg ){. 
31200 20 20 20 63 68 61 72 20 2a 7a 4f 6c 64 20 3d 20     char *zOld = 
31210 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 3b  pCheck->zErrMsg;
31220 0a 20 20 20 20 70 43 68 65 63 6b 2d 3e 7a 45 72  .    pCheck->zEr
31230 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 73 71  rMsg = 0;.    sq
31240 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26  lite3SetString(&
31250 70 43 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2c  pCheck->zErrMsg,
31260 20 7a 4f 6c 64 2c 20 22 5c 6e 22 2c 20 7a 4d 73   zOld, "\n", zMs
31270 67 31 2c 20 7a 4d 73 67 32 2c 20 28 63 68 61 72  g1, zMsg2, (char
31280 2a 29 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  *)0);.    sqlite
31290 33 5f 66 72 65 65 28 7a 4f 6c 64 29 3b 0a 20 20  3_free(zOld);.  
312a0 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
312b0 65 33 53 65 74 53 74 72 69 6e 67 28 26 70 43 68  e3SetString(&pCh
312c0 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2c 20 7a 4d  eck->zErrMsg, zM
312d0 73 67 31 2c 20 7a 4d 73 67 32 2c 20 28 63 68 61  sg1, zMsg2, (cha
312e0 72 2a 29 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  r*)0);.  }.  sql
312f0 69 74 65 33 5f 66 72 65 65 28 7a 4d 73 67 32 29  ite3_free(zMsg2)
31300 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
31310 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
31320 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69  ITY_CHECK */..#i
31330 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
31340 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
31350 4b 0a 2f 2a 0a 2a 2a 20 41 64 64 20 31 20 74 6f  K./*.** Add 1 to
31360 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
31370 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20 69 50  ount for page iP
31380 61 67 65 2e 20 20 49 66 20 74 68 69 73 20 69 73  age.  If this is
31390 20 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 72   the second.** r
313a0 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
313b0 70 61 67 65 2c 20 61 64 64 20 61 6e 20 65 72 72  page, add an err
313c0 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 70 43  or message to pC
313d0 68 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  heck->zErrMsg..*
313e0 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68  * Return 1 if th
313f0 65 72 65 20 61 72 65 20 32 20 6f 72 65 20 6d 6f  ere are 2 ore mo
31400 72 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  re references to
31410 20 74 68 65 20 70 61 67 65 20 61 6e 64 20 30 20   the page and 0 
31420 69 66 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73  if.** if this is
31430 20 74 68 65 20 66 69 72 73 74 20 72 65 66 65 72   the first refer
31440 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65  ence to the page
31450 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 63 68 65  ..**.** Also che
31460 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ck that the page
31470 20 6e 75 6d 62 65 72 20 69 73 20 69 6e 20 62 6f   number is in bo
31480 75 6e 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  unds..*/.static 
31490 69 6e 74 20 63 68 65 63 6b 52 65 66 28 49 6e 74  int checkRef(Int
314a0 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b  egrityCk *pCheck
314b0 2c 20 69 6e 74 20 69 50 61 67 65 2c 20 63 68 61  , int iPage, cha
314c0 72 20 2a 7a 43 6f 6e 74 65 78 74 29 7b 0a 20 20  r *zContext){.  
314d0 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29 20 72  if( iPage==0 ) r
314e0 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 69  eturn 1;.  if( i
314f0 50 61 67 65 3e 70 43 68 65 63 6b 2d 3e 6e 50 61  Page>pCheck->nPa
31500 67 65 20 7c 7c 20 69 50 61 67 65 3c 30 20 29 7b  ge || iPage<0 ){
31510 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
31520 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
31530 74 65 78 74 2c 20 22 69 6e 76 61 6c 69 64 20 70  text, "invalid p
31540 61 67 65 20 6e 75 6d 62 65 72 20 25 64 22 2c 20  age number %d", 
31550 69 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75  iPage);.    retu
31560 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 1;.  }.  if( 
31570 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69 50  pCheck->anRef[iP
31580 61 67 65 5d 3d 3d 31 20 29 7b 0a 20 20 20 20 63  age]==1 ){.    c
31590 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
315a0 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  heck, zContext, 
315b0 22 32 6e 64 20 72 65 66 65 72 65 6e 63 65 20 74  "2nd reference t
315c0 6f 20 70 61 67 65 20 25 64 22 2c 20 69 50 61 67  o page %d", iPag
315d0 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  e);.    return 1
315e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 20  ;.  }.  return  
315f0 28 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66 5b 69  (pCheck->anRef[i
31600 50 61 67 65 5d 2b 2b 29 3e 31 3b 0a 7d 0a 0a 23  Page]++)>1;.}..#
31610 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
31620 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
31630 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74  .** Check that t
31640 68 65 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  he entry in the 
31650 70 6f 69 6e 74 65 72 2d 6d 61 70 20 66 6f 72 20  pointer-map for 
31660 70 61 67 65 20 69 43 68 69 6c 64 20 6d 61 70 73  page iChild maps
31670 20 74 6f 20 0a 2a 2a 20 70 61 67 65 20 69 50 61   to .** page iPa
31680 72 65 6e 74 2c 20 70 6f 69 6e 74 65 72 20 74 79  rent, pointer ty
31690 70 65 20 70 74 72 54 79 70 65 2e 20 49 66 20 6e  pe ptrType. If n
316a0 6f 74 2c 20 61 70 70 65 6e 64 20 61 6e 20 65 72  ot, append an er
316b0 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 74  ror message.** t
316c0 6f 20 70 43 68 65 63 6b 2e 0a 2a 2f 0a 73 74 61  o pCheck..*/.sta
316d0 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 74  tic void checkPt
316e0 72 6d 61 70 28 0a 20 20 49 6e 74 65 67 72 69 74  rmap(.  Integrit
316f0 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 20 20 2f  yCk *pCheck,   /
31700 2a 20 49 6e 74 65 67 72 69 74 79 20 63 68 65 63  * Integrity chec
31710 6b 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 50  k context */.  P
31720 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20 20 20 20  gno iChild,     
31730 20 20 20 20 20 20 2f 2a 20 43 68 69 6c 64 20 70        /* Child p
31740 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
31750 75 38 20 65 54 79 70 65 2c 20 20 20 20 20 20 20  u8 eType,       
31760 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74         /* Expect
31770 65 64 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 74  ed pointer map t
31780 79 70 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50  ype */.  Pgno iP
31790 61 72 65 6e 74 2c 20 20 20 20 20 20 20 20 20 20  arent,          
317a0 2f 2a 20 45 78 70 65 63 74 65 64 20 70 6f 69 6e  /* Expected poin
317b0 74 65 72 20 6d 61 70 20 70 61 72 65 6e 74 20 70  ter map parent p
317c0 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  age number */.  
317d0 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20  char *zContext  
317e0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78         /* Contex
317f0 74 20 64 65 73 63 72 69 70 74 69 6f 6e 20 28 75  t description (u
31800 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 6d 73  sed for error ms
31810 67 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  g) */.){.  int r
31820 63 3b 0a 20 20 75 38 20 65 50 74 72 6d 61 70 54  c;.  u8 ePtrmapT
31830 79 70 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74 72  ype;.  Pgno iPtr
31840 6d 61 70 50 61 72 65 6e 74 3b 0a 0a 20 20 72 63  mapParent;..  rc
31850 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 43 68   = ptrmapGet(pCh
31860 65 63 6b 2d 3e 70 42 74 2c 20 69 43 68 69 6c 64  eck->pBt, iChild
31870 2c 20 26 65 50 74 72 6d 61 70 54 79 70 65 2c 20  , &ePtrmapType, 
31880 26 69 50 74 72 6d 61 70 50 61 72 65 6e 74 29 3b  &iPtrmapParent);
31890 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
318a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 68 65 63  E_OK ){.    chec
318b0 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
318c0 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 46 61  k, zContext, "Fa
318d0 69 6c 65 64 20 74 6f 20 72 65 61 64 20 70 74 72  iled to read ptr
318e0 6d 61 70 20 6b 65 79 3d 25 64 22 2c 20 69 43 68  map key=%d", iCh
318f0 69 6c 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ild);.    return
31900 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 65 50 74  ;.  }..  if( ePt
31910 72 6d 61 70 54 79 70 65 21 3d 65 54 79 70 65 20  rmapType!=eType 
31920 7c 7c 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74  || iPtrmapParent
31930 21 3d 69 50 61 72 65 6e 74 20 29 7b 0a 20 20 20  !=iParent ){.   
31940 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
31950 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
31960 2c 20 0a 20 20 20 20 20 20 22 42 61 64 20 70 74  , .      "Bad pt
31970 72 20 6d 61 70 20 65 6e 74 72 79 20 6b 65 79 3d  r map entry key=
31980 25 64 20 65 78 70 65 63 74 65 64 3d 28 25 64 2c  %d expected=(%d,
31990 25 64 29 20 67 6f 74 3d 28 25 64 2c 25 64 29 22  %d) got=(%d,%d)"
319a0 2c 20 0a 20 20 20 20 20 20 69 43 68 69 6c 64 2c  , .      iChild,
319b0 20 65 54 79 70 65 2c 20 69 50 61 72 65 6e 74 2c   eType, iParent,
319c0 20 65 50 74 72 6d 61 70 54 79 70 65 2c 20 69 50   ePtrmapType, iP
319d0 74 72 6d 61 70 50 61 72 65 6e 74 29 3b 0a 20 20  trmapParent);.  
319e0 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
319f0 2a 20 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65  * Check the inte
31a00 67 72 69 74 79 20 6f 66 20 74 68 65 20 66 72 65  grity of the fre
31a10 65 6c 69 73 74 20 6f 72 20 6f 66 20 61 6e 20 6f  elist or of an o
31a20 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6c 69 73  verflow page lis
31a30 74 2e 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61  t..** Verify tha
31a40 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
31a50 70 61 67 65 73 20 6f 6e 20 74 68 65 20 6c 69 73  pages on the lis
31a60 74 20 69 73 20 4e 2e 0a 2a 2f 0a 73 74 61 74 69  t is N..*/.stati
31a70 63 20 76 6f 69 64 20 63 68 65 63 6b 4c 69 73 74  c void checkList
31a80 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20  (.  IntegrityCk 
31a90 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20 49 6e 74  *pCheck,  /* Int
31aa0 65 67 72 69 74 79 20 63 68 65 63 6b 69 6e 67 20  egrity checking 
31ab0 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
31ac0 20 69 73 46 72 65 65 4c 69 73 74 2c 20 20 20 20   isFreeList,    
31ad0 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61     /* True for a
31ae0 20 66 72 65 65 6c 69 73 74 2e 20 20 46 61 6c 73   freelist.  Fals
31af0 65 20 66 6f 72 20 6f 76 65 72 66 6c 6f 77 20 70  e for overflow p
31b00 61 67 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  age list */.  in
31b10 74 20 69 50 61 67 65 2c 20 20 20 20 20 20 20 20  t iPage,        
31b20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
31b30 65 72 20 66 6f 72 20 66 69 72 73 74 20 70 61 67  er for first pag
31b40 65 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f  e in the list */
31b50 0a 20 20 69 6e 74 20 4e 2c 20 20 20 20 20 20 20  .  int N,       
31b60 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65           /* Expe
31b70 63 74 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 70  cted number of p
31b80 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73 74  ages in the list
31b90 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e   */.  char *zCon
31ba0 74 65 78 74 20 20 20 20 20 20 20 20 2f 2a 20 43  text        /* C
31bb0 6f 6e 74 65 78 74 20 66 6f 72 20 65 72 72 6f 72  ontext for error
31bc0 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 29 7b 0a   messages */.){.
31bd0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 65    int i;.  int e
31be0 78 70 65 63 74 65 64 20 3d 20 4e 3b 0a 20 20 69  xpected = N;.  i
31bf0 6e 74 20 69 46 69 72 73 74 20 3d 20 69 50 61 67  nt iFirst = iPag
31c00 65 3b 0a 20 20 77 68 69 6c 65 28 20 4e 2d 2d 20  e;.  while( N-- 
31c10 3e 20 30 20 26 26 20 70 43 68 65 63 6b 2d 3e 6d  > 0 && pCheck->m
31c20 78 45 72 72 20 29 7b 0a 20 20 20 20 44 62 50 61  xErr ){.    DbPa
31c30 67 65 20 2a 70 4f 76 66 6c 50 61 67 65 3b 0a 20  ge *pOvflPage;. 
31c40 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72     unsigned char
31c50 20 2a 70 4f 76 66 6c 44 61 74 61 3b 0a 20 20 20   *pOvflData;.   
31c60 20 69 66 28 20 69 50 61 67 65 3c 31 20 29 7b 0a   if( iPage<1 ){.
31c70 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
31c80 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
31c90 6e 74 65 78 74 2c 0a 20 20 20 20 20 20 20 20 20  ntext,.         
31ca0 22 25 64 20 6f 66 20 25 64 20 70 61 67 65 73 20  "%d of %d pages 
31cb0 6d 69 73 73 69 6e 67 20 66 72 6f 6d 20 6f 76 65  missing from ove
31cc0 72 66 6c 6f 77 20 6c 69 73 74 20 73 74 61 72 74  rflow list start
31cd0 69 6e 67 20 61 74 20 25 64 22 2c 0a 20 20 20 20  ing at %d",.    
31ce0 20 20 20 20 20 20 4e 2b 31 2c 20 65 78 70 65 63        N+1, expec
31cf0 74 65 64 2c 20 69 46 69 72 73 74 29 3b 0a 20 20  ted, iFirst);.  
31d00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
31d10 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b 52 65  .    if( checkRe
31d20 66 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c  f(pCheck, iPage,
31d30 20 7a 43 6f 6e 74 65 78 74 29 20 29 20 62 72 65   zContext) ) bre
31d40 61 6b 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  ak;.    if( sqli
31d50 74 65 33 50 61 67 65 72 47 65 74 28 70 43 68 65  te3PagerGet(pChe
31d60 63 6b 2d 3e 70 50 61 67 65 72 2c 20 28 50 67 6e  ck->pPager, (Pgn
31d70 6f 29 69 50 61 67 65 2c 20 26 70 4f 76 66 6c 50  o)iPage, &pOvflP
31d80 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 63 68  age) ){.      ch
31d90 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
31da0 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22  eck, zContext, "
31db0 66 61 69 6c 65 64 20 74 6f 20 67 65 74 20 70 61  failed to get pa
31dc0 67 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a  ge %d", iPage);.
31dd0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
31de0 20 7d 0a 20 20 20 20 70 4f 76 66 6c 44 61 74 61   }.    pOvflData
31df0 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
31e00 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72  r *)sqlite3Pager
31e10 47 65 74 44 61 74 61 28 70 4f 76 66 6c 50 61 67  GetData(pOvflPag
31e20 65 29 3b 0a 20 20 20 20 69 66 28 20 69 73 46 72  e);.    if( isFr
31e30 65 65 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  eeList ){.      
31e40 69 6e 74 20 6e 20 3d 20 67 65 74 34 62 79 74 65  int n = get4byte
31e50 28 26 70 4f 76 66 6c 44 61 74 61 5b 34 5d 29 3b  (&pOvflData[4]);
31e60 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
31e70 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
31e80 20 20 20 20 20 20 69 66 28 20 70 43 68 65 63 6b        if( pCheck
31e90 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
31ea0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65  m ){.        che
31eb0 63 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c  ckPtrmap(pCheck,
31ec0 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46   iPage, PTRMAP_F
31ed0 52 45 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e  REEPAGE, 0, zCon
31ee0 74 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 0a 23  text);.      }.#
31ef0 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
31f00 6e 3e 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 75  n>pCheck->pBt->u
31f10 73 61 62 6c 65 53 69 7a 65 2f 34 2d 38 20 29 7b  sableSize/4-8 ){
31f20 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41 70  .        checkAp
31f30 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
31f40 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20  zContext,.      
31f50 20 20 20 20 20 22 66 72 65 65 6c 69 73 74 20 6c       "freelist l
31f60 65 61 66 20 63 6f 75 6e 74 20 74 6f 6f 20 62 69  eaf count too bi
31f70 67 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 20 69  g on page %d", i
31f80 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 4e  Page);.        N
31f90 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  --;.      }else{
31fa0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
31fb0 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
31fc0 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65         Pgno iFre
31fd0 65 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  ePage = get4byte
31fe0 28 26 70 4f 76 66 6c 44 61 74 61 5b 38 2b 69 2a  (&pOvflData[8+i*
31ff0 34 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  4]);.#ifndef SQL
32000 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
32010 55 55 4d 0a 20 20 20 20 20 20 20 20 20 20 69 66  UUM.          if
32020 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61  ( pCheck->pBt->a
32030 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
32040 20 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74           checkPt
32050 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 46 72  rmap(pCheck, iFr
32060 65 65 50 61 67 65 2c 20 50 54 52 4d 41 50 5f 46  eePage, PTRMAP_F
32070 52 45 45 50 41 47 45 2c 20 30 2c 20 7a 43 6f 6e  REEPAGE, 0, zCon
32080 74 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 20  text);.         
32090 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
320a0 20 20 20 20 63 68 65 63 6b 52 65 66 28 70 43 68      checkRef(pCh
320b0 65 63 6b 2c 20 69 46 72 65 65 50 61 67 65 2c 20  eck, iFreePage, 
320c0 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  zContext);.     
320d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 4e 20 2d     }.        N -
320e0 3d 20 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = n;.      }.   
320f0 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
32100 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
32110 4d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  M.    else{.    
32120 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74    /* If this dat
32130 61 62 61 73 65 20 73 75 70 70 6f 72 74 73 20 61  abase supports a
32140 75 74 6f 2d 76 61 63 75 75 6d 20 61 6e 64 20 69  uto-vacuum and i
32150 50 61 67 65 20 69 73 20 6e 6f 74 20 74 68 65 20  Page is not the 
32160 6c 61 73 74 0a 20 20 20 20 20 20 2a 2a 20 70 61  last.      ** pa
32170 67 65 20 69 6e 20 74 68 69 73 20 6f 76 65 72 66  ge in this overf
32180 6c 6f 77 20 6c 69 73 74 2c 20 63 68 65 63 6b 20  low list, check 
32190 74 68 61 74 20 74 68 65 20 70 6f 69 6e 74 65 72  that the pointer
321a0 2d 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20  -map entry for. 
321b0 20 20 20 20 20 2a 2a 20 74 68 65 20 66 6f 6c 6c       ** the foll
321c0 6f 77 69 6e 67 20 70 61 67 65 20 6d 61 74 63 68  owing page match
321d0 65 73 20 69 50 61 67 65 2e 0a 20 20 20 20 20 20  es iPage..      
321e0 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 43 68  */.      if( pCh
321f0 65 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  eck->pBt->autoVa
32200 63 75 75 6d 20 26 26 20 4e 3e 30 20 29 7b 0a 20  cuum && N>0 ){. 
32210 20 20 20 20 20 20 20 69 20 3d 20 67 65 74 34 62         i = get4b
32220 79 74 65 28 70 4f 76 66 6c 44 61 74 61 29 3b 0a  yte(pOvflData);.
32230 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72          checkPtr
32240 6d 61 70 28 70 43 68 65 63 6b 2c 20 69 2c 20 50  map(pCheck, i, P
32250 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c  TRMAP_OVERFLOW2,
32260 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74   iPage, zContext
32270 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
32280 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 50 61 67  .#endif.    iPag
32290 65 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f 76  e = get4byte(pOv
322a0 66 6c 44 61 74 61 29 3b 0a 20 20 20 20 73 71 6c  flData);.    sql
322b0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
322c0 4f 76 66 6c 50 61 67 65 29 3b 0a 20 20 7d 0a 7d  OvflPage);.  }.}
322d0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
322e0 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
322f0 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64  _CHECK */..#ifnd
32300 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
32310 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f  NTEGRITY_CHECK./
32320 2a 0a 2a 2a 20 44 6f 20 76 61 72 69 6f 75 73 20  *.** Do various 
32330 73 61 6e 69 74 79 20 63 68 65 63 6b 73 20 6f 6e  sanity checks on
32340 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 6f   a single page o
32350 66 20 61 20 74 72 65 65 2e 20 20 52 65 74 75 72  f a tree.  Retur
32360 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 64 65  n.** the tree de
32370 70 74 68 2e 20 20 52 6f 6f 74 20 70 61 67 65 73  pth.  Root pages
32380 20 72 65 74 75 72 6e 20 30 2e 20 20 50 61 72 65   return 0.  Pare
32390 6e 74 73 20 6f 66 20 72 6f 6f 74 20 70 61 67 65  nts of root page
323a0 73 0a 2a 2a 20 72 65 74 75 72 6e 20 31 2c 20 61  s.** return 1, a
323b0 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a 2a 20  nd so forth..** 
323c0 0a 2a 2a 20 54 68 65 73 65 20 63 68 65 63 6b 73  .** These checks
323d0 20 61 72 65 20 64 6f 6e 65 3a 0a 2a 2a 0a 2a 2a   are done:.**.**
323e0 20 20 20 20 20 20 31 2e 20 20 4d 61 6b 65 20 73        1.  Make s
323f0 75 72 65 20 74 68 61 74 20 63 65 6c 6c 73 20 61  ure that cells a
32400 6e 64 20 66 72 65 65 62 6c 6f 63 6b 73 20 64 6f  nd freeblocks do
32410 20 6e 6f 74 20 6f 76 65 72 6c 61 70 0a 2a 2a 20   not overlap.** 
32420 20 20 20 20 20 20 20 20 20 62 75 74 20 63 6f 6d           but com
32430 62 69 6e 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65  bine to complete
32440 6c 79 20 63 6f 76 65 72 20 74 68 65 20 70 61 67  ly cover the pag
32450 65 2e 0a 2a 2a 20 20 4e 4f 20 20 32 2e 20 20 4d  e..**  NO  2.  M
32460 61 6b 65 20 73 75 72 65 20 63 65 6c 6c 20 6b 65  ake sure cell ke
32470 79 73 20 61 72 65 20 69 6e 20 6f 72 64 65 72 2e  ys are in order.
32480 0a 2a 2a 20 20 4e 4f 20 20 33 2e 20 20 4d 61 6b  .**  NO  3.  Mak
32490 65 20 73 75 72 65 20 6e 6f 20 6b 65 79 20 69 73  e sure no key is
324a0 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65 71   less than or eq
324b0 75 61 6c 20 74 6f 20 7a 4c 6f 77 65 72 42 6f 75  ual to zLowerBou
324c0 6e 64 2e 0a 2a 2a 20 20 4e 4f 20 20 34 2e 20 20  nd..**  NO  4.  
324d0 4d 61 6b 65 20 73 75 72 65 20 6e 6f 20 6b 65 79  Make sure no key
324e0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
324f0 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 55 70   or equal to zUp
32500 70 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20 20 20  perBound..**    
32510 20 20 35 2e 20 20 43 68 65 63 6b 20 74 68 65 20    5.  Check the 
32520 69 6e 74 65 67 72 69 74 79 20 6f 66 20 6f 76 65  integrity of ove
32530 72 66 6c 6f 77 20 70 61 67 65 73 2e 0a 2a 2a 20  rflow pages..** 
32540 20 20 20 20 20 36 2e 20 20 52 65 63 75 72 73 69       6.  Recursi
32550 76 65 6c 79 20 63 61 6c 6c 20 63 68 65 63 6b 54  vely call checkT
32560 72 65 65 50 61 67 65 20 6f 6e 20 61 6c 6c 20 63  reePage on all c
32570 68 69 6c 64 72 65 6e 2e 0a 2a 2a 20 20 20 20 20  hildren..**     
32580 20 37 2e 20 20 56 65 72 69 66 79 20 74 68 61 74   7.  Verify that
32590 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 61 6c   the depth of al
325a0 6c 20 63 68 69 6c 64 72 65 6e 20 69 73 20 74 68  l children is th
325b0 65 20 73 61 6d 65 2e 0a 2a 2a 20 20 20 20 20 20  e same..**      
325c0 38 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  8.  Make sure th
325d0 69 73 20 70 61 67 65 20 69 73 20 61 74 20 6c 65  is page is at le
325e0 61 73 74 20 33 33 25 20 66 75 6c 6c 20 6f 72 20  ast 33% full or 
325f0 65 6c 73 65 20 69 74 20 69 73 0a 2a 2a 20 20 20  else it is.**   
32600 20 20 20 20 20 20 20 74 68 65 20 72 6f 6f 74 20         the root 
32610 6f 66 20 74 68 65 20 74 72 65 65 2e 0a 2a 2f 0a  of the tree..*/.
32620 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b  static int check
32630 54 72 65 65 50 61 67 65 28 0a 20 20 49 6e 74 65  TreePage(.  Inte
32640 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c  grityCk *pCheck,
32650 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66 6f 72    /* Context for
32660 20 74 68 65 20 73 61 6e 69 74 79 20 63 68 65 63   the sanity chec
32670 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67 65  k */.  int iPage
32680 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
32690 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  Page number of t
326a0 68 65 20 70 61 67 65 20 74 6f 20 63 68 65 63 6b  he page to check
326b0 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
326c0 50 61 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20 50  Parent,     /* P
326d0 61 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20  arent page */.  
326e0 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f 6e  char *zParentCon
326f0 74 65 78 74 20 20 2f 2a 20 50 61 72 65 6e 74 20  text  /* Parent 
32700 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20  context */.){.  
32710 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
32720 20 20 69 6e 74 20 69 2c 20 72 63 2c 20 64 65 70    int i, rc, dep
32730 74 68 2c 20 64 32 2c 20 70 67 6e 6f 2c 20 63 6e  th, d2, pgno, cn
32740 74 3b 0a 20 20 69 6e 74 20 68 64 72 2c 20 63 65  t;.  int hdr, ce
32750 6c 6c 53 74 61 72 74 3b 0a 20 20 69 6e 74 20 6e  llStart;.  int n
32760 43 65 6c 6c 3b 0a 20 20 75 38 20 2a 64 61 74 61  Cell;.  u8 *data
32770 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
32780 74 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  t;.  int usableS
32790 69 7a 65 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6e  ize;.  char zCon
327a0 74 65 78 74 5b 31 30 30 5d 3b 0a 20 20 63 68 61  text[100];.  cha
327b0 72 20 2a 68 69 74 3b 0a 0a 20 20 73 71 6c 69 74  r *hit;..  sqlit
327c0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
327d0 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a 43  of(zContext), zC
327e0 6f 6e 74 65 78 74 2c 20 22 50 61 67 65 20 25 64  ontext, "Page %d
327f0 3a 20 22 2c 20 69 50 61 67 65 29 3b 0a 0a 20 20  : ", iPage);..  
32800 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
32810 65 20 70 61 67 65 20 65 78 69 73 74 73 0a 20 20  e page exists.  
32820 2a 2f 0a 20 20 70 42 74 20 3d 20 70 43 68 65 63  */.  pBt = pChec
32830 6b 2d 3e 70 42 74 3b 0a 20 20 75 73 61 62 6c 65  k->pBt;.  usable
32840 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
32850 6c 65 53 69 7a 65 3b 0a 20 20 69 66 28 20 69 50  leSize;.  if( iP
32860 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  age==0 ) return 
32870 30 3b 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65  0;.  if( checkRe
32880 66 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c  f(pCheck, iPage,
32890 20 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78 74 29   zParentContext)
328a0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
328b0 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  f( (rc = sqlite3
328c0 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
328d0 2c 20 28 50 67 6e 6f 29 69 50 61 67 65 2c 20 26  , (Pgno)iPage, &
328e0 70 50 61 67 65 2c 20 30 29 29 21 3d 30 20 29 7b  pPage, 0))!=0 ){
328f0 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
32900 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
32910 74 65 78 74 2c 0a 20 20 20 20 20 20 20 22 75 6e  text,.       "un
32920 61 62 6c 65 20 74 6f 20 67 65 74 20 74 68 65 20  able to get the 
32930 70 61 67 65 2e 20 65 72 72 6f 72 20 63 6f 64 65  page. error code
32940 3d 25 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 72  =%d", rc);.    r
32950 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
32960 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  f( (rc = sqlite3
32970 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  BtreeInitPage(pP
32980 61 67 65 2c 20 70 50 61 72 65 6e 74 29 29 21 3d  age, pParent))!=
32990 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70  0 ){.    checkAp
329a0 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
329b0 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20  zContext, .     
329c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 73                "s
329d0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
329e0 61 67 65 28 29 20 72 65 74 75 72 6e 73 20 65 72  age() returns er
329f0 72 6f 72 20 63 6f 64 65 20 25 64 22 2c 20 72 63  ror code %d", rc
32a00 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
32a10 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72  ge(pPage);.    r
32a20 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20  eturn 0;.  }..  
32a30 2f 2a 20 43 68 65 63 6b 20 6f 75 74 20 61 6c 6c  /* Check out all
32a40 20 74 68 65 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f   the cells..  */
32a50 0a 20 20 64 65 70 74 68 20 3d 20 30 3b 0a 20 20  .  depth = 0;.  
32a60 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65  for(i=0; i<pPage
32a70 2d 3e 6e 43 65 6c 6c 20 26 26 20 70 43 68 65 63  ->nCell && pChec
32a80 6b 2d 3e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a  k->mxErr; i++){.
32a90 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20      u8 *pCell;. 
32aa0 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20 43     int sz;.    C
32ab0 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20  ellInfo info;.. 
32ac0 20 20 20 2f 2a 20 43 68 65 63 6b 20 70 61 79 6c     /* Check payl
32ad0 6f 61 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  oad overflow pag
32ae0 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  es.    */.    sq
32af0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
32b00 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c  izeof(zContext),
32b10 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20   zContext,.     
32b20 20 20 20 20 20 20 20 20 22 4f 6e 20 74 72 65 65          "On tree
32b30 20 70 61 67 65 20 25 64 20 63 65 6c 6c 20 25 64   page %d cell %d
32b40 3a 20 22 2c 20 69 50 61 67 65 2c 20 69 29 3b 0a  : ", iPage, i);.
32b50 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64      pCell = find
32b60 43 65 6c 6c 28 70 50 61 67 65 2c 69 29 3b 0a 20  Cell(pPage,i);. 
32b70 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
32b80 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
32b90 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
32ba0 3b 0a 20 20 20 20 73 7a 20 3d 20 69 6e 66 6f 2e  ;.    sz = info.
32bb0 6e 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 21  nData;.    if( !
32bc0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 20  pPage->intKey ) 
32bd0 73 7a 20 2b 3d 20 69 6e 66 6f 2e 6e 4b 65 79 3b  sz += info.nKey;
32be0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3d  .    assert( sz=
32bf0 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  =info.nPayload )
32c00 3b 0a 20 20 20 20 69 66 28 20 73 7a 3e 69 6e 66  ;.    if( sz>inf
32c10 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
32c20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 28 73    int nPage = (s
32c30 7a 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  z - info.nLocal 
32c40 2b 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 35  + usableSize - 5
32c50 29 2f 28 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  )/(usableSize - 
32c60 34 29 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 70  4);.      Pgno p
32c70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62 79  gnoOvfl = get4by
32c80 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
32c90 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 23 69 66 6e  Overflow]);.#ifn
32ca0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
32cb0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
32cc0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
32cd0 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
32ce0 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65  checkPtrmap(pChe
32cf0 63 6b 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54  ck, pgnoOvfl, PT
32d00 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20  RMAP_OVERFLOW1, 
32d10 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29  iPage, zContext)
32d20 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
32d30 0a 20 20 20 20 20 20 63 68 65 63 6b 4c 69 73 74  .      checkList
32d40 28 70 43 68 65 63 6b 2c 20 30 2c 20 70 67 6e 6f  (pCheck, 0, pgno
32d50 4f 76 66 6c 2c 20 6e 50 61 67 65 2c 20 7a 43 6f  Ovfl, nPage, zCo
32d60 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 0a 0a 20  ntext);.    }.. 
32d70 20 20 20 2f 2a 20 43 68 65 63 6b 20 73 61 6e 69     /* Check sani
32d80 74 79 20 6f 66 20 6c 65 66 74 20 63 68 69 6c 64  ty of left child
32d90 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
32da0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
32db0 61 66 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f  af ){.      pgno
32dc0 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65 6c   = get4byte(pCel
32dd0 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  l);.#ifndef SQLI
32de0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
32df0 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  UM.      if( pBt
32e00 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
32e10 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72          checkPtr
32e20 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f  map(pCheck, pgno
32e30 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
32e40 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29  iPage, zContext)
32e50 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
32e60 0a 20 20 20 20 20 20 64 32 20 3d 20 63 68 65 63  .      d2 = chec
32e70 6b 54 72 65 65 50 61 67 65 28 70 43 68 65 63 6b  kTreePage(pCheck
32e80 2c 70 67 6e 6f 2c 70 50 61 67 65 2c 7a 43 6f 6e  ,pgno,pPage,zCon
32e90 74 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28  text);.      if(
32ea0 20 69 3e 30 20 26 26 20 64 32 21 3d 64 65 70 74   i>0 && d2!=dept
32eb0 68 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65  h ){.        che
32ec0 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
32ed0 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 43  ck, zContext, "C
32ee0 68 69 6c 64 20 70 61 67 65 20 64 65 70 74 68 20  hild page depth 
32ef0 64 69 66 66 65 72 73 22 29 3b 0a 20 20 20 20 20  differs");.     
32f00 20 7d 0a 20 20 20 20 20 20 64 65 70 74 68 20 3d   }.      depth =
32f10 20 64 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   d2;.    }.  }. 
32f20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
32f30 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  f ){.    pgno = 
32f40 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
32f50 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
32f60 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
32f70 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
32f80 66 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78  f(sizeof(zContex
32f90 74 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20  t), zContext, . 
32fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32fb0 20 20 20 20 22 4f 6e 20 70 61 67 65 20 25 64 20      "On page %d 
32fc0 61 74 20 72 69 67 68 74 20 63 68 69 6c 64 3a 20  at right child: 
32fd0 22 2c 20 69 50 61 67 65 29 3b 0a 23 69 66 6e 64  ", iPage);.#ifnd
32fe0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
32ff0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
33000 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
33010 6d 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b  m ){.      check
33020 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70  Ptrmap(pCheck, p
33030 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45  gno, PTRMAP_BTRE
33040 45 2c 20 69 50 61 67 65 2c 20 30 29 3b 0a 20 20  E, iPage, 0);.  
33050 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
33060 68 65 63 6b 54 72 65 65 50 61 67 65 28 70 43 68  heckTreePage(pCh
33070 65 63 6b 2c 20 70 67 6e 6f 2c 20 70 50 61 67 65  eck, pgno, pPage
33080 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 7d  , zContext);.  }
33090 0a 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f  . .  /* Check fo
330a0 72 20 63 6f 6d 70 6c 65 74 65 20 63 6f 76 65 72  r complete cover
330b0 61 67 65 20 6f 66 20 74 68 65 20 70 61 67 65 0a  age of the page.
330c0 20 20 2a 2f 0a 20 20 64 61 74 61 20 3d 20 70 50    */.  data = pP
330d0 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64  age->aData;.  hd
330e0 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
330f0 66 73 65 74 3b 0a 20 20 68 69 74 20 3d 20 73 71  fset;.  hit = sq
33100 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
33110 20 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20   usableSize );. 
33120 20 69 66 28 20 68 69 74 20 29 7b 0a 20 20 20 20   if( hit ){.    
33130 6d 65 6d 73 65 74 28 68 69 74 2c 20 31 2c 20 67  memset(hit, 1, g
33140 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
33150 72 2b 35 5d 29 29 3b 0a 20 20 20 20 6e 43 65 6c  r+5]));.    nCel
33160 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
33170 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20  ta[hdr+3]);.    
33180 63 65 6c 6c 53 74 61 72 74 20 3d 20 68 64 72 20  cellStart = hdr 
33190 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e  + 12 - 4*pPage->
331a0 6c 65 61 66 3b 0a 20 20 20 20 66 6f 72 28 69 3d  leaf;.    for(i=
331b0 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
331c0 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 63 20 3d  {.      int pc =
331d0 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
331e0 63 65 6c 6c 53 74 61 72 74 2b 69 2a 32 5d 29 3b  cellStart+i*2]);
331f0 0a 20 20 20 20 20 20 75 31 36 20 73 69 7a 65 20  .      u16 size 
33200 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
33210 61 67 65 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b  age, &data[pc]);
33220 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
33230 20 20 20 20 69 66 28 20 28 70 63 2b 73 69 7a 65      if( (pc+size
33240 2d 31 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20  -1)>=usableSize 
33250 7c 7c 20 70 63 3c 30 20 29 7b 0a 20 20 20 20 20  || pc<0 ){.     
33260 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
33270 67 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a 20 20  g(pCheck, 0, .  
33280 20 20 20 20 20 20 20 20 20 20 22 43 6f 72 72 75            "Corru
33290 70 74 69 6f 6e 20 64 65 74 65 63 74 65 64 20 69  ption detected i
332a0 6e 20 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61 67  n cell %d on pag
332b0 65 20 25 64 22 2c 69 2c 69 50 61 67 65 2c 30 29  e %d",i,iPage,0)
332c0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
332d0 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 70 63 2b         for(j=pc+
332e0 73 69 7a 65 2d 31 3b 20 6a 3e 3d 70 63 3b 20 6a  size-1; j>=pc; j
332f0 2d 2d 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20  --) hit[j]++;.  
33300 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
33310 66 6f 72 28 63 6e 74 3d 30 2c 20 69 3d 67 65 74  for(cnt=0, i=get
33320 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
33330 31 5d 29 3b 20 69 3e 30 20 26 26 20 69 3c 75 73  1]); i>0 && i<us
33340 61 62 6c 65 53 69 7a 65 20 26 26 20 63 6e 74 3c  ableSize && cnt<
33350 31 30 30 30 30 3b 20 0a 20 20 20 20 20 20 20 20  10000; .        
33360 20 20 20 63 6e 74 2b 2b 29 7b 0a 20 20 20 20 20     cnt++){.     
33370 20 69 6e 74 20 73 69 7a 65 20 3d 20 67 65 74 32   int size = get2
33380 62 79 74 65 28 26 64 61 74 61 5b 69 2b 32 5d 29  byte(&data[i+2])
33390 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
333a0 20 20 20 20 20 69 66 28 20 28 69 2b 73 69 7a 65       if( (i+size
333b0 2d 31 29 3e 3d 75 73 61 62 6c 65 53 69 7a 65 20  -1)>=usableSize 
333c0 7c 7c 20 69 3c 30 20 29 7b 0a 20 20 20 20 20 20  || i<0 ){.      
333d0 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
333e0 28 70 43 68 65 63 6b 2c 20 30 2c 20 20 0a 20 20  (pCheck, 0,  .  
333f0 20 20 20 20 20 20 20 20 20 20 22 43 6f 72 72 75            "Corru
33400 70 74 69 6f 6e 20 64 65 74 65 63 74 65 64 20 69  ption detected i
33410 6e 20 63 65 6c 6c 20 25 64 20 6f 6e 20 70 61 67  n cell %d on pag
33420 65 20 25 64 22 2c 69 2c 69 50 61 67 65 2c 30 29  e %d",i,iPage,0)
33430 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
33440 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 69 2b 73         for(j=i+s
33450 69 7a 65 2d 31 3b 20 6a 3e 3d 69 3b 20 6a 2d 2d  ize-1; j>=i; j--
33460 29 20 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20  ) hit[j]++;.    
33470 20 20 7d 0a 20 20 20 20 20 20 69 20 3d 20 67 65    }.      i = ge
33480 74 32 62 79 74 65 28 26 64 61 74 61 5b 69 5d 29  t2byte(&data[i])
33490 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
334a0 69 3d 63 6e 74 3d 30 3b 20 69 3c 75 73 61 62 6c  i=cnt=0; i<usabl
334b0 65 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20  eSize; i++){.   
334c0 20 20 20 69 66 28 20 68 69 74 5b 69 5d 3d 3d 30     if( hit[i]==0
334d0 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6e 74 2b   ){.        cnt+
334e0 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  +;.      }else i
334f0 66 28 20 68 69 74 5b 69 5d 3e 31 20 29 7b 0a 20  f( hit[i]>1 ){. 
33500 20 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65         checkAppe
33510 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c  ndMsg(pCheck, 0,
33520 0a 20 20 20 20 20 20 20 20 20 20 22 4d 75 6c 74  .          "Mult
33530 69 70 6c 65 20 75 73 65 73 20 66 6f 72 20 62 79  iple uses for by
33540 74 65 20 25 64 20 6f 66 20 70 61 67 65 20 25 64  te %d of page %d
33550 22 2c 20 69 2c 20 69 50 61 67 65 29 3b 0a 20 20  ", i, iPage);.  
33560 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
33570 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
33580 66 28 20 63 6e 74 21 3d 64 61 74 61 5b 68 64 72  f( cnt!=data[hdr
33590 2b 37 5d 20 29 7b 0a 20 20 20 20 20 20 63 68 65  +7] ){.      che
335a0 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
335b0 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  ck, 0, .        
335c0 20 20 22 46 72 61 67 6d 65 6e 74 65 64 20 73 70    "Fragmented sp
335d0 61 63 65 20 69 73 20 25 64 20 62 79 74 65 20 72  ace is %d byte r
335e0 65 70 6f 72 74 65 64 20 61 73 20 25 64 20 6f 6e  eported as %d on
335f0 20 70 61 67 65 20 25 64 22 2c 0a 20 20 20 20 20   page %d",.     
33600 20 20 20 20 20 63 6e 74 2c 20 64 61 74 61 5b 68       cnt, data[h
33610 64 72 2b 37 5d 2c 20 69 50 61 67 65 29 3b 0a 20  dr+7], iPage);. 
33620 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
33630 65 33 5f 66 72 65 65 28 68 69 74 29 3b 0a 0a 20  e3_free(hit);.. 
33640 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
33650 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 65  ge);.  return de
33660 70 74 68 2b 31 3b 0a 7d 0a 23 65 6e 64 69 66 20  pth+1;.}.#endif 
33670 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  /* SQLITE_OMIT_I
33680 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a  NTEGRITY_CHECK *
33690 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
336a0 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
336b0 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69  _CHECK./*.** Thi
336c0 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61  s routine does a
336d0 20 63 6f 6d 70 6c 65 74 65 20 63 68 65 63 6b 20   complete check 
336e0 6f 66 20 74 68 65 20 67 69 76 65 6e 20 42 54 72  of the given BTr
336f0 65 65 20 66 69 6c 65 2e 20 20 61 52 6f 6f 74 5b  ee file.  aRoot[
33700 5d 20 69 73 0a 2a 2a 20 61 6e 20 61 72 72 61 79  ] is.** an array
33710 20 6f 66 20 70 61 67 65 73 20 6e 75 6d 62 65 72   of pages number
33720 73 20 77 65 72 65 20 65 61 63 68 20 70 61 67 65  s were each page
33730 20 6e 75 6d 62 65 72 20 69 73 20 74 68 65 20 72   number is the r
33740 6f 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 61  oot page of.** a
33750 20 74 61 62 6c 65 2e 20 20 6e 52 6f 6f 74 20 69   table.  nRoot i
33760 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
33770 65 6e 74 72 69 65 73 20 69 6e 20 61 52 6f 6f 74  entries in aRoot
33780 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79  ..**.** If every
33790 74 68 69 6e 67 20 63 68 65 63 6b 73 20 6f 75 74  thing checks out
337a0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
337b0 65 74 75 72 6e 73 20 4e 55 4c 4c 2e 20 20 49 66  eturns NULL.  If
337c0 20 73 6f 6d 65 74 68 69 6e 67 20 69 73 0a 2a 2a   something is.**
337d0 20 61 6d 69 73 73 2c 20 61 6e 20 65 72 72 6f 72   amiss, an error
337e0 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74   message is writ
337f0 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20  ten into memory 
33800 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
33810 6c 6c 6f 63 28 29 0a 2a 2a 20 61 6e 64 20 61 20  lloc().** and a 
33820 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 20  pointer to that 
33830 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
33840 20 72 65 74 75 72 6e 65 64 2e 20 20 54 68 65 20   returned.  The 
33850 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
33860 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62  .** is responsib
33870 6c 65 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74  le for freeing t
33880 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
33890 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65   when it is done
338a0 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74  ..*/.char *sqlit
338b0 65 33 42 74 72 65 65 49 6e 74 65 67 72 69 74 79  e3BtreeIntegrity
338c0 43 68 65 63 6b 28 0a 20 20 42 74 72 65 65 20 2a  Check(.  Btree *
338d0 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74  p,     /* The bt
338e0 72 65 65 20 74 6f 20 62 65 20 63 68 65 63 6b 65  ree to be checke
338f0 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 6f 6f  d */.  int *aRoo
33900 74 2c 20 20 20 2f 2a 20 41 6e 20 61 72 72 61 79  t,   /* An array
33910 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 73 20 6e   of root pages n
33920 75 6d 62 65 72 73 20 66 6f 72 20 69 6e 64 69 76  umbers for indiv
33930 69 64 75 61 6c 20 74 72 65 65 73 20 2a 2f 0a 20  idual trees */. 
33940 20 69 6e 74 20 6e 52 6f 6f 74 2c 20 20 20 20 2f   int nRoot,    /
33950 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
33960 69 65 73 20 69 6e 20 61 52 6f 6f 74 5b 5d 20 2a  ies in aRoot[] *
33970 2f 0a 20 20 69 6e 74 20 6d 78 45 72 72 2c 20 20  /.  int mxErr,  
33980 20 20 2f 2a 20 53 74 6f 70 20 72 65 70 6f 72 74    /* Stop report
33990 69 6e 67 20 65 72 72 6f 72 73 20 61 66 74 65 72  ing errors after
339a0 20 74 68 69 73 20 6d 61 6e 79 20 2a 2f 0a 20 20   this many */.  
339b0 69 6e 74 20 2a 70 6e 45 72 72 20 20 20 20 2f 2a  int *pnErr    /*
339c0 20 57 72 69 74 65 20 6e 75 6d 62 65 72 20 6f 66   Write number of
339d0 20 65 72 72 6f 72 73 20 73 65 65 6e 20 74 6f 20   errors seen to 
339e0 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 2a 2f  this variable */
339f0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
33a00 6e 74 20 6e 52 65 66 3b 0a 20 20 49 6e 74 65 67  nt nRef;.  Integ
33a10 72 69 74 79 43 6b 20 73 43 68 65 63 6b 3b 0a 20  rityCk sCheck;. 
33a20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
33a30 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69   p->pBt;..  sqli
33a40 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
33a50 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d  ;.  pBt->db = p-
33a60 3e 64 62 3b 0a 20 20 6e 52 65 66 20 3d 20 73 71  >db;.  nRef = sq
33a70 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
33a80 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  nt(pBt->pPager);
33a90 0a 20 20 69 66 28 20 6c 6f 63 6b 42 74 72 65 65  .  if( lockBtree
33aa0 57 69 74 68 52 65 74 72 79 28 70 29 21 3d 53 51  WithRetry(p)!=SQ
33ab0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
33ac0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
33ad0 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (p);.    return 
33ae0 73 71 6c 69 74 65 33 53 74 72 44 75 70 28 22 55  sqlite3StrDup("U
33af0 6e 61 62 6c 65 20 74 6f 20 61 63 71 75 69 72 65  nable to acquire
33b00 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20   a read lock on 
33b10 74 68 65 20 64 61 74 61 62 61 73 65 22 29 3b 0a  the database");.
33b20 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e 70 42 74    }.  sCheck.pBt
33b30 20 3d 20 70 42 74 3b 0a 20 20 73 43 68 65 63 6b   = pBt;.  sCheck
33b40 2e 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70  .pPager = pBt->p
33b50 50 61 67 65 72 3b 0a 20 20 73 43 68 65 63 6b 2e  Pager;.  sCheck.
33b60 6e 50 61 67 65 20 3d 20 70 61 67 65 72 50 61 67  nPage = pagerPag
33b70 65 63 6f 75 6e 74 28 73 43 68 65 63 6b 2e 70 50  ecount(sCheck.pP
33b80 61 67 65 72 29 3b 0a 20 20 73 43 68 65 63 6b 2e  ager);.  sCheck.
33b90 6d 78 45 72 72 20 3d 20 6d 78 45 72 72 3b 0a 20  mxErr = mxErr;. 
33ba0 20 73 43 68 65 63 6b 2e 6e 45 72 72 20 3d 20 30   sCheck.nErr = 0
33bb0 3b 0a 20 20 2a 70 6e 45 72 72 20 3d 20 30 3b 0a  ;.  *pnErr = 0;.
33bc0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
33bd0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
33be0 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63   if( pBt->nTrunc
33bf0 21 3d 30 20 29 7b 0a 20 20 20 20 73 43 68 65 63  !=0 ){.    sChec
33c00 6b 2e 6e 50 61 67 65 20 3d 20 70 42 74 2d 3e 6e  k.nPage = pBt->n
33c10 54 72 75 6e 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  Trunc;.  }.#endi
33c20 66 0a 20 20 69 66 28 20 73 43 68 65 63 6b 2e 6e  f.  if( sCheck.n
33c30 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 75  Page==0 ){.    u
33c40 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
33c50 65 64 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c  ed(pBt);.    sql
33c60 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
33c70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
33c80 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e 61 6e  .  }.  sCheck.an
33c90 52 65 66 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  Ref = sqlite3Mal
33ca0 6c 6f 63 28 20 28 73 43 68 65 63 6b 2e 6e 50 61  loc( (sCheck.nPa
33cb0 67 65 2b 31 29 2a 73 69 7a 65 6f 66 28 73 43 68  ge+1)*sizeof(sCh
33cc0 65 63 6b 2e 61 6e 52 65 66 5b 30 5d 29 20 29 3b  eck.anRef[0]) );
33cd0 0a 20 20 69 66 28 20 21 73 43 68 65 63 6b 2e 61  .  if( !sCheck.a
33ce0 6e 52 65 66 20 29 7b 0a 20 20 20 20 75 6e 6c 6f  nRef ){.    unlo
33cf0 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
33d00 70 42 74 29 3b 0a 20 20 20 20 2a 70 6e 45 72 72  pBt);.    *pnErr
33d10 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 1;.    sqlite
33d20 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
33d30 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
33d40 65 33 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c  e3MPrintf(p->db,
33d50 20 22 55 6e 61 62 6c 65 20 74 6f 20 6d 61 6c 6c   "Unable to mall
33d60 6f 63 20 25 64 20 62 79 74 65 73 22 2c 20 0a 20  oc %d bytes", . 
33d70 20 20 20 20 20 20 20 28 73 43 68 65 63 6b 2e 6e         (sCheck.n
33d80 50 61 67 65 2b 31 29 2a 73 69 7a 65 6f 66 28 73  Page+1)*sizeof(s
33d90 43 68 65 63 6b 2e 61 6e 52 65 66 5b 30 5d 29 29  Check.anRef[0]))
33da0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
33db0 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65   i<=sCheck.nPage
33dc0 3b 20 69 2b 2b 29 7b 20 73 43 68 65 63 6b 2e 61  ; i++){ sCheck.a
33dd0 6e 52 65 66 5b 69 5d 20 3d 20 30 3b 20 7d 0a 20  nRef[i] = 0; }. 
33de0 20 69 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54   i = PENDING_BYT
33df0 45 5f 50 41 47 45 28 70 42 74 29 3b 0a 20 20 69  E_PAGE(pBt);.  i
33e00 66 28 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61  f( i<=sCheck.nPa
33e10 67 65 20 29 7b 0a 20 20 20 20 73 43 68 65 63 6b  ge ){.    sCheck
33e20 2e 61 6e 52 65 66 5b 69 5d 20 3d 20 31 3b 0a 20  .anRef[i] = 1;. 
33e30 20 7d 0a 20 20 73 43 68 65 63 6b 2e 7a 45 72 72   }.  sCheck.zErr
33e40 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43  Msg = 0;..  /* C
33e50 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69  heck the integri
33e60 74 79 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69  ty of the freeli
33e70 73 74 0a 20 20 2a 2f 0a 20 20 63 68 65 63 6b 4c  st.  */.  checkL
33e80 69 73 74 28 26 73 43 68 65 63 6b 2c 20 31 2c 20  ist(&sCheck, 1, 
33e90 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
33ea0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
33eb0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  ),.            g
33ec0 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
33ed0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
33ee0 2c 20 22 4d 61 69 6e 20 66 72 65 65 6c 69 73 74  , "Main freelist
33ef0 3a 20 22 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  : ");..  /* Chec
33f00 6b 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 73  k all the tables
33f10 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
33f20 3b 20 69 3c 6e 52 6f 6f 74 20 26 26 20 73 43 68  ; i<nRoot && sCh
33f30 65 63 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b  eck.mxErr; i++){
33f40 0a 20 20 20 20 69 66 28 20 61 52 6f 6f 74 5b 69  .    if( aRoot[i
33f50 5d 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ]==0 ) continue;
33f60 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
33f70 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
33f80 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
33f90 6f 56 61 63 75 75 6d 20 26 26 20 61 52 6f 6f 74  oVacuum && aRoot
33fa0 5b 69 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 63  [i]>1 ){.      c
33fb0 68 65 63 6b 50 74 72 6d 61 70 28 26 73 43 68 65  heckPtrmap(&sChe
33fc0 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 50 54  ck, aRoot[i], PT
33fd0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30  RMAP_ROOTPAGE, 0
33fe0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  , 0);.    }.#end
33ff0 69 66 0a 20 20 20 20 63 68 65 63 6b 54 72 65 65  if.    checkTree
34000 50 61 67 65 28 26 73 43 68 65 63 6b 2c 20 61 52  Page(&sCheck, aR
34010 6f 6f 74 5b 69 5d 2c 20 30 2c 20 22 4c 69 73 74  oot[i], 0, "List
34020 20 6f 66 20 74 72 65 65 20 72 6f 6f 74 73 3a 20   of tree roots: 
34030 22 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  ");.  }..  /* Ma
34040 6b 65 20 73 75 72 65 20 65 76 65 72 79 20 70 61  ke sure every pa
34050 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69  ge in the file i
34060 73 20 72 65 66 65 72 65 6e 63 65 64 0a 20 20 2a  s referenced.  *
34070 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d  /.  for(i=1; i<=
34080 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 26 26 20  sCheck.nPage && 
34090 73 43 68 65 63 6b 2e 6d 78 45 72 72 3b 20 69 2b  sCheck.mxErr; i+
340a0 2b 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  +){.#ifdef SQLIT
340b0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
340c0 4d 0a 20 20 20 20 69 66 28 20 73 43 68 65 63 6b  M.    if( sCheck
340d0 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 29 7b 0a  .anRef[i]==0 ){.
340e0 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
340f0 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c  dMsg(&sCheck, 0,
34100 20 22 50 61 67 65 20 25 64 20 69 73 20 6e 65 76   "Page %d is nev
34110 65 72 20 75 73 65 64 22 2c 20 69 29 3b 0a 20 20  er used", i);.  
34120 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a    }.#else.    /*
34130 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
34140 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
34150 61 63 75 75 6d 2c 20 6d 61 6b 65 20 73 75 72 65  acuum, make sure
34160 20 6e 6f 20 74 61 62 6c 65 73 20 63 6f 6e 74 61   no tables conta
34170 69 6e 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65  in.    ** refere
34180 6e 63 65 73 20 74 6f 20 70 6f 69 6e 74 65 72 2d  nces to pointer-
34190 6d 61 70 20 70 61 67 65 73 2e 0a 20 20 20 20 2a  map pages..    *
341a0 2f 0a 20 20 20 20 69 66 28 20 73 43 68 65 63 6b  /.    if( sCheck
341b0 2e 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 26 26 20  .anRef[i]==0 && 
341c0 0a 20 20 20 20 20 20 20 28 50 54 52 4d 41 50 5f  .       (PTRMAP_
341d0 50 41 47 45 4e 4f 28 70 42 74 2c 20 69 29 21 3d  PAGENO(pBt, i)!=
341e0 69 20 7c 7c 20 21 70 42 74 2d 3e 61 75 74 6f 56  i || !pBt->autoV
341f0 61 63 75 75 6d 29 20 29 7b 0a 20 20 20 20 20 20  acuum) ){.      
34200 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26  checkAppendMsg(&
34210 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 61 67 65  sCheck, 0, "Page
34220 20 25 64 20 69 73 20 6e 65 76 65 72 20 75 73 65   %d is never use
34230 64 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20  d", i);.    }.  
34240 20 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e 52    if( sCheck.anR
34250 65 66 5b 69 5d 21 3d 30 20 26 26 20 0a 20 20 20  ef[i]!=0 && .   
34260 20 20 20 20 28 50 54 52 4d 41 50 5f 50 41 47 45      (PTRMAP_PAGE
34270 4e 4f 28 70 42 74 2c 20 69 29 3d 3d 69 20 26 26  NO(pBt, i)==i &&
34280 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
34290 29 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b  ) ){.      check
342a0 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63  AppendMsg(&sChec
342b0 6b 2c 20 30 2c 20 22 50 6f 69 6e 74 65 72 20 6d  k, 0, "Pointer m
342c0 61 70 20 70 61 67 65 20 25 64 20 69 73 20 72 65  ap page %d is re
342d0 66 65 72 65 6e 63 65 64 22 2c 20 69 29 3b 0a 20  ferenced", i);. 
342e0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
342f0 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
34300 74 68 69 73 20 61 6e 61 6c 79 73 69 73 20 64 69  this analysis di
34310 64 20 6e 6f 74 20 6c 65 61 76 65 20 61 6e 79 20  d not leave any 
34320 75 6e 72 65 66 28 29 20 70 61 67 65 73 0a 20 20  unref() pages.  
34330 2a 2f 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  */.  unlockBtree
34340 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
34350 20 69 66 28 20 6e 52 65 66 20 21 3d 20 73 71 6c   if( nRef != sql
34360 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
34370 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29  t(pBt->pPager) )
34380 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e  {.    checkAppen
34390 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c  dMsg(&sCheck, 0,
343a0 20 0a 20 20 20 20 20 20 22 4f 75 74 73 74 61 6e   .      "Outstan
343b0 64 69 6e 67 20 70 61 67 65 20 63 6f 75 6e 74 20  ding page count 
343c0 67 6f 65 73 20 66 72 6f 6d 20 25 64 20 74 6f 20  goes from %d to 
343d0 25 64 20 64 75 72 69 6e 67 20 74 68 69 73 20 61  %d during this a
343e0 6e 61 6c 79 73 69 73 22 2c 0a 20 20 20 20 20 20  nalysis",.      
343f0 6e 52 65 66 2c 20 73 71 6c 69 74 65 33 50 61 67  nRef, sqlite3Pag
34400 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e  erRefcount(pBt->
34410 70 50 61 67 65 72 29 0a 20 20 20 20 29 3b 0a 20  pPager).    );. 
34420 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 20   }..  /* Clean  
34430 75 70 20 61 6e 64 20 72 65 70 6f 72 74 20 65 72  up and report er
34440 72 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  rors..  */.  sql
34450 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
34460 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
34470 65 28 73 43 68 65 63 6b 2e 61 6e 52 65 66 29 3b  e(sCheck.anRef);
34480 0a 20 20 2a 70 6e 45 72 72 20 3d 20 73 43 68 65  .  *pnErr = sChe
34490 63 6b 2e 6e 45 72 72 3b 0a 20 20 72 65 74 75 72  ck.nErr;.  retur
344a0 6e 20 73 43 68 65 63 6b 2e 7a 45 72 72 4d 73 67  n sCheck.zErrMsg
344b0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
344c0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
344d0 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 2f 2a  ITY_CHECK */../*
344e0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
344f0 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  ull pathname of 
34500 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  the underlying d
34510 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
34520 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 66 69  .** The pager fi
34530 6c 65 6e 61 6d 65 20 69 73 20 69 6e 76 61 72 69  lename is invari
34540 61 6e 74 20 61 73 20 6c 6f 6e 67 20 61 73 20 74  ant as long as t
34550 68 65 20 70 61 67 65 72 20 69 73 0a 2a 2a 20 6f  he pager is.** o
34560 70 65 6e 20 73 6f 20 69 74 20 69 73 20 73 61 66  pen so it is saf
34570 65 20 74 6f 20 61 63 63 65 73 73 20 77 69 74 68  e to access with
34580 6f 75 74 20 74 68 65 20 42 74 53 68 61 72 65 64  out the BtShared
34590 20 6d 75 74 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74   mutex..*/.const
345a0 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74   char *sqlite3Bt
345b0 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 42  reeGetFilename(B
345c0 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65  tree *p){.  asse
345d0 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67  rt( p->pBt->pPag
345e0 65 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  er!=0 );.  retur
345f0 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  n sqlite3PagerFi
34600 6c 65 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70  lename(p->pBt->p
34610 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pager);.}../*.**
34620 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 74 68   Return the path
34630 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65  name of the dire
34640 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61  ctory that conta
34650 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ins the database
34660 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   file..**.** The
34670 20 70 61 67 65 72 20 64 69 72 65 63 74 6f 72 79   pager directory
34680 20 6e 61 6d 65 20 69 73 20 69 6e 76 61 72 69 61   name is invaria
34690 6e 74 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68  nt as long as th
346a0 65 20 70 61 67 65 72 20 69 73 0a 2a 2a 20 6f 70  e pager is.** op
346b0 65 6e 20 73 6f 20 69 74 20 69 73 20 73 61 66 65  en so it is safe
346c0 20 74 6f 20 61 63 63 65 73 73 20 77 69 74 68 6f   to access witho
346d0 75 74 20 74 68 65 20 42 74 53 68 61 72 65 64 20  ut the BtShared 
346e0 6d 75 74 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  mutex..*/.const 
346f0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72  char *sqlite3Btr
34700 65 65 47 65 74 44 69 72 6e 61 6d 65 28 42 74 72  eeGetDirname(Btr
34710 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  ee *p){.  assert
34720 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  ( p->pBt->pPager
34730 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
34740 73 71 6c 69 74 65 33 50 61 67 65 72 44 69 72 6e  sqlite3PagerDirn
34750 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  ame(p->pBt->pPag
34760 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  er);.}../*.** Re
34770 74 75 72 6e 20 74 68 65 20 70 61 74 68 6e 61 6d  turn the pathnam
34780 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
34790 20 66 69 6c 65 20 66 6f 72 20 74 68 69 73 20 64   file for this d
347a0 61 74 61 62 61 73 65 2e 20 54 68 65 20 72 65 74  atabase. The ret
347b0 75 72 6e 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  urn.** value of 
347c0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
347d0 74 68 65 20 73 61 6d 65 20 72 65 67 61 72 64 6c  the same regardl
347e0 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 74  ess of whether t
347f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
34800 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72 65 61  ** has been crea
34810 74 65 64 20 6f 72 20 6e 6f 74 2e 0a 2a 2a 0a 2a  ted or not..**.*
34820 2a 20 54 68 65 20 70 61 67 65 72 20 6a 6f 75 72  * The pager jour
34830 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
34840 69 6e 76 61 72 69 61 6e 74 20 61 73 20 6c 6f 6e  invariant as lon
34850 67 20 61 73 20 74 68 65 20 70 61 67 65 72 20 69  g as the pager i
34860 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20 69 74 20  s.** open so it 
34870 69 73 20 73 61 66 65 20 74 6f 20 61 63 63 65 73  is safe to acces
34880 73 20 77 69 74 68 6f 75 74 20 74 68 65 20 42 74  s without the Bt
34890 53 68 61 72 65 64 20 6d 75 74 65 78 2e 0a 2a 2f  Shared mutex..*/
348a0 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
348b0 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72  ite3BtreeGetJour
348c0 6e 61 6c 6e 61 6d 65 28 42 74 72 65 65 20 2a 70  nalname(Btree *p
348d0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
348e0 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29  pBt->pPager!=0 )
348f0 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
34900 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61  e3PagerJournalna
34910 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  me(p->pBt->pPage
34920 72 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  r);.}..#ifndef S
34930 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55  QLITE_OMIT_VACUU
34940 4d 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65  M./*.** Copy the
34950 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e   complete conten
34960 74 20 6f 66 20 70 42 74 46 72 6f 6d 20 69 6e 74  t of pBtFrom int
34970 6f 20 70 42 74 54 6f 2e 20 20 41 20 74 72 61 6e  o pBtTo.  A tran
34980 73 61 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20  saction.** must 
34990 62 65 20 61 63 74 69 76 65 20 66 6f 72 20 62 6f  be active for bo
349a0 74 68 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  th files..**.** 
349b0 54 68 65 20 73 69 7a 65 20 6f 66 20 66 69 6c 65  The size of file
349c0 20 70 54 6f 20 6d 61 79 20 62 65 20 72 65 64 75   pTo may be redu
349d0 63 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72  ced by this oper
349e0 61 74 69 6f 6e 2e 0a 2a 2a 20 49 66 20 61 6e 79  ation..** If any
349f0 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
34a00 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
34a10 6e 20 6f 6e 20 70 54 6f 20 69 73 20 72 6f 6c 6c  n on pTo is roll
34a20 65 64 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20  ed back. .**.** 
34a30 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 43  If successful, C
34a40 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
34a50 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  may be called on
34a60 20 70 54 6f 20 62 65 66 6f 72 65 20 72 65 74 75   pTo before retu
34a70 72 6e 69 6e 67 2e 20 0a 2a 2a 20 54 68 65 20 63  rning. .** The c
34a80 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 66 69 6e  aller should fin
34a90 69 73 68 20 63 6f 6d 6d 69 74 74 69 6e 67 20 74  ish committing t
34aa0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  he transaction o
34ab0 6e 20 70 54 6f 20 62 79 20 63 61 6c 6c 69 6e 67  n pTo by calling
34ac0 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
34ad0 43 6f 6d 6d 69 74 28 29 2e 0a 2a 2f 0a 73 74 61  Commit()..*/.sta
34ae0 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 6f 70  tic int btreeCop
34af0 79 46 69 6c 65 28 42 74 72 65 65 20 2a 70 54 6f  yFile(Btree *pTo
34b00 2c 20 42 74 72 65 65 20 2a 70 46 72 6f 6d 29 7b  , Btree *pFrom){
34b10 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
34b20 54 45 5f 4f 4b 3b 0a 20 20 50 67 6e 6f 20 69 3b  TE_OK;.  Pgno i;
34b30 0a 0a 20 20 50 67 6e 6f 20 6e 46 72 6f 6d 50 61  ..  Pgno nFromPa
34b40 67 65 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ge;     /* Numbe
34b50 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70 46  r of pages in pF
34b60 72 6f 6d 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54  rom */.  Pgno nT
34b70 6f 50 61 67 65 3b 20 20 20 20 20 20 20 2f 2a 20  oPage;       /* 
34b80 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
34b90 69 6e 20 70 54 6f 20 2a 2f 0a 20 20 50 67 6e 6f  in pTo */.  Pgno
34ba0 20 6e 4e 65 77 50 61 67 65 3b 20 20 20 20 20 20   nNewPage;      
34bb0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
34bc0 65 73 20 69 6e 20 70 54 6f 20 61 66 74 65 72 20  es in pTo after 
34bd0 74 68 65 20 63 6f 70 79 20 2a 2f 0a 0a 20 20 50  the copy */..  P
34be0 67 6e 6f 20 69 53 6b 69 70 3b 20 20 20 20 20 20  gno iSkip;      
34bf0 20 20 20 2f 2a 20 50 65 6e 64 69 6e 67 20 62 79     /* Pending by
34c00 74 65 20 70 61 67 65 20 69 6e 20 70 54 6f 20 2a  te page in pTo *
34c10 2f 0a 20 20 69 6e 74 20 6e 54 6f 50 61 67 65 53  /.  int nToPageS
34c20 69 7a 65 3b 20 20 20 20 2f 2a 20 50 61 67 65 20  ize;    /* Page 
34c30 73 69 7a 65 20 6f 66 20 70 54 6f 20 69 6e 20 62  size of pTo in b
34c40 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  ytes */.  int nF
34c50 72 6f 6d 50 61 67 65 53 69 7a 65 3b 20 20 2f 2a  romPageSize;  /*
34c60 20 50 61 67 65 20 73 69 7a 65 20 6f 66 20 70 46   Page size of pF
34c70 72 6f 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  rom in bytes */.
34c80 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
34c90 54 6f 20 3d 20 70 54 6f 2d 3e 70 42 74 3b 0a 20  To = pTo->pBt;. 
34ca0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 46 72   BtShared *pBtFr
34cb0 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b  om = pFrom->pBt;
34cc0 0a 20 20 70 42 74 54 6f 2d 3e 64 62 20 3d 20 70  .  pBtTo->db = p
34cd0 54 6f 2d 3e 64 62 3b 0a 20 20 70 42 74 46 72 6f  To->db;.  pBtFro
34ce0 6d 2d 3e 64 62 20 3d 20 70 46 72 6f 6d 2d 3e 64  m->db = pFrom->d
34cf0 62 3b 0a 0a 20 20 6e 54 6f 50 61 67 65 53 69 7a  b;..  nToPageSiz
34d00 65 20 3d 20 70 42 74 54 6f 2d 3e 70 61 67 65 53  e = pBtTo->pageS
34d10 69 7a 65 3b 0a 20 20 6e 46 72 6f 6d 50 61 67 65  ize;.  nFromPage
34d20 53 69 7a 65 20 3d 20 70 42 74 46 72 6f 6d 2d 3e  Size = pBtFrom->
34d30 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 69 66 28  pageSize;..  if(
34d40 20 70 54 6f 2d 3e 69 6e 54 72 61 6e 73 21 3d 54   pTo->inTrans!=T
34d50 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 70 46  RANS_WRITE || pF
34d60 72 6f 6d 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  rom->inTrans!=TR
34d70 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
34d80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
34d90 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
34da0 70 42 74 54 6f 2d 3e 70 43 75 72 73 6f 72 20 29  pBtTo->pCursor )
34db0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
34dc0 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20  ITE_BUSY;.  }.. 
34dd0 20 6e 54 6f 50 61 67 65 20 3d 20 70 61 67 65 72   nToPage = pager
34de0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 54 6f 2d  Pagecount(pBtTo-
34df0 3e 70 50 61 67 65 72 29 3b 0a 20 20 6e 46 72 6f  >pPager);.  nFro
34e00 6d 50 61 67 65 20 3d 20 70 61 67 65 72 50 61 67  mPage = pagerPag
34e10 65 63 6f 75 6e 74 28 70 42 74 46 72 6f 6d 2d 3e  ecount(pBtFrom->
34e20 70 50 61 67 65 72 29 3b 0a 20 20 69 53 6b 69 70  pPager);.  iSkip
34e30 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f   = PENDING_BYTE_
34e40 50 41 47 45 28 70 42 74 54 6f 29 3b 0a 0a 20 20  PAGE(pBtTo);..  
34e50 2f 2a 20 56 61 72 69 61 62 6c 65 20 6e 4e 65 77  /* Variable nNew
34e60 50 61 67 65 20 69 73 20 74 68 65 20 6e 75 6d 62  Page is the numb
34e70 65 72 20 6f 66 20 70 61 67 65 73 20 72 65 71 75  er of pages requ
34e80 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  ired to store th
34e90 65 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  e.  ** contents 
34ea0 6f 66 20 70 46 72 6f 6d 20 75 73 69 6e 67 20 74  of pFrom using t
34eb0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2d  he current page-
34ec0 73 69 7a 65 20 6f 66 20 70 54 6f 2e 0a 20 20 2a  size of pTo..  *
34ed0 2f 0a 20 20 6e 4e 65 77 50 61 67 65 20 3d 20 28  /.  nNewPage = (
34ee0 28 69 36 34 29 6e 46 72 6f 6d 50 61 67 65 20 2a  (i64)nFromPage *
34ef0 20 28 69 36 34 29 6e 46 72 6f 6d 50 61 67 65 53   (i64)nFromPageS
34f00 69 7a 65 20 2b 20 28 69 36 34 29 6e 54 6f 50 61  ize + (i64)nToPa
34f10 67 65 53 69 7a 65 20 2d 20 31 29 20 2f 20 0a 20  geSize - 1) / . 
34f20 20 20 20 20 20 28 69 36 34 29 6e 54 6f 50 61 67       (i64)nToPag
34f30 65 53 69 7a 65 3b 0a 0a 20 20 66 6f 72 28 69 3d  eSize;..  for(i=
34f40 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  1; rc==SQLITE_OK
34f50 20 26 26 20 28 69 3c 3d 6e 54 6f 50 61 67 65 20   && (i<=nToPage 
34f60 7c 7c 20 69 3c 3d 6e 4e 65 77 50 61 67 65 29 3b  || i<=nNewPage);
34f70 20 69 2b 2b 29 7b 0a 0a 20 20 20 20 2f 2a 20 4a   i++){..    /* J
34f80 6f 75 72 6e 61 6c 20 74 68 65 20 6f 72 69 67 69  ournal the origi
34f90 6e 61 6c 20 70 61 67 65 2e 0a 20 20 20 20 2a 2a  nal page..    **
34fa0 0a 20 20 20 20 2a 2a 20 69 53 6b 69 70 20 69 73  .    ** iSkip is
34fb0 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
34fc0 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   of the locking 
34fd0 70 61 67 65 20 28 50 45 4e 44 49 4e 47 5f 42 59  page (PENDING_BY
34fe0 54 45 5f 50 41 47 45 29 0a 20 20 20 20 2a 2a 20  TE_PAGE).    ** 
34ff0 69 6e 20 64 61 74 61 62 61 73 65 20 2a 70 54 6f  in database *pTo
35000 20 28 62 65 66 6f 72 65 20 74 68 65 20 63 6f 70   (before the cop
35010 79 29 2e 20 54 68 69 73 20 70 61 67 65 20 69 73  y). This page is
35020 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 0a   never written .
35030 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
35040 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 55 6e  journal file. Un
35050 6c 65 73 73 20 69 3d 3d 69 53 6b 69 70 20 6f 72  less i==iSkip or
35060 20 74 68 65 20 70 61 67 65 20 77 61 73 20 6e 6f   the page was no
35070 74 0a 20 20 20 20 2a 2a 20 70 72 65 73 65 6e 74  t.    ** present
35080 20 69 6e 20 70 54 6f 20 62 65 66 6f 72 65 20 74   in pTo before t
35090 68 65 20 63 6f 70 79 20 6f 70 65 72 61 74 69 6f  he copy operatio
350a0 6e 2c 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  n, journal page 
350b0 69 20 66 72 6f 6d 20 70 54 6f 2e 0a 20 20 20 20  i from pTo..    
350c0 2a 2f 0a 20 20 20 20 69 66 28 20 69 21 3d 69 53  */.    if( i!=iS
350d0 6b 69 70 20 26 26 20 69 3c 3d 6e 54 6f 50 61 67  kip && i<=nToPag
350e0 65 20 29 7b 0a 20 20 20 20 20 20 44 62 50 61 67  e ){.      DbPag
350f0 65 20 2a 70 44 62 50 61 67 65 20 3d 20 30 3b 0a  e *pDbPage = 0;.
35100 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
35110 65 33 50 61 67 65 72 47 65 74 28 70 42 74 54 6f  e3PagerGet(pBtTo
35120 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20 26 70 44  ->pPager, i, &pD
35130 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
35140 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
35150 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
35160 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
35170 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  e(pDbPage);.    
35180 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
35190 54 45 5f 4f 4b 20 26 26 20 69 3e 6e 46 72 6f 6d  TE_OK && i>nFrom
351a0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
351b0 20 20 2f 2a 20 59 65 61 68 2e 20 20 49 74 20 73    /* Yeah.  It s
351c0 65 65 6d 73 20 77 69 65 72 64 20 74 6f 20 63 61  eems wierd to ca
351d0 6c 6c 20 44 6f 6e 74 57 72 69 74 65 28 29 20 72  ll DontWrite() r
351e0 69 67 68 74 20 61 66 74 65 72 20 57 72 69 74 65  ight after Write
351f0 28 29 2e 20 42 75 74 0a 20 20 20 20 20 20 20 20  (). But.        
35200 20 20 2a 2a 20 74 68 61 74 20 69 73 20 62 65 63    ** that is bec
35210 61 75 73 65 20 74 68 65 20 6e 61 6d 65 73 20 6f  ause the names o
35220 66 20 74 68 6f 73 65 20 70 72 6f 63 65 64 75 72  f those procedur
35230 65 73 20 64 6f 20 6e 6f 74 20 65 78 61 63 74 6c  es do not exactl
35240 79 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  y .          ** 
35250 72 65 70 72 65 73 65 6e 74 20 77 68 61 74 20 74  represent what t
35260 68 65 79 20 64 6f 2e 20 20 57 72 69 74 65 28 29  hey do.  Write()
35270 20 72 65 61 6c 6c 79 20 6d 65 61 6e 73 20 22 70   really means "p
35280 75 74 20 74 68 69 73 20 70 61 67 65 20 69 6e 20  ut this page in 
35290 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
352a0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
352b0 6c 20 61 6e 64 20 6d 61 72 6b 20 69 74 20 61 73  l and mark it as
352c0 20 64 69 72 74 79 20 73 6f 20 74 68 61 74 20 69   dirty so that i
352d0 74 20 77 69 6c 6c 20 62 65 20 77 72 69 74 74 65  t will be writte
352e0 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  n.          ** t
352f0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
35300 69 6c 65 20 6c 61 74 65 72 2e 22 20 20 44 6f 6e  ile later."  Don
35310 74 57 72 69 74 65 28 29 20 75 6e 64 6f 65 73 20  tWrite() undoes 
35320 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 74 20  the second part 
35330 6f 66 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  of.          ** 
35340 74 68 61 74 20 61 6e 64 20 70 72 65 76 65 6e 74  that and prevent
35350 73 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  s the page from 
35360 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f  being written to
35370 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 54   the database. T
35380 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
35390 70 61 67 65 20 69 73 20 73 74 69 6c 6c 20 6f 6e  page is still on
353a0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
353b0 75 72 6e 61 6c 2c 20 74 68 6f 75 67 68 2e 20 20  urnal, though.  
353c0 41 6e 64 20 74 68 61 74 20 69 73 20 74 68 65 20  And that is the 
353d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 68  .          ** wh
353e0 6f 6c 65 20 70 6f 69 6e 74 20 6f 66 20 74 68 69  ole point of thi
353f0 73 20 62 6c 6f 63 6b 3a 20 74 6f 20 70 75 74 20  s block: to put 
35400 70 61 67 65 73 20 6f 6e 20 74 68 65 20 72 6f 6c  pages on the rol
35410 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 0a  lback journal. .
35420 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
35430 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
35440 67 65 72 44 6f 6e 74 57 72 69 74 65 28 70 44 62  gerDontWrite(pDb
35450 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
35460 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
35470 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
35480 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
35490 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77   }..    /* Overw
354a0 72 69 74 65 20 74 68 65 20 64 61 74 61 20 69 6e  rite the data in
354b0 20 70 61 67 65 20 69 20 6f 66 20 74 68 65 20 74   page i of the t
354c0 61 72 67 65 74 20 64 61 74 61 62 61 73 65 20 2a  arget database *
354d0 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
354e0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 21 3d 69 53  LITE_OK && i!=iS
354f0 6b 69 70 20 26 26 20 69 3c 3d 6e 4e 65 77 50 61  kip && i<=nNewPa
35500 67 65 20 29 7b 0a 0a 20 20 20 20 20 20 44 62 50  ge ){..      DbP
35510 61 67 65 20 2a 70 54 6f 50 61 67 65 20 3d 20 30  age *pToPage = 0
35520 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
35530 69 6e 74 36 34 20 69 4f 66 66 3b 0a 0a 20 20 20  int64 iOff;..   
35540 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
35550 61 67 65 72 47 65 74 28 70 42 74 54 6f 2d 3e 70  agerGet(pBtTo->p
35560 50 61 67 65 72 2c 20 69 2c 20 26 70 54 6f 50 61  Pager, i, &pToPa
35570 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
35580 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
35590 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
355a0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
355b0 54 6f 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d  ToPage);.      }
355c0 0a 0a 20 20 20 20 20 20 66 6f 72 28 0a 20 20 20  ..      for(.   
355d0 20 20 20 20 20 69 4f 66 66 3d 28 69 2d 31 29 2a       iOff=(i-1)*
355e0 6e 54 6f 50 61 67 65 53 69 7a 65 3b 20 0a 20 20  nToPageSize; .  
355f0 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45        rc==SQLITE
35600 5f 4f 4b 20 26 26 20 69 4f 66 66 3c 69 2a 6e 54  _OK && iOff<i*nT
35610 6f 50 61 67 65 53 69 7a 65 3b 20 0a 20 20 20 20  oPageSize; .    
35620 20 20 20 20 69 4f 66 66 20 2b 3d 20 6e 46 72 6f      iOff += nFro
35630 6d 50 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20  mPageSize.      
35640 29 7b 0a 20 20 20 20 20 20 20 20 44 62 50 61 67  ){.        DbPag
35650 65 20 2a 70 46 72 6f 6d 50 61 67 65 20 3d 20 30  e *pFromPage = 0
35660 3b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69  ;.        Pgno i
35670 46 72 6f 6d 20 3d 20 28 69 4f 66 66 2f 6e 46 72  From = (iOff/nFr
35680 6f 6d 50 61 67 65 53 69 7a 65 29 2b 31 3b 0a 0a  omPageSize)+1;..
35690 20 20 20 20 20 20 20 20 69 66 28 20 69 46 72 6f          if( iFro
356a0 6d 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  m==PENDING_BYTE_
356b0 50 41 47 45 28 70 42 74 46 72 6f 6d 29 20 29 7b  PAGE(pBtFrom) ){
356c0 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
356d0 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  nue;.        }..
356e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
356f0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
35700 46 72 6f 6d 2d 3e 70 50 61 67 65 72 2c 20 69 46  From->pPager, iF
35710 72 6f 6d 2c 20 26 70 46 72 6f 6d 50 61 67 65 29  rom, &pFromPage)
35720 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
35730 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
35740 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
35750 54 6f 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  To = sqlite3Page
35760 72 47 65 74 44 61 74 61 28 70 54 6f 50 61 67 65  rGetData(pToPage
35770 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  );.          cha
35780 72 20 2a 7a 46 72 6f 6d 20 3d 20 73 71 6c 69 74  r *zFrom = sqlit
35790 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
357a0 46 72 6f 6d 50 61 67 65 29 3b 0a 20 20 20 20 20  FromPage);.     
357b0 20 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 3b 0a       int nCopy;.
357c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
357d0 46 72 6f 6d 50 61 67 65 53 69 7a 65 3e 3d 6e 54  FromPageSize>=nT
357e0 6f 50 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  oPageSize ){.   
357f0 20 20 20 20 20 20 20 20 20 7a 46 72 6f 6d 20 2b           zFrom +
35800 3d 20 28 28 69 2d 31 29 2a 6e 54 6f 50 61 67 65  = ((i-1)*nToPage
35810 53 69 7a 65 20 2d 20 28 28 69 46 72 6f 6d 2d 31  Size - ((iFrom-1
35820 29 2a 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 29  )*nFromPageSize)
35830 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  );.            n
35840 43 6f 70 79 20 3d 20 6e 54 6f 50 61 67 65 53 69  Copy = nToPageSi
35850 7a 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ze;.          }e
35860 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
35870 20 7a 54 6f 20 2b 3d 20 28 28 28 69 46 72 6f 6d   zTo += (((iFrom
35880 2d 31 29 2a 6e 46 72 6f 6d 50 61 67 65 53 69 7a  -1)*nFromPageSiz
35890 65 29 20 2d 20 28 69 2d 31 29 2a 6e 54 6f 50 61  e) - (i-1)*nToPa
358a0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
358b0 20 20 20 20 20 6e 43 6f 70 79 20 3d 20 6e 46 72       nCopy = nFr
358c0 6f 6d 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  omPageSize;.    
358d0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
358e0 20 20 20 6d 65 6d 63 70 79 28 7a 54 6f 2c 20 7a     memcpy(zTo, z
358f0 46 72 6f 6d 2c 20 6e 43 6f 70 79 29 3b 0a 09 20  From, nCopy);.. 
35900 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
35910 65 66 28 70 46 72 6f 6d 50 61 67 65 29 3b 0a 20  ef(pFromPage);. 
35920 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
35930 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f 50  ..      if( pToP
35940 61 67 65 20 29 20 73 71 6c 69 74 65 33 50 61 67  age ) sqlite3Pag
35950 65 72 55 6e 72 65 66 28 70 54 6f 50 61 67 65 29  erUnref(pToPage)
35960 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
35970 2a 20 49 66 20 74 68 69 6e 67 73 20 68 61 76 65  * If things have
35980 20 77 6f 72 6b 65 64 20 73 6f 20 66 61 72 2c 20   worked so far, 
35990 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
359a0 65 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65  e may need to be
359b0 20 0a 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64   .  ** truncated
359c0 2e 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 70 61  . The complex pa
359d0 72 74 20 69 73 20 74 68 61 74 20 69 74 20 6d 61  rt is that it ma
359e0 79 20 6e 65 65 64 20 74 6f 20 62 65 20 74 72 75  y need to be tru
359f0 6e 63 61 74 65 64 20 74 6f 0a 20 20 2a 2a 20 61  ncated to.  ** a
35a00 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6e 6f   size that is no
35a10 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c  t an integer mul
35a20 74 69 70 6c 65 20 6f 66 20 6e 54 6f 50 61 67 65  tiple of nToPage
35a30 53 69 7a 65 20 2d 20 74 68 65 20 63 75 72 72 65  Size - the curre
35a40 6e 74 0a 20 20 2a 2a 20 70 61 67 65 20 73 69 7a  nt.  ** page siz
35a50 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70 61  e used by the pa
35a60 67 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77  ger associated w
35a70 69 74 68 20 42 2d 54 72 65 65 20 70 54 6f 2e 0a  ith B-Tree pTo..
35a80 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 65 78    **.  ** For ex
35a90 61 6d 70 6c 65 2c 20 73 61 79 20 74 68 65 20 70  ample, say the p
35aa0 61 67 65 2d 73 69 7a 65 20 6f 66 20 70 54 6f 20  age-size of pTo 
35ab0 69 73 20 32 30 34 38 20 62 79 74 65 73 20 61 6e  is 2048 bytes an
35ac0 64 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 0a  d the original .
35ad0 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70    ** number of p
35ae0 61 67 65 73 20 69 73 20 35 20 28 31 30 20 4b 42  ages is 5 (10 KB
35af0 20 66 69 6c 65 29 2e 20 49 66 20 70 46 72 6f 6d   file). If pFrom
35b00 20 68 61 73 20 61 20 70 61 67 65 20 73 69 7a 65   has a page size
35b10 20 6f 66 20 31 30 32 34 20 0a 20 20 2a 2a 20 62   of 1024 .  ** b
35b20 79 74 65 73 20 61 6e 64 20 39 20 70 61 67 65 73  ytes and 9 pages
35b30 2c 20 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20  , then the file 
35b40 6e 65 65 64 73 20 74 6f 20 62 65 20 74 72 75 6e  needs to be trun
35b50 63 61 74 65 64 20 74 6f 20 39 4b 42 2e 0a 20 20  cated to 9KB..  
35b60 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
35b70 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
35b80 28 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 21  ( nFromPageSize!
35b90 3d 6e 54 6f 50 61 67 65 53 69 7a 65 20 29 7b 0a  =nToPageSize ){.
35ba0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
35bb0 6c 65 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69  le *pFile = sqli
35bc0 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74  te3PagerFile(pBt
35bd0 54 6f 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20  To->pPager);.   
35be0 20 20 20 69 36 34 20 69 53 69 7a 65 20 3d 20 28     i64 iSize = (
35bf0 69 36 34 29 6e 46 72 6f 6d 50 61 67 65 53 69 7a  i64)nFromPageSiz
35c00 65 20 2a 20 28 69 36 34 29 6e 46 72 6f 6d 50 61  e * (i64)nFromPa
35c10 67 65 3b 0a 20 20 20 20 20 20 69 36 34 20 69 4e  ge;.      i64 iN
35c20 6f 77 20 3d 20 28 69 36 34 29 28 28 6e 54 6f 50  ow = (i64)((nToP
35c30 61 67 65 3e 6e 4e 65 77 50 61 67 65 29 3f 6e 54  age>nNewPage)?nT
35c40 6f 50 61 67 65 3a 6e 4e 65 77 50 61 67 65 29 20  oPage:nNewPage) 
35c50 2a 20 28 69 36 34 29 6e 54 6f 50 61 67 65 53 69  * (i64)nToPageSi
35c60 7a 65 3b 20 0a 20 20 20 20 20 20 69 36 34 20 69  ze; .      i64 i
35c70 50 65 6e 64 69 6e 67 20 3d 20 28 28 69 36 34 29  Pending = ((i64)
35c80 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
35c90 45 28 70 42 74 54 6f 29 2d 31 29 20 2a 28 69 36  E(pBtTo)-1) *(i6
35ca0 34 29 6e 54 6f 50 61 67 65 53 69 7a 65 3b 0a 20  4)nToPageSize;. 
35cb0 20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20   .      assert( 
35cc0 69 53 69 7a 65 3c 3d 69 4e 6f 77 20 29 3b 0a 20  iSize<=iNow );. 
35cd0 20 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 69   .      /* Commi
35ce0 74 20 70 68 61 73 65 20 6f 6e 65 20 73 79 6e 63  t phase one sync
35cf0 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
35d00 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
35d10 74 68 20 70 54 6f 20 0a 20 20 20 20 20 20 2a 2a  th pTo .      **
35d20 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
35d30 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 2e 20 49  original data. I
35d40 74 20 64 6f 65 73 20 6e 6f 74 20 73 79 6e 63 20  t does not sync 
35d50 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
35d60 65 0a 20 20 20 20 20 20 2a 2a 20 69 74 73 65 6c  e.      ** itsel
35d70 66 2e 20 41 66 74 65 72 20 64 6f 69 6e 67 20 74  f. After doing t
35d80 68 69 73 20 69 74 20 69 73 20 73 61 66 65 20 74  his it is safe t
35d90 6f 20 75 73 65 20 4f 73 54 72 75 6e 63 61 74 65  o use OsTruncate
35da0 28 29 20 61 6e 64 20 6f 74 68 65 72 0a 20 20 20  () and other.   
35db0 20 20 20 2a 2a 20 66 69 6c 65 20 41 50 49 73 20     ** file APIs 
35dc0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
35dd0 66 69 6c 65 20 64 69 72 65 63 74 6c 79 2e 0a 20  file directly.. 
35de0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 42       */.      pB
35df0 74 54 6f 2d 3e 64 62 20 3d 20 70 54 6f 2d 3e 64  tTo->db = pTo->d
35e00 62 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  b;.      rc = sq
35e10 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
35e20 50 68 61 73 65 4f 6e 65 28 70 42 74 54 6f 2d 3e  PhaseOne(pBtTo->
35e30 70 50 61 67 65 72 2c 20 30 2c 20 30 2c 20 31 29  pPager, 0, 0, 1)
35e40 3b 0a 20 20 20 20 20 20 69 66 28 20 69 53 69 7a  ;.      if( iSiz
35e50 65 3c 69 4e 6f 77 20 26 26 20 72 63 3d 3d 53 51  e<iNow && rc==SQ
35e60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
35e70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
35e80 73 54 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2c  sTruncate(pFile,
35e90 20 69 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d   iSize);.      }
35ea0 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  .  .      /* The
35eb0 20 6c 6f 6f 70 20 74 68 61 74 20 63 6f 70 69 65   loop that copie
35ec0 64 20 64 61 74 61 20 66 72 6f 6d 20 64 61 74 61  d data from data
35ed0 62 61 73 65 20 70 46 72 6f 6d 20 74 6f 20 70 54  base pFrom to pT
35ee0 6f 20 64 69 64 20 6e 6f 74 0a 20 20 20 20 20 20  o did not.      
35ef0 2a 2a 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20  ** populate the 
35f00 6c 6f 63 6b 69 6e 67 20 70 61 67 65 20 6f 66 20  locking page of 
35f10 64 61 74 61 62 61 73 65 20 70 54 6f 2e 20 49 66  database pTo. If
35f20 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f   the page-size o
35f30 66 0a 20 20 20 20 20 20 2a 2a 20 70 46 72 6f 6d  f.      ** pFrom
35f40 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   is smaller than
35f50 20 74 68 61 74 20 6f 66 20 70 54 6f 2c 20 74 68   that of pTo, th
35f60 69 73 20 6d 65 61 6e 73 20 73 6f 6d 65 20 64 61  is means some da
35f70 74 61 20 77 69 6c 6c 0a 20 20 20 20 20 20 2a 2a  ta will.      **
35f80 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 63   not have been c
35f90 6f 70 69 65 64 2e 20 0a 20 20 20 20 20 20 2a 2a  opied. .      **
35fa0 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 62  .      ** This b
35fb0 6c 6f 63 6b 20 63 6f 70 69 65 73 20 74 68 65 20  lock copies the 
35fc0 6d 69 73 73 69 6e 67 20 64 61 74 61 20 66 72 6f  missing data fro
35fd0 6d 20 64 61 74 61 62 61 73 65 20 70 46 72 6f 6d  m database pFrom
35fe0 20 74 6f 20 70 54 6f 20 0a 20 20 20 20 20 20 2a   to pTo .      *
35ff0 2a 20 75 73 69 6e 67 20 66 69 6c 65 20 41 50 49  * using file API
36000 73 2e 20 54 68 69 73 20 69 73 20 73 61 66 65 20  s. This is safe 
36010 62 65 63 61 75 73 65 20 61 74 20 74 68 69 73 20  because at this 
36020 70 6f 69 6e 74 20 77 65 20 6b 6e 6f 77 20 74 68  point we know th
36030 61 74 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20  at.      ** all 
36040 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
36050 64 61 74 61 20 66 72 6f 6d 20 70 54 6f 20 68 61  data from pTo ha
36060 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 69 6e  s been synced in
36070 74 6f 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  to the .      **
36080 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
36090 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
360a0 77 6f 75 6c 64 20 62 65 20 73 61 66 65 20 74 6f  would be safe to
360b0 20 64 6f 20 61 6e 79 74 68 69 6e 67 20 61 74 0a   do anything at.
360c0 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 74 6f 20        ** all to 
360d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
360e0 65 20 65 78 63 65 70 74 20 74 72 75 6e 63 61 74  e except truncat
360f0 65 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74  e it to zero byt
36100 65 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  es..      */.   
36110 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
36120 45 5f 4f 4b 20 26 26 20 6e 46 72 6f 6d 50 61 67  E_OK && nFromPag
36130 65 53 69 7a 65 3c 6e 54 6f 50 61 67 65 53 69 7a  eSize<nToPageSiz
36140 65 20 26 26 20 69 53 69 7a 65 3e 69 50 65 6e 64  e && iSize>iPend
36150 69 6e 67 29 7b 0a 20 20 20 20 20 20 20 20 69 36  ing){.        i6
36160 34 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20  4 iOff;.        
36170 66 6f 72 28 0a 20 20 20 20 20 20 20 20 20 20 69  for(.          i
36180 4f 66 66 3d 69 50 65 6e 64 69 6e 67 3b 20 0a 20  Off=iPending; . 
36190 20 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c           rc==SQL
361a0 49 54 45 5f 4f 4b 20 26 26 20 69 4f 66 66 3c 28  ITE_OK && iOff<(
361b0 69 50 65 6e 64 69 6e 67 2b 6e 54 6f 50 61 67 65  iPending+nToPage
361c0 53 69 7a 65 29 3b 20 0a 20 20 20 20 20 20 20 20  Size); .        
361d0 20 20 69 4f 66 66 20 2b 3d 20 6e 46 72 6f 6d 50    iOff += nFromP
361e0 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20 20 20  ageSize.        
361f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62 50  ){.          DbP
36200 61 67 65 20 2a 70 46 72 6f 6d 50 61 67 65 20 3d  age *pFromPage =
36210 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67   0;.          Pg
36220 6e 6f 20 69 46 72 6f 6d 20 3d 20 28 69 4f 66 66  no iFrom = (iOff
36230 2f 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 29 2b  /nFromPageSize)+
36240 31 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20  1;.  .          
36250 69 66 28 20 69 46 72 6f 6d 3d 3d 50 45 4e 44 49  if( iFrom==PENDI
36260 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
36270 46 72 6f 6d 29 20 7c 7c 20 69 46 72 6f 6d 3e 6e  From) || iFrom>n
36280 46 72 6f 6d 50 61 67 65 20 29 7b 0a 20 20 20 20  FromPage ){.    
36290 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
362a0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
362b0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
362c0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
362d0 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72 2c  pBtFrom->pPager,
362e0 20 69 46 72 6f 6d 2c 20 26 70 46 72 6f 6d 50 61   iFrom, &pFromPa
362f0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ge);.          i
36300 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
36310 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
36320 63 68 61 72 20 2a 7a 46 72 6f 6d 20 3d 20 73 71  char *zFrom = sq
36330 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
36340 61 28 70 46 72 6f 6d 50 61 67 65 29 3b 0a 20 20  a(pFromPage);.  
36350 09 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
36360 73 57 72 69 74 65 28 70 46 69 6c 65 2c 20 7a 46  sWrite(pFile, zF
36370 72 6f 6d 2c 20 6e 46 72 6f 6d 50 61 67 65 53 69  rom, nFromPageSi
36380 7a 65 2c 20 69 4f 66 66 29 3b 0a 20 20 20 20 20  ze, iOff);.     
36390 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
363a0 67 65 72 55 6e 72 65 66 28 70 46 72 6f 6d 50 61  gerUnref(pFromPa
363b0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ge);.          }
363c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
363d0 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 53   }.  .      /* S
363e0 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
363f0 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69   file */.      i
36400 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
36410 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
36420 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e   sqlite3PagerSyn
36430 63 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 29  c(pBtTo->pPager)
36440 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
36450 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
36460 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e  sqlite3PagerTrun
36470 63 61 74 65 28 70 42 74 54 6f 2d 3e 70 50 61 67  cate(pBtTo->pPag
36480 65 72 2c 20 6e 4e 65 77 50 61 67 65 29 3b 0a 20  er, nNewPage);. 
36490 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
364a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
364b0 20 20 20 20 70 42 74 54 6f 2d 3e 70 61 67 65 53      pBtTo->pageS
364c0 69 7a 65 46 69 78 65 64 20 3d 20 30 3b 0a 20 20  izeFixed = 0;.  
364d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
364e0 63 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  c ){.    sqlite3
364f0 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 54  BtreeRollback(pT
36500 6f 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  o);.  }..  retur
36510 6e 20 72 63 3b 20 20 0a 7d 0a 69 6e 74 20 73 71  n rc;  .}.int sq
36520 6c 69 74 65 33 42 74 72 65 65 43 6f 70 79 46 69  lite3BtreeCopyFi
36530 6c 65 28 42 74 72 65 65 20 2a 70 54 6f 2c 20 42  le(Btree *pTo, B
36540 74 72 65 65 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  tree *pFrom){.  
36550 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
36560 33 42 74 72 65 65 45 6e 74 65 72 28 70 54 6f 29  3BtreeEnter(pTo)
36570 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
36580 45 6e 74 65 72 28 70 46 72 6f 6d 29 3b 0a 20 20  Enter(pFrom);.  
36590 72 63 20 3d 20 62 74 72 65 65 43 6f 70 79 46 69  rc = btreeCopyFi
365a0 6c 65 28 70 54 6f 2c 20 70 46 72 6f 6d 29 3b 0a  le(pTo, pFrom);.
365b0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
365c0 61 76 65 28 70 46 72 6f 6d 29 3b 0a 20 20 73 71  ave(pFrom);.  sq
365d0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
365e0 70 54 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  pTo);.  return r
365f0 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  c;.}..#endif /* 
36600 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55  SQLITE_OMIT_VACU
36610 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  UM */../*.** Ret
36620 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  urn non-zero if 
36630 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
36640 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20   active..*/.int 
36650 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
36660 54 72 61 6e 73 28 42 74 72 65 65 20 2a 70 29 7b  Trans(Btree *p){
36670 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20  .  assert( p==0 
36680 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  || sqlite3_mutex
36690 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74  _held(p->db->mut
366a0 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ex) );.  return 
366b0 28 70 20 26 26 20 28 70 2d 3e 69 6e 54 72 61 6e  (p && (p->inTran
366c0 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 29  s==TRANS_WRITE))
366d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
366e0 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 20  n non-zero if a 
366f0 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
36700 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
36710 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
36720 74 72 65 65 49 73 49 6e 53 74 6d 74 28 42 74 72  treeIsInStmt(Btr
36730 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  ee *p){.  assert
36740 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
36750 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
36760 20 72 65 74 75 72 6e 20 28 70 2d 3e 70 42 74 20   return (p->pBt 
36770 26 26 20 70 2d 3e 70 42 74 2d 3e 69 6e 53 74 6d  && p->pBt->inStm
36780 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  t);.}../*.** Ret
36790 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  urn non-zero if 
367a0 61 20 72 65 61 64 20 28 6f 72 20 77 72 69 74 65  a read (or write
367b0 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  ) transaction is
367c0 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20   active..*/.int 
367d0 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
367e0 52 65 61 64 54 72 61 6e 73 28 42 74 72 65 65 20  ReadTrans(Btree 
367f0 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  *p){.  assert( s
36800 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
36810 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20  d(p->db->mutex) 
36820 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26  );.  return (p &
36830 26 20 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54  & (p->inTrans!=T
36840 52 41 4e 53 5f 4e 4f 4e 45 29 29 3b 0a 7d 0a 0a  RANS_NONE));.}..
36850 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
36860 69 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f  ion returns a po
36870 69 6e 74 65 72 20 74 6f 20 61 20 62 6c 6f 62 20  inter to a blob 
36880 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69  of memory associ
36890 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 73  ated with.** a s
368a0 69 6e 67 6c 65 20 73 68 61 72 65 64 2d 62 74 72  ingle shared-btr
368b0 65 65 2e 20 54 68 65 20 6d 65 6d 6f 72 79 20 69  ee. The memory i
368c0 73 20 75 73 65 64 20 62 79 20 63 6c 69 65 6e 74  s used by client
368d0 20 63 6f 64 65 20 66 6f 72 20 69 74 73 20 6f 77   code for its ow
368e0 6e 0a 2a 2a 20 70 75 72 70 6f 73 65 73 20 28 66  n.** purposes (f
368f0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20 73  or example, to s
36900 74 6f 72 65 20 61 20 68 69 67 68 2d 6c 65 76 65  tore a high-leve
36910 6c 20 73 63 68 65 6d 61 20 61 73 73 6f 63 69 61  l schema associa
36920 74 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65  ted with .** the
36930 20 73 68 61 72 65 64 2d 62 74 72 65 65 29 2e 20   shared-btree). 
36940 54 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20  The btree layer 
36950 6d 61 6e 61 67 65 73 20 72 65 66 65 72 65 6e 63  manages referenc
36960 65 20 63 6f 75 6e 74 69 6e 67 20 69 73 73 75 65  e counting issue
36970 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  s..**.** The fir
36980 73 74 20 74 69 6d 65 20 74 68 69 73 20 69 73 20  st time this is 
36990 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72  called on a shar
369a0 65 64 2d 62 74 72 65 65 2c 20 6e 42 79 74 65 73  ed-btree, nBytes
369b0 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
369c0 0a 2a 2a 20 61 72 65 20 61 6c 6c 6f 63 61 74 65  .** are allocate
369d0 64 2c 20 7a 65 72 6f 65 64 2c 20 61 6e 64 20 72  d, zeroed, and r
369e0 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
369f0 61 6c 6c 65 72 2e 20 46 6f 72 20 65 61 63 68 20  aller. For each 
36a00 73 75 62 73 65 71 75 65 6e 74 20 0a 2a 2a 20 63  subsequent .** c
36a10 61 6c 6c 20 74 68 65 20 6e 42 79 74 65 73 20 70  all the nBytes p
36a20 61 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f  arameter is igno
36a30 72 65 64 20 61 6e 64 20 61 20 70 6f 69 6e 74 65  red and a pointe
36a40 72 20 74 6f 20 74 68 65 20 73 61 6d 65 20 62 6c  r to the same bl
36a50 6f 62 0a 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79 20  ob.** of memory 
36a60 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a  returned. .**.**
36a70 20 4a 75 73 74 20 62 65 66 6f 72 65 20 74 68 65   Just before the
36a80 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 69 73   shared-btree is
36a90 20 63 6c 6f 73 65 64 2c 20 74 68 65 20 66 75 6e   closed, the fun
36aa0 63 74 69 6f 6e 20 70 61 73 73 65 64 20 61 73 20  ction passed as 
36ab0 74 68 65 20 0a 2a 2a 20 78 46 72 65 65 20 61 72  the .** xFree ar
36ac0 67 75 6d 65 6e 74 20 77 68 65 6e 20 74 68 65 20  gument when the 
36ad0 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
36ae0 6e 20 77 61 73 20 6d 61 64 65 20 69 73 20 69 6e  n was made is in
36af0 76 6f 6b 65 64 20 6f 6e 20 74 68 65 20 0a 2a 2a  voked on the .**
36b00 20 62 6c 6f 62 20 6f 66 20 61 6c 6c 6f 63 61 74   blob of allocat
36b10 65 64 20 6d 65 6d 6f 72 79 2e 20 54 68 69 73 20  ed memory. This 
36b20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20  function should 
36b30 6e 6f 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  not call sqlite3
36b40 5f 66 72 65 65 28 29 0a 2a 2a 20 6f 6e 20 74 68  _free().** on th
36b50 65 20 6d 65 6d 6f 72 79 2c 20 74 68 65 20 62 74  e memory, the bt
36b60 72 65 65 20 6c 61 79 65 72 20 64 6f 65 73 20 74  ree layer does t
36b70 68 61 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  hat..*/.void *sq
36b80 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61  lite3BtreeSchema
36b90 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e  (Btree *p, int n
36ba0 42 79 74 65 73 2c 20 76 6f 69 64 28 2a 78 46 72  Bytes, void(*xFr
36bb0 65 65 29 28 76 6f 69 64 20 2a 29 29 7b 0a 20 20  ee)(void *)){.  
36bc0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
36bd0 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
36be0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
36bf0 20 20 69 66 28 20 21 70 42 74 2d 3e 70 53 63 68    if( !pBt->pSch
36c00 65 6d 61 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ema ){.    pBt->
36c10 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65  pSchema = sqlite
36c20 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 6e 42 79 74  3MallocZero(nByt
36c30 65 73 29 3b 0a 20 20 20 20 70 42 74 2d 3e 78 46  es);.    pBt->xF
36c40 72 65 65 53 63 68 65 6d 61 20 3d 20 78 46 72 65  reeSchema = xFre
36c50 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  e;.  }.  sqlite3
36c60 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
36c70 20 72 65 74 75 72 6e 20 70 42 74 2d 3e 70 53 63   return pBt->pSc
36c80 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  hema;.}../*.** R
36c90 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 61 6e  eturn true if an
36ca0 6f 74 68 65 72 20 75 73 65 72 20 6f 66 20 74 68  other user of th
36cb0 65 20 73 61 6d 65 20 73 68 61 72 65 64 20 62 74  e same shared bt
36cc0 72 65 65 20 61 73 20 74 68 65 20 61 72 67 75 6d  ree as the argum
36cd0 65 6e 74 0a 2a 2a 20 68 61 6e 64 6c 65 20 68 6f  ent.** handle ho
36ce0 6c 64 73 20 61 6e 20 65 78 63 6c 75 73 69 76 65  lds an exclusive
36cf0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 73 71 6c   lock on the sql
36d00 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
36d10 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
36d20 42 74 72 65 65 53 63 68 65 6d 61 4c 6f 63 6b 65  BtreeSchemaLocke
36d30 64 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  d(Btree *p){.  i
36d40 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
36d50 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
36d60 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
36d70 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
36d80 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
36d90 63 20 3d 20 28 71 75 65 72 79 54 61 62 6c 65 4c  c = (queryTableL
36da0 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52 5f 52 4f  ock(p, MASTER_RO
36db0 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 21 3d  OT, READ_LOCK)!=
36dc0 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71  SQLITE_OK);.  sq
36dd0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
36de0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
36df0 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
36e00 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
36e10 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 4f 62 74 61  CACHE./*.** Obta
36e20 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  in a lock on the
36e30 20 74 61 62 6c 65 20 77 68 6f 73 65 20 72 6f 6f   table whose roo
36e40 74 20 70 61 67 65 20 69 73 20 69 54 61 62 2e 20  t page is iTab. 
36e50 20 54 68 65 0a 2a 2a 20 6c 6f 63 6b 20 69 73 20   The.** lock is 
36e60 61 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66 20  a write lock if 
36e70 69 73 57 72 69 74 65 6c 6f 63 6b 20 69 73 20 74  isWritelock is t
36e80 72 75 65 20 6f 72 20 61 20 72 65 61 64 20 6c 6f  rue or a read lo
36e90 63 6b 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 66  ck.** if it is f
36ea0 61 6c 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  alse..*/.int sql
36eb0 69 74 65 33 42 74 72 65 65 4c 6f 63 6b 54 61 62  ite3BtreeLockTab
36ec0 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74  le(Btree *p, int
36ed0 20 69 54 61 62 2c 20 75 38 20 69 73 57 72 69 74   iTab, u8 isWrit
36ee0 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63  eLock){.  int rc
36ef0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
36f00 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20  if( p->sharable 
36f10 29 7b 0a 20 20 20 20 75 38 20 6c 6f 63 6b 54 79  ){.    u8 lockTy
36f20 70 65 20 3d 20 52 45 41 44 5f 4c 4f 43 4b 20 2b  pe = READ_LOCK +
36f30 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b 0a 20 20   isWriteLock;.  
36f40 20 20 61 73 73 65 72 74 28 20 52 45 41 44 5f 4c    assert( READ_L
36f50 4f 43 4b 2b 31 3d 3d 57 52 49 54 45 5f 4c 4f 43  OCK+1==WRITE_LOC
36f60 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
36f70 20 69 73 57 72 69 74 65 4c 6f 63 6b 3d 3d 30 20   isWriteLock==0 
36f80 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63 6b 3d 3d  || isWriteLock==
36f90 31 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  1 );.    sqlite3
36fa0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
36fb0 20 20 20 72 63 20 3d 20 71 75 65 72 79 54 61 62     rc = queryTab
36fc0 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61 62 2c 20  leLock(p, iTab, 
36fd0 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20 20 69  lockType);.    i
36fe0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
36ff0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6c   ){.      rc = l
37000 6f 63 6b 54 61 62 6c 65 28 70 2c 20 69 54 61 62  ockTable(p, iTab
37010 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20 20  , lockType);.   
37020 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
37030 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d  reeLeave(p);.  }
37040 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
37050 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
37060 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
37070 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d  BLOB./*.** Argum
37080 65 6e 74 20 70 43 73 72 20 6d 75 73 74 20 62 65  ent pCsr must be
37090 20 61 20 63 75 72 73 6f 72 20 6f 70 65 6e 65 64   a cursor opened
370a0 20 66 6f 72 20 77 72 69 74 69 6e 67 20 6f 6e 20   for writing on 
370b0 61 6e 20 0a 2a 2a 20 49 4e 54 4b 45 59 20 74 61  an .** INTKEY ta
370c0 62 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 70 6f  ble currently po
370d0 69 6e 74 69 6e 67 20 61 74 20 61 20 76 61 6c 69  inting at a vali
370e0 64 20 74 61 62 6c 65 20 65 6e 74 72 79 2e 20 0a  d table entry. .
370f0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
37100 20 6d 6f 64 69 66 69 65 73 20 74 68 65 20 64 61   modifies the da
37110 74 61 20 73 74 6f 72 65 64 20 61 73 20 70 61 72  ta stored as par
37120 74 20 6f 66 20 74 68 61 74 20 65 6e 74 72 79 2e  t of that entry.
37130 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 64 61 74  .** Only the dat
37140 61 20 63 6f 6e 74 65 6e 74 20 6d 61 79 20 6f 6e  a content may on
37150 6c 79 20 62 65 20 6d 6f 64 69 66 69 65 64 2c 20  ly be modified, 
37160 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
37170 6c 65 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20  le.** to change 
37180 74 68 65 20 6c 65 6e 67 74 68 20 6f 66 20 74 68  the length of th
37190 65 20 64 61 74 61 20 73 74 6f 72 65 64 2e 0a 2a  e data stored..*
371a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
371b0 65 65 50 75 74 44 61 74 61 28 42 74 43 75 72 73  eePutData(BtCurs
371c0 6f 72 20 2a 70 43 73 72 2c 20 75 33 32 20 6f 66  or *pCsr, u32 of
371d0 66 73 65 74 2c 20 75 33 32 20 61 6d 74 2c 20 76  fset, u32 amt, v
371e0 6f 69 64 20 2a 7a 29 7b 0a 20 20 61 73 73 65 72  oid *z){.  asser
371f0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
37200 74 65 78 28 70 43 73 72 29 20 29 3b 0a 20 20 61  tex(pCsr) );.  a
37210 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
37220 75 74 65 78 5f 68 65 6c 64 28 70 43 73 72 2d 3e  utex_held(pCsr->
37230 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
37240 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70  x) );.  assert(p
37250 43 73 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48  Csr->isIncrblobH
37260 61 6e 64 6c 65 29 3b 0a 0a 20 20 72 65 73 74 6f  andle);..  resto
37270 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50  reOrClearCursorP
37280 6f 73 69 74 69 6f 6e 28 70 43 73 72 29 3b 0a 20  osition(pCsr);. 
37290 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 65   assert( pCsr->e
372a0 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 52 45  State!=CURSOR_RE
372b0 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
372c0 66 28 20 70 43 73 72 2d 3e 65 53 74 61 74 65 21  f( pCsr->eState!
372d0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
372e0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
372f0 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 0a 20  TE_ABORT;.  }.. 
37300 20 2f 2a 20 43 68 65 63 6b 20 73 6f 6d 65 20 70   /* Check some p
37310 72 65 63 6f 6e 64 69 74 69 6f 6e 73 3a 20 0a 20  reconditions: . 
37320 20 2a 2a 20 20 20 28 61 29 20 74 68 65 20 63 75   **   (a) the cu
37330 72 73 6f 72 20 69 73 20 6f 70 65 6e 20 66 6f 72  rsor is open for
37340 20 77 72 69 74 69 6e 67 2c 0a 20 20 2a 2a 20 20   writing,.  **  
37350 20 28 62 29 20 74 68 65 72 65 20 69 73 20 6e 6f   (b) there is no
37360 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68   read-lock on th
37370 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6d 6f  e table being mo
37380 64 69 66 69 65 64 20 61 6e 64 0a 20 20 2a 2a 20  dified and.  ** 
37390 20 20 28 63 29 20 74 68 65 20 63 75 72 73 6f 72    (c) the cursor
373a0 20 70 6f 69 6e 74 73 20 61 74 20 61 20 76 61 6c   points at a val
373b0 69 64 20 72 6f 77 20 6f 66 20 61 6e 20 69 6e 74  id row of an int
373c0 4b 65 79 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  Key table..  */.
373d0 20 20 69 66 28 20 21 70 43 73 72 2d 3e 77 72 46    if( !pCsr->wrF
373e0 6c 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72  lag ){.    retur
373f0 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
37400 59 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  Y;.  }.  assert(
37410 20 21 70 43 73 72 2d 3e 70 42 74 2d 3e 72 65 61   !pCsr->pBt->rea
37420 64 4f 6e 6c 79 20 0a 20 20 20 20 20 20 20 20 20  dOnly .         
37430 20 26 26 20 70 43 73 72 2d 3e 70 42 74 2d 3e 69   && pCsr->pBt->i
37440 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
37450 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69  ANS_WRITE );.  i
37460 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b  f( checkReadLock
37470 73 28 70 43 73 72 2d 3e 70 42 74 72 65 65 2c 20  s(pCsr->pBtree, 
37480 70 43 73 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCsr->pgnoRoot, 
37490 70 43 73 72 2c 20 30 29 20 29 7b 0a 20 20 20 20  pCsr, 0) ){.    
374a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
374b0 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62  CKED; /* The tab
374c0 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74  le pCur points t
374d0 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  o has a read loc
374e0 6b 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  k */.  }.  if( p
374f0 43 73 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Csr->eState==CUR
37500 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 21  SOR_INVALID || !
37510 70 43 73 72 2d 3e 70 50 61 67 65 2d 3e 69 6e 74  pCsr->pPage->int
37520 4b 65 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  Key ){.    retur
37530 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
37540 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 61 63    }..  return ac
37550 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43 73 72  cessPayload(pCsr
37560 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28  , offset, amt, (
37570 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29  unsigned char *)
37580 7a 2c 20 30 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 20  z, 0, 1);.}../* 
37590 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61 67 20 6f  .** Set a flag o
375a0 6e 20 74 68 69 73 20 63 75 72 73 6f 72 20 74 6f  n this cursor to
375b0 20 63 61 63 68 65 20 74 68 65 20 6c 6f 63 61 74   cache the locat
375c0 69 6f 6e 73 20 6f 66 20 70 61 67 65 73 20 66 72  ions of pages fr
375d0 6f 6d 20 74 68 65 20 0a 2a 2a 20 6f 76 65 72 66  om the .** overf
375e0 6c 6f 77 20 6c 69 73 74 20 66 6f 72 20 74 68 65  low list for the
375f0 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 20 54 68   current row. Th
37600 69 73 20 69 73 20 75 73 65 64 20 62 79 20 63 75  is is used by cu
37610 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20  rsors opened.** 
37620 66 6f 72 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20  for incremental 
37630 62 6c 6f 62 20 49 4f 20 6f 6e 6c 79 2e 0a 2a 2a  blob IO only..**
37640 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
37650 6e 20 73 65 74 73 20 61 20 66 6c 61 67 20 6f 6e  n sets a flag on
37660 6c 79 2e 20 54 68 65 20 61 63 74 75 61 6c 20 70  ly. The actual p
37670 61 67 65 20 6c 6f 63 61 74 69 6f 6e 20 63 61 63  age location cac
37680 68 65 0a 2a 2a 20 28 73 74 6f 72 65 64 20 69 6e  he.** (stored in
37690 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66   BtCursor.aOverf
376a0 6c 6f 77 5b 5d 29 20 69 73 20 61 6c 6c 6f 63 61  low[]) is alloca
376b0 74 65 64 20 61 6e 64 20 75 73 65 64 20 62 79 20  ted and used by 
376c0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 63 63 65  function.** acce
376d0 73 73 50 61 79 6c 6f 61 64 28 29 20 28 74 68 65  ssPayload() (the
376e0 20 77 6f 72 6b 65 72 20 66 75 6e 63 74 69 6f 6e   worker function
376f0 20 66 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65   for sqlite3Btre
37700 65 44 61 74 61 28 29 20 61 6e 64 0a 2a 2a 20 73  eData() and.** s
37710 71 6c 69 74 65 33 42 74 72 65 65 50 75 74 44 61  qlite3BtreePutDa
37720 74 61 28 29 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ta())..*/.void s
37730 71 6c 69 74 65 33 42 74 72 65 65 43 61 63 68 65  qlite3BtreeCache
37740 4f 76 65 72 66 6c 6f 77 28 42 74 43 75 72 73 6f  Overflow(BtCurso
37750 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
37760 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
37770 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
37780 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
37790 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
377a0 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
377b0 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
377c0 21 70 43 75 72 2d 3e 69 73 49 6e 63 72 62 6c 6f  !pCur->isIncrblo
377d0 62 48 61 6e 64 6c 65 29 3b 0a 20 20 61 73 73 65  bHandle);.  asse
377e0 72 74 28 21 70 43 75 72 2d 3e 61 4f 76 65 72 66  rt(!pCur->aOverf
377f0 6c 6f 77 29 3b 0a 20 20 70 43 75 72 2d 3e 69 73  low);.  pCur->is
37800 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 3d  IncrblobHandle =
37810 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a            1;.}.#endif.