/ Hex Artifact Content
Login

Artifact 965da6ca8bbd51677db5587471a5b0ef08f49786:


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 37 32 20 32 30 30 38 2f 30  c,v 1.472 2008/0
0190: 37 2f 30 38 20 31 37 3a 31 33 3a 35 39 20 64 61  7/08 17:13:59 da
01a0: 6e 69 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a  nielk1977 Exp $.
01b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  **.** This file 
01c0: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74  implements a ext
01d0: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01e0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01f0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
0200: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
0210: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
0220: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
0230: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0240: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0250: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0260: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0270: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0280: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0290: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
02a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
02b0: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
02c0: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
02d0: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02e0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02f0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
0300: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
0310: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
0320: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
0330: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0340: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0350: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0360: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0370: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0380: 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45  */.#if SQLITE_TE
0390: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  ST.int sqlite3Bt
03a0: 72 65 65 54 72 61 63 65 3d 30 3b 20 20 2f 2a 20  reeTrace=0;  /* 
03b0: 54 72 75 65 20 74 6f 20 65 6e 61 62 6c 65 20 74  True to enable t
03c0: 72 61 63 69 6e 67 20 2a 2f 0a 23 65 6e 64 69 66  racing */.#endif
03d0: 0a 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ....#ifndef SQLI
03e0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
03f0: 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 66 6c 61  ACHE./*.** A fla
0400: 67 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68  g to indicate wh
0410: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 73 68 61  ether or not sha
0420: 72 65 64 20 63 61 63 68 65 20 69 73 20 65 6e 61  red cache is ena
0430: 62 6c 65 64 2e 20 20 41 6c 73 6f 2c 0a 2a 2a 20  bled.  Also,.** 
0440: 61 20 6c 69 73 74 20 6f 66 20 42 74 53 68 61 72  a list of BtShar
0450: 65 64 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20  ed objects that 
0460: 61 72 65 20 65 6c 69 67 69 62 6c 65 20 66 6f 72  are eligible for
0470: 20 70 61 72 74 69 63 69 70 61 74 69 6f 6e 0a 2a   participation.*
0480: 2a 20 69 6e 20 73 68 61 72 65 64 20 63 61 63 68  * in shared cach
0490: 65 2e 20 20 54 68 65 20 76 61 72 69 61 62 6c 65  e.  The variable
04a0: 73 20 68 61 76 65 20 66 69 6c 65 20 73 63 6f 70  s have file scop
04b0: 65 20 64 75 72 69 6e 67 20 6e 6f 72 6d 61 6c 20  e during normal 
04c0: 62 75 69 6c 64 73 2c 0a 2a 2a 20 62 75 74 20 74  builds,.** but t
04d0: 68 65 20 74 65 73 74 20 68 61 72 6e 65 73 73 20  he test harness 
04e0: 6e 65 65 64 73 20 74 6f 20 61 63 63 65 73 73 20  needs to access 
04f0: 74 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20  these variables 
0500: 73 6f 20 77 65 20 6d 61 6b 65 20 74 68 65 6d 0a  so we make them.
0510: 2a 2a 20 67 6c 6f 62 61 6c 20 66 6f 72 20 74 65  ** global for te
0520: 73 74 20 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69  st builds..*/.#i
0530: 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
0540: 0a 42 74 53 68 61 72 65 64 20 2a 73 71 6c 69 74  .BtShared *sqlit
0550: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
0560: 74 20 3d 20 30 3b 0a 69 6e 74 20 73 71 6c 69 74  t = 0;.int sqlit
0570: 65 33 53 68 61 72 65 64 43 61 63 68 65 45 6e 61  e3SharedCacheEna
0580: 62 6c 65 64 20 3d 20 30 3b 0a 23 65 6c 73 65 0a  bled = 0;.#else.
0590: 73 74 61 74 69 63 20 42 74 53 68 61 72 65 64 20  static BtShared 
05a0: 2a 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61  *sqlite3SharedCa
05b0: 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 73 74 61  cheList = 0;.sta
05c0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 53  tic int sqlite3S
05d0: 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65  haredCacheEnable
05e0: 64 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 65  d = 0;.#endif.#e
05f0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
0600: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
0610: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
0620: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
0630: 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 45 6e 61 62  CACHE./*.** Enab
0640: 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68  le or disable th
0650: 65 20 73 68 61 72 65 64 20 70 61 67 65 72 20 61  e shared pager a
0660: 6e 64 20 73 63 68 65 6d 61 20 66 65 61 74 75 72  nd schema featur
0670: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  es..**.** This r
0680: 6f 75 74 69 6e 65 20 68 61 73 20 6e 6f 20 65 66  outine has no ef
0690: 66 65 63 74 20 6f 6e 20 65 78 69 73 74 69 6e 67  fect on existing
06a0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
06b0: 74 69 6f 6e 73 2e 0a 2a 2a 20 54 68 65 20 73 68  tions..** The sh
06c0: 61 72 65 64 20 63 61 63 68 65 20 73 65 74 74 69  ared cache setti
06d0: 6e 67 20 65 66 66 65 63 74 73 20 6f 6e 6c 79 20  ng effects only 
06e0: 66 75 74 75 72 65 20 63 61 6c 6c 73 20 74 6f 0a  future calls to.
06f0: 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  ** sqlite3_open(
0700: 29 2c 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  ), sqlite3_open1
0710: 36 28 29 2c 20 6f 72 20 73 71 6c 69 74 65 33 5f  6(), or sqlite3_
0720: 6f 70 65 6e 5f 76 32 28 29 2e 0a 2a 2f 0a 69 6e  open_v2()..*/.in
0730: 74 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  t sqlite3_enable
0740: 5f 73 68 61 72 65 64 5f 63 61 63 68 65 28 69 6e  _shared_cache(in
0750: 74 20 65 6e 61 62 6c 65 29 7b 0a 20 20 73 71 6c  t enable){.  sql
0760: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 45  ite3SharedCacheE
0770: 6e 61 62 6c 65 64 20 3d 20 65 6e 61 62 6c 65 3b  nabled = enable;
0780: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
0790: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  _OK;.}.#endif...
07a0: 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65  /*.** Forward de
07b0: 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  claration.*/.sta
07c0: 74 69 63 20 69 6e 74 20 63 68 65 63 6b 52 65 61  tic int checkRea
07d0: 64 4c 6f 63 6b 73 28 42 74 72 65 65 2a 2c 20 50  dLocks(Btree*, P
07e0: 67 6e 6f 2c 20 42 74 43 75 72 73 6f 72 2a 2c 20  gno, BtCursor*, 
07f0: 69 36 34 29 3b 0a 0a 0a 23 69 66 64 65 66 20 53  i64);...#ifdef S
0800: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
0810: 44 5f 43 41 43 48 45 0a 20 20 2f 2a 0a 20 20 2a  D_CACHE.  /*.  *
0820: 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 73 20  * The functions 
0830: 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 29  queryTableLock()
0840: 2c 20 6c 6f 63 6b 54 61 62 6c 65 28 29 20 61 6e  , lockTable() an
0850: 64 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65  d unlockAllTable
0860: 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69 70 75 6c  s().  ** manipul
0870: 61 74 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74  ate entries in t
0880: 68 65 20 42 74 53 68 61 72 65 64 2e 70 4c 6f 63  he BtShared.pLoc
0890: 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 75 73  k linked list us
08a0: 65 64 20 74 6f 20 73 74 6f 72 65 0a 20 20 2a 2a  ed to store.  **
08b0: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 74 61   shared-cache ta
08c0: 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63 6b 73 2e  ble level locks.
08d0: 20 49 66 20 74 68 65 20 6c 69 62 72 61 72 79 20   If the library 
08e0: 69 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68  is compiled with
08f0: 20 74 68 65 0a 20 20 2a 2a 20 73 68 61 72 65 64   the.  ** shared
0900: 2d 63 61 63 68 65 20 66 65 61 74 75 72 65 20 64  -cache feature d
0910: 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68  isabled, then th
0920: 65 72 65 20 69 73 20 6f 6e 6c 79 20 65 76 65 72  ere is only ever
0930: 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a 2a 20 6f   one user.  ** o
0940: 66 20 65 61 63 68 20 42 74 53 68 61 72 65 64 20  f each BtShared 
0950: 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 73 6f  structure and so
0960: 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67 20 69 73   this locking is
0970: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 2e 20   not necessary. 
0980: 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69 6e 65 20  .  ** So define 
0990: 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61 74 65 64  the lock related
09a0: 20 66 75 6e 63 74 69 6f 6e 73 20 61 73 20 6e 6f   functions as no
09b0: 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20 23 64 65  -ops..  */.  #de
09c0: 66 69 6e 65 20 71 75 65 72 79 54 61 62 6c 65 4c  fine queryTableL
09d0: 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c 49 54  ock(a,b,c) SQLIT
09e0: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 6c  E_OK.  #define l
09f0: 6f 63 6b 54 61 62 6c 65 28 61 2c 62 2c 63 29 20  ockTable(a,b,c) 
0a00: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
0a10: 69 6e 65 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62  ine unlockAllTab
0a20: 6c 65 73 28 61 29 0a 23 65 6e 64 69 66 0a 0a 23  les(a).#endif..#
0a30: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
0a40: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
0a50: 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74 6f 20 73  /*.** Query to s
0a60: 65 65 20 69 66 20 62 74 72 65 65 20 68 61 6e 64  ee if btree hand
0a70: 6c 65 20 70 20 6d 61 79 20 6f 62 74 61 69 6e 20  le p may obtain 
0a80: 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 65  a lock of type e
0a90: 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41 44 5f 4c  Lock .** (READ_L
0aa0: 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43  OCK or WRITE_LOC
0ab0: 4b 29 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20  K) on the table 
0ac0: 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69  with root-page i
0ad0: 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 53  Tab. Return.** S
0ae0: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 65 20  QLITE_OK if the 
0af0: 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f 62 74 61  lock may be obta
0b00: 69 6e 65 64 20 28 62 79 20 63 61 6c 6c 69 6e 67  ined (by calling
0b10: 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29 2c 20 6f   lockTable()), o
0b20: 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  r.** SQLITE_LOCK
0b30: 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74  ED if not..*/.st
0b40: 61 74 69 63 20 69 6e 74 20 71 75 65 72 79 54 61  atic int queryTa
0b50: 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65 20 2a 70  bleLock(Btree *p
0b60: 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20 75 38 20  , Pgno iTab, u8 
0b70: 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53 68 61 72  eLock){.  BtShar
0b80: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
0b90: 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65  ;.  BtLock *pIte
0ba0: 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  r;..  assert( sq
0bb0: 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
0bc0: 75 74 65 78 28 70 29 20 29 3b 0a 20 20 0a 20 20  utex(p) );.  .  
0bd0: 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  /* This is a no-
0be0: 6f 70 20 69 66 20 74 68 65 20 73 68 61 72 65 64  op if the shared
0bf0: 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e  -cache is not en
0c00: 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21  abled */.  if( !
0c10: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
0c20: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
0c30: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  _OK;.  }..  /* I
0c40: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e  f some other con
0c50: 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69  nection is holdi
0c60: 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ng an exclusive 
0c70: 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72  lock, the.  ** r
0c80: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61  equested lock ma
0c90: 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65  y not be obtaine
0ca0: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  d..  */.  if( pB
0cb0: 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 20 26 26  t->pExclusive &&
0cc0: 20 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65   pBt->pExclusive
0cd0: 21 3d 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=p ){.    retur
0ce0: 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b  n SQLITE_LOCKED;
0cf0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20  .  }..  /* This 
0d00: 28 61 6c 6f 6e 67 20 77 69 74 68 20 6c 6f 63 6b  (along with lock
0d10: 54 61 62 6c 65 28 29 29 20 69 73 20 77 68 65 72  Table()) is wher
0d20: 65 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d  e the ReadUncomm
0d30: 69 74 74 65 64 20 66 6c 61 67 20 69 73 0a 20 20  itted flag is.  
0d40: 2a 2a 20 64 65 61 6c 74 20 77 69 74 68 2e 20 49  ** dealt with. I
0d50: 66 20 74 68 65 20 63 61 6c 6c 65 72 20 69 73 20  f the caller is 
0d60: 71 75 65 72 79 69 6e 67 20 66 6f 72 20 61 20 72  querying for a r
0d70: 65 61 64 2d 6c 6f 63 6b 20 61 6e 64 20 74 68 65  ead-lock and the
0d80: 20 66 6c 61 67 20 69 73 0a 20 20 2a 2a 20 73 65   flag is.  ** se
0d90: 74 2c 20 69 74 20 69 73 20 75 6e 63 6f 6e 64 69  t, it is uncondi
0da0: 74 69 6f 6e 61 6c 6c 79 20 67 72 61 6e 74 65 64  tionally granted
0db0: 20 2d 20 65 76 65 6e 20 69 66 20 74 68 65 72 65   - even if there
0dc0: 20 61 72 65 20 77 72 69 74 65 2d 6c 6f 63 6b 73   are write-locks
0dd0: 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 74 61 62  .  ** on the tab
0de0: 6c 65 2e 20 49 66 20 61 20 77 72 69 74 65 2d 6c  le. If a write-l
0df0: 6f 63 6b 20 69 73 20 72 65 71 75 65 73 74 65 64  ock is requested
0e00: 2c 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d  , the ReadUncomm
0e10: 69 74 74 65 64 20 66 6c 61 67 0a 20 20 2a 2a 20  itted flag.  ** 
0e20: 69 73 20 6e 6f 74 20 63 6f 6e 73 69 64 65 72 65  is not considere
0e30: 64 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20  d..  **.  ** In 
0e40: 66 75 6e 63 74 69 6f 6e 20 6c 6f 63 6b 54 61 62  function lockTab
0e50: 6c 65 28 29 2c 20 69 66 20 61 20 72 65 61 64 2d  le(), if a read-
0e60: 6c 6f 63 6b 20 69 73 20 64 65 6d 61 6e 64 65 64  lock is demanded
0e70: 20 61 6e 64 20 74 68 65 20 0a 20 20 2a 2a 20 52   and the .  ** R
0e80: 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66  eadUncommitted f
0e90: 6c 61 67 20 69 73 20 73 65 74 2c 20 6e 6f 20 65  lag is set, no e
0ea0: 6e 74 72 79 20 69 73 20 61 64 64 65 64 20 74 6f  ntry is added to
0eb0: 20 74 68 65 20 6c 6f 63 6b 73 20 6c 69 73 74 20   the locks list 
0ec0: 0a 20 20 2a 2a 20 28 42 74 53 68 61 72 65 64 2e  .  ** (BtShared.
0ed0: 70 4c 6f 63 6b 29 2e 0a 20 20 2a 2a 0a 20 20 2a  pLock)..  **.  *
0ee0: 2a 20 54 6f 20 73 75 6d 6d 61 72 69 7a 65 3a 20  * To summarize: 
0ef0: 49 66 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d  If the ReadUncom
0f00: 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73 20 73  mitted flag is s
0f10: 65 74 2c 20 74 68 65 6e 20 72 65 61 64 20 63 75  et, then read cu
0f20: 72 73 6f 72 73 20 64 6f 0a 20 20 2a 2a 20 6e 6f  rsors do.  ** no
0f30: 74 20 63 72 65 61 74 65 20 6f 72 20 72 65 73 70  t create or resp
0f40: 65 63 74 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2e  ect table locks.
0f50: 20 54 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 6f   The locking pro
0f60: 63 65 64 75 72 65 20 66 6f 72 20 61 20 0a 20 20  cedure for a .  
0f70: 2a 2a 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20  ** write-cursor 
0f80: 64 6f 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 2e  does not change.
0f90: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20  .  */.  if( .   
0fa0: 20 21 70 2d 3e 64 62 20 7c 7c 20 0a 20 20 20 20   !p->db || .    
0fb0: 30 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73  0==(p->db->flags
0fc0: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
0fd0: 6d 6d 69 74 74 65 64 29 20 7c 7c 20 0a 20 20 20  mmitted) || .   
0fe0: 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f   eLock==WRITE_LO
0ff0: 43 4b 20 7c 7c 0a 20 20 20 20 69 54 61 62 3d 3d  CK ||.    iTab==
1000: 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20 20 29 7b  MASTER_ROOT.  ){
1010: 0a 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70  .    for(pIter=p
1020: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72  Bt->pLock; pIter
1030: 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70  ; pIter=pIter->p
1040: 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28  Next){.      if(
1050: 20 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d   pIter->pBtree!=
1060: 70 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61 62  p && pIter->iTab
1070: 6c 65 3d 3d 69 54 61 62 20 26 26 20 0a 20 20 20  le==iTab && .   
1080: 20 20 20 20 20 20 20 28 70 49 74 65 72 2d 3e 65         (pIter->e
1090: 4c 6f 63 6b 21 3d 65 4c 6f 63 6b 20 7c 7c 20 65  Lock!=eLock || e
10a0: 4c 6f 63 6b 21 3d 52 45 41 44 5f 4c 4f 43 4b 29  Lock!=READ_LOCK)
10b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
10c0: 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
10d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
10e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
10f0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
1100: 20 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54   /* !SQLITE_OMIT
1110: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f  _SHARED_CACHE */
1120: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1130: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
1140: 48 45 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  HE./*.** Add a l
1150: 6f 63 6b 20 6f 6e 20 74 68 65 20 74 61 62 6c 65  ock on the table
1160: 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67 65 20   with root-page 
1170: 69 54 61 62 6c 65 20 74 6f 20 74 68 65 20 73 68  iTable to the sh
1180: 61 72 65 64 2d 62 74 72 65 65 20 75 73 65 64 0a  ared-btree used.
1190: 2a 2a 20 62 79 20 42 74 72 65 65 20 68 61 6e 64  ** by Btree hand
11a0: 6c 65 20 70 2e 20 50 61 72 61 6d 65 74 65 72 20  le p. Parameter 
11b0: 65 4c 6f 63 6b 20 6d 75 73 74 20 62 65 20 65 69  eLock must be ei
11c0: 74 68 65 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f  ther READ_LOCK o
11d0: 72 20 0a 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b  r .** WRITE_LOCK
11e0: 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
11f0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
1200: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 61 64 64   the lock is add
1210: 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
1220: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64   SQLITE_BUSY and
1230: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
1240: 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 72 65 74   may also be ret
1250: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
1260: 20 69 6e 74 20 6c 6f 63 6b 54 61 62 6c 65 28 42   int lockTable(B
1270: 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54  tree *p, Pgno iT
1280: 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b  able, u8 eLock){
1290: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
12a0: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c   = p->pBt;.  BtL
12b0: 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a  ock *pLock = 0;.
12c0: 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b    BtLock *pIter;
12d0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
12e0: 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74  te3BtreeHoldsMut
12f0: 65 78 28 70 29 20 29 3b 0a 0a 20 20 2f 2a 20 54  ex(p) );..  /* T
1300: 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  his is a no-op i
1310: 66 20 74 68 65 20 73 68 61 72 65 64 2d 63 61 63  f the shared-cac
1320: 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65  he is not enable
1330: 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 73  d */.  if( !p->s
1340: 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 72  harable ){.    r
1350: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1360: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1370: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 71 75 65 72 79  SQLITE_OK==query
1380: 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
1390: 62 6c 65 2c 20 65 4c 6f 63 6b 29 20 29 3b 0a 0a  ble, eLock) );..
13a0: 20 20 2f 2a 20 49 66 20 74 68 65 20 72 65 61 64    /* If the read
13b0: 2d 75 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  -uncommitted fla
13c0: 67 20 69 73 20 73 65 74 20 61 6e 64 20 61 20 72  g is set and a r
13d0: 65 61 64 2d 6c 6f 63 6b 20 69 73 20 72 65 71 75  ead-lock is requ
13e0: 65 73 74 65 64 2c 0a 20 20 2a 2a 20 72 65 74 75  ested,.  ** retu
13f0: 72 6e 20 65 61 72 6c 79 20 77 69 74 68 6f 75 74  rn early without
1400: 20 61 64 64 69 6e 67 20 61 6e 20 65 6e 74 72 79   adding an entry
1410: 20 74 6f 20 74 68 65 20 42 74 53 68 61 72 65 64   to the BtShared
1420: 2e 70 4c 6f 63 6b 20 6c 69 73 74 2e 20 53 65 65  .pLock list. See
1430: 0a 20 20 2a 2a 20 63 6f 6d 6d 65 6e 74 20 69 6e  .  ** comment in
1440: 20 66 75 6e 63 74 69 6f 6e 20 71 75 65 72 79 54   function queryT
1450: 61 62 6c 65 4c 6f 63 6b 28 29 20 66 6f 72 20 6d  ableLock() for m
1460: 6f 72 65 20 69 6e 66 6f 20 6f 6e 20 68 61 6e 64  ore info on hand
1470: 6c 69 6e 67 20 0a 20 20 2a 2a 20 74 68 65 20 52  ling .  ** the R
1480: 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66  eadUncommitted f
1490: 6c 61 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  lag..  */.  if( 
14a0: 0a 20 20 20 20 28 70 2d 3e 64 62 29 20 26 26 20  .    (p->db) && 
14b0: 0a 20 20 20 20 28 70 2d 3e 64 62 2d 3e 66 6c 61  .    (p->db->fla
14c0: 67 73 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e  gs&SQLITE_ReadUn
14d0: 63 6f 6d 6d 69 74 74 65 64 29 20 26 26 20 0a 20  committed) && . 
14e0: 20 20 20 28 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f     (eLock==READ_
14f0: 4c 4f 43 4b 29 20 26 26 0a 20 20 20 20 69 54 61  LOCK) &&.    iTa
1500: 62 6c 65 21 3d 4d 41 53 54 45 52 5f 52 4f 4f 54  ble!=MASTER_ROOT
1510: 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
1520: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1530: 0a 20 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72  .  /* First sear
1540: 63 68 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20  ch the list for 
1550: 61 6e 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b  an existing lock
1560: 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20   on this table. 
1570: 2a 2f 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70  */.  for(pIter=p
1580: 42 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72  Bt->pLock; pIter
1590: 3b 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70  ; pIter=pIter->p
15a0: 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70  Next){.    if( p
15b0: 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54  Iter->iTable==iT
15c0: 61 62 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70  able && pIter->p
15d0: 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20  Btree==p ){.    
15e0: 20 20 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b    pLock = pIter;
15f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1600: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
1610: 20 74 68 65 20 61 62 6f 76 65 20 73 65 61 72 63   the above searc
1620: 68 20 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61  h did not find a
1630: 20 42 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61   BtLock struct a
1640: 73 73 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65  ssociating Btree
1650: 20 70 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62   p.  ** with tab
1660: 6c 65 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63  le iTable, alloc
1670: 61 74 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b  ate one and link
1680: 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73   it into the lis
1690: 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  t..  */.  if( !p
16a0: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63  Lock ){.    pLoc
16b0: 6b 20 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71  k = (BtLock *)sq
16c0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
16d0: 73 69 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b  sizeof(BtLock));
16e0: 0a 20 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20  .    if( !pLock 
16f0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1700: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1710: 20 20 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69    }.    pLock->i
1720: 54 61 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a  Table = iTable;.
1730: 20 20 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65      pLock->pBtre
1740: 65 20 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b  e = p;.    pLock
1750: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
1760: 4c 6f 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70  Lock;.    pBt->p
1770: 4c 6f 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20  Lock = pLock;.  
1780: 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
1790: 42 74 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72  BtLock.eLock var
17a0: 69 61 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78  iable to the max
17b0: 69 6d 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72  imum of the curr
17c0: 65 6e 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e  ent lock.  ** an
17d0: 64 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  d the requested 
17e0: 6c 6f 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73  lock. This means
17f0: 20 69 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b   if a write-lock
1800: 20 77 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c   was already hel
1810: 64 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61  d.  ** and a rea
1820: 64 2d 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64  d-lock requested
1830: 2c 20 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72  , we don't incor
1840: 72 65 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65  rectly downgrade
1850: 20 74 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a   the lock..  */.
1860: 20 20 61 73 73 65 72 74 28 20 57 52 49 54 45 5f    assert( WRITE_
1870: 4c 4f 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29  LOCK>READ_LOCK )
1880: 3b 0a 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c  ;.  if( eLock>pL
1890: 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20  ock->eLock ){.  
18a0: 20 20 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d    pLock->eLock =
18b0: 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72   eLock;.  }..  r
18c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18d0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51  .}.#endif /* !SQ
18e0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
18f0: 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64  _CACHE */..#ifnd
1900: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
1910: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
1920: 2a 20 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68  * Release all th
1930: 65 20 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c  e table locks (l
1940: 6f 63 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69  ocks obtained vi
1950: 61 20 63 61 6c 6c 73 20 74 6f 20 74 68 65 20 6c  a calls to the l
1960: 6f 63 6b 54 61 62 6c 65 28 29 0a 2a 2a 20 70 72  ockTable().** pr
1970: 6f 63 65 64 75 72 65 29 20 68 65 6c 64 20 62 79  ocedure) held by
1980: 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20 70 2e   Btree handle p.
1990: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
19a0: 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28  unlockAllTables(
19b0: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
19c0: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
19d0: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 2a  pBt;.  BtLock **
19e0: 70 70 49 74 65 72 20 3d 20 26 70 42 74 2d 3e 70  ppIter = &pBt->p
19f0: 4c 6f 63 6b 3b 0a 0a 20 20 61 73 73 65 72 74 28  Lock;..  assert(
1a00: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
1a10: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
1a20: 61 73 73 65 72 74 28 20 70 2d 3e 73 68 61 72 61  assert( p->shara
1a30: 62 6c 65 20 7c 7c 20 30 3d 3d 2a 70 70 49 74 65  ble || 0==*ppIte
1a40: 72 20 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 2a  r );..  while( *
1a50: 70 70 49 74 65 72 20 29 7b 0a 20 20 20 20 42 74  ppIter ){.    Bt
1a60: 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20 2a 70  Lock *pLock = *p
1a70: 70 49 74 65 72 3b 0a 20 20 20 20 61 73 73 65 72  pIter;.    asser
1a80: 74 28 20 70 42 74 2d 3e 70 45 78 63 6c 75 73 69  t( pBt->pExclusi
1a90: 76 65 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 70 45  ve==0 || pBt->pE
1aa0: 78 63 6c 75 73 69 76 65 3d 3d 70 4c 6f 63 6b 2d  xclusive==pLock-
1ab0: 3e 70 42 74 72 65 65 20 29 3b 0a 20 20 20 20 69  >pBtree );.    i
1ac0: 66 28 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65  f( pLock->pBtree
1ad0: 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20 2a 70 70  ==p ){.      *pp
1ae0: 49 74 65 72 20 3d 20 70 4c 6f 63 6b 2d 3e 70 4e  Iter = pLock->pN
1af0: 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ext;.      sqlit
1b00: 65 33 5f 66 72 65 65 28 70 4c 6f 63 6b 29 3b 0a  e3_free(pLock);.
1b10: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1b20: 20 70 70 49 74 65 72 20 3d 20 26 70 4c 6f 63 6b   ppIter = &pLock
1b30: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
1b40: 20 7d 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 70   }..  if( pBt->p
1b50: 45 78 63 6c 75 73 69 76 65 3d 3d 70 20 29 7b 0a  Exclusive==p ){.
1b60: 20 20 20 20 70 42 74 2d 3e 70 45 78 63 6c 75 73      pBt->pExclus
1b70: 69 76 65 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23  ive = 0;.  }.}.#
1b80: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1b90: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
1ba0: 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69  E */..static voi
1bb0: 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65  d releasePage(Me
1bc0: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20  mPage *pPage);  
1bd0: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
1be0: 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 56  ence */../*.** V
1bf0: 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63  erify that the c
1c00: 75 72 73 6f 72 20 68 6f 6c 64 73 20 61 20 6d 75  ursor holds a mu
1c10: 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61  tex on the BtSha
1c20: 72 65 64 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  red.*/.#ifndef N
1c30: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
1c40: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1c50: 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a  x(BtCursor *p){.
1c60: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
1c70: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70  _mutex_held(p->p
1c80: 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65  Bt->mutex);.}.#e
1c90: 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53  ndif...#ifndef S
1ca0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
1cb0: 4c 4f 42 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69  LOB./*.** Invali
1cc0: 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  date the overflo
1cd0: 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
1ce0: 65 20 66 6f 72 20 63 75 72 73 6f 72 20 70 43 75  e for cursor pCu
1cf0: 72 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74  r, if any..*/.st
1d00: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
1d10: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
1d20: 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
1d30: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
1d40: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1d50: 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ur) );.  sqlite3
1d60: 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 4f 76 65  _free(pCur->aOve
1d70: 72 66 6c 6f 77 29 3b 0a 20 20 70 43 75 72 2d 3e  rflow);.  pCur->
1d80: 61 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d  aOverflow = 0;.}
1d90: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61  ../*.** Invalida
1da0: 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
1db0: 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
1dc0: 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  for all cursors 
1dd0: 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65  opened.** on the
1de0: 20 73 68 61 72 65 64 20 62 74 72 65 65 20 73 74   shared btree st
1df0: 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a  ructure pBt..*/.
1e00: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61  static void inva
1e10: 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
1e20: 77 43 61 63 68 65 28 42 74 53 68 61 72 65 64 20  wCache(BtShared 
1e30: 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f  *pBt){.  BtCurso
1e40: 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  r *p;.  assert( 
1e50: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1e60: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
1e70: 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
1e80: 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
1e90: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 76 61  pNext){.    inva
1ea0: 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61  lidateOverflowCa
1eb0: 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65  che(p);.  }.}.#e
1ec0: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 69 6e  lse.  #define in
1ed0: 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
1ee0: 43 61 63 68 65 28 78 29 0a 20 20 23 64 65 66 69  Cache(x).  #defi
1ef0: 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c  ne invalidateAll
1f00: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 78 29  OverflowCache(x)
1f10: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53  .#endif../*.** S
1f20: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
1f30: 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
1f40: 69 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 73  in the variables
1f50: 20 42 74 43 75 72 73 6f 72 2e 6e 4b 65 79 20 0a   BtCursor.nKey .
1f60: 2a 2a 20 61 6e 64 20 42 74 43 75 72 73 6f 72 2e  ** and BtCursor.
1f70: 70 4b 65 79 2e 20 54 68 65 20 63 75 72 73 6f 72  pKey. The cursor
1f80: 27 73 20 73 74 61 74 65 20 69 73 20 73 65 74 20  's state is set 
1f90: 74 6f 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52  to CURSOR_REQUIR
1fa0: 45 53 45 45 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  ESEEK..*/.static
1fb0: 20 69 6e 74 20 73 61 76 65 43 75 72 73 6f 72 50   int saveCursorP
1fc0: 6f 73 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72  osition(BtCursor
1fd0: 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 72   *pCur){.  int r
1fe0: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 43 55  c;..  assert( CU
1ff0: 52 53 4f 52 5f 56 41 4c 49 44 3d 3d 70 43 75 72  RSOR_VALID==pCur
2000: 2d 3e 65 53 74 61 74 65 20 29 3b 0a 20 20 61 73  ->eState );.  as
2010: 73 65 72 74 28 20 30 3d 3d 70 43 75 72 2d 3e 70  sert( 0==pCur->p
2020: 4b 65 79 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Key );.  assert(
2030: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
2040: 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 72 63  x(pCur) );..  rc
2050: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b   = sqlite3BtreeK
2060: 65 79 53 69 7a 65 28 70 43 75 72 2c 20 26 70 43  eySize(pCur, &pC
2070: 75 72 2d 3e 6e 4b 65 79 29 3b 0a 0a 20 20 2f 2a  ur->nKey);..  /*
2080: 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   If this is an i
2090: 6e 74 4b 65 79 20 74 61 62 6c 65 2c 20 74 68 65  ntKey table, the
20a0: 6e 20 74 68 65 20 61 62 6f 76 65 20 63 61 6c 6c  n the above call
20b0: 20 74 6f 20 42 74 72 65 65 4b 65 79 53 69 7a 65   to BtreeKeySize
20c0: 28 29 0a 20 20 2a 2a 20 73 74 6f 72 65 73 20 74  ().  ** stores t
20d0: 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 69  he integer key i
20e0: 6e 20 70 43 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e  n pCur->nKey. In
20f0: 20 74 68 69 73 20 63 61 73 65 20 74 68 69 73 20   this case this 
2100: 76 61 6c 75 65 20 69 73 0a 20 20 2a 2a 20 61 6c  value is.  ** al
2110: 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  l that is requir
2120: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
2130: 66 20 70 43 75 72 20 69 73 20 6e 6f 74 20 6f 70  f pCur is not op
2140: 65 6e 20 6f 6e 20 61 6e 20 69 6e 74 4b 65 79 0a  en on an intKey.
2150: 20 20 2a 2a 20 74 61 62 6c 65 2c 20 74 68 65 6e    ** table, then
2160: 20 6d 61 6c 6c 6f 63 20 73 70 61 63 65 20 66 6f   malloc space fo
2170: 72 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 20  r and store the 
2180: 70 43 75 72 2d 3e 6e 4b 65 79 20 62 79 74 65 73  pCur->nKey bytes
2190: 20 6f 66 20 6b 65 79 20 0a 20 20 2a 2a 20 64 61   of key .  ** da
21a0: 74 61 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  ta..  */.  if( r
21b0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
21c0: 30 3d 3d 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  0==pCur->pPage->
21d0: 69 6e 74 4b 65 79 29 7b 0a 20 20 20 20 76 6f 69  intKey){.    voi
21e0: 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65  d *pKey = sqlite
21f0: 33 4d 61 6c 6c 6f 63 28 70 43 75 72 2d 3e 6e 4b  3Malloc(pCur->nK
2200: 65 79 29 3b 0a 20 20 20 20 69 66 28 20 70 4b 65  ey);.    if( pKe
2210: 79 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  y ){.      rc = 
2220: 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 28  sqlite3BtreeKey(
2230: 70 43 75 72 2c 20 30 2c 20 70 43 75 72 2d 3e 6e  pCur, 0, pCur->n
2240: 4b 65 79 2c 20 70 4b 65 79 29 3b 0a 20 20 20 20  Key, pKey);.    
2250: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2260: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
2270: 43 75 72 2d 3e 70 4b 65 79 20 3d 20 70 4b 65 79  Cur->pKey = pKey
2280: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2290: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
22a0: 72 65 65 28 70 4b 65 79 29 3b 0a 20 20 20 20 20  ree(pKey);.     
22b0: 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
22c0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
22d0: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d  NOMEM;.    }.  }
22e0: 0a 20 20 61 73 73 65 72 74 28 20 21 70 43 75 72  .  assert( !pCur
22f0: 2d 3e 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ->pPage->intKey 
2300: 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20 29  || !pCur->pKey )
2310: 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
2320: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
2330: 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
2340: 70 50 61 67 65 29 3b 0a 20 20 20 20 70 43 75 72  pPage);.    pCur
2350: 2d 3e 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20  ->pPage = 0;.   
2360: 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
2370: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
2380: 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69 6e 76 61 6c  EK;.  }..  inval
2390: 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63  idateOverflowCac
23a0: 68 65 28 70 43 75 72 29 3b 0a 20 20 72 65 74 75  he(pCur);.  retu
23b0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
23c0: 53 61 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f  Save the positio
23d0: 6e 73 20 6f 66 20 61 6c 6c 20 63 75 72 73 6f 72  ns of all cursor
23e0: 73 20 65 78 63 65 70 74 20 70 45 78 63 65 70 74  s except pExcept
23f0: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 74 61 62   open on the tab
2400: 6c 65 20 0a 2a 2a 20 77 69 74 68 20 72 6f 6f 74  le .** with root
2410: 2d 70 61 67 65 20 69 52 6f 6f 74 2e 20 55 73 75  -page iRoot. Usu
2420: 61 6c 6c 79 2c 20 74 68 69 73 20 69 73 20 63 61  ally, this is ca
2430: 6c 6c 65 64 20 6a 75 73 74 20 62 65 66 6f 72 65  lled just before
2440: 20 63 75 72 73 6f 72 0a 2a 2a 20 70 45 78 63 65   cursor.** pExce
2450: 70 74 20 69 73 20 75 73 65 64 20 74 6f 20 6d 6f  pt is used to mo
2460: 64 69 66 79 20 74 68 65 20 74 61 62 6c 65 20 28  dify the table (
2470: 42 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72  BtreeDelete() or
2480: 20 42 74 72 65 65 49 6e 73 65 72 74 28 29 29 2e   BtreeInsert()).
2490: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
24a0: 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 42 74  aveAllCursors(Bt
24b0: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e  Shared *pBt, Pgn
24c0: 6f 20 69 52 6f 6f 74 2c 20 42 74 43 75 72 73 6f  o iRoot, BtCurso
24d0: 72 20 2a 70 45 78 63 65 70 74 29 7b 0a 20 20 42  r *pExcept){.  B
24e0: 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73  tCursor *p;.  as
24f0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2500: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
2510: 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
2520: 28 20 70 45 78 63 65 70 74 3d 3d 30 20 7c 7c 20  ( pExcept==0 || 
2530: 70 45 78 63 65 70 74 2d 3e 70 42 74 3d 3d 70 42  pExcept->pBt==pB
2540: 74 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74  t );.  for(p=pBt
2550: 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d  ->pCursor; p; p=
2560: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
2570: 66 28 20 70 21 3d 70 45 78 63 65 70 74 20 26 26  f( p!=pExcept &&
2580: 20 28 30 3d 3d 69 52 6f 6f 74 20 7c 7c 20 70 2d   (0==iRoot || p-
2590: 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69 52 6f 6f 74  >pgnoRoot==iRoot
25a0: 29 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 2d  ) && .        p-
25b0: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
25c0: 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 69  VALID ){.      i
25d0: 6e 74 20 72 63 20 3d 20 73 61 76 65 43 75 72 73  nt rc = saveCurs
25e0: 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b 0a 20  orPosition(p);. 
25f0: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
2600: 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20 20 20  OK!=rc ){.      
2610: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2620: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2630: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2640: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61  K;.}../*.** Clea
2650: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  r the current cu
2660: 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 2e 0a 2a  rsor position..*
2670: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
2680: 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
2690: 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  n(BtCursor *pCur
26a0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
26b0: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
26c0: 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ur) );.  sqlite3
26d0: 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  _free(pCur->pKey
26e0: 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79 20  );.  pCur->pKey 
26f0: 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74  = 0;.  pCur->eSt
2700: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56  ate = CURSOR_INV
2710: 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ALID;.}../*.** R
2720: 65 73 74 6f 72 65 20 74 68 65 20 63 75 72 73 6f  estore the curso
2730: 72 20 74 6f 20 74 68 65 20 70 6f 73 69 74 69 6f  r to the positio
2740: 6e 20 69 74 20 77 61 73 20 69 6e 20 28 6f 72 20  n it was in (or 
2750: 61 73 20 63 6c 6f 73 65 20 74 6f 20 61 73 20 70  as close to as p
2760: 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77 68 65 6e  ossible).** when
2770: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
2780: 69 6f 6e 28 29 20 77 61 73 20 63 61 6c 6c 65 64  ion() was called
2790: 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73  . Note that this
27a0: 20 63 61 6c 6c 20 64 65 6c 65 74 65 73 20 74 68   call deletes th
27b0: 65 20 0a 2a 2a 20 73 61 76 65 64 20 70 6f 73 69  e .** saved posi
27c0: 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f 72 65 64  tion info stored
27d0: 20 62 79 20 73 61 76 65 43 75 72 73 6f 72 50 6f   by saveCursorPo
27e0: 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20 74 68 65  sition(), so the
27f0: 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20 61 74 20  re can be.** at 
2800: 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65 63 74 69  most one effecti
2810: 76 65 20 72 65 73 74 6f 72 65 4f 72 43 6c 65 61  ve restoreOrClea
2820: 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
2830: 29 20 63 61 6c 6c 20 61 66 74 65 72 20 65 61 63  ) call after eac
2840: 68 20 0a 2a 2a 20 73 61 76 65 43 75 72 73 6f 72  h .** saveCursor
2850: 50 6f 73 69 74 69 6f 6e 28 29 2e 0a 2a 2a 0a 2a  Position()..**.*
2860: 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  * If the second 
2870: 61 72 67 75 6d 65 6e 74 20 61 72 67 75 6d 65 6e  argument argumen
2880: 74 20 2d 20 64 6f 53 65 65 6b 20 2d 20 69 73 20  t - doSeek - is 
2890: 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73 74  false, then inst
28a0: 65 61 64 20 6f 66 20 0a 2a 2a 20 72 65 74 75 72  ead of .** retur
28b0: 6e 69 6e 67 20 74 68 65 20 63 75 72 73 6f 72 20  ning the cursor 
28c0: 74 6f 20 69 74 73 20 73 61 76 65 64 20 70 6f 73  to its saved pos
28d0: 69 74 69 6f 6e 2c 20 61 6e 79 20 73 61 76 65 64  ition, any saved
28e0: 20 70 6f 73 69 74 69 6f 6e 20 69 73 20 64 65 6c   position is del
28f0: 65 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20  eted.** and the 
2900: 63 75 72 73 6f 72 20 73 74 61 74 65 20 73 65 74  cursor state set
2910: 20 74 6f 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c   to CURSOR_INVAL
2920: 49 44 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ID..*/.int sqlit
2930: 65 33 42 74 72 65 65 52 65 73 74 6f 72 65 4f 72  e3BtreeRestoreOr
2940: 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  ClearCursorPosit
2950: 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ion(BtCursor *pC
2960: 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ur){.  int rc;. 
2970: 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
2980: 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
2990: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
29a0: 72 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f  r->eState>=CURSO
29b0: 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
29c0: 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74  .  if( pCur->eSt
29d0: 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c  ate==CURSOR_FAUL
29e0: 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  T ){.    return 
29f0: 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a  pCur->skip;.  }.
2a00: 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
2a10: 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
2a20: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
2a30: 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c  treeMoveto(pCur,
2a40: 20 70 43 75 72 2d 3e 70 4b 65 79 2c 20 30 2c 20   pCur->pKey, 0, 
2a50: 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 30 2c 20 26  pCur->nKey, 0, &
2a60: 70 43 75 72 2d 3e 73 6b 69 70 29 3b 0a 20 20 69  pCur->skip);.  i
2a70: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2a80: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
2a90: 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79 29  free(pCur->pKey)
2aa0: 3b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4b 65 79  ;.    pCur->pKey
2ab0: 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
2ac0: 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
2ad0: 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 7c 7c 20  CURSOR_VALID || 
2ae0: 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
2af0: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 3b 0a  RSOR_INVALID );.
2b00: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2b10: 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 72 65 73 74  .}..#define rest
2b20: 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72  oreOrClearCursor
2b30: 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c 0a 20 20  Position(p) \.  
2b40: 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43 55 52 53  (p->eState>=CURS
2b50: 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 3f  OR_REQUIRESEEK ?
2b60: 20 5c 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69   \.         sqli
2b70: 74 65 33 42 74 72 65 65 52 65 73 74 6f 72 65 4f  te3BtreeRestoreO
2b80: 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69  rClearCursorPosi
2b90: 74 69 6f 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20  tion(p) : \.    
2ba0: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a       SQLITE_OK).
2bb0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2bc0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2bd0: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20 70 61  /*.** Given a pa
2be0: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 72  ge number of a r
2bf0: 65 67 75 6c 61 72 20 64 61 74 61 62 61 73 65 20  egular database 
2c00: 70 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68 65  page, return the
2c10: 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65 72 20   page.** number 
2c20: 66 6f 72 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  for the pointer-
2c30: 6d 61 70 20 70 61 67 65 20 74 68 61 74 20 63 6f  map page that co
2c40: 6e 74 61 69 6e 73 20 74 68 65 20 65 6e 74 72 79  ntains the entry
2c50: 20 66 6f 72 20 74 68 65 0a 2a 2a 20 69 6e 70 75   for the.** inpu
2c60: 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a  t page number..*
2c70: 2f 0a 73 74 61 74 69 63 20 50 67 6e 6f 20 70 74  /.static Pgno pt
2c80: 72 6d 61 70 50 61 67 65 6e 6f 28 42 74 53 68 61  rmapPageno(BtSha
2c90: 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 70  red *pBt, Pgno p
2ca0: 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67  gno){.  int nPag
2cb0: 65 73 50 65 72 4d 61 70 50 61 67 65 2c 20 69 50  esPerMapPage, iP
2cc0: 74 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61 73  trMap, ret;.  as
2cd0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
2ce0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
2cf0: 74 65 78 29 20 29 3b 0a 20 20 6e 50 61 67 65 73  tex) );.  nPages
2d00: 50 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42  PerMapPage = (pB
2d10: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29  t->usableSize/5)
2d20: 2b 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20  +1;.  iPtrMap = 
2d30: 28 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50  (pgno-2)/nPagesP
2d40: 65 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74  erMapPage;.  ret
2d50: 20 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67   = (iPtrMap*nPag
2d60: 65 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20  esPerMapPage) + 
2d70: 32 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50  2; .  if( ret==P
2d80: 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2d90: 28 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74  (pBt) ){.    ret
2da0: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
2db0: 20 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57   ret;.}../*.** W
2dc0: 72 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e  rite an entry in
2dd0: 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  to the pointer m
2de0: 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ap..**.** This r
2df0: 6f 75 74 69 6e 65 20 75 70 64 61 74 65 73 20 74  outine updates t
2e00: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
2e10: 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75  ntry for page nu
2e20: 6d 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f  mber 'key'.** so
2e30: 20 74 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f   that it maps to
2e40: 20 74 79 70 65 20 27 65 54 79 70 65 27 20 61 6e   type 'eType' an
2e50: 64 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75  d parent page nu
2e60: 6d 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 20  mber 'pgno'..** 
2e70: 41 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  An error code is
2e80: 20 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d   returned if som
2e90: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
2ea0: 67 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c  g, otherwise SQL
2eb0: 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69  ITE_OK..*/.stati
2ec0: 63 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 28  c int ptrmapPut(
2ed0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50  BtShared *pBt, P
2ee0: 67 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70  gno key, u8 eTyp
2ef0: 65 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 29 7b  e, Pgno parent){
2f00: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
2f10: 67 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e  ge;  /* The poin
2f20: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
2f30: 20 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20    u8 *pPtrmap;  
2f40: 20 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74      /* The point
2f50: 65 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20  er map data */. 
2f60: 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20   Pgno iPtrmap;  
2f70: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
2f80: 72 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65  r map page numbe
2f90: 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65  r */.  int offse
2fa0: 74 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73  t;       /* Offs
2fb0: 65 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61  et in pointer ma
2fc0: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
2fd0: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
2fe0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2ff0: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
3000: 0a 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72  .  /* The master
3010: 2d 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75  -journal page nu
3020: 6d 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20  mber must never 
3030: 62 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69  be used as a poi
3040: 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f  nter map page */
3050: 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54  .  assert( 0==PT
3060: 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
3070: 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41   PENDING_BYTE_PA
3080: 47 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61  GE(pBt)) );..  a
3090: 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f  ssert( pBt->auto
30a0: 56 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20  Vacuum );.  if( 
30b0: 6b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  key==0 ){.    re
30c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
30d0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
30e0: 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50  iPtrmap = PTRMAP
30f0: 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79  _PAGENO(pBt, key
3100: 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
3110: 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
3120: 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20  Pager, iPtrmap, 
3130: 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  &pDbPage);.  if(
3140: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
3150: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
3160: 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20  .  }.  offset = 
3170: 50 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54  PTRMAP_PTROFFSET
3180: 28 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 70 50  (pBt, key);.  pP
3190: 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71  trmap = (u8 *)sq
31a0: 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
31b0: 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 69  a(pDbPage);..  i
31c0: 66 28 20 65 54 79 70 65 21 3d 70 50 74 72 6d 61  f( eType!=pPtrma
31d0: 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20 67 65 74  p[offset] || get
31e0: 34 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f  4byte(&pPtrmap[o
31f0: 66 66 73 65 74 2b 31 5d 29 21 3d 70 61 72 65 6e  ffset+1])!=paren
3200: 74 20 29 7b 0a 20 20 20 20 54 52 41 43 45 28 28  t ){.    TRACE((
3210: 22 50 54 52 4d 41 50 5f 55 50 44 41 54 45 3a 20  "PTRMAP_UPDATE: 
3220: 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e 22 2c 20  %d->(%d,%d)\n", 
3230: 6b 65 79 2c 20 65 54 79 70 65 2c 20 70 61 72 65  key, eType, pare
3240: 6e 74 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  nt));.    rc = s
3250: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
3260: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
3270: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
3280: 20 29 7b 0a 20 20 20 20 20 20 70 50 74 72 6d 61   ){.      pPtrma
3290: 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65 54 79 70  p[offset] = eTyp
32a0: 65 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  e;.      put4byt
32b0: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
32c0: 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29 3b 0a 20  t+1], parent);. 
32d0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 71 6c 69     }.  }..  sqli
32e0: 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 44  te3PagerUnref(pD
32f0: 62 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e  bPage);.  return
3300: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
3310: 61 64 20 61 6e 20 65 6e 74 72 79 20 66 72 6f 6d  ad an entry from
3320: 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
3330: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
3340: 74 69 6e 65 20 72 65 74 72 69 65 76 65 73 20 74  tine retrieves t
3350: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65  he pointer map e
3360: 6e 74 72 79 20 66 6f 72 20 70 61 67 65 20 27 6b  ntry for page 'k
3370: 65 79 27 2c 20 77 72 69 74 69 6e 67 0a 2a 2a 20  ey', writing.** 
3380: 74 68 65 20 74 79 70 65 20 61 6e 64 20 70 61 72  the type and par
3390: 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ent page number 
33a0: 74 6f 20 2a 70 45 54 79 70 65 20 61 6e 64 20 2a  to *pEType and *
33b0: 70 50 67 6e 6f 20 72 65 73 70 65 63 74 69 76 65  pPgno respective
33c0: 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20  ly..** An error 
33d0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
33e0: 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   if something go
33f0: 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72 77  es wrong, otherw
3400: 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a  ise SQLITE_OK..*
3410: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
3420: 6d 61 70 47 65 74 28 42 74 53 68 61 72 65 64 20  mapGet(BtShared 
3430: 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c 20  *pBt, Pgno key, 
3440: 75 38 20 2a 70 45 54 79 70 65 2c 20 50 67 6e 6f  u8 *pEType, Pgno
3450: 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44 62 50 61   *pPgno){.  DbPa
3460: 67 65 20 2a 70 44 62 50 61 67 65 3b 20 20 20 2f  ge *pDbPage;   /
3470: 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * The pointer ma
3480: 70 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  p page */.  int 
3490: 69 50 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f  iPtrmap;       /
34a0: 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  * Pointer map pa
34b0: 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20 20 75 38  ge index */.  u8
34c0: 20 2a 70 50 74 72 6d 61 70 3b 20 20 20 20 20 20   *pPtrmap;      
34d0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20   /* Pointer map 
34e0: 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 69  page data */.  i
34f0: 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  nt offset;      
3500: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 65    /* Offset of e
3510: 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74 65 72 20  ntry in pointer 
3520: 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  map */.  int rc;
3530: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
3540: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
3550: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
3560: 20 69 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41   iPtrmap = PTRMA
3570: 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65  P_PAGENO(pBt, ke
3580: 79 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  y);.  rc = sqlit
3590: 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e  e3PagerGet(pBt->
35a0: 70 50 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c  pPager, iPtrmap,
35b0: 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66   &pDbPage);.  if
35c0: 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 72  ( rc!=0 ){.    r
35d0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
35e0: 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a 29  pPtrmap = (u8 *)
35f0: 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
3600: 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a 20  ata(pDbPage);.. 
3610: 20 6f 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50   offset = PTRMAP
3620: 5f 50 54 52 4f 46 46 53 45 54 28 70 42 74 2c 20  _PTROFFSET(pBt, 
3630: 6b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20  key);.  assert( 
3640: 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a  pEType!=0 );.  *
3650: 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70  pEType = pPtrmap
3660: 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20  [offset];.  if( 
3670: 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d  pPgno ) *pPgno =
3680: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
3690: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a  ap[offset+1]);..
36a0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
36b0: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
36c0: 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c  if( *pEType<1 ||
36d0: 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65 74   *pEType>5 ) ret
36e0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
36f0: 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75 72  PT_BKPT;.  retur
3700: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
3710: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
3720: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
3730: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e   */../*.** Given
3740: 20 61 20 62 74 72 65 65 20 70 61 67 65 20 61 6e   a btree page an
3750: 64 20 61 20 63 65 6c 6c 20 69 6e 64 65 78 20 28  d a cell index (
3760: 30 20 6d 65 61 6e 73 20 74 68 65 20 66 69 72 73  0 means the firs
3770: 74 20 63 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65  t cell on.** the
3780: 20 70 61 67 65 2c 20 31 20 6d 65 61 6e 73 20 74   page, 1 means t
3790: 68 65 20 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20  he second cell, 
37a0: 61 6e 64 20 73 6f 20 66 6f 72 74 68 29 20 72 65  and so forth) re
37b0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a  turn a pointer.*
37c0: 2a 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  * to the cell co
37d0: 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ntent..**.** Thi
37e0: 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
37f0: 6f 6e 6c 79 20 66 6f 72 20 70 61 67 65 73 20 74  only for pages t
3800: 68 61 74 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61  hat do not conta
3810: 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  in overflow cell
3820: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69  s..*/.#define fi
3830: 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  ndCell(pPage, iC
3840: 65 6c 6c 29 20 5c 0a 20 20 28 28 70 50 61 67 65  ell) \.  ((pPage
3850: 29 2d 3e 61 44 61 74 61 20 2b 20 67 65 74 32 62  )->aData + get2b
3860: 79 74 65 28 26 28 70 50 61 67 65 29 2d 3e 61 44  yte(&(pPage)->aD
3870: 61 74 61 5b 28 70 50 61 67 65 29 2d 3e 63 65 6c  ata[(pPage)->cel
3880: 6c 4f 66 66 73 65 74 2b 32 2a 28 69 43 65 6c 6c  lOffset+2*(iCell
3890: 29 5d 29 29 0a 23 69 66 64 65 66 20 53 51 4c 49  )])).#ifdef SQLI
38a0: 54 45 5f 54 45 53 54 0a 75 38 20 2a 73 71 6c 69  TE_TEST.u8 *sqli
38b0: 74 65 33 42 74 72 65 65 46 69 6e 64 43 65 6c 6c  te3BtreeFindCell
38c0: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
38d0: 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 61   int iCell){.  a
38e0: 73 73 65 72 74 28 20 69 43 65 6c 6c 3e 3d 30 20  ssert( iCell>=0 
38f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 43 65  );.  assert( iCe
3900: 6c 6c 3c 67 65 74 32 62 79 74 65 28 26 70 50 61  ll<get2byte(&pPa
3910: 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
3920: 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29 20 29  >hdrOffset+3]) )
3930: 3b 0a 20 20 72 65 74 75 72 6e 20 66 69 6e 64 43  ;.  return findC
3940: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
3950: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  );.}.#endif../*.
3960: 2a 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63  ** This a more c
3970: 6f 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f  omplex version o
3980: 66 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69  f sqlite3BtreeFi
3990: 6e 64 43 65 6c 6c 28 29 20 74 68 61 74 20 77 6f  ndCell() that wo
39a0: 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61 67 65 73  rks for.** pages
39b0: 20 74 68 61 74 20 64 6f 20 63 6f 6e 74 61 69 6e   that do contain
39c0: 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e   overflow cells.
39d0: 20 20 53 65 65 20 69 6e 73 65 72 74 0a 2a 2f 0a    See insert.*/.
39e0: 73 74 61 74 69 63 20 75 38 20 2a 66 69 6e 64 4f  static u8 *findO
39f0: 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50  verflowCell(MemP
3a00: 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20  age *pPage, int 
3a10: 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74 20 69 3b  iCell){.  int i;
3a20: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
3a30: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
3a40: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
3a50: 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70 50 61 67   );.  for(i=pPag
3a60: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d 31 3b 20  e->nOverflow-1; 
3a70: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
3a80: 69 6e 74 20 6b 3b 0a 20 20 20 20 73 74 72 75 63  int k;.    struc
3a90: 74 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a 70 4f 76  t _OvflCell *pOv
3aa0: 66 6c 3b 0a 20 20 20 20 70 4f 76 66 6c 20 3d 20  fl;.    pOvfl = 
3ab0: 26 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 69 5d  &pPage->aOvfl[i]
3ac0: 3b 0a 20 20 20 20 6b 20 3d 20 70 4f 76 66 6c 2d  ;.    k = pOvfl-
3ad0: 3e 69 64 78 3b 0a 20 20 20 20 69 66 28 20 6b 3c  >idx;.    if( k<
3ae0: 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20  =iCell ){.      
3af0: 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a  if( k==iCell ){.
3b00: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
3b10: 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a 20 20 20  Ovfl->pCell;.   
3b20: 20 20 20 7d 0a 20 20 20 20 20 20 69 43 65 6c 6c     }.      iCell
3b30: 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  --;.    }.  }.  
3b40: 72 65 74 75 72 6e 20 66 69 6e 64 43 65 6c 6c 28  return findCell(
3b50: 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d  pPage, iCell);.}
3b60: 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 61 20  ../*.** Parse a 
3b70: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 62 6c 6f  cell content blo
3b80: 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69 6e 20 74  ck and fill in t
3b90: 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73 74 72 75  he CellInfo stru
3ba0: 63 74 75 72 65 2e 20 20 54 68 65 72 65 0a 2a 2a  cture.  There.**
3bb0: 20 61 72 65 20 74 77 6f 20 76 65 72 73 69 6f 6e   are two version
3bc0: 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
3bd0: 6f 6e 2e 20 20 73 71 6c 69 74 65 33 42 74 72 65  on.  sqlite3Btre
3be0: 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74 61 6b  eParseCell() tak
3bf0: 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e  es a .** cell in
3c00: 64 65 78 20 61 73 20 74 68 65 20 73 65 63 6f 6e  dex as the secon
3c10: 64 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 73  d argument and s
3c20: 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65  qlite3BtreeParse
3c30: 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a 20 74 61  CellPtr() .** ta
3c40: 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  kes a pointer to
3c50: 20 74 68 65 20 62 6f 64 79 20 6f 66 20 74 68 65   the body of the
3c60: 20 63 65 6c 6c 20 61 73 20 69 74 73 20 73 65 63   cell as its sec
3c70: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a  ond argument..**
3c80: 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20  .** Within this 
3c90: 66 69 6c 65 2c 20 74 68 65 20 70 61 72 73 65 43  file, the parseC
3ca0: 65 6c 6c 28 29 20 6d 61 63 72 6f 20 63 61 6e 20  ell() macro can 
3cb0: 62 65 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61  be called instea
3cc0: 64 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 42  d of.** sqlite3B
3cd0: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
3ce0: 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d 65 20 63  (). Using some c
3cf0: 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69 73 20 77  ompilers, this w
3d00: 69 6c 6c 20 62 65 20 66 61 73 74 65 72 2e 0a 2a  ill be faster..*
3d10: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  /.void sqlite3Bt
3d20: 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
3d30: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
3d40: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
3d50: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
3d60: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a  e cell */.  u8 *
3d70: 70 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  pCell,          
3d80: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
3d90: 6f 20 74 68 65 20 63 65 6c 6c 20 74 65 78 74 2e  o the cell text.
3da0: 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 2a   */.  CellInfo *
3db0: 70 49 6e 66 6f 20 20 20 20 20 20 20 20 20 2f 2a  pInfo         /*
3dc0: 20 46 69 6c 6c 20 69 6e 20 74 68 69 73 20 73 74   Fill in this st
3dd0: 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b 0a 20 20  ructure */.){.  
3de0: 69 6e 74 20 6e 3b 20 20 20 20 20 20 20 20 20 20  int n;          
3df0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3e00: 72 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 20  r bytes in cell 
3e10: 63 6f 6e 74 65 6e 74 20 68 65 61 64 65 72 20 2a  content header *
3e20: 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c 6f 61 64  /.  u32 nPayload
3e30: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  ;           /* N
3e40: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
3e50: 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61 64 20 2a  f cell payload *
3e60: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
3e70: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
3e80: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
3e90: 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e  x) );..  pInfo->
3ea0: 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20  pCell = pCell;. 
3eb0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
3ec0: 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50 61 67 65  leaf==0 || pPage
3ed0: 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a 20 20 6e  ->leaf==1 );.  n
3ee0: 20 3d 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50   = pPage->childP
3ef0: 74 72 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  trSize;.  assert
3f00: 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67 65 2d 3e  ( n==4-4*pPage->
3f10: 6c 65 61 66 20 29 3b 0a 20 20 69 66 28 20 70 50  leaf );.  if( pP
3f20: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a  age->hasData ){.
3f30: 20 20 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69      n += getVari
3f40: 6e 74 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20  nt32(&pCell[n], 
3f50: 6e 50 61 79 6c 6f 61 64 29 3b 0a 20 20 7d 65 6c  nPayload);.  }el
3f60: 73 65 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64  se{.    nPayload
3f70: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 49 6e 66   = 0;.  }.  pInf
3f80: 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61 79 6c  o->nData = nPayl
3f90: 6f 61 64 3b 0a 20 20 69 66 28 20 70 50 61 67 65  oad;.  if( pPage
3fa0: 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
3fb0: 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 28 26  n += getVarint(&
3fc0: 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34 20 2a  pCell[n], (u64 *
3fd0: 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b 0a  )&pInfo->nKey);.
3fe0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 33 32    }else{.    u32
3ff0: 20 78 3b 0a 20 20 20 20 6e 20 2b 3d 20 67 65 74   x;.    n += get
4000: 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c 6c 5b  Varint32(&pCell[
4010: 6e 5d 2c 20 78 29 3b 0a 20 20 20 20 70 49 6e 66  n], x);.    pInf
4020: 6f 2d 3e 6e 4b 65 79 20 3d 20 78 3b 0a 20 20 20  o->nKey = x;.   
4030: 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 78 3b 0a   nPayload += x;.
4040: 20 20 7d 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61    }.  pInfo->nPa
4050: 79 6c 6f 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64  yload = nPayload
4060: 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e 48 65 61 64  ;.  pInfo->nHead
4070: 65 72 20 3d 20 6e 3b 0a 20 20 69 66 28 20 6e 50  er = n;.  if( nP
4080: 61 79 6c 6f 61 64 3c 3d 70 50 61 67 65 2d 3e 6d  ayload<=pPage->m
4090: 61 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 2f  axLocal ){.    /
40a0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 28 65  * This is the (e
40b0: 61 73 79 29 20 63 6f 6d 6d 6f 6e 20 63 61 73 65  asy) common case
40c0: 20 77 68 65 72 65 20 74 68 65 20 65 6e 74 69 72   where the entir
40d0: 65 20 70 61 79 6c 6f 61 64 20 66 69 74 73 0a 20  e payload fits. 
40e0: 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 6f 63     ** on the loc
40f0: 61 6c 20 70 61 67 65 2e 20 20 4e 6f 20 6f 76 65  al page.  No ove
4100: 72 66 6c 6f 77 20 69 73 20 72 65 71 75 69 72 65  rflow is require
4110: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  d..    */.    in
4120: 74 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20  t nSize;        
4130: 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
4140: 6f 66 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  of cell content 
4150: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 20 20  in bytes */.    
4160: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
4170: 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49  nPayload;.    pI
4180: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d  nfo->iOverflow =
4190: 20 30 3b 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20   0;.    nSize = 
41a0: 6e 50 61 79 6c 6f 61 64 20 2b 20 6e 3b 0a 20 20  nPayload + n;.  
41b0: 20 20 69 66 28 20 6e 53 69 7a 65 3c 34 20 29 7b    if( nSize<4 ){
41c0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 34  .      nSize = 4
41d0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69  ;        /* Mini
41e0: 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69 73  mum cell size is
41f0: 20 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20   4 */.    }.    
4200: 70 49 6e 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e  pInfo->nSize = n
4210: 53 69 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Size;.  }else{. 
4220: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79     /* If the pay
4230: 6c 6f 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69  load will not fi
4240: 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20  t completely on 
4250: 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20  the local page, 
4260: 77 65 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74  we have.    ** t
4270: 6f 20 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63  o decide how muc
4280: 68 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  h to store local
4290: 6c 79 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20  ly and how much 
42a0: 74 6f 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20  to spill onto.  
42b0: 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61    ** overflow pa
42c0: 67 65 73 2e 20 20 54 68 65 20 73 74 72 61 74 65  ges.  The strate
42d0: 67 79 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a  gy is to minimiz
42e0: 65 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  e the amount of 
42f0: 75 6e 75 73 65 64 0a 20 20 20 20 2a 2a 20 73 70  unused.    ** sp
4300: 61 63 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20  ace on overflow 
4310: 70 61 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70  pages while keep
4320: 69 6e 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f  ing the amount o
4330: 66 20 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a  f local storage.
4340: 20 20 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65      ** in betwee
4350: 6e 20 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d  n minLocal and m
4360: 61 78 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a  axLocal..    **.
4370: 20 20 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20      ** Warning: 
4380: 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61   changing the wa
4390: 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f  y overflow paylo
43a0: 61 64 20 69 73 20 64 69 73 74 72 69 62 75 74 65  ad is distribute
43b0: 64 20 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20  d in any.    ** 
43c0: 77 61 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20  way will result 
43d0: 69 6e 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  in an incompatib
43e0: 6c 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a  le file format..
43f0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d      */.    int m
4400: 69 6e 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e  inLocal;  /* Min
4410: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
4420: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
4430: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d  lly */.    int m
4440: 61 78 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78  axLocal;  /* Max
4450: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
4460: 61 79 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61  ayload held loca
4470: 6c 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73  lly */.    int s
4480: 75 72 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65  urplus;   /* Ove
4490: 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76  rflow payload av
44a0: 61 69 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61  ailable for loca
44b0: 6c 20 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20  l storage */..  
44c0: 20 20 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61    minLocal = pPa
44d0: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20  ge->minLocal;.  
44e0: 20 20 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61    maxLocal = pPa
44f0: 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20  ge->maxLocal;.  
4500: 20 20 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c    surplus = minL
4510: 6f 63 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64  ocal + (nPayload
4520: 20 2d 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50   - minLocal)%(pP
4530: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
4540: 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 69  Size - 4);.    i
4550: 66 28 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61  f( surplus <= ma
4560: 78 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20  xLocal ){.      
4570: 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20  pInfo->nLocal = 
4580: 73 75 72 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c  surplus;.    }el
4590: 73 65 7b 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d  se{.      pInfo-
45a0: 3e 6e 4c 6f 63 61 6c 20 3d 20 6d 69 6e 4c 6f 63  >nLocal = minLoc
45b0: 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 49  al;.    }.    pI
45c0: 6e 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d  nfo->iOverflow =
45d0: 20 70 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b   pInfo->nLocal +
45e0: 20 6e 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e   n;.    pInfo->n
45f0: 53 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f  Size = pInfo->iO
4600: 76 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d  verflow + 4;.  }
4610: 0a 7d 0a 23 64 65 66 69 6e 65 20 70 61 72 73 65  .}.#define parse
4620: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c  Cell(pPage, iCel
4630: 6c 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20 73 71  l, pInfo) \.  sq
4640: 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
4650: 65 6c 6c 50 74 72 28 28 70 50 61 67 65 29 2c 20  ellPtr((pPage), 
4660: 66 69 6e 64 43 65 6c 6c 28 28 70 50 61 67 65 29  findCell((pPage)
4670: 2c 20 28 69 43 65 6c 6c 29 29 2c 20 28 70 49 6e  , (iCell)), (pIn
4680: 66 6f 29 29 0a 76 6f 69 64 20 73 71 6c 69 74 65  fo)).void sqlite
4690: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
46a0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
46b0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  e,         /* Pa
46c0: 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ge containing th
46d0: 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20  e cell */.  int 
46e0: 69 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20  iCell,          
46f0: 20 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20      /* The cell 
4700: 69 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65  index.  First ce
4710: 6c 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c  ll is 0 */.  Cel
4720: 6c 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20  lInfo *pInfo    
4730: 20 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20       /* Fill in 
4740: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a  this structure *
4750: 2f 0a 29 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c  /.){.  parseCell
4760: 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70  (pPage, iCell, p
4770: 49 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Info);.}../*.** 
4780: 43 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61  Compute the tota
4790: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  l number of byte
47a0: 73 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65  s that a Cell ne
47b0: 65 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a  eds in the cell.
47c0: 2a 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  ** data area of 
47d0: 74 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20  the btree-page. 
47e0: 20 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62   The return numb
47f0: 65 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20  er includes the 
4800: 63 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61  cell.** data hea
4810: 64 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61  der and the loca
4820: 6c 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e  l payload, but n
4830: 6f 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20  ot any overflow 
4840: 70 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73  page or.** the s
4850: 70 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65  pace used by the
4860: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a   cell pointer..*
4870: 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
4880: 0a 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c  .static u16 cell
4890: 53 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Size(MemPage *pP
48a0: 61 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b  age, int iCell){
48b0: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
48c0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
48d0: 50 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c  ParseCell(pPage,
48e0: 20 69 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   iCell, &info);.
48f0: 20 20 72 65 74 75 72 6e 20 69 6e 66 6f 2e 6e 53    return info.nS
4900: 69 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 73 74  ize;.}.#endif.st
4910: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
4920: 65 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  ePtr(MemPage *pP
4930: 61 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b  age, u8 *pCell){
4940: 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
4950: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
4960: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
4970: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
4980: 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 66 6f  );.  return info
4990: 2e 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 6e 64  .nSize;.}..#ifnd
49a0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
49b0: 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  UTOVACUUM./*.** 
49c0: 49 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c  If the cell pCel
49d0: 6c 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65 20  l, part of page 
49e0: 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61  pPage contains a
49f0: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61   pointer.** to a
4a00: 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c  n overflow page,
4a10: 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79   insert an entry
4a20: 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65   into the pointe
4a30: 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65  r-map.** for the
4a40: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a   overflow page..
4a50: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74  */.static int pt
4a60: 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d  rmapPutOvflPtr(M
4a70: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
4a80: 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 69 66 28  8 *pCell){.  if(
4a90: 20 70 43 65 6c 6c 20 29 7b 0a 20 20 20 20 43 65   pCell ){.    Ce
4aa0: 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20  llInfo info;.   
4ab0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
4ac0: 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
4ad0: 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
4ae0: 20 20 20 20 61 73 73 65 72 74 28 20 28 69 6e 66      assert( (inf
4af0: 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e  o.nData+(pPage->
4b00: 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b  intKey?0:info.nK
4b10: 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c  ey))==info.nPayl
4b20: 6f 61 64 20 29 3b 0a 20 20 20 20 69 66 28 20 28  oad );.    if( (
4b30: 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67  info.nData+(pPag
4b40: 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f  e->intKey?0:info
4b50: 2e 6e 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f  .nKey))>info.nLo
4b60: 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  cal ){.      Pgn
4b70: 6f 20 6f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  o ovfl = get4byt
4b80: 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
4b90: 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20  verflow]);.     
4ba0: 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75   return ptrmapPu
4bb0: 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 6f 76  t(pPage->pBt, ov
4bc0: 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  fl, PTRMAP_OVERF
4bd0: 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e  LOW1, pPage->pgn
4be0: 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  o);.    }.  }.  
4bf0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
4c00: 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  ;.}./*.** If the
4c10: 20 63 65 6c 6c 20 77 69 74 68 20 69 6e 64 65 78   cell with index
4c20: 20 69 43 65 6c 6c 20 6f 6e 20 70 61 67 65 20 70   iCell on page p
4c30: 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  Page contains a 
4c40: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e  pointer.** to an
4c50: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
4c60: 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20  insert an entry 
4c70: 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
4c80: 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20  -map.** for the 
4c90: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a  overflow page..*
4ca0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
4cb0: 6d 61 70 50 75 74 4f 76 66 6c 28 4d 65 6d 50 61  mapPutOvfl(MemPa
4cc0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 69  ge *pPage, int i
4cd0: 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70 43 65  Cell){.  u8 *pCe
4ce0: 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ll;.  assert( sq
4cf0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
4d00: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
4d10: 65 78 29 20 29 3b 0a 20 20 70 43 65 6c 6c 20 3d  ex) );.  pCell =
4d20: 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c   findOverflowCel
4d30: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29 3b  l(pPage, iCell);
4d40: 0a 20 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70  .  return ptrmap
4d50: 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67 65  PutOvflPtr(pPage
4d60: 2c 20 70 43 65 6c 6c 29 3b 0a 7d 0a 23 65 6e 64  , pCell);.}.#end
4d70: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66 72 61  if.../*.** Defra
4d80: 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65 20 67  gment the page g
4d90: 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c 6c 73  iven.  All Cells
4da0: 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20 74 68   are moved to th
4db0: 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20  e.** end of the 
4dc0: 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66 72 65  page and all fre
4dd0: 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c 6c 65  e space is colle
4de0: 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a 2a 2a  cted into one.**
4df0: 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74 68 61   big FreeBlk tha
4e00: 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65 74 77  t occurs in betw
4e10: 65 65 6e 20 74 68 65 20 68 65 61 64 65 72 20 61  een the header a
4e20: 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69 6e 74  nd cell.** point
4e30: 65 72 20 61 72 72 61 79 20 61 6e 64 20 74 68 65  er array and the
4e40: 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72   cell content ar
4e50: 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ea..*/.static in
4e60: 74 20 64 65 66 72 61 67 6d 65 6e 74 50 61 67 65  t defragmentPage
4e70: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
4e80: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
4e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4ea0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
4eb0: 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20 20 20 20  /.  int pc;     
4ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4ed0: 2a 20 41 64 64 72 65 73 73 20 6f 66 20 61 20 69  * Address of a i
4ee0: 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  -th cell */.  in
4ef0: 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20 20  t addr;         
4f00: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
4f10: 65 74 20 6f 66 20 66 69 72 73 74 20 62 79 74 65  et of first byte
4f20: 20 61 66 74 65 72 20 63 65 6c 6c 20 70 6f 69 6e   after cell poin
4f30: 74 65 72 20 61 72 72 61 79 20 2a 2f 0a 20 20 69  ter array */.  i
4f40: 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20  nt hdr;         
4f50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
4f60: 73 65 74 20 74 6f 20 74 68 65 20 70 61 67 65 20  set to the page 
4f70: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
4f80: 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  size;           
4f90: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
4fa0: 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e  f a cell */.  in
4fb0: 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
4fc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4fd0: 65 72 20 6f 66 20 75 73 61 62 6c 65 20 62 79 74  er of usable byt
4fe0: 65 73 20 6f 6e 20 61 20 70 61 67 65 20 2a 2f 0a  es on a page */.
4ff0: 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74    int cellOffset
5000: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
5010: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 63 65  Offset to the ce
5020: 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61 79  ll pointer array
5030: 20 2a 2f 0a 20 20 69 6e 74 20 62 72 6b 3b 20 20   */.  int brk;  
5040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5050: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
5060: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
5070: 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65  rea */.  int nCe
5080: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
5090: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
50a0: 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 70 61   cells on the pa
50b0: 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64  ge */.  unsigned
50c0: 20 63 68 61 72 20 2a 64 61 74 61 3b 20 20 20 20   char *data;    
50d0: 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 64     /* The page d
50e0: 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  ata */.  unsigne
50f0: 64 20 63 68 61 72 20 2a 74 65 6d 70 3b 20 20 20  d char *temp;   
5100: 20 20 20 20 2f 2a 20 54 65 6d 70 20 61 72 65 61      /* Temp area
5110: 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   for cell conten
5120: 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
5130: 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
5140: 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
5150: 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73  DbPage) );.  ass
5160: 65 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21  ert( pPage->pBt!
5170: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
5180: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
5190: 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c 49 54 45  leSize <= SQLITE
51a0: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29  _MAX_PAGE_SIZE )
51b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
51c0: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
51d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
51e0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
51f0: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
5200: 78 29 20 29 3b 0a 20 20 74 65 6d 70 20 3d 20 73  x) );.  temp = s
5210: 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
5220: 70 61 63 65 28 70 50 61 67 65 2d 3e 70 42 74 2d  pace(pPage->pBt-
5230: 3e 70 50 61 67 65 72 29 3b 0a 20 20 64 61 74 61  >pPager);.  data
5240: 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
5250: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
5260: 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 63 65 6c  hdrOffset;.  cel
5270: 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d  lOffset = pPage-
5280: 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 6e  >cellOffset;.  n
5290: 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43  Cell = pPage->nC
52a0: 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20 6e  ell;.  assert( n
52b0: 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74 65 28 26  Cell==get2byte(&
52c0: 64 61 74 61 5b 68 64 72 2b 33 5d 29 20 29 3b 0a  data[hdr+3]) );.
52d0: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
52e0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
52f0: 65 53 69 7a 65 3b 0a 20 20 62 72 6b 20 3d 20 67  eSize;.  brk = g
5300: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
5310: 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d 63 70 79 28  r+5]);.  memcpy(
5320: 26 74 65 6d 70 5b 62 72 6b 5d 2c 20 26 64 61 74  &temp[brk], &dat
5330: 61 5b 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69  a[brk], usableSi
5340: 7a 65 20 2d 20 62 72 6b 29 3b 0a 20 20 62 72 6b  ze - brk);.  brk
5350: 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20   = usableSize;. 
5360: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
5370: 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20  l; i++){.    u8 
5380: 2a 70 41 64 64 72 3b 20 20 20 20 20 2f 2a 20 54  *pAddr;     /* T
5390: 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 70 6f 69  he i-th cell poi
53a0: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 70 41 64 64  nter */.    pAdd
53b0: 72 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f 66  r = &data[cellOf
53c0: 66 73 65 74 20 2b 20 69 2a 32 5d 3b 0a 20 20 20  fset + i*2];.   
53d0: 20 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70   pc = get2byte(p
53e0: 41 64 64 72 29 3b 0a 20 20 20 20 61 73 73 65 72  Addr);.    asser
53f0: 74 28 20 70 63 3c 70 50 61 67 65 2d 3e 70 42 74  t( pc<pPage->pBt
5400: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
5410: 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c 6c 53      size = cellS
5420: 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 26 74  izePtr(pPage, &t
5430: 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20 20 62 72  emp[pc]);.    br
5440: 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20 20 20 6d  k -= size;.    m
5450: 65 6d 63 70 79 28 26 64 61 74 61 5b 62 72 6b 5d  emcpy(&data[brk]
5460: 2c 20 26 74 65 6d 70 5b 70 63 5d 2c 20 73 69 7a  , &temp[pc], siz
5470: 65 29 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65  e);.    put2byte
5480: 28 70 41 64 64 72 2c 20 62 72 6b 29 3b 0a 20 20  (pAddr, brk);.  
5490: 7d 0a 20 20 61 73 73 65 72 74 28 20 62 72 6b 3e  }.  assert( brk>
54a0: 3d 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43  =cellOffset+2*nC
54b0: 65 6c 6c 20 29 3b 0a 20 20 70 75 74 32 62 79 74  ell );.  put2byt
54c0: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 2c 20  e(&data[hdr+5], 
54d0: 62 72 6b 29 3b 0a 20 20 64 61 74 61 5b 68 64 72  brk);.  data[hdr
54e0: 2b 31 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b  +1] = 0;.  data[
54f0: 68 64 72 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61  hdr+2] = 0;.  da
5500: 74 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20  ta[hdr+7] = 0;. 
5510: 20 61 64 64 72 20 3d 20 63 65 6c 6c 4f 66 66 73   addr = cellOffs
5520: 65 74 2b 32 2a 6e 43 65 6c 6c 3b 0a 20 20 6d 65  et+2*nCell;.  me
5530: 6d 73 65 74 28 26 64 61 74 61 5b 61 64 64 72 5d  mset(&data[addr]
5540: 2c 20 30 2c 20 62 72 6b 2d 61 64 64 72 29 3b 0a  , 0, brk-addr);.
5550: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
5560: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  OK;.}../*.** All
5570: 6f 63 61 74 65 20 6e 42 79 74 65 20 62 79 74 65  ocate nByte byte
5580: 73 20 6f 66 20 73 70 61 63 65 20 6f 6e 20 61 20  s of space on a 
5590: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  page..**.** Retu
55a0: 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 6e 74  rn the index int
55b0: 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d  o pPage->aData[]
55c0: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 62 79   of the first by
55d0: 74 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6e 65 77  te of.** the new
55e0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20 4f 72 20   allocation. Or 
55f0: 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65 72  return 0 if ther
5600: 65 20 69 73 20 6e 6f 74 20 65 6e 6f 75 67 68 20  e is not enough 
5610: 66 72 65 65 0a 2a 2a 20 73 70 61 63 65 20 6f 6e  free.** space on
5620: 20 74 68 65 20 70 61 67 65 20 74 6f 20 73 61 74   the page to sat
5630: 69 73 66 79 20 74 68 65 20 61 6c 6c 6f 63 61 74  isfy the allocat
5640: 69 6f 6e 20 72 65 71 75 65 73 74 2e 0a 2a 2a 0a  ion request..**.
5650: 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 63  ** If the page c
5660: 6f 6e 74 61 69 6e 73 20 6e 42 79 74 65 73 20 6f  ontains nBytes o
5670: 66 20 66 72 65 65 20 73 70 61 63 65 20 62 75 74  f free space but
5680: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
5690: 6e 0a 2a 2a 20 6e 42 79 74 65 73 20 6f 66 20 63  n.** nBytes of c
56a0: 6f 6e 74 69 67 75 6f 75 73 20 66 72 65 65 20 73  ontiguous free s
56b0: 70 61 63 65 2c 20 74 68 65 6e 20 74 68 69 73 20  pace, then this 
56c0: 72 6f 75 74 69 6e 65 20 61 75 74 6f 6d 61 74 69  routine automati
56d0: 63 61 6c 6c 79 0a 2a 2a 20 63 61 6c 6c 73 20 64  cally.** calls d
56e0: 65 66 72 61 67 65 6d 65 6e 74 50 61 67 65 28 29  efragementPage()
56f0: 20 74 6f 20 63 6f 6e 73 6f 6c 69 64 61 74 65 20   to consolidate 
5700: 61 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 62  all free space b
5710: 65 66 6f 72 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61  efore .** alloca
5720: 74 69 6e 67 20 74 68 65 20 6e 65 77 20 63 68 75  ting the new chu
5730: 6e 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nk..*/.static in
5740: 74 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28  t allocateSpace(
5750: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
5760: 69 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 69 6e  int nByte){.  in
5770: 74 20 61 64 64 72 2c 20 70 63 2c 20 68 64 72 3b  t addr, pc, hdr;
5780: 0a 20 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20 69  .  int size;.  i
5790: 6e 74 20 6e 46 72 61 67 3b 0a 20 20 69 6e 74 20  nt nFrag;.  int 
57a0: 74 6f 70 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c  top;.  int nCell
57b0: 3b 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73  ;.  int cellOffs
57c0: 65 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  et;.  unsigned c
57d0: 68 61 72 20 2a 64 61 74 61 3b 0a 20 20 0a 20 20  har *data;.  .  
57e0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
57f0: 61 74 61 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ata;.  assert( s
5800: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
5810: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
5820: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
5830: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29  rt( pPage->pBt )
5840: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
5850: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
5860: 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
5870: 29 20 29 3b 0a 20 20 69 66 28 20 6e 42 79 74 65  ) );.  if( nByte
5880: 3c 34 20 29 20 6e 42 79 74 65 20 3d 20 34 3b 0a  <4 ) nByte = 4;.
5890: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 46 72    if( pPage->nFr
58a0: 65 65 3c 6e 42 79 74 65 20 7c 7c 20 70 50 61 67  ee<nByte || pPag
58b0: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29  e->nOverflow>0 )
58c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 50 61   return 0;.  pPa
58d0: 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e 42 79  ge->nFree -= nBy
58e0: 74 65 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  te;.  hdr = pPag
58f0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 0a 20  e->hdrOffset;.. 
5900: 20 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68 64   nFrag = data[hd
5910: 72 2b 37 5d 3b 0a 20 20 69 66 28 20 6e 46 72 61  r+7];.  if( nFra
5920: 67 3c 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53  g<60 ){.    /* S
5930: 65 61 72 63 68 20 74 68 65 20 66 72 65 65 6c 69  earch the freeli
5940: 73 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  st looking for a
5950: 20 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68   slot big enough
5960: 20 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 0a   to satisfy the.
5970: 20 20 20 20 2a 2a 20 73 70 61 63 65 20 72 65 71      ** space req
5980: 75 65 73 74 2e 20 2a 2f 0a 20 20 20 20 61 64 64  uest. */.    add
5990: 72 20 3d 20 68 64 72 2b 31 3b 0a 20 20 20 20 77  r = hdr+1;.    w
59a0: 68 69 6c 65 28 20 28 70 63 20 3d 20 67 65 74 32  hile( (pc = get2
59b0: 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d  byte(&data[addr]
59c0: 29 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 69  ))>0 ){.      si
59d0: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
59e0: 61 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20  ata[pc+2]);.    
59f0: 20 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74    if( size>=nByt
5a00: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  e ){.        if(
5a10: 20 73 69 7a 65 3c 6e 42 79 74 65 2b 34 20 29 7b   size<nByte+4 ){
5a20: 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
5a30: 79 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 26  y(&data[addr], &
5a40: 64 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20  data[pc], 2);.  
5a50: 20 20 20 20 20 20 20 20 64 61 74 61 5b 68 64 72          data[hdr
5a60: 2b 37 5d 20 3d 20 6e 46 72 61 67 20 2b 20 73 69  +7] = nFrag + si
5a70: 7a 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20  ze - nByte;.    
5a80: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 63 3b        return pc;
5a90: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
5aa0: 20 20 20 20 20 20 20 20 20 20 70 75 74 32 62 79            put2by
5ab0: 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c 20  te(&data[pc+2], 
5ac0: 73 69 7a 65 2d 6e 42 79 74 65 29 3b 0a 20 20 20  size-nByte);.   
5ad0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 63         return pc
5ae0: 20 2b 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b   + size - nByte;
5af0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5b00: 20 7d 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20   }.      addr = 
5b10: 70 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  pc;.    }.  }.. 
5b20: 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d   /* Allocate mem
5b30: 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70  ory from the gap
5b40: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
5b50: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72  cell pointer arr
5b60: 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20  ay.  ** and the 
5b70: 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65  cell content are
5b80: 61 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 3d 20  a..  */.  top = 
5b90: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
5ba0: 64 72 2b 35 5d 29 3b 0a 20 20 6e 43 65 6c 6c 20  dr+5]);.  nCell 
5bb0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
5bc0: 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 63 65 6c 6c  [hdr+3]);.  cell
5bd0: 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e  Offset = pPage->
5be0: 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 69 66  cellOffset;.  if
5bf0: 28 20 6e 46 72 61 67 3e 3d 36 30 20 7c 7c 20 63  ( nFrag>=60 || c
5c00: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43  ellOffset + 2*nC
5c10: 65 6c 6c 20 3e 20 74 6f 70 20 2d 20 6e 42 79 74  ell > top - nByt
5c20: 65 20 29 7b 0a 20 20 20 20 69 66 28 20 64 65 66  e ){.    if( def
5c30: 72 61 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67  ragmentPage(pPag
5c40: 65 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  e) ) return 0;. 
5c50: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
5c60: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
5c70: 0a 20 20 7d 0a 20 20 74 6f 70 20 2d 3d 20 6e 42  .  }.  top -= nB
5c80: 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20 63  yte;.  assert( c
5c90: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43  ellOffset + 2*nC
5ca0: 65 6c 6c 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20  ell <= top );.  
5cb0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
5cc0: 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 72  dr+5], top);.  r
5cd0: 65 74 75 72 6e 20 74 6f 70 3b 0a 7d 0a 0a 2f 2a  eturn top;.}../*
5ce0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63  .** Return a sec
5cf0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67  tion of the pPag
5d00: 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20  e->aData to the 
5d10: 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65  freelist..** The
5d20: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
5d30: 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63  he new free bloc
5d40: 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44 69 73  k is pPage->aDis
5d50: 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20  k[start].** and 
5d60: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
5d70: 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65 22 20  block is "size" 
5d80: 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73  bytes..**.** Mos
5d90: 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72 74 20  t of the effort 
5da0: 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76 65 64  here is involved
5db0: 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61 64   in coalesing ad
5dc0: 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62  jacent.** free b
5dd0: 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e  locks into a sin
5de0: 67 6c 65 20 62 69 67 20 66 72 65 65 20 62 6c 6f  gle big free blo
5df0: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
5e00: 69 64 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d  id freeSpace(Mem
5e10: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
5e20: 20 73 74 61 72 74 2c 20 69 6e 74 20 73 69 7a 65   start, int size
5e30: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70  ){.  int addr, p
5e40: 62 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20 75 6e  begin, hdr;.  un
5e50: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
5e60: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
5e70: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
5e80: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
5e90: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
5ea0: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
5eb0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
5ec0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61  );.  assert( sta
5ed0: 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66  rt>=pPage->hdrOf
5ee0: 66 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c  fset+6+(pPage->l
5ef0: 65 61 66 3f 30 3a 34 29 20 29 3b 0a 20 20 61 73  eaf?0:4) );.  as
5f00: 73 65 72 74 28 20 28 73 74 61 72 74 20 2b 20 73  sert( (start + s
5f10: 69 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70 42 74  ize)<=pPage->pBt
5f20: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
5f30: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5f40: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
5f50: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
5f60: 29 3b 0a 20 20 69 66 28 20 73 69 7a 65 3c 34 20  );.  if( size<4 
5f70: 29 20 73 69 7a 65 20 3d 20 34 3b 0a 0a 23 69 66  ) size = 4;..#if
5f80: 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
5f90: 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 4f 76  E_DELETE.  /* Ov
5fa0: 65 72 77 72 69 74 65 20 64 65 6c 65 74 65 64 20  erwrite deleted 
5fb0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 74 68  information with
5fc0: 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68 65 20   zeros when the 
5fd0: 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 0a 20  SECURE_DELETE . 
5fe0: 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20 65 6e   ** option is en
5ff0: 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  abled at compile
6000: 2d 74 69 6d 65 20 2a 2f 0a 20 20 6d 65 6d 73 65  -time */.  memse
6010: 74 28 26 64 61 74 61 5b 73 74 61 72 74 5d 2c 20  t(&data[start], 
6020: 30 2c 20 73 69 7a 65 29 3b 0a 23 65 6e 64 69 66  0, size);.#endif
6030: 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 73  ..  /* Add the s
6040: 70 61 63 65 20 62 61 63 6b 20 69 6e 74 6f 20 74  pace back into t
6050: 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f  he linked list o
6060: 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 2a 2f 0a  f freeblocks */.
6070: 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68    hdr = pPage->h
6080: 64 72 4f 66 66 73 65 74 3b 0a 20 20 61 64 64 72  drOffset;.  addr
6090: 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20 77 68   = hdr + 1;.  wh
60a0: 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d 20 67  ile( (pbegin = g
60b0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64  et2byte(&data[ad
60c0: 64 72 5d 29 29 3c 73 74 61 72 74 20 26 26 20 70  dr]))<start && p
60d0: 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20 20 61  begin>0 ){.    a
60e0: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70  ssert( pbegin<=p
60f0: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
6100: 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20 20 61  eSize-4 );.    a
6110: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64  ssert( pbegin>ad
6120: 64 72 20 29 3b 0a 20 20 20 20 61 64 64 72 20 3d  dr );.    addr =
6130: 20 70 62 65 67 69 6e 3b 0a 20 20 7d 0a 20 20 61   pbegin;.  }.  a
6140: 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c 3d 70  ssert( pbegin<=p
6150: 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c  Page->pBt->usabl
6160: 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 61 73 73  eSize-4 );.  ass
6170: 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72  ert( pbegin>addr
6180: 20 7c 7c 20 70 62 65 67 69 6e 3d 3d 30 20 29 3b   || pbegin==0 );
6190: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
61a0: 61 5b 61 64 64 72 5d 2c 20 73 74 61 72 74 29 3b  a[addr], start);
61b0: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
61c0: 61 5b 73 74 61 72 74 5d 2c 20 70 62 65 67 69 6e  a[start], pbegin
61d0: 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
61e0: 61 74 61 5b 73 74 61 72 74 2b 32 5d 2c 20 73 69  ata[start+2], si
61f0: 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  ze);.  pPage->nF
6200: 72 65 65 20 2b 3d 20 73 69 7a 65 3b 0a 0a 20 20  ree += size;..  
6210: 2f 2a 20 43 6f 61 6c 65 73 63 65 20 61 64 6a 61  /* Coalesce adja
6220: 63 65 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b 73  cent free blocks
6230: 20 2a 2f 0a 20 20 61 64 64 72 20 3d 20 70 50 61   */.  addr = pPa
6240: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b 20  ge->hdrOffset + 
6250: 31 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65  1;.  while( (pbe
6260: 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26  gin = get2byte(&
6270: 64 61 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29  data[addr]))>0 )
6280: 7b 0a 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c  {.    int pnext,
6290: 20 70 73 69 7a 65 3b 0a 20 20 20 20 61 73 73 65   psize;.    asse
62a0: 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20  rt( pbegin>addr 
62b0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
62c0: 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70 42  begin<=pPage->pB
62d0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20  t->usableSize-4 
62e0: 29 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20 67  );.    pnext = g
62f0: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  et2byte(&data[pb
6300: 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69 7a  egin]);.    psiz
6310: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
6320: 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a 20  ta[pbegin+2]);. 
6330: 20 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b 20     if( pbegin + 
6340: 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e 65  psize + 3 >= pne
6350: 78 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29 7b  xt && pnext>0 ){
6360: 0a 20 20 20 20 20 20 69 6e 74 20 66 72 61 67 20  .      int frag 
6370: 3d 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67 69  = pnext - (pbegi
6380: 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20 20  n+psize);.      
6390: 61 73 73 65 72 74 28 20 66 72 61 67 3c 3d 64 61  assert( frag<=da
63a0: 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
63b0: 73 65 74 2b 37 5d 20 29 3b 0a 20 20 20 20 20 20  set+7] );.      
63c0: 64 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f  data[pPage->hdrO
63d0: 66 66 73 65 74 2b 37 5d 20 2d 3d 20 66 72 61 67  ffset+7] -= frag
63e0: 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74 65  ;.      put2byte
63f0: 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c 20  (&data[pbegin], 
6400: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
6410: 6e 65 78 74 5d 29 29 3b 0a 20 20 20 20 20 20 70  next]));.      p
6420: 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  ut2byte(&data[pb
6430: 65 67 69 6e 2b 32 5d 2c 20 70 6e 65 78 74 2b 67  egin+2], pnext+g
6440: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 6e  et2byte(&data[pn
6450: 65 78 74 2b 32 5d 29 2d 70 62 65 67 69 6e 29 3b  ext+2])-pbegin);
6460: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
6470: 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b    addr = pbegin;
6480: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
6490: 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e   If the cell con
64a0: 74 65 6e 74 20 61 72 65 61 20 62 65 67 69 6e 73  tent area begins
64b0: 20 77 69 74 68 20 61 20 66 72 65 65 62 6c 6f 63   with a freebloc
64c0: 6b 2c 20 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f  k, remove it. */
64d0: 0a 20 20 69 66 28 20 64 61 74 61 5b 68 64 72 2b  .  if( data[hdr+
64e0: 31 5d 3d 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20  1]==data[hdr+5] 
64f0: 26 26 20 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d  && data[hdr+2]==
6500: 64 61 74 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20  data[hdr+6] ){. 
6510: 20 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20     int top;.    
6520: 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79 74  pbegin = get2byt
6530: 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b  e(&data[hdr+1]);
6540: 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
6550: 61 5b 68 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b  a[hdr+1], &data[
6560: 70 62 65 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20  pbegin], 2);.   
6570: 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65 28   top = get2byte(
6580: 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20  &data[hdr+5]);. 
6590: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
65a0: 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 20 2b 20  a[hdr+5], top + 
65b0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
65c0: 62 65 67 69 6e 2b 32 5d 29 29 3b 0a 20 20 7d 0a  begin+2]));.  }.
65d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20  }../*.** Decode 
65e0: 74 68 65 20 66 6c 61 67 73 20 62 79 74 65 20 28  the flags byte (
65f0: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
6600: 66 20 74 68 65 20 68 65 61 64 65 72 29 20 66 6f  f the header) fo
6610: 72 20 61 20 70 61 67 65 0a 2a 2a 20 61 6e 64 20  r a page.** and 
6620: 69 6e 69 74 69 61 6c 69 7a 65 20 66 69 65 6c 64  initialize field
6630: 73 20 6f 66 20 74 68 65 20 4d 65 6d 50 61 67 65  s of the MemPage
6640: 20 73 74 72 75 63 74 75 72 65 20 61 63 63 6f 72   structure accor
6650: 64 69 6e 67 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69  dingly..*/.stati
6660: 63 20 76 6f 69 64 20 64 65 63 6f 64 65 46 6c 61  c void decodeFla
6670: 67 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  gs(MemPage *pPag
6680: 65 2c 20 69 6e 74 20 66 6c 61 67 42 79 74 65 29  e, int flagByte)
6690: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
66a0: 74 3b 20 20 20 20 20 2f 2a 20 41 20 63 6f 70 79  t;     /* A copy
66b0: 20 6f 66 20 70 50 61 67 65 2d 3e 70 42 74 20 2a   of pPage->pBt *
66c0: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  /..  assert( pPa
66d0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28  ge->hdrOffset==(
66e0: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f  pPage->pgno==1 ?
66f0: 20 31 30 30 20 3a 20 30 29 20 29 3b 0a 20 20 61   100 : 0) );.  a
6700: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
6710: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
6720: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
6730: 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20    pPage->intKey 
6740: 3d 20 28 66 6c 61 67 42 79 74 65 20 26 20 28 50  = (flagByte & (P
6750: 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
6760: 41 46 44 41 54 41 29 29 21 3d 30 3b 0a 20 20 70  AFDATA))!=0;.  p
6770: 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20 3d  Page->zeroData =
6780: 20 28 66 6c 61 67 42 79 74 65 20 26 20 50 54 46   (flagByte & PTF
6790: 5f 5a 45 52 4f 44 41 54 41 29 21 3d 30 3b 0a 20  _ZERODATA)!=0;. 
67a0: 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 28   pPage->leaf = (
67b0: 66 6c 61 67 42 79 74 65 20 26 20 50 54 46 5f 4c  flagByte & PTF_L
67c0: 45 41 46 29 21 3d 30 3b 0a 20 20 70 50 61 67 65  EAF)!=0;.  pPage
67d0: 2d 3e 63 68 69 6c 64 50 74 72 53 69 7a 65 20 3d  ->childPtrSize =
67e0: 20 34 2a 28 70 50 61 67 65 2d 3e 6c 65 61 66 3d   4*(pPage->leaf=
67f0: 3d 30 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61  =0);.  pBt = pPa
6800: 67 65 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 66  ge->pBt;.  if( f
6810: 6c 61 67 42 79 74 65 20 26 20 50 54 46 5f 4c 45  lagByte & PTF_LE
6820: 41 46 44 41 54 41 20 29 7b 0a 20 20 20 20 70 50  AFDATA ){.    pP
6830: 61 67 65 2d 3e 6c 65 61 66 44 61 74 61 20 3d 20  age->leafData = 
6840: 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  1;.    pPage->ma
6850: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
6860: 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65  xLeaf;.    pPage
6870: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
6880: 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d 65 6c  ->minLeaf;.  }el
6890: 73 65 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6c  se{.    pPage->l
68a0: 65 61 66 44 61 74 61 20 3d 20 30 3b 0a 20 20 20  eafData = 0;.   
68b0: 20 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63 61 6c   pPage->maxLocal
68c0: 20 3d 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c   = pBt->maxLocal
68d0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 69 6e  ;.    pPage->min
68e0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 69 6e  Local = pBt->min
68f0: 4c 6f 63 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61  Local;.  }.  pPa
6900: 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 21 28  ge->hasData = !(
6910: 70 50 61 67 65 2d 3e 7a 65 72 6f 44 61 74 61 20  pPage->zeroData 
6920: 7c 7c 20 28 21 70 50 61 67 65 2d 3e 6c 65 61 66  || (!pPage->leaf
6930: 20 26 26 20 70 50 61 67 65 2d 3e 6c 65 61 66 44   && pPage->leafD
6940: 61 74 61 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ata));.}../*.** 
6950: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61  Initialize the a
6960: 75 78 69 6c 69 61 72 79 20 69 6e 66 6f 72 6d 61  uxiliary informa
6970: 74 69 6f 6e 20 66 6f 72 20 61 20 64 69 73 6b 20  tion for a disk 
6980: 62 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  block..**.** The
6990: 20 70 50 61 72 65 6e 74 20 70 61 72 61 6d 65 74   pParent paramet
69a0: 65 72 20 6d 75 73 74 20 62 65 20 61 20 70 6f 69  er must be a poi
69b0: 6e 74 65 72 20 74 6f 20 74 68 65 20 4d 65 6d 50  nter to the MemP
69c0: 61 67 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  age which.** is 
69d0: 74 68 65 20 70 61 72 65 6e 74 20 6f 66 20 74 68  the parent of th
69e0: 65 20 70 61 67 65 20 62 65 69 6e 67 20 69 6e 69  e page being ini
69f0: 74 69 61 6c 69 7a 65 64 2e 20 20 54 68 65 20 72  tialized.  The r
6a00: 6f 6f 74 20 6f 66 20 61 0a 2a 2a 20 42 54 72 65  oot of a.** BTre
6a10: 65 20 68 61 73 20 6e 6f 20 70 61 72 65 6e 74 20  e has no parent 
6a20: 61 6e 64 20 73 6f 20 66 6f 72 20 74 68 61 74 20  and so for that 
6a30: 70 61 67 65 2c 20 70 50 61 72 65 6e 74 3d 3d 4e  page, pParent==N
6a40: 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ULL..**.** Retur
6a50: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
6a60: 75 63 63 65 73 73 2e 20 20 49 66 20 77 65 20 73  uccess.  If we s
6a70: 65 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ee that the page
6a80: 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 63 6f 6e   does.** not con
6a90: 74 61 69 6e 20 61 20 77 65 6c 6c 2d 66 6f 72 6d  tain a well-form
6aa0: 65 64 20 64 61 74 61 62 61 73 65 20 70 61 67 65  ed database page
6ab0: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 0a 2a  , then return .*
6ac0: 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  * SQLITE_CORRUPT
6ad0: 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 61 20 72  .  Note that a r
6ae0: 65 74 75 72 6e 20 6f 66 20 53 51 4c 49 54 45 5f  eturn of SQLITE_
6af0: 4f 4b 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 67  OK does not.** g
6b00: 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 74 68  uarantee that th
6b10: 65 20 70 61 67 65 20 69 73 20 77 65 6c 6c 2d 66  e page is well-f
6b20: 6f 72 6d 65 64 2e 20 20 49 74 20 6f 6e 6c 79 20  ormed.  It only 
6b30: 73 68 6f 77 73 20 74 68 61 74 0a 2a 2a 20 77 65  shows that.** we
6b40: 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63   failed to detec
6b50: 74 20 61 6e 79 20 63 6f 72 72 75 70 74 69 6f 6e  t any corruption
6b60: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6b70: 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 0a 20  BtreeInitPage(. 
6b80: 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c   MemPage *pPage,
6b90: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
6ba0: 61 67 65 20 74 6f 20 62 65 20 69 6e 69 74 69 61  age to be initia
6bb0: 6c 69 7a 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61  lized */.  MemPa
6bc0: 67 65 20 2a 70 50 61 72 65 6e 74 20 20 20 20 20  ge *pParent     
6bd0: 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e 74 2e    /* The parent.
6be0: 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20    Might be NULL 
6bf0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 63 3b 20  */.){.  int pc; 
6c00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64             /* Ad
6c10: 64 72 65 73 73 20 6f 66 20 61 20 66 72 65 65 62  dress of a freeb
6c20: 6c 6f 63 6b 20 77 69 74 68 69 6e 20 70 50 61 67  lock within pPag
6c30: 65 2d 3e 61 44 61 74 61 5b 5d 20 2a 2f 0a 20 20  e->aData[] */.  
6c40: 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
6c50: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
6c60: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 70 61 67  beginning of pag
6c70: 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 38  e header */.  u8
6c80: 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20 20   *data;         
6c90: 20 2f 2a 20 45 71 75 61 6c 20 74 6f 20 70 50 61   /* Equal to pPa
6ca0: 67 65 2d 3e 61 44 61 74 61 20 2a 2f 0a 20 20 42  ge->aData */.  B
6cb0: 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
6cc0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e       /* The main
6cd0: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
6ce0: 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c 65   */.  int usable
6cf0: 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75  Size;    /* Amou
6d00: 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61  nt of usable spa
6d10: 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  ce on each page 
6d20: 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66  */.  int cellOff
6d30: 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66 73 65  set;    /* Offse
6d40: 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f 66 20  t from start of 
6d50: 70 61 67 65 20 74 6f 20 66 69 72 73 74 20 63 65  page to first ce
6d60: 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  ll pointer */.  
6d70: 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20  int nFree;      
6d80: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6d90: 75 6e 75 73 65 64 20 62 79 74 65 73 20 6f 6e 20  unused bytes on 
6da0: 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e  the page */.  in
6db0: 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20 20 20  t top;          
6dc0: 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20 6f   /* First byte o
6dd0: 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  f the cell conte
6de0: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 75 38 20  nt area */.  u8 
6df0: 2a 70 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  *pOff;          
6e00: 2f 2a 20 49 74 65 72 61 74 6f 72 20 75 73 65 64  /* Iterator used
6e10: 20 74 6f 20 63 68 65 63 6b 20 61 6c 6c 20 63 65   to check all ce
6e20: 6c 6c 20 6f 66 66 73 65 74 73 20 61 72 65 20 69  ll offsets are i
6e30: 6e 20 72 61 6e 67 65 20 2a 2f 0a 20 20 75 38 20  n range */.  u8 
6e40: 2a 70 45 6e 64 3b 20 20 20 20 20 20 20 20 20 20  *pEnd;          
6e50: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 65 6e  /* Pointer to en
6e60: 64 20 6f 66 20 63 65 6c 6c 20 6f 66 66 73 65 74  d of cell offset
6e70: 20 61 72 72 61 79 20 2a 2f 0a 20 20 75 38 20 6d   array */.  u8 m
6e80: 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ask;           /
6e90: 2a 20 4d 61 73 6b 20 6f 66 20 62 69 74 73 20 74  * Mask of bits t
6ea0: 68 61 74 20 6d 75 73 74 20 62 65 20 7a 65 72 6f  hat must be zero
6eb0: 20 69 6e 20 4d 53 42 20 6f 66 20 63 65 6c 6c 20   in MSB of cell 
6ec0: 6f 66 66 73 65 74 73 20 2a 2f 0a 0a 20 20 70 42  offsets */..  pB
6ed0: 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
6ee0: 20 20 61 73 73 65 72 74 28 20 70 42 74 21 3d 30    assert( pBt!=0
6ef0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
6f00: 61 72 65 6e 74 3d 3d 30 20 7c 7c 20 70 50 61 72  arent==0 || pPar
6f10: 65 6e 74 2d 3e 70 42 74 3d 3d 70 42 74 20 29 3b  ent->pBt==pBt );
6f20: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
6f30: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
6f40: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
6f50: 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67  ssert( pPage->pg
6f60: 6e 6f 3d 3d 73 71 6c 69 74 65 33 50 61 67 65 72  no==sqlite3Pager
6f70: 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61 67 65  Pagenumber(pPage
6f80: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
6f90: 61 73 73 65 72 74 28 20 70 50 61 67 65 20 3d 3d  assert( pPage ==
6fa0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
6fb0: 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44 62  Extra(pPage->pDb
6fc0: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
6fd0: 74 28 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  t( pPage->aData 
6fe0: 3d 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  == sqlite3PagerG
6ff0: 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44  etData(pPage->pD
7000: 62 50 61 67 65 29 20 29 3b 0a 20 20 69 66 28 20  bPage) );.  if( 
7010: 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 21 3d  pPage->pParent!=
7020: 70 50 61 72 65 6e 74 20 26 26 20 28 70 50 61 67  pParent && (pPag
7030: 65 2d 3e 70 50 61 72 65 6e 74 21 3d 30 20 7c 7c  e->pParent!=0 ||
7040: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 29 20   pPage->isInit) 
7050: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ){.    /* The pa
7060: 72 65 6e 74 20 70 61 67 65 20 73 68 6f 75 6c 64  rent page should
7070: 20 6e 65 76 65 72 20 63 68 61 6e 67 65 20 75 6e   never change un
7080: 6c 65 73 73 20 74 68 65 20 66 69 6c 65 20 69 73  less the file is
7090: 20 63 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20   corrupt */.    
70a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
70b0: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
70c0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49    if( pPage->isI
70d0: 6e 69 74 20 29 20 72 65 74 75 72 6e 20 53 51 4c  nit ) return SQL
70e0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
70f0: 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30 20  age->pParent==0 
7100: 26 26 20 70 50 61 72 65 6e 74 21 3d 30 20 29 7b  && pParent!=0 ){
7110: 0a 20 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72  .    pPage->pPar
7120: 65 6e 74 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20  ent = pParent;. 
7130: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
7140: 65 66 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  ef(pParent->pDbP
7150: 61 67 65 29 3b 0a 20 20 7d 0a 20 20 68 64 72 20  age);.  }.  hdr 
7160: 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  = pPage->hdrOffs
7170: 65 74 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61  et;.  data = pPa
7180: 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 64 65 63  ge->aData;.  dec
7190: 6f 64 65 46 6c 61 67 73 28 70 50 61 67 65 2c 20  odeFlags(pPage, 
71a0: 64 61 74 61 5b 68 64 72 5d 29 3b 0a 20 20 70 50  data[hdr]);.  pP
71b0: 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d  age->nOverflow =
71c0: 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 69 64 78   0;.  pPage->idx
71d0: 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 75 73 61  Shift = 0;.  usa
71e0: 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  bleSize = pBt->u
71f0: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 70 50 61  sableSize;.  pPa
7200: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d  ge->cellOffset =
7210: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 68 64   cellOffset = hd
7220: 72 20 2b 20 31 32 20 2d 20 34 2a 70 50 61 67 65  r + 12 - 4*pPage
7230: 2d 3e 6c 65 61 66 3b 0a 20 20 74 6f 70 20 3d 20  ->leaf;.  top = 
7240: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
7250: 64 72 2b 35 5d 29 3b 0a 20 20 70 50 61 67 65 2d  dr+5]);.  pPage-
7260: 3e 6e 43 65 6c 6c 20 3d 20 67 65 74 32 62 79 74  >nCell = get2byt
7270: 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b  e(&data[hdr+3]);
7280: 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43  .  if( pPage->nC
7290: 65 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29  ell>MX_CELL(pBt)
72a0: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 6f 20 6d 61   ){.    /* To ma
72b0: 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73  ny cells for a s
72c0: 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65  ingle page.  The
72d0: 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f   page must be co
72e0: 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 72 65 74  rrupt */.    ret
72f0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
7300: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  PT_BKPT;.  }.  i
7310: 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d  f( pPage->nCell=
7320: 3d 30 20 26 26 20 70 50 61 72 65 6e 74 21 3d 30  =0 && pParent!=0
7330: 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e   && pParent->pgn
7340: 6f 21 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 41  o!=1 ){.    /* A
7350: 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 20 68 61  ll pages must ha
7360: 76 65 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  ve at least one 
7370: 63 65 6c 6c 2c 20 65 78 63 65 70 74 20 66 6f 72  cell, except for
7380: 20 72 6f 6f 74 20 70 61 67 65 73 20 2a 2f 0a 20   root pages */. 
7390: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
73a0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
73b0: 20 7d 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65   }..  /* Compute
73c0: 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65 65 20   the total free 
73d0: 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70 61 67  space on the pag
73e0: 65 20 2a 2f 0a 20 20 70 63 20 3d 20 67 65 74 32  e */.  pc = get2
73f0: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 31  byte(&data[hdr+1
7400: 5d 29 3b 0a 20 20 6e 46 72 65 65 20 3d 20 64 61  ]);.  nFree = da
7410: 74 61 5b 68 64 72 2b 37 5d 20 2b 20 74 6f 70 20  ta[hdr+7] + top 
7420: 2d 20 28 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  - (cellOffset + 
7430: 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 29 3b  2*pPage->nCell);
7440: 0a 20 20 77 68 69 6c 65 28 20 70 63 3e 30 20 29  .  while( pc>0 )
7450: 7b 0a 20 20 20 20 69 6e 74 20 6e 65 78 74 2c 20  {.    int next, 
7460: 73 69 7a 65 3b 0a 20 20 20 20 69 66 28 20 70 63  size;.    if( pc
7470: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 7b  >usableSize-4 ){
7480: 0a 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62  .      /* Free b
7490: 6c 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20  lock is off the 
74a0: 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 72 65  page */.      re
74b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
74c0: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 7d  UPT_BKPT; .    }
74d0: 0a 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 32  .    next = get2
74e0: 62 79 74 65 28 26 64 61 74 61 5b 70 63 5d 29 3b  byte(&data[pc]);
74f0: 0a 20 20 20 20 73 69 7a 65 20 3d 20 67 65 74 32  .    size = get2
7500: 62 79 74 65 28 26 64 61 74 61 5b 70 63 2b 32 5d  byte(&data[pc+2]
7510: 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 3e  );.    if( next>
7520: 30 20 26 26 20 6e 65 78 74 3c 3d 70 63 2b 73 69  0 && next<=pc+si
7530: 7a 65 2b 33 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ze+3 ){.      /*
7540: 20 46 72 65 65 20 62 6c 6f 63 6b 73 20 6d 75 73   Free blocks mus
7550: 74 20 62 65 20 69 6e 20 61 63 63 65 6e 64 69 6e  t be in accendin
7560: 67 20 6f 72 64 65 72 20 2a 2f 0a 20 20 20 20 20  g order */.     
7570: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
7580: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20  ORRUPT_BKPT; .  
7590: 20 20 7d 0a 20 20 20 20 6e 46 72 65 65 20 2b 3d    }.    nFree +=
75a0: 20 73 69 7a 65 3b 0a 20 20 20 20 70 63 20 3d 20   size;.    pc = 
75b0: 6e 65 78 74 3b 0a 20 20 7d 0a 20 20 70 50 61 67  next;.  }.  pPag
75c0: 65 2d 3e 6e 46 72 65 65 20 3d 20 6e 46 72 65 65  e->nFree = nFree
75d0: 3b 0a 20 20 69 66 28 20 6e 46 72 65 65 3e 3d 75  ;.  if( nFree>=u
75e0: 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  sableSize ){.   
75f0: 20 2f 2a 20 46 72 65 65 20 73 70 61 63 65 20 63   /* Free space c
7600: 61 6e 6e 6f 74 20 65 78 63 65 65 64 20 74 6f 74  annot exceed tot
7610: 61 6c 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  al page size */.
7620: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7630: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20  E_CORRUPT_BKPT; 
7640: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
7650: 20 74 68 61 74 20 61 6c 6c 20 74 68 65 20 6f 66   that all the of
7660: 66 73 65 74 73 20 69 6e 20 74 68 65 20 63 65 6c  fsets in the cel
7670: 6c 20 6f 66 66 73 65 74 20 61 72 72 61 79 20 61  l offset array a
7680: 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e  re within range.
7690: 20 2a 2f 0a 20 20 6d 61 73 6b 20 3d 20 7e 28 28   */.  mask = ~((
76a0: 28 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69  (u8)(pBt->pageSi
76b0: 7a 65 3e 3e 38 29 29 2d 31 29 3b 0a 20 20 70 45  ze>>8))-1);.  pE
76c0: 6e 64 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  nd = &data[cellO
76d0: 66 66 73 65 74 20 2b 20 70 50 61 67 65 2d 3e 6e  ffset + pPage->n
76e0: 43 65 6c 6c 2a 32 5d 3b 0a 20 20 66 6f 72 28 70  Cell*2];.  for(p
76f0: 4f 66 66 3d 26 64 61 74 61 5b 63 65 6c 6c 4f 66  Off=&data[cellOf
7700: 66 73 65 74 5d 3b 20 70 4f 66 66 21 3d 70 45 6e  fset]; pOff!=pEn
7710: 64 20 26 26 20 21 28 28 2a 70 4f 66 66 29 26 6d  d && !((*pOff)&m
7720: 61 73 6b 29 3b 20 70 4f 66 66 2b 3d 32 29 3b 0a  ask); pOff+=2);.
7730: 20 20 69 66 28 20 70 4f 66 66 21 3d 70 45 6e 64    if( pOff!=pEnd
7740: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
7750: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
7760: 50 54 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65  PT;.  }..  pPage
7770: 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20  ->isInit = 1;.  
7780: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
7790: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75  ;.}../*.** Set u
77a0: 70 20 61 20 72 61 77 20 70 61 67 65 20 73 6f 20  p a raw page so 
77b0: 74 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69  that it looks li
77c0: 6b 65 20 61 20 64 61 74 61 62 61 73 65 20 70 61  ke a database pa
77d0: 67 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f  ge holding.** no
77e0: 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61   entries..*/.sta
77f0: 74 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67  tic void zeroPag
7800: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
7810: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
7820: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64  unsigned char *d
7830: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
7840: 74 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ta;.  BtShared *
7850: 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
7860: 3b 0a 20 20 69 6e 74 20 68 64 72 20 3d 20 70 50  ;.  int hdr = pP
7870: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
7880: 20 20 69 6e 74 20 66 69 72 73 74 3b 0a 0a 20 20    int first;..  
7890: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
78a0: 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70  agerPagenumber(p
78b0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d  Page->pDbPage)==
78c0: 70 50 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20  pPage->pgno );. 
78d0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
78e0: 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70 50  PagerGetExtra(pP
78f0: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d  age->pDbPage) ==
7900: 20 28 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b   (void*)pPage );
7910: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
7920: 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70  e3PagerGetData(p
7930: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d  Page->pDbPage) =
7940: 3d 20 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65  = data );.  asse
7950: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
7960: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
7970: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
7980: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
7990: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
79a0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 6d 65 6d  >mutex) );.  mem
79b0: 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20  set(&data[hdr], 
79c0: 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  0, pBt->usableSi
79d0: 7a 65 20 2d 20 68 64 72 29 3b 0a 20 20 64 61 74  ze - hdr);.  dat
79e0: 61 5b 68 64 72 5d 20 3d 20 66 6c 61 67 73 3b 0a  a[hdr] = flags;.
79f0: 20 20 66 69 72 73 74 20 3d 20 68 64 72 20 2b 20    first = hdr + 
7a00: 38 20 2b 20 34 2a 28 28 66 6c 61 67 73 26 50 54  8 + 4*((flags&PT
7a10: 46 5f 4c 45 41 46 29 3d 3d 30 29 3b 0a 20 20 6d  F_LEAF)==0);.  m
7a20: 65 6d 73 65 74 28 26 64 61 74 61 5b 68 64 72 2b  emset(&data[hdr+
7a30: 31 5d 2c 20 30 2c 20 34 29 3b 0a 20 20 64 61 74  1], 0, 4);.  dat
7a40: 61 5b 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20  a[hdr+7] = 0;.  
7a50: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
7a60: 64 72 2b 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62  dr+5], pBt->usab
7a70: 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  leSize);.  pPage
7a80: 2d 3e 6e 46 72 65 65 20 3d 20 70 42 74 2d 3e 75  ->nFree = pBt->u
7a90: 73 61 62 6c 65 53 69 7a 65 20 2d 20 66 69 72 73  sableSize - firs
7aa0: 74 3b 0a 20 20 64 65 63 6f 64 65 46 6c 61 67 73  t;.  decodeFlags
7ab0: 28 70 50 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a  (pPage, flags);.
7ac0: 20 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73    pPage->hdrOffs
7ad0: 65 74 20 3d 20 68 64 72 3b 0a 20 20 70 50 61 67  et = hdr;.  pPag
7ae0: 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20  e->cellOffset = 
7af0: 66 69 72 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e  first;.  pPage->
7b00: 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
7b10: 20 70 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74   pPage->idxShift
7b20: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 2d 3e 6e   = 0;.  pPage->n
7b30: 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  Cell = 0;.  pPag
7b40: 65 2d 3e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 7d  e->isInit = 1;.}
7b50: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
7b60: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
7b70: 72 2e 20 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  r.  Initialize t
7b80: 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20 61  he MemPage.pBt a
7b90: 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61 44  nd.** MemPage.aD
7ba0: 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66 20  ata elements if 
7bb0: 6e 65 65 64 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  needed..**.** If
7bc0: 20 74 68 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66   the noContent f
7bd0: 6c 61 67 20 69 73 20 73 65 74 2c 20 69 74 20 6d  lag is set, it m
7be0: 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20  eans that we do 
7bf0: 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 0a 2a  not care about.*
7c00: 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  * the content of
7c10: 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69   the page at thi
7c20: 73 20 74 69 6d 65 2e 20 20 53 6f 20 64 6f 20 6e  s time.  So do n
7c30: 6f 74 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73  ot go to the dis
7c40: 6b 0a 2a 2a 20 74 6f 20 66 65 74 63 68 20 74 68  k.** to fetch th
7c50: 65 20 63 6f 6e 74 65 6e 74 2e 20 20 4a 75 73 74  e content.  Just
7c60: 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 63 6f 6e   fill in the con
7c70: 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 20  tent with zeros 
7c80: 66 6f 72 20 6e 6f 77 2e 0a 2a 2a 20 49 66 20 69  for now..** If i
7c90: 6e 20 74 68 65 20 66 75 74 75 72 65 20 77 65 20  n the future we 
7ca0: 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65  call sqlite3Page
7cb0: 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 69 73  rWrite() on this
7cc0: 20 70 61 67 65 2c 20 74 68 61 74 0a 2a 2a 20 6d   page, that.** m
7cd0: 65 61 6e 73 20 77 65 20 68 61 76 65 20 73 74 61  eans we have sta
7ce0: 72 74 65 64 20 74 6f 20 62 65 20 63 6f 6e 63 65  rted to be conce
7cf0: 72 6e 65 64 20 61 62 6f 75 74 20 63 6f 6e 74 65  rned about conte
7d00: 6e 74 20 61 6e 64 20 74 68 65 20 64 69 73 6b 0a  nt and the disk.
7d10: 2a 2a 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f  ** read should o
7d20: 63 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69  ccur at that poi
7d30: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
7d40: 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 0a  e3BtreeGetPage(.
7d50: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
7d60: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74         /* The bt
7d70: 72 65 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ree */.  Pgno pg
7d80: 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no,           /*
7d90: 20 4e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70   Number of the p
7da0: 61 67 65 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  age to fetch */.
7db0: 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61    MemPage **ppPa
7dc0: 67 65 2c 20 20 20 20 2f 2a 20 52 65 74 75 72 6e  ge,    /* Return
7dd0: 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
7de0: 73 20 70 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20  s parameter */. 
7df0: 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20   int noContent  
7e00: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
7e10: 6c 6f 61 64 20 70 61 67 65 20 63 6f 6e 74 65 6e  load page conten
7e20: 74 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a  t if true */.){.
7e30: 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
7e40: 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 44 62  age *pPage;.  Db
7e50: 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 0a  Page *pDbPage;..
7e60: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
7e70: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
7e80: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63  ->mutex) );.  rc
7e90: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 41   = sqlite3PagerA
7ea0: 63 71 75 69 72 65 28 70 42 74 2d 3e 70 50 61 67  cquire(pBt->pPag
7eb0: 65 72 2c 20 70 67 6e 6f 2c 20 28 44 62 50 61 67  er, pgno, (DbPag
7ec0: 65 2a 2a 29 26 70 44 62 50 61 67 65 2c 20 6e 6f  e**)&pDbPage, no
7ed0: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 69 66 28 20  Content);.  if( 
7ee0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
7ef0: 20 20 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61    pPage = (MemPa
7f00: 67 65 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ge *)sqlite3Page
7f10: 72 47 65 74 45 78 74 72 61 28 70 44 62 50 61 67  rGetExtra(pDbPag
7f20: 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 61 44 61  e);.  pPage->aDa
7f30: 74 61 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ta = sqlite3Page
7f40: 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
7f50: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 70 44 62 50  );.  pPage->pDbP
7f60: 61 67 65 20 3d 20 70 44 62 50 61 67 65 3b 0a 20  age = pDbPage;. 
7f70: 20 70 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42   pPage->pBt = pB
7f80: 74 3b 0a 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f  t;.  pPage->pgno
7f90: 20 3d 20 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65   = pgno;.  pPage
7fa0: 2d 3e 68 64 72 4f 66 66 73 65 74 20 3d 20 70 50  ->hdrOffset = pP
7fb0: 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31  age->pgno==1 ? 1
7fc0: 30 30 20 3a 20 30 3b 0a 20 20 2a 70 70 50 61 67  00 : 0;.  *ppPag
7fd0: 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 72 65 74  e = pPage;.  ret
7fe0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
7ff0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 70 61  ../*.** Get a pa
8000: 67 65 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ge from the page
8010: 72 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  r and initialize
8020: 20 69 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69   it.  This routi
8030: 6e 65 0a 2a 2a 20 69 73 20 6a 75 73 74 20 61 20  ne.** is just a 
8040: 63 6f 6e 76 65 6e 69 65 6e 63 65 20 77 72 61 70  convenience wrap
8050: 70 65 72 20 61 72 6f 75 6e 64 20 73 65 70 61 72  per around separ
8060: 61 74 65 20 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20  ate calls to.** 
8070: 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
8080: 61 67 65 28 29 20 61 6e 64 20 73 71 6c 69 74 65  age() and sqlite
8090: 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 29  3BtreeInitPage()
80a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
80b0: 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 0a  getAndInitPage(.
80c0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
80d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
80e0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
80f0: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
8100: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
8110: 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 74  er of the page t
8120: 6f 20 67 65 74 20 2a 2f 0a 20 20 4d 65 6d 50 61  o get */.  MemPa
8130: 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20  ge **ppPage,    
8140: 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67  /* Write the pag
8150: 65 20 70 6f 69 6e 74 65 72 20 68 65 72 65 20 2a  e pointer here *
8160: 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  /.  MemPage *pPa
8170: 72 65 6e 74 20 20 20 20 20 2f 2a 20 50 61 72 65  rent     /* Pare
8180: 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a  nt of the page *
8190: 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  /.){.  int rc;. 
81a0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
81b0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
81c0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
81d0: 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20   pgno==0 ){.    
81e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
81f0: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 7d  RRUPT_BKPT; .  }
8200: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42  .  rc = sqlite3B
8210: 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
8220: 20 70 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20 30   pgno, ppPage, 0
8230: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
8240: 49 54 45 5f 4f 4b 20 26 26 20 28 2a 70 70 50 61  ITE_OK && (*ppPa
8250: 67 65 29 2d 3e 69 73 49 6e 69 74 3d 3d 30 20 29  ge)->isInit==0 )
8260: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
8270: 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
8280: 2a 70 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74  *ppPage, pParent
8290: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
82a0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
82b0: 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70    releasePage(*p
82c0: 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 2a 70  pPage);.      *p
82d0: 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 20 20 7d  pPage = 0;.    }
82e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
82f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
8300: 73 65 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54  se a MemPage.  T
8310: 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61  his should be ca
8320: 6c 6c 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61  lled once for ea
8330: 63 68 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c  ch prior.** call
8340: 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
8350: 47 65 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  GetPage..*/.stat
8360: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
8370: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
8380: 67 65 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  ge){.  if( pPage
8390: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
83a0: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a  pPage->aData );.
83b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
83c0: 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73  e->pBt );.    as
83d0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
83e0: 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67 65  erGetExtra(pPage
83f0: 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76  ->pDbPage) == (v
8400: 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20  oid*)pPage );.  
8410: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8420: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50  3PagerGetData(pP
8430: 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70  age->pDbPage)==p
8440: 50 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20  Page->aData );. 
8450: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
8460: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
8470: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
8480: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
8490: 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 2d  agerUnref(pPage-
84a0: 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d  >pDbPage);.  }.}
84b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
84c0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
84d0: 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63  hen the referenc
84e0: 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61  e count for a pa
84f0: 67 65 0a 2a 2a 20 72 65 61 63 68 65 73 20 7a 65  ge.** reaches ze
8500: 72 6f 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20  ro.  We need to 
8510: 75 6e 72 65 66 20 74 68 65 20 70 50 61 72 65 6e  unref the pParen
8520: 74 20 70 6f 69 6e 74 65 72 20 77 68 65 6e 20 74  t pointer when t
8530: 68 61 74 0a 2a 2a 20 68 61 70 70 65 6e 73 2e 0a  hat.** happens..
8540: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
8550: 61 67 65 44 65 73 74 72 75 63 74 6f 72 28 44 62  ageDestructor(Db
8560: 50 61 67 65 20 2a 70 44 61 74 61 2c 20 69 6e 74  Page *pData, int
8570: 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 4d 65   pageSize){.  Me
8580: 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
8590: 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
85a0: 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 70  e & 7)==0 );.  p
85b0: 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20  Page = (MemPage 
85c0: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
85d0: 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20  tExtra(pData);. 
85e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
85f0: 69 73 49 6e 69 74 3d 3d 30 20 7c 7c 20 73 71 6c  isInit==0 || sql
8600: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
8610: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
8620: 78 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  x) );.  if( pPag
8630: 65 2d 3e 70 50 61 72 65 6e 74 20 29 7b 0a 20 20  e->pParent ){.  
8640: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65    MemPage *pPare
8650: 6e 74 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72  nt = pPage->pPar
8660: 65 6e 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ent;.    assert(
8670: 20 70 50 61 72 65 6e 74 2d 3e 70 42 74 3d 3d 70   pParent->pBt==p
8680: 50 61 67 65 2d 3e 70 42 74 20 29 3b 0a 20 20 20  Page->pBt );.   
8690: 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 20   pPage->pParent 
86a0: 3d 20 30 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  = 0;.    release
86b0: 50 61 67 65 28 70 50 61 72 65 6e 74 29 3b 0a 20  Page(pParent);. 
86c0: 20 7d 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e   }.  pPage->isIn
86d0: 69 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  it = 0;.}../*.**
86e0: 20 44 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   During a rollba
86f0: 63 6b 2c 20 77 68 65 6e 20 74 68 65 20 70 61 67  ck, when the pag
8700: 65 72 20 72 65 6c 6f 61 64 73 20 69 6e 66 6f 72  er reloads infor
8710: 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74 68 65 20  mation into the 
8720: 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74 68 61 74  cache.** so that
8730: 20 74 68 65 20 63 61 63 68 65 20 69 73 20 72 65   the cache is re
8740: 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72  stored to its or
8750: 69 67 69 6e 61 6c 20 73 74 61 74 65 20 61 74 20  iginal state at 
8760: 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20  the start of.** 
8770: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
8780: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 72   for each page r
8790: 65 73 74 6f 72 65 64 20 74 68 69 73 20 72 6f 75  estored this rou
87a0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a  tine is called..
87b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
87c0: 6e 65 20 6e 65 65 64 73 20 74 6f 20 72 65 73 65  ne needs to rese
87d0: 74 20 74 68 65 20 65 78 74 72 61 20 64 61 74 61  t the extra data
87e0: 20 73 65 63 74 69 6f 6e 20 61 74 20 74 68 65 20   section at the 
87f0: 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 70 61  end of the.** pa
8800: 67 65 20 74 6f 20 61 67 72 65 65 20 77 69 74 68  ge to agree with
8810: 20 74 68 65 20 72 65 73 74 6f 72 65 64 20 64 61   the restored da
8820: 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ta..*/.static vo
8830: 69 64 20 70 61 67 65 52 65 69 6e 69 74 28 44 62  id pageReinit(Db
8840: 50 61 67 65 20 2a 70 44 61 74 61 2c 20 69 6e 74  Page *pData, int
8850: 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 4d 65   pageSize){.  Me
8860: 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
8870: 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
8880: 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 70  e & 7)==0 );.  p
8890: 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65 20  Page = (MemPage 
88a0: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
88b0: 74 45 78 74 72 61 28 70 44 61 74 61 29 3b 0a 20  tExtra(pData);. 
88c0: 20 69 66 28 20 70 50 61 67 65 2d 3e 69 73 49 6e   if( pPage->isIn
88d0: 69 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  it ){.    assert
88e0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
88f0: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
8900: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 20 20 70  >mutex) );.    p
8910: 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
8920: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
8930: 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
8940: 2c 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74  , pPage->pParent
8950: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
8960: 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20  Invoke the busy 
8970: 68 61 6e 64 6c 65 72 20 66 6f 72 20 61 20 62 74  handler for a bt
8980: 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ree..*/.static i
8990: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
89a0: 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72  nvokeBusyHandler
89b0: 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74  (void *pArg, int
89c0: 20 6e 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20   n){.  BtShared 
89d0: 2a 70 42 74 20 3d 20 28 42 74 53 68 61 72 65 64  *pBt = (BtShared
89e0: 2a 29 70 41 72 67 3b 0a 20 20 61 73 73 65 72 74  *)pArg;.  assert
89f0: 28 20 70 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61  ( pBt->db );.  a
8a00: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
8a10: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64  utex_held(pBt->d
8a20: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
8a30: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 49 6e 76  eturn sqlite3Inv
8a40: 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 26  okeBusyHandler(&
8a50: 70 42 74 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e  pBt->db->busyHan
8a60: 64 6c 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  dler);.}../*.** 
8a70: 4f 70 65 6e 20 61 20 64 61 74 61 62 61 73 65 20  Open a database 
8a80: 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69  file..** .** zFi
8a90: 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6e 61  lename is the na
8aa0: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
8ab0: 73 65 20 66 69 6c 65 2e 20 20 49 66 20 7a 46 69  se file.  If zFi
8ac0: 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a  lename is NULL.*
8ad0: 2a 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  * a new database
8ae0: 20 77 69 74 68 20 61 20 72 61 6e 64 6f 6d 20 6e   with a random n
8af0: 61 6d 65 20 69 73 20 63 72 65 61 74 65 64 2e 20  ame is created. 
8b00: 20 54 68 69 73 20 72 61 6e 64 6f 6d 6c 79 20 6e   This randomly n
8b10: 61 6d 65 64 0a 2a 2a 20 64 61 74 61 62 61 73 65  amed.** database
8b20: 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65   file will be de
8b30: 6c 65 74 65 64 20 77 68 65 6e 20 73 71 6c 69 74  leted when sqlit
8b40: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 29 20 69  e3BtreeClose() i
8b50: 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 49 66 20  s called..** If 
8b60: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d  zFilename is ":m
8b70: 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6e 20  emory:" then an 
8b80: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
8b90: 73 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  se is created.**
8ba0: 20 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61 74   that is automat
8bb0: 69 63 61 6c 6c 79 20 64 65 73 74 72 6f 79 65 64  ically destroyed
8bc0: 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73   when it is clos
8bd0: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
8be0: 65 33 42 74 72 65 65 4f 70 65 6e 28 0a 20 20 63  e3BtreeOpen(.  c
8bf0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
8c00: 6e 61 6d 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  name,  /* Name o
8c10: 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74 61  f the file conta
8c20: 69 6e 69 6e 67 20 74 68 65 20 42 54 72 65 65 20  ining the BTree 
8c30: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 71  database */.  sq
8c40: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
8c50: 20 20 20 20 20 20 2f 2a 20 41 73 73 6f 63 69 61        /* Associa
8c60: 74 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e  ted database han
8c70: 64 6c 65 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a  dle */.  Btree *
8c80: 2a 70 70 42 74 72 65 65 2c 20 20 20 20 20 20 20  *ppBtree,       
8c90: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e   /* Pointer to n
8ca0: 65 77 20 42 74 72 65 65 20 6f 62 6a 65 63 74 20  ew Btree object 
8cb0: 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a  written here */.
8cc0: 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
8cd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 74            /* Opt
8ce0: 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66  ions */.  int vf
8cf0: 73 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20  sFlags          
8d00: 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
8d10: 64 20 74 68 72 6f 75 67 68 20 74 6f 20 73 71 6c  d through to sql
8d20: 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29  ite3_vfs.xOpen()
8d30: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
8d40: 5f 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20  _vfs *pVfs;     
8d50: 20 2f 2a 20 54 68 65 20 56 46 53 20 74 6f 20 75   /* The VFS to u
8d60: 73 65 20 66 6f 72 20 74 68 69 73 20 62 74 72 65  se for this btre
8d70: 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  e */.  BtShared 
8d80: 2a 70 42 74 20 3d 20 30 3b 20 20 20 20 20 20 2f  *pBt = 0;      /
8d90: 2a 20 53 68 61 72 65 64 20 70 61 72 74 20 6f 66  * Shared part of
8da0: 20 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65   btree structure
8db0: 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 70 3b 20   */.  Btree *p; 
8dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8dd0: 20 48 61 6e 64 6c 65 20 74 6f 20 72 65 74 75 72   Handle to retur
8de0: 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  n */.  int rc = 
8df0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
8e00: 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 75 6e 73   nReserve;.  uns
8e10: 69 67 6e 65 64 20 63 68 61 72 20 7a 44 62 48 65  igned char zDbHe
8e20: 61 64 65 72 5b 31 30 30 5d 3b 0a 0a 20 20 2f 2a  ader[100];..  /*
8e30: 20 53 65 74 20 74 68 65 20 76 61 72 69 61 62 6c   Set the variabl
8e40: 65 20 69 73 4d 65 6d 64 62 20 74 6f 20 74 72 75  e isMemdb to tru
8e50: 65 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  e for an in-memo
8e60: 72 79 20 64 61 74 61 62 61 73 65 2c 20 6f 72 20  ry database, or 
8e70: 0a 20 20 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20  .  ** false for 
8e80: 61 20 66 69 6c 65 2d 62 61 73 65 64 20 64 61 74  a file-based dat
8e90: 61 62 61 73 65 2e 20 54 68 69 73 20 73 79 6d 62  abase. This symb
8ea0: 6f 6c 20 69 73 20 6f 6e 6c 79 20 72 65 71 75 69  ol is only requi
8eb0: 72 65 64 20 69 66 0a 20 20 2a 2a 20 65 69 74 68  red if.  ** eith
8ec0: 65 72 20 6f 66 20 74 68 65 20 73 68 61 72 65 64  er of the shared
8ed0: 2d 64 61 74 61 20 6f 72 20 61 75 74 6f 76 61 63  -data or autovac
8ee0: 75 75 6d 20 66 65 61 74 75 72 65 73 20 61 72 65  uum features are
8ef0: 20 63 6f 6d 70 69 6c 65 64 20 0a 20 20 2a 2a 20   compiled .  ** 
8f00: 69 6e 74 6f 20 74 68 65 20 6c 69 62 72 61 72 79  into the library
8f10: 2e 0a 20 20 2a 2f 0a 23 69 66 20 21 64 65 66 69  ..  */.#if !defi
8f20: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
8f30: 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 7c 7c  SHARED_CACHE) ||
8f40: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
8f50: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
8f60: 29 0a 20 20 23 69 66 64 65 66 20 53 51 4c 49 54  ).  #ifdef SQLIT
8f70: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a  E_OMIT_MEMORYDB.
8f80: 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73      const int is
8f90: 4d 65 6d 64 62 20 3d 20 30 3b 0a 20 20 23 65 6c  Memdb = 0;.  #el
8fa0: 73 65 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  se.    const int
8fb0: 20 69 73 4d 65 6d 64 62 20 3d 20 7a 46 69 6c 65   isMemdb = zFile
8fc0: 6e 61 6d 65 20 26 26 20 21 73 74 72 63 6d 70 28  name && !strcmp(
8fd0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d  zFilename, ":mem
8fe0: 6f 72 79 3a 22 29 3b 0a 20 20 23 65 6e 64 69 66  ory:");.  #endif
8ff0: 0a 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72  .#endif..  asser
9000: 74 28 20 64 62 21 3d 30 20 29 3b 0a 20 20 61 73  t( db!=0 );.  as
9010: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
9020: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
9030: 65 78 29 20 29 3b 0a 0a 20 20 70 56 66 73 20 3d  ex) );..  pVfs =
9040: 20 64 62 2d 3e 70 56 66 73 3b 0a 20 20 70 20 3d   db->pVfs;.  p =
9050: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
9060: 72 6f 28 73 69 7a 65 6f 66 28 42 74 72 65 65 29  ro(sizeof(Btree)
9070: 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20  );.  if( !p ){. 
9080: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
9090: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d  _NOMEM;.  }.  p-
90a0: 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53  >inTrans = TRANS
90b0: 5f 4e 4f 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d  _NONE;.  p->db =
90c0: 20 64 62 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e   db;..#if !defin
90d0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
90e0: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
90f0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
9100: 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f  OMIT_DISKIO).  /
9110: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 69 73 20 42  *.  ** If this B
9120: 74 72 65 65 20 69 73 20 61 20 63 61 6e 64 69 64  tree is a candid
9130: 61 74 65 20 66 6f 72 20 73 68 61 72 65 64 20 63  ate for shared c
9140: 61 63 68 65 2c 20 74 72 79 20 74 6f 20 66 69 6e  ache, try to fin
9150: 64 20 61 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69  d an.  ** existi
9160: 6e 67 20 42 74 53 68 61 72 65 64 20 6f 62 6a 65  ng BtShared obje
9170: 63 74 20 74 68 61 74 20 77 65 20 63 61 6e 20 73  ct that we can s
9180: 68 61 72 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20  hare with.  */. 
9190: 20 69 66 28 20 28 66 6c 61 67 73 20 26 20 42 54   if( (flags & BT
91a0: 52 45 45 5f 50 52 49 56 41 54 45 29 3d 3d 30 0a  REE_PRIVATE)==0.
91b0: 20 20 20 26 26 20 69 73 4d 65 6d 64 62 3d 3d 30     && isMemdb==0
91c0: 0a 20 20 20 26 26 20 28 64 62 2d 3e 66 6c 61 67  .   && (db->flag
91d0: 73 20 26 20 53 51 4c 49 54 45 5f 56 74 61 62 29  s & SQLITE_Vtab)
91e0: 3d 3d 30 0a 20 20 20 26 26 20 7a 46 69 6c 65 6e  ==0.   && zFilen
91f0: 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
9200: 5b 30 5d 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  [0].  ){.    if(
9210: 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61   sqlite3SharedCa
9220: 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20  cheEnabled ){.  
9230: 20 20 20 20 69 6e 74 20 6e 46 75 6c 6c 50 61 74      int nFullPat
9240: 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
9250: 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
9260: 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74    char *zFullPat
9270: 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4d  hname = sqlite3M
9280: 61 6c 6c 6f 63 28 6e 46 75 6c 6c 50 61 74 68 6e  alloc(nFullPathn
9290: 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ame);.      sqli
92a0: 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
92b0: 53 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70 2d  Shared;.      p-
92c0: 3e 73 68 61 72 61 62 6c 65 20 3d 20 31 3b 0a 20  >sharable = 1;. 
92d0: 20 20 20 20 20 69 66 28 20 64 62 20 29 7b 0a 20       if( db ){. 
92e0: 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73         db->flags
92f0: 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 61 72 65   |= SQLITE_Share
9300: 64 43 61 63 68 65 3b 0a 20 20 20 20 20 20 7d 0a  dCache;.      }.
9310: 20 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c        if( !zFull
9320: 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
9330: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
9340: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  (p);.        ret
9350: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
9360: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
9370: 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74  sqlite3OsFullPat
9380: 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c  hname(pVfs, zFil
9390: 65 6e 61 6d 65 2c 20 6e 46 75 6c 6c 50 61 74 68  ename, nFullPath
93a0: 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  name, zFullPathn
93b0: 61 6d 65 29 3b 0a 20 20 20 20 20 20 6d 75 74 65  ame);.      mute
93c0: 78 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65  xShared = sqlite
93d0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
93e0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
93f0: 4d 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73  MASTER);.      s
9400: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
9410: 65 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b  er(mutexShared);
9420: 0a 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d 73  .      for(pBt=s
9430: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
9440: 65 4c 69 73 74 3b 20 70 42 74 3b 20 70 42 74 3d  eList; pBt; pBt=
9450: 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  pBt->pNext){.   
9460: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
9470: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
9480: 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
9490: 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  p(zFullPathname,
94a0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
94b0: 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65  ename(pBt->pPage
94c0: 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  r)).            
94d0: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
94e0: 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61  agerVfs(pBt->pPa
94f0: 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20  ger)==pVfs ){.  
9500: 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d          p->pBt =
9510: 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20   pBt;.          
9520: 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  pBt->nRef++;.   
9530: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9540: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
9550: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
9560: 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
9570: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71  hared);.      sq
9580: 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
9590: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  Pathname);.    }
95a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
95b0: 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20  EBUG.    else{. 
95c0: 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67       /* In debug
95d0: 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61   mode, we mark a
95e0: 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64 61  ll persistent da
95f0: 74 61 62 61 73 65 73 20 61 73 20 73 68 61 72 61  tabases as shara
9600: 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65  ble.      ** eve
9610: 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20  n when they are 
9620: 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72 63  not.  This exerc
9630: 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ises the locking
9640: 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20   code and.      
9650: 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70  ** gives more op
9660: 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73  portunity for as
9670: 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75  serts(sqlite3_mu
9680: 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20  tex_held()).    
9690: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20    ** statements 
96a0: 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20  to find locking 
96b0: 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20  problems..      
96c0: 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  */.      p->shar
96d0: 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  able = 1;.    }.
96e0: 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69  #endif.  }.#endi
96f0: 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29  f.  if( pBt==0 )
9700: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
9710: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
9720: 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20  serts make sure 
9730: 74 68 61 74 20 73 74 72 75 63 74 75 72 65 73 20  that structures 
9740: 75 73 65 64 20 62 79 20 74 68 65 20 62 74 72 65  used by the btre
9750: 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65  e are.    ** the
9760: 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68   right size.  Th
9770: 69 73 20 69 73 20 74 6f 20 67 75 61 72 64 20 61  is is to guard a
9780: 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e  gainst size chan
9790: 67 65 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a  ges that result.
97a0: 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70      ** when comp
97b0: 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65  iling on a diffe
97c0: 72 65 6e 74 20 61 72 63 68 69 74 65 63 74 75 72  rent architectur
97d0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
97e0: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34  sert( sizeof(i64
97f0: 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 69  )==8 || sizeof(i
9800: 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73  64)==4 );.    as
9810: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34  sert( sizeof(u64
9820: 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 75  )==8 || sizeof(u
9830: 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73  64)==4 );.    as
9840: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32  sert( sizeof(u32
9850: 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65  )==4 );.    asse
9860: 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d  rt( sizeof(u16)=
9870: 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =2 );.    assert
9880: 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d  ( sizeof(Pgno)==
9890: 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20  4 );.  .    pBt 
98a0: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
98b0: 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74  ero( sizeof(*pBt
98c0: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  ) );.    if( pBt
98d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
98e0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
98f0: 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
9900: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
9910: 0a 20 20 20 20 70 42 74 2d 3e 62 75 73 79 48 64  .    pBt->busyHd
9920: 72 2e 78 46 75 6e 63 20 3d 20 73 71 6c 69 74 65  r.xFunc = sqlite
9930: 33 42 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79  3BtreeInvokeBusy
9940: 48 61 6e 64 6c 65 72 3b 0a 20 20 20 20 70 42 74  Handler;.    pBt
9950: 2d 3e 62 75 73 79 48 64 72 2e 70 41 72 67 20 3d  ->busyHdr.pArg =
9960: 20 70 42 74 3b 0a 20 20 20 20 72 63 20 3d 20 73   pBt;.    rc = s
9970: 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28  qlite3PagerOpen(
9980: 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61 67  pVfs, &pBt->pPag
9990: 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a 20  er, zFilename,. 
99a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99b0: 20 20 20 20 20 20 20 20 20 45 58 54 52 41 5f 53           EXTRA_S
99c0: 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66 73 46  IZE, flags, vfsF
99d0: 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 72  lags);.    if( r
99e0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
99f0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
9a00: 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68  e3PagerReadFileh
9a10: 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67 65  eader(pBt->pPage
9a20: 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61 64  r,sizeof(zDbHead
9a30: 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b 0a  er),zDbHeader);.
9a40: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
9a50: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
9a60: 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f       goto btree_
9a70: 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  open_out;.    }.
9a80: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
9a90: 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 70  SetBusyhandler(p
9aa0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74  Bt->pPager, &pBt
9ab0: 2d 3e 62 75 73 79 48 64 72 29 3b 0a 20 20 20 20  ->busyHdr);.    
9ac0: 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  p->pBt = pBt;.  
9ad0: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
9ae0: 72 53 65 74 44 65 73 74 72 75 63 74 6f 72 28 70  rSetDestructor(p
9af0: 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65  Bt->pPager, page
9b00: 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20  Destructor);.   
9b10: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
9b20: 52 65 69 6e 69 74 65 72 28 70 42 74 2d 3e 70 50  Reiniter(pBt->pP
9b30: 61 67 65 72 2c 20 70 61 67 65 52 65 69 6e 69 74  ager, pageReinit
9b40: 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 43 75 72  );.    pBt->pCur
9b50: 73 6f 72 20 3d 20 30 3b 0a 20 20 20 20 70 42 74  sor = 0;.    pBt
9b60: 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
9b70: 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20    pBt->readOnly 
9b80: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  = sqlite3PagerIs
9b90: 72 65 61 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50  readonly(pBt->pP
9ba0: 61 67 65 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e  ager);.    pBt->
9bb0: 70 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62  pageSize = get2b
9bc0: 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 31  yte(&zDbHeader[1
9bd0: 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  6]);.    if( pBt
9be0: 2d 3e 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c  ->pageSize<512 |
9bf0: 7c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e  | pBt->pageSize>
9c00: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
9c10: 53 49 5a 45 0a 20 20 20 20 20 20 20 20 20 7c 7c  SIZE.         ||
9c20: 20 28 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   ((pBt->pageSize
9c30: 2d 31 29 26 70 42 74 2d 3e 70 61 67 65 53 69 7a  -1)&pBt->pageSiz
9c40: 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  e)!=0 ){.      p
9c50: 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 30  Bt->pageSize = 0
9c60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
9c70: 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
9c80: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
9c90: 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 23 69  t->pageSize);.#i
9ca0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9cb0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
9cc0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6d 61 67     /* If the mag
9cd0: 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79  ic name ":memory
9ce0: 3a 22 20 77 69 6c 6c 20 63 72 65 61 74 65 20 61  :" will create a
9cf0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
9d00: 62 61 73 65 2c 20 74 68 65 6e 0a 20 20 20 20 20  base, then.     
9d10: 20 2a 2a 20 6c 65 61 76 65 20 74 68 65 20 61 75   ** leave the au
9d20: 74 6f 56 61 63 75 75 6d 20 6d 6f 64 65 20 61 74  toVacuum mode at
9d30: 20 30 20 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d   0 (do not auto-
9d40: 76 61 63 75 75 6d 29 2c 20 65 76 65 6e 20 69 66  vacuum), even if
9d50: 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  .      ** SQLITE
9d60: 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43  _DEFAULT_AUTOVAC
9d70: 55 55 4d 20 69 73 20 74 72 75 65 2e 20 4f 6e 20  UUM is true. On 
9d80: 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c 20  the other hand, 
9d90: 69 66 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49  if.      ** SQLI
9da0: 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
9db0: 20 68 61 73 20 62 65 65 6e 20 64 65 66 69 6e 65   has been define
9dc0: 64 2c 20 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79  d, then ":memory
9dd0: 3a 22 20 69 73 20 6a 75 73 74 20 61 0a 20 20 20  :" is just a.   
9de0: 20 20 20 2a 2a 20 72 65 67 75 6c 61 72 20 66 69     ** regular fi
9df0: 6c 65 2d 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73  le-name. In this
9e00: 20 63 61 73 65 20 74 68 65 20 61 75 74 6f 2d 76   case the auto-v
9e10: 61 63 75 75 6d 20 61 70 70 6c 69 65 73 20 61 73  acuum applies as
9e20: 20 70 65 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20   per normal..   
9e30: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
9e40: 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 21 69 73  zFilename && !is
9e50: 4d 65 6d 64 62 20 29 7b 0a 20 20 20 20 20 20 20  Memdb ){.       
9e60: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
9e70: 20 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55   = (SQLITE_DEFAU
9e80: 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 3f 20  LT_AUTOVACUUM ? 
9e90: 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  1 : 0);.        
9ea0: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20  pBt->incrVacuum 
9eb0: 3d 20 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  = (SQLITE_DEFAUL
9ec0: 54 5f 41 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20  T_AUTOVACUUM==2 
9ed0: 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20  ? 1 : 0);.      
9ee0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 6e  }.#endif.      n
9ef0: 52 65 73 65 72 76 65 20 3d 20 30 3b 0a 20 20 20  Reserve = 0;.   
9f00: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52   }else{.      nR
9f10: 65 73 65 72 76 65 20 3d 20 7a 44 62 48 65 61 64  eserve = zDbHead
9f20: 65 72 5b 32 30 5d 3b 0a 20 20 20 20 20 20 70 42  er[20];.      pB
9f30: 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
9f40: 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 1;.#ifndef SQ
9f50: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
9f60: 43 55 55 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e  CUUM.      pBt->
9f70: 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
9f80: 74 34 62 79 74 65 28 26 7a 44 62 48 65 61 64 65  t4byte(&zDbHeade
9f90: 72 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30  r[36 + 4*4])?1:0
9fa0: 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e  );.      pBt->in
9fb0: 63 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34  crVacuum = (get4
9fc0: 62 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b  byte(&zDbHeader[
9fd0: 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
9fe0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
9ff0: 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
a000: 65 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  e = pBt->pageSiz
a010: 65 20 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20  e - nReserve;.  
a020: 20 20 61 73 73 65 72 74 28 20 28 70 42 74 2d 3e    assert( (pBt->
a030: 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30  pageSize & 7)==0
a040: 20 29 3b 20 20 2f 2a 20 38 2d 62 79 74 65 20 61   );  /* 8-byte a
a050: 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65  lignment of page
a060: 53 69 7a 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69  Size */.    sqli
a070: 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
a080: 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
a090: 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29   &pBt->pageSize)
a0a0: 3b 0a 20 20 20 0a 23 69 66 20 21 64 65 66 69 6e  ;.   .#if !defin
a0b0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ed(SQLITE_OMIT_S
a0c0: 48 41 52 45 44 5f 43 41 43 48 45 29 20 26 26 20  HARED_CACHE) && 
a0d0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
a0e0: 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20  OMIT_DISKIO).   
a0f0: 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77 20   /* Add the new 
a100: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
a110: 74 6f 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69  to the linked li
a120: 73 74 20 73 68 61 72 61 62 6c 65 20 42 74 53 68  st sharable BtSh
a130: 61 72 65 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  areds..    */.  
a140: 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62 6c    if( p->sharabl
a150: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
a160: 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 53  e3_mutex *mutexS
a170: 68 61 72 65 64 3b 0a 20 20 20 20 20 20 70 42 74  hared;.      pBt
a180: 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20  ->nRef = 1;.    
a190: 20 20 6d 75 74 65 78 53 68 61 72 65 64 20 3d 20    mutexShared = 
a1a0: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
a1b0: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
a1c0: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20  TATIC_MASTER);. 
a1d0: 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
a1e0: 54 48 52 45 41 44 53 41 46 45 20 26 26 20 73 71  THREADSAFE && sq
a1f0: 6c 69 74 65 33 43 6f 6e 66 69 67 2e 62 43 6f 72  lite3Config.bCor
a200: 65 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20 20  eMutex ){.      
a210: 20 20 70 42 74 2d 3e 6d 75 74 65 78 20 3d 20 73    pBt->mutex = s
a220: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
a230: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 46 41  (SQLITE_MUTEX_FA
a240: 53 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ST);.        if(
a250: 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d 30 20 29   pBt->mutex==0 )
a260: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
a270: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
a280: 20 20 20 20 20 20 20 20 20 64 62 2d 3e 6d 61 6c           db->mal
a290: 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20  locFailed = 0;. 
a2a0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 74           goto bt
a2b0: 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20  ree_open_out;.  
a2c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
a2d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
a2e0: 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 53  tex_enter(mutexS
a2f0: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 70 42  hared);.      pB
a300: 74 2d 3e 70 4e 65 78 74 20 3d 20 73 71 6c 69 74  t->pNext = sqlit
a310: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
a320: 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
a330: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 20  SharedCacheList 
a340: 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c  = pBt;.      sql
a350: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
a360: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
a370: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a     }.#endif.  }.
a380: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
a390: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
a3a0: 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69  _CACHE) && !defi
a3b0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
a3c0: 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20  DISKIO).  /* If 
a3d0: 74 68 65 20 6e 65 77 20 42 74 72 65 65 20 75 73  the new Btree us
a3e0: 65 73 20 61 20 73 68 61 72 61 62 6c 65 20 70 42  es a sharable pB
a3f0: 74 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69  tShared, then li
a400: 6e 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20  nk the new.  ** 
a410: 42 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c  Btree into the l
a420: 69 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61  ist of all shara
a430: 62 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20 74  ble Btrees for t
a440: 68 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69  he same connecti
a450: 6f 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73  on..  ** The lis
a460: 74 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63  t is kept in asc
a470: 65 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20  ending order by 
a480: 70 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a  pBt address..  *
a490: 2f 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61  /.  if( p->shara
a4a0: 62 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  ble ){.    int i
a4b0: 3b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53 69  ;.    Btree *pSi
a4c0: 62 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  b;.    for(i=0; 
a4d0: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
a4e0: 0a 20 20 20 20 20 20 69 66 28 20 28 70 53 69 62  .      if( (pSib
a4f0: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42   = db->aDb[i].pB
a500: 74 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73  t)!=0 && pSib->s
a510: 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20  harable ){.     
a520: 20 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e     while( pSib->
a530: 70 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20  pPrev ){ pSib = 
a540: 70 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20  pSib->pPrev; }. 
a550: 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 42         if( p->pB
a560: 74 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20  t<pSib->pBt ){. 
a570: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78           p->pNex
a580: 74 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20  t = pSib;.      
a590: 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30      p->pPrev = 0
a5a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62  ;.          pSib
a5b0: 2d 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20  ->pPrev = p;.   
a5c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a5d0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69        while( pSi
a5e0: 62 2d 3e 70 4e 65 78 74 20 26 26 20 70 53 69 62  b->pNext && pSib
a5f0: 2d 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e  ->pNext->pBt<p->
a600: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pBt ){.         
a610: 20 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e     pSib = pSib->
a620: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20  pNext;.         
a630: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
a640: 70 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e  pNext = pSib->pN
a650: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  ext;.          p
a660: 2d 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a  ->pPrev = pSib;.
a670: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
a680: 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
a690: 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e        p->pNext->
a6a0: 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20  pPrev = p;.     
a6b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
a6c0: 20 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70   pSib->pNext = p
a6d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a6e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a6f0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
a700: 64 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d  dif.  *ppBtree =
a710: 20 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f   p;..btree_open_
a720: 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53  out:.  if( rc!=S
a730: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
a740: 69 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e  if( pBt && pBt->
a750: 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20  pPager ){.      
a760: 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
a770: 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  e(pBt->pPager);.
a780: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
a790: 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20  3_free(pBt);.   
a7a0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
a7b0: 3b 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d  ;.    *ppBtree =
a7c0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
a7d0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
a7e0: 63 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68  crement the BtSh
a7f0: 61 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65  ared.nRef counte
a800: 72 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63  r.  When it reac
a810: 68 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d  hes zero,.** rem
a820: 6f 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64  ove the BtShared
a830: 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20   structure from 
a840: 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74  the sharing list
a850: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75  .  Return.** tru
a860: 65 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65  e if the BtShare
a870: 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72  d.nRef counter r
a880: 65 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20  eaches zero and 
a890: 72 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20  return.** false 
a8a0: 69 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70  if it is still p
a8b0: 6f 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74  ositive..*/.stat
a8c0: 69 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f  ic int removeFro
a8d0: 6d 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53  mSharingList(BtS
a8e0: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66  hared *pBt){.#if
a8f0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a900: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
a910: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70  sqlite3_mutex *p
a920: 4d 61 73 74 65 72 3b 0a 20 20 42 74 53 68 61 72  Master;.  BtShar
a930: 65 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74  ed *pList;.  int
a940: 20 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20   removed = 0;.. 
a950: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
a960: 5f 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70  _mutex_notheld(p
a970: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
a980: 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65  pMaster = sqlite
a990: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
a9a0: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
a9b0: 4d 41 53 54 45 52 29 3b 0a 20 20 73 71 6c 69 74  MASTER);.  sqlit
a9c0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
a9d0: 4d 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e  Master);.  pBt->
a9e0: 6e 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42  nRef--;.  if( pB
a9f0: 74 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20  t->nRef<=0 ){.  
aa00: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 68 61    if( sqlite3Sha
aa10: 72 65 64 43 61 63 68 65 4c 69 73 74 3d 3d 70 42  redCacheList==pB
aa20: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
aa30: 65 33 53 68 61 72 65 64 43 61 63 68 65 4c 69 73  e3SharedCacheLis
aa40: 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78 74 3b 0a  t = pBt->pNext;.
aa50: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
aa60: 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33   pList = sqlite3
aa70: 53 68 61 72 65 64 43 61 63 68 65 4c 69 73 74 3b  SharedCacheList;
aa80: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 4c  .      while( pL
aa90: 69 73 74 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e  ist && pList->pN
aaa0: 65 78 74 21 3d 70 42 74 20 29 7b 0a 20 20 20 20  ext!=pBt ){.    
aab0: 20 20 20 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d      pList=pList-
aac0: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a  >pNext;.      }.
aad0: 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 20        if( pList 
aae0: 29 7b 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74  ){.        pList
aaf0: 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70  ->pNext = pBt->p
ab00: 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Next;.      }.  
ab10: 20 20 7d 0a 20 20 20 20 69 66 28 20 53 51 4c 49    }.    if( SQLI
ab20: 54 45 5f 54 48 52 45 41 44 53 41 46 45 20 29 7b  TE_THREADSAFE ){
ab30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
ab40: 75 74 65 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d  utex_free(pBt->m
ab50: 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  utex);.    }.   
ab60: 20 72 65 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20   removed = 1;.  
ab70: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
ab80: 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65 72 29  x_leave(pMaster)
ab90: 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 6d 6f 76  ;.  return remov
aba0: 65 64 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75  ed;.#else.  retu
abb0: 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 1;.#endif.}..
abc0: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
abd0: 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 70  pBt->pTmpSpace p
abe0: 6f 69 6e 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f  oints to an allo
abf0: 63 61 74 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58  cation of .** MX
ac00: 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
ac10: 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  bytes..*/.static
ac20: 20 76 6f 69 64 20 61 6c 6c 6f 63 61 74 65 54 65   void allocateTe
ac30: 6d 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64  mpSpace(BtShared
ac40: 20 2a 70 42 74 29 7b 0a 20 20 69 66 28 20 21 70   *pBt){.  if( !p
ac50: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 7b  Bt->pTmpSpace ){
ac60: 0a 20 20 20 20 70 42 74 2d 3e 70 54 6d 70 53 70  .    pBt->pTmpSp
ac70: 61 63 65 20 3d 20 73 71 6c 69 74 65 33 50 61 67  ace = sqlite3Pag
ac80: 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61  eMalloc( pBt->pa
ac90: 67 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a  geSize );.  }.}.
aca0: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
acb0: 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 20 61  pBt->pTmpSpace a
acc0: 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  llocation.*/.sta
acd0: 74 69 63 20 76 6f 69 64 20 66 72 65 65 54 65 6d  tic void freeTem
ace0: 70 53 70 61 63 65 28 42 74 53 68 61 72 65 64 20  pSpace(BtShared 
acf0: 2a 70 42 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  *pBt){.  sqlite3
ad00: 50 61 67 65 46 72 65 65 28 20 70 42 74 2d 3e 70  PageFree( pBt->p
ad10: 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 70 42 74  TmpSpace);.  pBt
ad20: 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 30 3b  ->pTmpSpace = 0;
ad30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
ad40: 61 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  an open database
ad50: 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20   and invalidate 
ad60: 61 6c 6c 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a  all cursors..*/.
ad70: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
ad80: 43 6c 6f 73 65 28 42 74 72 65 65 20 2a 70 29 7b  Close(Btree *p){
ad90: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
ada0: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43   = p->pBt;.  BtC
adb0: 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20  ursor *pCur;..  
adc0: 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72  /* Close all cur
add0: 73 6f 72 73 20 6f 70 65 6e 65 64 20 76 69 61 20  sors opened via 
ade0: 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f  this handle.  */
adf0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
ae00: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d  e3_mutex_held(p-
ae10: 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
ae20: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
ae30: 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62  er(p);.  pBt->db
ae40: 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 70 43 75 72   = p->db;.  pCur
ae50: 20 3d 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b   = pBt->pCursor;
ae60: 0a 20 20 77 68 69 6c 65 28 20 70 43 75 72 20 29  .  while( pCur )
ae70: 7b 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 2a  {.    BtCursor *
ae80: 70 54 6d 70 20 3d 20 70 43 75 72 3b 0a 20 20 20  pTmp = pCur;.   
ae90: 20 70 43 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e   pCur = pCur->pN
aea0: 65 78 74 3b 0a 20 20 20 20 69 66 28 20 70 54 6d  ext;.    if( pTm
aeb0: 70 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a  p->pBtree==p ){.
aec0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
aed0: 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 70 54  eeCloseCursor(pT
aee0: 6d 70 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  mp);.    }.  }..
aef0: 20 20 2f 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e    /* Rollback an
af00: 79 20 61 63 74 69 76 65 20 74 72 61 6e 73 61 63  y active transac
af10: 74 69 6f 6e 20 61 6e 64 20 66 72 65 65 20 74 68  tion and free th
af20: 65 20 68 61 6e 64 6c 65 20 73 74 72 75 63 74 75  e handle structu
af30: 72 65 2e 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c  re..  ** The cal
af40: 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
af50: 65 52 6f 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70  eRollback() drop
af60: 73 20 61 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b  s any table-lock
af70: 73 20 68 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74  s held by.  ** t
af80: 68 69 73 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f  his handle..  */
af90: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52  .  sqlite3BtreeR
afa0: 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 73 71  ollback(p);.  sq
afb0: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
afc0: 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
afd0: 72 65 20 61 72 65 20 73 74 69 6c 6c 20 6f 74 68  re are still oth
afe0: 65 72 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72  er outstanding r
aff0: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
b000: 20 73 68 61 72 65 64 2d 62 74 72 65 65 0a 20 20   shared-btree.  
b010: 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 72 65  ** structure, re
b020: 74 75 72 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65  turn now. The re
b030: 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 69 73 20  mainder of this 
b040: 70 72 6f 63 65 64 75 72 65 20 63 6c 65 61 6e 73  procedure cleans
b050: 20 0a 20 20 2a 2a 20 75 70 20 74 68 65 20 73 68   .  ** up the sh
b060: 61 72 65 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f  ared-btree..  */
b070: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 77 61  .  assert( p->wa
b080: 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70  ntToLock==0 && p
b090: 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20  ->locked==0 );. 
b0a0: 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61 62 6c   if( !p->sharabl
b0b0: 65 20 7c 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53  e || removeFromS
b0c0: 68 61 72 69 6e 67 4c 69 73 74 28 70 42 74 29 20  haringList(pBt) 
b0d0: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 42  ){.    /* The pB
b0e0: 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f  t is no longer o
b0f0: 6e 20 74 68 65 20 73 68 61 72 69 6e 67 20 6c 69  n the sharing li
b100: 73 74 2c 20 73 6f 20 77 65 20 63 61 6e 20 61 63  st, so we can ac
b110: 63 65 73 73 0a 20 20 20 20 2a 2a 20 69 74 20 77  cess.    ** it w
b120: 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
b130: 20 68 6f 6c 64 20 74 68 65 20 6d 75 74 65 78 2e   hold the mutex.
b140: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43  .    **.    ** C
b150: 6c 65 61 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c  lean out and del
b160: 65 74 65 20 74 68 65 20 42 74 53 68 61 72 65 64  ete the BtShared
b170: 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a   object..    */.
b180: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 42 74      assert( !pBt
b190: 2d 3e 70 43 75 72 73 6f 72 20 29 3b 0a 20 20 20  ->pCursor );.   
b1a0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
b1b0: 73 65 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  se(pBt->pPager);
b1c0: 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 78 46  .    if( pBt->xF
b1d0: 72 65 65 53 63 68 65 6d 61 20 26 26 20 70 42 74  reeSchema && pBt
b1e0: 2d 3e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ->pSchema ){.   
b1f0: 20 20 20 70 42 74 2d 3e 78 46 72 65 65 53 63 68     pBt->xFreeSch
b200: 65 6d 61 28 70 42 74 2d 3e 70 53 63 68 65 6d 61  ema(pBt->pSchema
b210: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
b220: 69 74 65 33 5f 66 72 65 65 28 70 42 74 2d 3e 70  ite3_free(pBt->p
b230: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 66 72 65  Schema);.    fre
b240: 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
b250: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
b260: 65 28 70 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66  e(pBt);.  }..#if
b270: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b280: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
b290: 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54  assert( p->wantT
b2a0: 6f 4c 6f 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73  oLock==0 );.  as
b2b0: 73 65 72 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d  sert( p->locked=
b2c0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70  =0 );.  if( p->p
b2d0: 50 72 65 76 20 29 20 70 2d 3e 70 50 72 65 76 2d  Prev ) p->pPrev-
b2e0: 3e 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78  >pNext = p->pNex
b2f0: 74 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4e 65 78  t;.  if( p->pNex
b300: 74 20 29 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50  t ) p->pNext->pP
b310: 72 65 76 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a  rev = p->pPrev;.
b320: 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
b330: 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 72 65 74  3_free(p);.  ret
b340: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
b350: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
b360: 68 65 20 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20  he limit on the 
b370: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
b380: 61 6c 6c 6f 77 65 64 20 69 6e 20 74 68 65 20 63  allowed in the c
b390: 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ache..**.** The 
b3a0: 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  maximum number o
b3b0: 66 20 63 61 63 68 65 20 70 61 67 65 73 20 69 73  f cache pages is
b3c0: 20 73 65 74 20 74 6f 20 74 68 65 20 61 62 73 6f   set to the abso
b3d0: 6c 75 74 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66  lute.** value of
b3e0: 20 6d 78 50 61 67 65 2e 20 20 49 66 20 6d 78 50   mxPage.  If mxP
b3f0: 61 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c  age is negative,
b400: 20 74 68 65 20 70 61 67 65 72 20 77 69 6c 6c 0a   the pager will.
b410: 2a 2a 20 6f 70 65 72 61 74 65 20 61 73 79 6e 63  ** operate async
b420: 68 72 6f 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77  hronously - it w
b430: 69 6c 6c 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20  ill not stop to 
b440: 64 6f 20 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74  do fsync()s.** t
b450: 6f 20 69 6e 73 75 72 65 20 64 61 74 61 20 69 73  o insure data is
b460: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
b470: 64 69 73 6b 20 73 75 72 66 61 63 65 20 62 65 66  disk surface bef
b480: 6f 72 65 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e  ore.** continuin
b490: 67 2e 20 20 54 72 61 6e 73 61 63 74 69 6f 6e 73  g.  Transactions
b4a0: 20 73 74 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73   still work if s
b4b0: 79 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66  ynchronous is of
b4c0: 66 2c 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61  f,.** and the da
b4d0: 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65  tabase cannot be
b4e0: 20 63 6f 72 72 75 70 74 65 64 20 69 66 20 74 68   corrupted if th
b4f0: 69 73 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72  is program.** cr
b500: 61 73 68 65 73 2e 20 20 42 75 74 20 69 66 20 74  ashes.  But if t
b510: 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  he operating sys
b520: 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74  tem crashes or t
b530: 68 65 72 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62  here is.** an ab
b540: 72 75 70 74 20 70 6f 77 65 72 20 66 61 69 6c 75  rupt power failu
b550: 72 65 20 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e  re when synchron
b560: 6f 75 73 20 69 73 20 6f 66 66 2c 20 74 68 65 20  ous is off, the 
b570: 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c  database.** coul
b580: 64 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e 20  d be left in an 
b590: 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64  inconsistent and
b5a0: 20 75 6e 72 65 63 6f 76 65 72 61 62 6c 65 20 73   unrecoverable s
b5b0: 74 61 74 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f  tate..** Synchro
b5c0: 6e 6f 75 73 20 69 73 20 6f 6e 20 62 79 20 64 65  nous is on by de
b5d0: 66 61 75 6c 74 20 73 6f 20 64 61 74 61 62 61 73  fault so databas
b5e0: 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  e corruption is 
b5f0: 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20  not.** normally 
b600: 61 20 77 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20  a worry..*/.int 
b610: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43  sqlite3BtreeSetC
b620: 61 63 68 65 53 69 7a 65 28 42 74 72 65 65 20 2a  acheSize(Btree *
b630: 70 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a  p, int mxPage){.
b640: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
b650: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
b660: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
b670: 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
b680: 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
b690: 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
b6a0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
b6b0: 74 43 61 63 68 65 73 69 7a 65 28 70 42 74 2d 3e  tCachesize(pBt->
b6c0: 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b  pPager, mxPage);
b6d0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
b6e0: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
b6f0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
b700: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
b710: 20 77 61 79 20 64 61 74 61 20 69 73 20 73 79 6e   way data is syn
b720: 63 65 64 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f  ced to disk in o
b730: 72 64 65 72 20 74 6f 20 69 6e 63 72 65 61 73 65  rder to increase
b740: 20 6f 72 20 64 65 63 72 65 61 73 65 0a 2a 2a 20   or decrease.** 
b750: 68 6f 77 20 77 65 6c 6c 20 74 68 65 20 64 61 74  how well the dat
b760: 61 62 61 73 65 20 72 65 73 69 73 74 73 20 64 61  abase resists da
b770: 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
b780: 72 61 73 68 65 73 20 61 6e 64 20 70 6f 77 65 72  rashes and power
b790: 0a 2a 2a 20 66 61 69 6c 75 72 65 73 2e 20 20 4c  .** failures.  L
b7a0: 65 76 65 6c 20 31 20 69 73 20 74 68 65 20 73 61  evel 1 is the sa
b7b0: 6d 65 20 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f  me as asynchrono
b7c0: 75 73 20 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f  us (no syncs() o
b7d0: 63 63 75 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72  ccur and.** ther
b7e0: 65 20 69 73 20 61 20 68 69 67 68 20 70 72 6f 62  e is a high prob
b7f0: 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61 67  ability of damag
b800: 65 29 20 20 4c 65 76 65 6c 20 32 20 69 73 20 74  e)  Level 2 is t
b810: 68 65 20 64 65 66 61 75 6c 74 2e 20 20 54 68 65  he default.  The
b820: 72 65 0a 2a 2a 20 69 73 20 61 20 76 65 72 79 20  re.** is a very 
b830: 6c 6f 77 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f  low but non-zero
b840: 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
b850: 64 61 6d 61 67 65 2e 20 20 4c 65 76 65 6c 20 33  damage.  Level 3
b860: 20 72 65 64 75 63 65 73 20 74 68 65 0a 2a 2a 20   reduces the.** 
b870: 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64  probability of d
b880: 61 6d 61 67 65 20 74 6f 20 6e 65 61 72 20 7a 65  amage to near ze
b890: 72 6f 20 62 75 74 20 77 69 74 68 20 61 20 77 72  ro but with a wr
b8a0: 69 74 65 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  ite performance 
b8b0: 72 65 64 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69  reduction..*/.#i
b8c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b8d0: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
b8e0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
b8f0: 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28 42  SetSafetyLevel(B
b900: 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6c 65 76  tree *p, int lev
b910: 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63  el, int fullSync
b920: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
b930: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61  Bt = p->pBt;.  a
b940: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
b950: 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d  utex_held(p->db-
b960: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
b970: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
b980: 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
b990: 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  rSetSafetyLevel(
b9a0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76  pBt->pPager, lev
b9b0: 65 6c 2c 20 66 75 6c 6c 53 79 6e 63 29 3b 0a 20  el, fullSync);. 
b9c0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
b9d0: 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
b9e0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
b9f0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
ba00: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
ba10: 76 65 6e 20 62 74 72 65 65 20 69 73 20 73 65 74  ven btree is set
ba20: 20 74 6f 20 73 61 66 65 74 79 20 6c 65 76 65 6c   to safety level
ba30: 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a   1.  In other.**
ba40: 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54   words, return T
ba50: 52 55 45 20 69 66 20 6e 6f 20 73 79 6e 63 28 29  RUE if no sync()
ba60: 20 6f 63 63 75 72 73 20 6f 6e 20 74 68 65 20 64   occurs on the d
ba70: 69 73 6b 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e  isk files..*/.in
ba80: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 79  t sqlite3BtreeSy
ba90: 6e 63 44 69 73 61 62 6c 65 64 28 42 74 72 65 65  ncDisabled(Btree
baa0: 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
bab0: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
bac0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
bad0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
bae0: 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
baf0: 74 65 78 29 20 29 3b 20 20 0a 20 20 73 71 6c 69  tex) );  .  sqli
bb00: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
bb10: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 20  ;.  assert( pBt 
bb20: 26 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29  && pBt->pPager )
bb30: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
bb40: 50 61 67 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d  PagerNosync(pBt-
bb50: 3e 70 50 61 67 65 72 29 3b 0a 20 20 73 71 6c 69  >pPager);.  sqli
bb60: 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
bb70: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
bb80: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
bb90: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
bba0: 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64 65  _PRAGMAS) || !de
bbb0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
bbc0: 54 5f 56 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20  T_VACUUM)./*.** 
bbd0: 43 68 61 6e 67 65 20 74 68 65 20 64 65 66 61 75  Change the defau
bbe0: 6c 74 20 70 61 67 65 73 20 73 69 7a 65 20 61 6e  lt pages size an
bbf0: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
bc00: 72 65 73 65 72 76 65 64 20 62 79 74 65 73 20 70  reserved bytes p
bc10: 65 72 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54  er page..**.** T
bc20: 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d 75 73  he page size mus
bc30: 74 20 62 65 20 61 20 70 6f 77 65 72 20 6f 66 20  t be a power of 
bc40: 32 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e  2 between 512 an
bc50: 64 20 36 35 35 33 36 2e 20 20 49 66 20 74 68 65  d 65536.  If the
bc60: 20 70 61 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75   page.** size su
bc70: 70 70 6c 69 65 64 20 64 6f 65 73 20 6e 6f 74 20  pplied does not 
bc80: 6d 65 65 74 20 74 68 69 73 20 63 6f 6e 73 74 72  meet this constr
bc90: 61 69 6e 74 20 74 68 65 6e 20 74 68 65 20 70 61  aint then the pa
bca0: 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a  ge size is not.*
bcb0: 2a 20 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a  * changed..**.**
bcc0: 20 50 61 67 65 20 73 69 7a 65 73 20 61 72 65 20   Page sizes are 
bcd0: 63 6f 6e 73 74 72 61 69 6e 65 64 20 74 6f 20 62  constrained to b
bce0: 65 20 61 20 70 6f 77 65 72 20 6f 66 20 74 77 6f  e a power of two
bcf0: 20 73 6f 20 74 68 61 74 20 74 68 65 20 72 65 67   so that the reg
bd00: 69 6f 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61  ion.** of the da
bd10: 74 61 62 61 73 65 20 66 69 6c 65 20 75 73 65 64  tabase file used
bd20: 20 66 6f 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65   for locking (be
bd30: 67 69 6e 6e 69 6e 67 20 61 74 20 50 45 4e 44 49  ginning at PENDI
bd40: 4e 47 5f 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20  NG_BYTE,.** the 
bd50: 66 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  first byte past 
bd60: 74 68 65 20 31 47 42 20 62 6f 75 6e 64 61 72 79  the 1GB boundary
bd70: 2c 20 30 78 34 30 30 30 30 30 30 30 29 20 6e 65  , 0x40000000) ne
bd80: 65 64 73 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20  eds to occur.** 
bd90: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
bda0: 20 6f 66 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a   of a page..**.*
bdb0: 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e  * If parameter n
bdc0: 52 65 73 65 72 76 65 20 69 73 20 6c 65 73 73 20  Reserve is less 
bdd0: 74 68 61 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20  than zero, then 
bde0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
bdf0: 73 65 72 76 65 64 0a 2a 2a 20 62 79 74 65 73 20  served.** bytes 
be00: 70 65 72 20 70 61 67 65 20 69 73 20 6c 65 66 74  per page is left
be10: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69   unchanged..*/.i
be20: 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
be30: 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65 65  etPageSize(Btree
be40: 20 2a 70 2c 20 69 6e 74 20 70 61 67 65 53 69 7a   *p, int pageSiz
be50: 65 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29  e, int nReserve)
be60: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
be70: 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72  ITE_OK;.  BtShar
be80: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
be90: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
bea0: 45 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20  Enter(p);.  if( 
beb0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78  pBt->pageSizeFix
bec0: 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
bed0: 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
bee0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
bef0: 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 0a  E_READONLY;.  }.
bf00: 20 20 69 66 28 20 6e 52 65 73 65 72 76 65 3c 30    if( nReserve<0
bf10: 20 29 7b 0a 20 20 20 20 6e 52 65 73 65 72 76 65   ){.    nReserve
bf20: 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
bf30: 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   - pBt->usableSi
bf40: 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 61  ze;.  }.  if( pa
bf50: 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70  geSize>=512 && p
bf60: 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
bf70: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 26 26  MAX_PAGE_SIZE &&
bf80: 0a 20 20 20 20 20 20 20 20 28 28 70 61 67 65 53  .        ((pageS
bf90: 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29  ize-1)&pageSize)
bfa0: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
bfb0: 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
bfc0: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  )==0 );.    asse
bfd0: 72 74 28 20 21 70 42 74 2d 3e 70 50 61 67 65 31  rt( !pBt->pPage1
bfe0: 20 26 26 20 21 70 42 74 2d 3e 70 43 75 72 73 6f   && !pBt->pCurso
bff0: 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61  r );.    pBt->pa
c000: 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
c010: 65 3b 0a 20 20 20 20 66 72 65 65 54 65 6d 70 53  e;.    freeTempS
c020: 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 72  pace(pBt);.    r
c030: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
c040: 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74 2d  SetPagesize(pBt-
c050: 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e 70  >pPager, &pBt->p
c060: 61 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20  ageSize);.  }.  
c070: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
c080: 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
c090: 2d 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 73 71  - nReserve;.  sq
c0a0: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
c0b0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
c0c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
c0d0: 20 74 68 65 20 63 75 72 72 65 6e 74 6c 79 20 64   the currently d
c0e0: 65 66 69 6e 65 64 20 70 61 67 65 20 73 69 7a 65  efined page size
c0f0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
c100: 74 72 65 65 47 65 74 50 61 67 65 53 69 7a 65 28  treeGetPageSize(
c110: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 72 65 74  Btree *p){.  ret
c120: 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65  urn p->pBt->page
c130: 53 69 7a 65 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  Size;.}.int sqli
c140: 74 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72  te3BtreeGetReser
c150: 76 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  ve(Btree *p){.  
c160: 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
c170: 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
c180: 20 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67   n = p->pBt->pag
c190: 65 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e  eSize - p->pBt->
c1a0: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71  usableSize;.  sq
c1b0: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
c1c0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a  p);.  return n;.
c1d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
c1e0: 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
c1f0: 75 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62 61  unt for a databa
c200: 73 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20  se if mxPage is 
c210: 70 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20  positive..** No 
c220: 63 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65  changes are made
c230: 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 30 20   if mxPage is 0 
c240: 6f 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20  or negative..** 
c250: 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68  Regardless of th
c260: 65 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67  e value of mxPag
c270: 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61  e, return the ma
c280: 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
c290: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
c2a0: 42 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e  BtreeMaxPageCoun
c2b0: 74 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  t(Btree *p, int 
c2c0: 6d 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e  mxPage){.  int n
c2d0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
c2e0: 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20  Enter(p);.  n = 
c2f0: 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50  sqlite3PagerMaxP
c300: 61 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d  ageCount(p->pBt-
c310: 3e 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29  >pPager, mxPage)
c320: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
c330: 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
c340: 72 6e 20 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn n;.}.#endif /
c350: 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  * !defined(SQLIT
c360: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
c370: 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65  GMAS) || !define
c380: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  d(SQLITE_OMIT_VA
c390: 43 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  CUUM) */../*.** 
c3a0: 43 68 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f  Change the 'auto
c3b0: 2d 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74  -vacuum' propert
c3c0: 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  y of the databas
c3d0: 65 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f 56  e. If the 'autoV
c3e0: 61 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65  acuum'.** parame
c3f0: 74 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ter is non-zero,
c400: 20 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75   then auto-vacuu
c410: 6d 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65  m mode is enable
c420: 64 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a  d. If zero, it.*
c430: 2a 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54  * is disabled. T
c440: 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
c450: 20 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61   for the auto-va
c460: 63 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73  cuum property is
c470: 20 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20   .** determined 
c480: 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45  by the SQLITE_DE
c490: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
c4a0: 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73   macro..*/.int s
c4b0: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75  qlite3BtreeSetAu
c4c0: 74 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a  toVacuum(Btree *
c4d0: 70 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75  p, int autoVacuu
c4e0: 6d 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  m){.#ifdef SQLIT
c4f0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
c500: 4d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  M.  return SQLIT
c510: 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73  E_READONLY;.#els
c520: 65 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  e.  BtShared *pB
c530: 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e  t = p->pBt;.  in
c540: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c550: 3b 0a 20 20 69 6e 74 20 61 76 20 3d 20 28 61 75  ;.  int av = (au
c560: 74 6f 56 61 63 75 75 6d 3f 31 3a 30 29 3b 0a 0a  toVacuum?1:0);..
c570: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
c580: 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 70 42  ter(p);.  if( pB
c590: 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64  t->pageSizeFixed
c5a0: 20 26 26 20 61 76 21 3d 70 42 74 2d 3e 61 75 74   && av!=pBt->aut
c5b0: 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
c5c0: 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
c5d0: 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  NLY;.  }else{.  
c5e0: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
c5f0: 6d 20 3d 20 61 76 3b 0a 20 20 7d 0a 20 20 73 71  m = av;.  }.  sq
c600: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
c610: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
c620: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
c630: 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
c640: 65 20 6f 66 20 74 68 65 20 27 61 75 74 6f 2d 76  e of the 'auto-v
c650: 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79 2e  acuum' property.
c660: 20 49 66 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   If auto-vacuum 
c670: 69 73 20 0a 2a 2a 20 65 6e 61 62 6c 65 64 20 31  is .** enabled 1
c680: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
c690: 68 65 72 77 69 73 65 20 30 2e 0a 2a 2f 0a 69 6e  herwise 0..*/.in
c6a0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
c6b0: 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74 72 65  tAutoVacuum(Btre
c6c0: 65 20 2a 70 29 7b 0a 23 69 66 64 65 66 20 53 51  e *p){.#ifdef SQ
c6d0: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
c6e0: 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20 42 54  CUUM.  return BT
c6f0: 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4e  REE_AUTOVACUUM_N
c700: 4f 4e 45 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  ONE;.#else.  int
c710: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
c720: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72  reeEnter(p);.  r
c730: 63 20 3d 20 28 0a 20 20 20 20 28 21 70 2d 3e 70  c = (.    (!p->p
c740: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3f  Bt->autoVacuum)?
c750: 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55 4d  BTREE_AUTOVACUUM
c760: 5f 4e 4f 4e 45 3a 0a 20 20 20 20 28 21 70 2d 3e  _NONE:.    (!p->
c770: 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29  pBt->incrVacuum)
c780: 3f 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55  ?BTREE_AUTOVACUU
c790: 4d 5f 46 55 4c 4c 3a 0a 20 20 20 20 42 54 52 45  M_FULL:.    BTRE
c7a0: 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43  E_AUTOVACUUM_INC
c7b0: 52 0a 20 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  R.  );.  sqlite3
c7c0: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
c7d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
c7e0: 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  if.}.../*.** Get
c7f0: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
c800: 70 50 61 67 65 31 20 6f 66 20 74 68 65 20 64 61  pPage1 of the da
c810: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
c820: 69 73 20 77 69 6c 6c 0a 2a 2a 20 61 6c 73 6f 20  is will.** also 
c830: 61 63 71 75 69 72 65 20 61 20 72 65 61 64 6c 6f  acquire a readlo
c840: 63 6b 20 6f 6e 20 74 68 61 74 20 66 69 6c 65 2e  ck on that file.
c850: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
c860: 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20   is returned on 
c870: 73 75 63 63 65 73 73 2e 20 20 49 66 20 74 68 65  success.  If the
c880: 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 0a 2a   file is not a.*
c890: 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  * well-formed da
c8a0: 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65  tabase file, the
c8b0: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
c8c0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a   is returned..**
c8d0: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20   SQLITE_BUSY is 
c8e0: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
c8f0: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
c900: 65 64 2e 20 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ed.  SQLITE_NOME
c910: 4d 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  M.** is returned
c920: 20 69 66 20 77 65 20 72 75 6e 20 6f 75 74 20 6f   if we run out o
c930: 66 20 6d 65 6d 6f 72 79 2e 20 0a 2a 2f 0a 73 74  f memory. .*/.st
c940: 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72  atic int lockBtr
c950: 65 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  ee(BtShared *pBt
c960: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d  ){.  int rc;.  M
c970: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a  emPage *pPage1;.
c980: 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20    int nPage;..  
c990: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
c9a0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
c9b0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
c9c0: 70 42 74 2d 3e 70 50 61 67 65 31 20 29 20 72 65  pBt->pPage1 ) re
c9d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
c9e0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
c9f0: 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
ca00: 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3b 0a  1, &pPage1, 0);.
ca10: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
ca20: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
ca30: 0a 0a 20 20 2f 2a 20 44 6f 20 73 6f 6d 65 20 63  ..  /* Do some c
ca40: 68 65 63 6b 69 6e 67 20 74 6f 20 68 65 6c 70 20  hecking to help 
ca50: 69 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65 20  insure the file 
ca60: 77 65 20 6f 70 65 6e 65 64 20 72 65 61 6c 6c 79  we opened really
ca70: 20 69 73 0a 20 20 2a 2a 20 61 20 76 61 6c 69 64   is.  ** a valid
ca80: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
ca90: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
caa0: 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
cab0: 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
cac0: 26 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  &nPage);.  if( r
cad0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
cae0: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
caf0: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 65  nit_failed;.  }e
cb00: 6c 73 65 20 69 66 28 20 6e 50 61 67 65 3e 30 20  lse if( nPage>0 
cb10: 29 7b 0a 20 20 20 20 69 6e 74 20 70 61 67 65 53  ){.    int pageS
cb20: 69 7a 65 3b 0a 20 20 20 20 69 6e 74 20 75 73 61  ize;.    int usa
cb30: 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 75 38 20  bleSize;.    u8 
cb40: 2a 70 61 67 65 31 20 3d 20 70 50 61 67 65 31 2d  *page1 = pPage1-
cb50: 3e 61 44 61 74 61 3b 0a 20 20 20 20 72 63 20 3d  >aData;.    rc =
cb60: 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3b 0a   SQLITE_NOTADB;.
cb70: 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70      if( memcmp(p
cb80: 61 67 65 31 2c 20 7a 4d 61 67 69 63 48 65 61 64  age1, zMagicHead
cb90: 65 72 2c 20 31 36 29 21 3d 30 20 29 7b 0a 20 20  er, 16)!=0 ){.  
cba0: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
cbb0: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
cbc0: 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  }.    if( page1[
cbd0: 31 38 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 70  18]>1 ){.      p
cbe0: 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31  Bt->readOnly = 1
cbf0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
cc00: 70 61 67 65 31 5b 31 39 5d 3e 31 20 29 7b 0a 20  page1[19]>1 ){. 
cc10: 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f       goto page1_
cc20: 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20  init_failed;.   
cc30: 20 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6d   }..    /* The m
cc40: 61 78 69 6d 75 6d 20 65 6d 62 65 64 64 65 64 20  aximum embedded 
cc50: 66 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65  fraction must be
cc60: 20 65 78 61 63 74 6c 79 20 32 35 25 2e 20 20 41   exactly 25%.  A
cc70: 6e 64 20 74 68 65 20 6d 69 6e 69 6d 75 6d 0a 20  nd the minimum. 
cc80: 20 20 20 2a 2a 20 65 6d 62 65 64 64 65 64 20 66     ** embedded f
cc90: 72 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  raction must be 
cca0: 31 32 2e 35 25 20 66 6f 72 20 62 6f 74 68 20 6c  12.5% for both l
ccb0: 65 61 66 2d 64 61 74 61 20 61 6e 64 20 6e 6f 6e  eaf-data and non
ccc0: 2d 6c 65 61 66 2d 64 61 74 61 2e 0a 20 20 20 20  -leaf-data..    
ccd0: 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  ** The original 
cce0: 64 65 73 69 67 6e 20 61 6c 6c 6f 77 65 64 20 74  design allowed t
ccf0: 68 65 73 65 20 61 6d 6f 75 6e 74 73 20 74 6f 20  hese amounts to 
cd00: 76 61 72 79 2c 20 62 75 74 20 61 73 20 6f 66 0a  vary, but as of.
cd10: 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 20 33      ** version 3
cd20: 2e 36 2e 30 2c 20 77 65 20 72 65 71 75 69 72 65  .6.0, we require
cd30: 20 74 68 65 6d 20 74 6f 20 62 65 20 66 69 78 65   them to be fixe
cd40: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
cd50: 28 20 6d 65 6d 63 6d 70 28 26 70 61 67 65 31 5b  ( memcmp(&page1[
cd60: 32 31 5d 2c 20 22 5c 31 30 30 5c 30 34 30 5c 30  21], "\100\040\0
cd70: 34 30 22 2c 33 29 21 3d 30 20 29 7b 0a 20 20 20  40",3)!=0 ){.   
cd80: 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
cd90: 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
cda0: 0a 20 20 20 20 70 61 67 65 53 69 7a 65 20 3d 20  .    pageSize = 
cdb0: 67 65 74 32 62 79 74 65 28 26 70 61 67 65 31 5b  get2byte(&page1[
cdc0: 31 36 5d 29 3b 0a 20 20 20 20 69 66 28 20 28 28  16]);.    if( ((
cdd0: 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65  pageSize-1)&page
cde0: 53 69 7a 65 29 21 3d 30 20 7c 7c 20 70 61 67 65  Size)!=0 || page
cdf0: 53 69 7a 65 3c 35 31 32 20 7c 7c 0a 20 20 20 20  Size<512 ||.    
ce00: 20 20 20 20 28 53 51 4c 49 54 45 5f 4d 41 58 5f      (SQLITE_MAX_
ce10: 50 41 47 45 5f 53 49 5a 45 3c 33 32 37 36 38 20  PAGE_SIZE<32768 
ce20: 26 26 20 70 61 67 65 53 69 7a 65 3e 53 51 4c 49  && pageSize>SQLI
ce30: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
ce40: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 67  ).    ){.      g
ce50: 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
ce60: 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
ce70: 20 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69   assert( (pageSi
ce80: 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20  ze & 7)==0 );.  
ce90: 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
cea0: 61 67 65 53 69 7a 65 20 2d 20 70 61 67 65 31 5b  ageSize - page1[
ceb0: 32 30 5d 3b 0a 20 20 20 20 69 66 28 20 70 61 67  20];.    if( pag
cec0: 65 53 69 7a 65 21 3d 70 42 74 2d 3e 70 61 67 65  eSize!=pBt->page
ced0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a  Size ){.      /*
cee0: 20 41 66 74 65 72 20 72 65 61 64 69 6e 67 20 74   After reading t
cef0: 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
cf00: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73   the database as
cf10: 73 75 6d 69 6e 67 20 61 20 70 61 67 65 20 73 69  suming a page si
cf20: 7a 65 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 42  ze.      ** of B
cf30: 74 53 68 61 72 65 64 2e 70 61 67 65 53 69 7a 65  tShared.pageSize
cf40: 2c 20 77 65 20 68 61 76 65 20 64 69 73 63 6f 76  , we have discov
cf50: 65 72 65 64 20 74 68 61 74 20 74 68 65 20 70 61  ered that the pa
cf60: 67 65 2d 73 69 7a 65 20 69 73 0a 20 20 20 20 20  ge-size is.     
cf70: 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 70 61 67   ** actually pag
cf80: 65 53 69 7a 65 2e 20 55 6e 6c 6f 63 6b 20 74 68  eSize. Unlock th
cf90: 65 20 64 61 74 61 62 61 73 65 2c 20 6c 65 61 76  e database, leav
cfa0: 65 20 70 42 74 2d 3e 70 50 61 67 65 31 20 61 74  e pBt->pPage1 at
cfb0: 0a 20 20 20 20 20 20 2a 2a 20 7a 65 72 6f 20 61  .      ** zero a
cfc0: 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  nd return SQLITE
cfd0: 5f 4f 4b 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  _OK. The caller 
cfe0: 77 69 6c 6c 20 63 61 6c 6c 20 74 68 69 73 20 66  will call this f
cff0: 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20 20 2a 2a  unction.      **
d000: 20 61 67 61 69 6e 20 77 69 74 68 20 74 68 65 20   again with the 
d010: 63 6f 72 72 65 63 74 20 70 61 67 65 2d 73 69 7a  correct page-siz
d020: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
d030: 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
d040: 61 67 65 31 29 3b 0a 20 20 20 20 20 20 70 42 74  age1);.      pBt
d050: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 75  ->usableSize = u
d060: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20  sableSize;.     
d070: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
d080: 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20   pageSize;.     
d090: 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28 70   freeTempSpace(p
d0a0: 42 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Bt);.      sqlit
d0b0: 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
d0c0: 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
d0d0: 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  &pBt->pageSize);
d0e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
d0f0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
d100: 20 20 20 69 66 28 20 75 73 61 62 6c 65 53 69 7a     if( usableSiz
d110: 65 3c 35 30 30 20 29 7b 0a 20 20 20 20 20 20 67  e<500 ){.      g
d120: 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
d130: 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20  ailed;.    }.   
d140: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d   pBt->pageSize =
d150: 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 70   pageSize;.    p
d160: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
d170: 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66   usableSize;.#if
d180: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d190: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
d1a0: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
d1b0: 3d 20 28 67 65 74 34 62 79 74 65 28 26 70 61 67  = (get4byte(&pag
d1c0: 65 31 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a  e1[36 + 4*4])?1:
d1d0: 30 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63  0);.    pBt->inc
d1e0: 72 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  rVacuum = (get4b
d1f0: 79 74 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20  yte(&page1[36 + 
d200: 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64  7*4])?1:0);.#end
d210: 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78  if.  }..  /* max
d220: 4c 6f 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78  Local is the max
d230: 69 6d 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70  imum amount of p
d240: 61 79 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20  ayload to store 
d250: 6c 6f 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a  locally for.  **
d260: 20 61 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73   a cell.  Make s
d270: 75 72 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20  ure it is small 
d280: 65 6e 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61  enough so that a
d290: 74 20 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75  t least minFanou
d2a0: 74 0a 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e  t.  ** cells can
d2b0: 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65   will fit on one
d2c0: 20 70 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d   page.  We assum
d2d0: 65 20 61 20 31 30 2d 62 79 74 65 20 70 61 67 65  e a 10-byte page
d2e0: 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65   header..  ** Be
d2f0: 73 69 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61  sides the payloa
d300: 64 2c 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74  d, the cell must
d310: 20 73 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20   store:.  **    
d320: 20 32 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20   2-byte pointer 
d330: 74 6f 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a  to the cell.  **
d340: 20 20 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c       4-byte chil
d350: 64 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20  d pointer.  **  
d360: 20 20 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76     9-byte nKey v
d370: 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d  alue.  **     4-
d380: 62 79 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65  byte nData value
d390: 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
d3a0: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   overflow page p
d3b0: 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61  ointer.  ** So a
d3c0: 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f   cell consists o
d3d0: 66 20 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 65  f a 2-byte poine
d3e0: 72 2c 20 61 20 68 65 61 64 65 72 20 77 68 69 63  r, a header whic
d3f0: 68 20 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a  h is as much as.
d400: 20 20 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f    ** 17 bytes lo
d410: 6e 67 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73  ng, 0 to N bytes
d420: 20 6f 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64   of payload, and
d430: 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62   an optional 4 b
d440: 79 74 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a  yte overflow.  *
d450: 2a 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a  * page pointer..
d460: 20 20 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c    */.  pBt->maxL
d470: 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61  ocal = (pBt->usa
d480: 62 6c 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32  bleSize-12)*64/2
d490: 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e  55 - 23;.  pBt->
d4a0: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d  minLocal = (pBt-
d4b0: 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a  >usableSize-12)*
d4c0: 33 32 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70  32/255 - 23;.  p
d4d0: 42 74 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 70 42  Bt->maxLeaf = pB
d4e0: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
d4f0: 33 35 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65  35;.  pBt->minLe
d500: 61 66 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c  af = (pBt->usabl
d510: 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35  eSize-12)*32/255
d520: 20 2d 20 32 33 3b 0a 20 20 69 66 28 20 70 42 74   - 23;.  if( pBt
d530: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3e 70 42 74 2d 3e  ->minLocal>pBt->
d540: 6d 61 78 4c 6f 63 61 6c 20 7c 7c 20 70 42 74 2d  maxLocal || pBt-
d550: 3e 6d 61 78 4c 6f 63 61 6c 3c 30 20 29 7b 0a 20  >maxLocal<0 ){. 
d560: 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
d570: 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 7d 0a 20  it_failed;.  }. 
d580: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 6d 61   assert( pBt->ma
d590: 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58  xLeaf + 23 <= MX
d5a0: 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20  _CELL_SIZE(pBt) 
d5b0: 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61 67 65 31  );.  pBt->pPage1
d5c0: 20 3d 20 70 50 61 67 65 31 3b 0a 20 20 72 65 74   = pPage1;.  ret
d5d0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
d5e0: 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
d5f0: 64 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  d:.  releasePage
d600: 28 70 50 61 67 65 31 29 3b 0a 20 20 70 42 74 2d  (pPage1);.  pBt-
d610: 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 72  >pPage1 = 0;.  r
d620: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
d630: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
d640: 77 6f 72 6b 73 20 6c 69 6b 65 20 6c 6f 63 6b 42  works like lockB
d650: 74 72 65 65 28 29 20 65 78 63 65 70 74 20 74 68  tree() except th
d660: 61 74 20 69 74 20 61 6c 73 6f 20 69 6e 76 6f 6b  at it also invok
d670: 65 73 20 74 68 65 0a 2a 2a 20 62 75 73 79 20 63  es the.** busy c
d680: 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 72 65  allback if there
d690: 20 69 73 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74   is lock content
d6a0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
d6b0: 6e 74 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68  nt lockBtreeWith
d6c0: 52 65 74 72 79 28 42 74 72 65 65 20 2a 70 52 65  Retry(Btree *pRe
d6d0: 66 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  f){.  int rc = S
d6e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73  QLITE_OK;..  ass
d6f0: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
d700: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 52 65 66  eHoldsMutex(pRef
d710: 29 20 29 3b 0a 20 20 69 66 28 20 70 52 65 66 2d  ) );.  if( pRef-
d720: 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
d730: 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 75 38 20 69  NONE ){.    u8 i
d740: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70  nTransaction = p
d750: 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e  Ref->pBt->inTran
d760: 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20 62 74 72  saction;.    btr
d770: 65 65 49 6e 74 65 67 72 69 74 79 28 70 52 65 66  eeIntegrity(pRef
d780: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
d790: 74 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61  te3BtreeBeginTra
d7a0: 6e 73 28 70 52 65 66 2c 20 30 29 3b 0a 20 20 20  ns(pRef, 0);.   
d7b0: 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72   pRef->pBt->inTr
d7c0: 61 6e 73 61 63 74 69 6f 6e 20 3d 20 69 6e 54 72  ansaction = inTr
d7d0: 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20 70  ansaction;.    p
d7e0: 52 65 66 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54  Ref->inTrans = T
d7f0: 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 69  RANS_NONE;.    i
d800: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
d810: 20 29 7b 0a 20 20 20 20 20 20 70 52 65 66 2d 3e   ){.      pRef->
d820: 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
d830: 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62  n--;.    }.    b
d840: 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 52  treeIntegrity(pR
d850: 65 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ef);.  }.  retur
d860: 6e 20 72 63 3b 0a 7d 0a 20 20 20 20 20 20 20 0a  n rc;.}.       .
d870: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  ./*.** If there 
d880: 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
d890: 6e 67 20 63 75 72 73 6f 72 73 20 61 6e 64 20 77  ng cursors and w
d8a0: 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65  e are not in the
d8b0: 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20   middle.** of a 
d8c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 75 74 20  transaction but 
d8d0: 74 68 65 72 65 20 69 73 20 61 20 72 65 61 64 20  there is a read 
d8e0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
d8f0: 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68  base, then.** th
d900: 69 73 20 72 6f 75 74 69 6e 65 20 75 6e 72 65 66  is routine unref
d910: 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  s the first page
d920: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
d930: 20 66 69 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20   file which .** 
d940: 68 61 73 20 74 68 65 20 65 66 66 65 63 74 20 6f  has the effect o
d950: 66 20 72 65 6c 65 61 73 69 6e 67 20 74 68 65 20  f releasing the 
d960: 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a  read lock..**.**
d970: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   If there are an
d980: 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 63 75  y outstanding cu
d990: 72 73 6f 72 73 2c 20 74 68 69 73 20 72 6f 75 74  rsors, this rout
d9a0: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
d9b0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69  **.** If there i
d9c0: 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
d9d0: 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 74 68 69  in progress, thi
d9e0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
d9f0: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
da00: 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65  void unlockBtree
da10: 49 66 55 6e 75 73 65 64 28 42 74 53 68 61 72 65  IfUnused(BtShare
da20: 64 20 2a 70 42 74 29 7b 0a 20 20 61 73 73 65 72  d *pBt){.  asser
da30: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
da40: 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
da50: 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e  ) );.  if( pBt->
da60: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54  inTransaction==T
da70: 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74  RANS_NONE && pBt
da80: 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 20 26 26 20  ->pCursor==0 && 
da90: 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29  pBt->pPage1!=0 )
daa0: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
dab0: 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70  3PagerRefcount(p
dac0: 42 74 2d 3e 70 50 61 67 65 72 29 3e 3d 31 20 29  Bt->pPager)>=1 )
dad0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
dae0: 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
daf0: 74 61 20 29 3b 0a 23 69 66 20 30 0a 20 20 20 20  ta );.#if 0.    
db00: 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65    if( pBt->pPage
db10: 31 2d 3e 61 44 61 74 61 3d 3d 30 20 29 7b 0a 20  1->aData==0 ){. 
db20: 20 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a         MemPage *
db30: 70 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 50 61  pPage = pBt->pPa
db40: 67 65 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61  ge1;.        pPa
db50: 67 65 2d 3e 61 44 61 74 61 20 3d 20 73 71 6c 69  ge->aData = sqli
db60: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
db70: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
db80: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e  .        pPage->
db90: 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 20 20 20  pBt = pBt;.     
dba0: 20 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d     pPage->pgno =
dbb0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   1;.      }.#end
dbc0: 69 66 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  if.      release
dbd0: 50 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 31  Page(pBt->pPage1
dbe0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42 74  );.    }.    pBt
dbf0: 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a 20 20  ->pPage1 = 0;.  
dc00: 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20    pBt->inStmt = 
dc10: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
dc20: 43 72 65 61 74 65 20 61 20 6e 65 77 20 64 61 74  Create a new dat
dc30: 61 62 61 73 65 20 62 79 20 69 6e 69 74 69 61 6c  abase by initial
dc40: 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  izing the first 
dc50: 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66  page of the.** f
dc60: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
dc70: 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65 28 42  nt newDatabase(B
dc80: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
dc90: 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20   MemPage *pP1;. 
dca0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
dcb0: 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  data;.  int rc;.
dcc0: 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20    int nPage;..  
dcd0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
dce0: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
dcf0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d  mutex) );.  rc =
dd00: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
dd10: 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67  ecount(pBt->pPag
dd20: 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 69  er, &nPage);.  i
dd30: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
dd40: 20 7c 7c 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20   || nPage>0 ){. 
dd50: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
dd60: 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70  }.  pP1 = pBt->p
dd70: 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74 28  Page1;.  assert(
dd80: 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61 74   pP1!=0 );.  dat
dd90: 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a  a = pP1->aData;.
dda0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
ddb0: 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70 44  gerWrite(pP1->pD
ddc0: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
ddd0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
dde0: 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d 61  memcpy(data, zMa
ddf0: 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65 6f  gicHeader, sizeo
de00: 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29 29  f(zMagicHeader))
de10: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ;.  assert( size
de20: 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29  of(zMagicHeader)
de30: 3d 3d 31 36 20 29 3b 0a 20 20 70 75 74 32 62 79  ==16 );.  put2by
de40: 74 65 28 26 64 61 74 61 5b 31 36 5d 2c 20 70 42  te(&data[16], pB
de50: 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  t->pageSize);.  
de60: 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20  data[18] = 1;.  
de70: 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20  data[19] = 1;.  
de80: 64 61 74 61 5b 32 30 5d 20 3d 20 70 42 74 2d 3e  data[20] = pBt->
de90: 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e  pageSize - pBt->
dea0: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61  usableSize;.  da
deb0: 74 61 5b 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64  ta[21] = 64;.  d
dec0: 61 74 61 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20  ata[22] = 32;.  
ded0: 64 61 74 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20  data[23] = 32;. 
dee0: 20 6d 65 6d 73 65 74 28 26 64 61 74 61 5b 32 34   memset(&data[24
def0: 5d 2c 20 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20  ], 0, 100-24);. 
df00: 20 7a 65 72 6f 50 61 67 65 28 70 50 31 2c 20 50   zeroPage(pP1, P
df10: 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
df20: 41 46 7c 50 54 46 5f 4c 45 41 46 44 41 54 41 20  AF|PTF_LEAFDATA 
df30: 29 3b 0a 20 20 70 42 74 2d 3e 70 61 67 65 53 69  );.  pBt->pageSi
df40: 7a 65 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66  zeFixed = 1;.#if
df50: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
df60: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 61 73  _AUTOVACUUM.  as
df70: 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
df80: 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d  acuum==1 || pBt-
df90: 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29  >autoVacuum==0 )
dfa0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
dfb0: 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c  >incrVacuum==1 |
dfc0: 7c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  | pBt->incrVacuu
dfd0: 6d 3d 3d 30 20 29 3b 0a 20 20 70 75 74 34 62 79  m==0 );.  put4by
dfe0: 74 65 28 26 64 61 74 61 5b 33 36 20 2b 20 34 2a  te(&data[36 + 4*
dff0: 34 5d 2c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  4], pBt->autoVac
e000: 75 75 6d 29 3b 0a 20 20 70 75 74 34 62 79 74 65  uum);.  put4byte
e010: 28 26 64 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d  (&data[36 + 7*4]
e020: 2c 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75  , pBt->incrVacuu
e030: 6d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  m);.#endif.  ret
e040: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
e050: 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ../*.** Attempt 
e060: 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 74  to start a new t
e070: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 77 72  ransaction. A wr
e080: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a  ite-transaction.
e090: 2a 2a 20 69 73 20 73 74 61 72 74 65 64 20 69 66  ** is started if
e0a0: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
e0b0: 6d 65 6e 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c  ment is nonzero,
e0c0: 20 6f 74 68 65 72 77 69 73 65 20 61 20 72 65 61   otherwise a rea
e0d0: 64 2d 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  d-.** transactio
e0e0: 6e 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e  n.  If the secon
e0f0: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 32 20  d argument is 2 
e100: 6f 72 20 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c  or more and excl
e110: 75 73 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63  usive.** transac
e120: 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64 2c  tion is started,
e130: 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f   meaning that no
e140: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
e150: 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
e160: 61 63 63 65 73 73 20 74 68 65 20 64 61 74 61 62  access the datab
e170: 61 73 65 2e 20 20 41 20 70 72 65 65 78 69 73 74  ase.  A preexist
e180: 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ing transaction 
e190: 6d 61 79 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70  may not be.** up
e1a0: 67 72 61 64 65 64 20 74 6f 20 65 78 63 6c 75 73  graded to exclus
e1b0: 69 76 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ive by calling t
e1c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 20 73 65  his routine a se
e1d0: 63 6f 6e 64 20 74 69 6d 65 20 2d 20 74 68 65 0a  cond time - the.
e1e0: 2a 2a 20 65 78 63 6c 75 73 69 76 69 74 79 20 66  ** exclusivity f
e1f0: 6c 61 67 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66  lag only works f
e200: 6f 72 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  or a new transac
e210: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72  tion..**.** A wr
e220: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
e230: 6d 75 73 74 20 62 65 20 73 74 61 72 74 65 64 20  must be started 
e240: 62 65 66 6f 72 65 20 61 74 74 65 6d 70 74 69 6e  before attemptin
e250: 67 20 61 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65  g any .** change
e260: 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
e270: 65 2e 20 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20  e.  None of the 
e280: 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e  following routin
e290: 65 73 20 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b  es .** will work
e2a0: 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61   unless a transa
e2b0: 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
e2c0: 20 66 69 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20   first:.**.**   
e2d0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
e2e0: 72 65 61 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20  reateTable().** 
e2f0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
e300: 65 43 72 65 61 74 65 49 6e 64 65 78 28 29 0a 2a  eCreateIndex().*
e310: 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  *      sqlite3Bt
e320: 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 29 0a  reeClearTable().
e330: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
e340: 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 29 0a  treeDropTable().
e350: 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  **      sqlite3B
e360: 74 72 65 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20  treeInsert().** 
e370: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
e380: 65 44 65 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20  eDelete().**    
e390: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70    sqlite3BtreeUp
e3a0: 64 61 74 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a  dateMeta().**.**
e3b0: 20 49 66 20 61 6e 20 69 6e 69 74 69 61 6c 20 61   If an initial a
e3c0: 74 74 65 6d 70 74 20 74 6f 20 61 63 71 75 69 72  ttempt to acquir
e3d0: 65 20 74 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73  e the lock fails
e3e0: 20 62 65 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b   because of lock
e3f0: 20 63 6f 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61   contention.** a
e400: 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nd the database 
e410: 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 75  was previously u
e420: 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e  nlocked, then in
e430: 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
e440: 6e 64 6c 65 72 0a 2a 2a 20 69 66 20 74 68 65 72  ndler.** if ther
e450: 65 20 69 73 20 6f 6e 65 2e 20 20 42 75 74 20 69  e is one.  But i
e460: 66 20 74 68 65 72 65 20 77 61 73 20 70 72 65 76  f there was prev
e470: 69 6f 75 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f  iously a read-lo
e480: 63 6b 2c 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e  ck, do not.** in
e490: 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61  voke the busy ha
e4a0: 6e 64 6c 65 72 20 2d 20 6a 75 73 74 20 72 65 74  ndler - just ret
e4b0: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
e4c0: 20 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73    SQLITE_BUSY is
e4d0: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 77 68   .** returned wh
e4e0: 65 6e 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  en there is alre
e4f0: 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
e500: 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 76 6f 69  in order to avoi
e510: 64 20 61 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a  d a deadlock..**
e520: 0a 2a 2a 20 53 75 70 70 6f 73 65 20 74 68 65 72  .** Suppose ther
e530: 65 20 61 72 65 20 74 77 6f 20 70 72 6f 63 65 73  e are two proces
e540: 73 65 73 20 41 20 61 6e 64 20 42 2e 20 20 41 20  ses A and B.  A 
e550: 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20  has a read lock 
e560: 61 6e 64 20 42 20 68 61 73 0a 2a 2a 20 61 20 72  and B has.** a r
e570: 65 73 65 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42  eserved lock.  B
e580: 20 74 72 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74   tries to promot
e590: 65 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62  e to exclusive b
e5a0: 75 74 20 69 73 20 62 6c 6f 63 6b 65 64 20 62 65  ut is blocked be
e5b0: 63 61 75 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20  cause.** of A's 
e5c0: 72 65 61 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72  read lock.  A tr
e5d0: 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
e5e0: 6f 20 72 65 73 65 72 76 65 64 20 62 75 74 20 69  o reserved but i
e5f0: 73 20 62 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a  s blocked by B..
e600: 2a 2a 20 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74  ** One or the ot
e610: 68 65 72 20 6f 66 20 74 68 65 20 74 77 6f 20 70  her of the two p
e620: 72 6f 63 65 73 73 65 73 20 6d 75 73 74 20 67 69  rocesses must gi
e630: 76 65 20 77 61 79 20 6f 72 20 74 68 65 72 65 20  ve way or there 
e640: 63 61 6e 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f  can be.** no pro
e650: 67 72 65 73 73 2e 20 20 42 79 20 72 65 74 75 72  gress.  By retur
e660: 6e 69 6e 67 20 53 51 4c 49 54 45 5f 42 55 53 59  ning SQLITE_BUSY
e670: 20 61 6e 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e   and not invokin
e680: 67 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  g the busy callb
e690: 61 63 6b 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c  ack.** when A al
e6a0: 72 65 61 64 79 20 68 61 73 20 61 20 72 65 61 64  ready has a read
e6b0: 20 6c 6f 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72   lock, we encour
e6c0: 61 67 65 20 41 20 74 6f 20 67 69 76 65 20 75 70  age A to give up
e6d0: 20 61 6e 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72   and let B.** pr
e6e0: 6f 63 65 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  oceed..*/.int sq
e6f0: 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e 54  lite3BtreeBeginT
e700: 72 61 6e 73 28 42 74 72 65 65 20 2a 70 2c 20 69  rans(Btree *p, i
e710: 6e 74 20 77 72 66 6c 61 67 29 7b 0a 20 20 42 74  nt wrflag){.  Bt
e720: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
e730: 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d  >pBt;.  int rc =
e740: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73   SQLITE_OK;..  s
e750: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
e760: 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d  (p);.  pBt->db =
e770: 20 70 2d 3e 64 62 3b 0a 20 20 62 74 72 65 65 49   p->db;.  btreeI
e780: 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20  ntegrity(p);..  
e790: 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20  /* If the btree 
e7a0: 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20  is already in a 
e7b0: 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
e7c0: 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73  n, or it.  ** is
e7d0: 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65   already in a re
e7e0: 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ad-transaction a
e7f0: 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61  nd a read-transa
e800: 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65  ction.  ** is re
e810: 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73  quested, this is
e820: 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
e830: 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
e840: 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20  =TRANS_WRITE || 
e850: 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41  (p->inTrans==TRA
e860: 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c  NS_READ && !wrfl
e870: 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ag) ){.    goto 
e880: 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d  trans_begun;.  }
e890: 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61  ..  /* Write tra
e8a0: 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f  nsactions are no
e8b0: 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20  t possible on a 
e8c0: 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61  read-only databa
e8d0: 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  se */.  if( pBt-
e8e0: 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 66  >readOnly && wrf
e8f0: 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  lag ){.    rc = 
e900: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
e910: 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f  .    goto trans_
e920: 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  begun;.  }..  /*
e930: 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61   If another data
e940: 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20  base handle has 
e950: 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61  already opened a
e960: 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
e970: 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73  on .  ** on this
e980: 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74   shared-btree st
e990: 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65  ructure and a se
e9a0: 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73  cond write trans
e9b0: 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72  action is.  ** r
e9c0: 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e  equested, return
e9d0: 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20   SQLITE_BUSY..  
e9e0: 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e  */.  if( pBt->in
e9f0: 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
ea00: 4e 53 5f 57 52 49 54 45 20 26 26 20 77 72 66 6c  NS_WRITE && wrfl
ea10: 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  ag ){.    rc = S
ea20: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
ea30: 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
ea40: 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
ea50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
ea60: 44 5f 43 41 43 48 45 0a 20 20 69 66 28 20 77 72  D_CACHE.  if( wr
ea70: 66 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 42 74  flag>1 ){.    Bt
ea80: 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20  Lock *pIter;.   
ea90: 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d 3e   for(pIter=pBt->
eaa0: 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70 49  pLock; pIter; pI
eab0: 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74  ter=pIter->pNext
eac0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
ead0: 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 29 7b  er->pBtree!=p ){
eae0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
eaf0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
eb00: 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65     goto trans_be
eb10: 67 75 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  gun;.      }.   
eb20: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
eb30: 20 64 6f 20 7b 0a 20 20 20 20 69 66 28 20 70 42   do {.    if( pB
eb40: 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a  t->pPage1==0 ){.
eb50: 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
eb60: 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65    rc = lockBtree
eb70: 28 70 42 74 29 3b 0a 20 20 20 20 20 20 7d 77 68  (pBt);.      }wh
eb80: 69 6c 65 28 20 70 42 74 2d 3e 70 50 61 67 65 31  ile( pBt->pPage1
eb90: 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  ==0 && rc==SQLIT
eba0: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 7d 0a 0a 20  E_OK );.    }.. 
ebb0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
ebc0: 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61 67 20 29  E_OK && wrflag )
ebd0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  {.      if( pBt-
ebe0: 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
ebf0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
ec00: 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20  _READONLY;.     
ec10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
ec20: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
ec30: 72 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67  rBegin(pBt->pPag
ec40: 65 31 2d 3e 70 44 62 50 61 67 65 2c 20 77 72 66  e1->pDbPage, wrf
ec50: 6c 61 67 3e 31 29 3b 0a 20 20 20 20 20 20 20 20  lag>1);.        
ec60: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
ec70: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
ec80: 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28  c = newDatabase(
ec90: 70 42 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pBt);.        }.
eca0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ecb0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
ecc0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
ecd0: 69 66 28 20 77 72 66 6c 61 67 20 29 20 70 42 74  if( wrflag ) pBt
ece0: 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
ecf0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
ed00: 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
ed10: 65 64 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20  ed(pBt);.    }. 
ed20: 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c   }while( rc==SQL
ed30: 49 54 45 5f 42 55 53 59 20 26 26 20 70 42 74 2d  ITE_BUSY && pBt-
ed40: 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
ed50: 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20  TRANS_NONE &&.  
ed60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
ed70: 74 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61  treeInvokeBusyHa
ed80: 6e 64 6c 65 72 28 70 42 74 2c 20 30 29 20 29 3b  ndler(pBt, 0) );
ed90: 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
eda0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
edb0: 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
edc0: 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20  NS_NONE ){.     
edd0: 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69   pBt->nTransacti
ede0: 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  on++;.    }.    
edf0: 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77 72  p->inTrans = (wr
ee00: 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54 45  flag?TRANS_WRITE
ee10: 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20  :TRANS_READ);.  
ee20: 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
ee30: 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74  >pBt->inTransact
ee40: 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ion ){.      pBt
ee50: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
ee60: 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20  = p->inTrans;.  
ee70: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
ee80: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
ee90: 41 43 48 45 0a 20 20 20 20 69 66 28 20 77 72 66  ACHE.    if( wrf
eea0: 6c 61 67 3e 31 20 29 7b 0a 20 20 20 20 20 20 61  lag>1 ){.      a
eeb0: 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 45 78  ssert( !pBt->pEx
eec0: 63 6c 75 73 69 76 65 20 29 3b 0a 20 20 20 20 20  clusive );.     
eed0: 20 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65   pBt->pExclusive
eee0: 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 23 65 6e 64   = p;.    }.#end
eef0: 69 66 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62  if.  }...trans_b
ef00: 65 67 75 6e 3a 0a 20 20 62 74 72 65 65 49 6e 74  egun:.  btreeInt
ef10: 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c  egrity(p);.  sql
ef20: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
ef30: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
ef40: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
ef50: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
ef60: 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  M../*.** Set the
ef70: 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
ef80: 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69  ries for all chi
ef90: 6c 64 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50  ldren of page pP
efa0: 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a  age. Also, if.**
efb0: 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
efc0: 63 65 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74  cells that point
efd0: 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   to overflow pag
efe0: 65 73 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e  es, set the poin
eff0: 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69  ter.** map entri
f000: 65 73 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66  es for the overf
f010: 6c 6f 77 20 70 61 67 65 73 20 61 73 20 77 65 6c  low pages as wel
f020: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
f030: 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
f040: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
f050: 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
f060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f070: 20 20 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65         /* Counte
f080: 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20  r variable */.  
f090: 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20  int nCell;      
f0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
f0c0: 63 65 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50  cells in page pP
f0d0: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  age */.  int rc;
f0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
f100: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
f110: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
f120: 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e  pPage->pBt;.  in
f130: 74 20 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70  t isInitOrig = p
f140: 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20  Page->isInit;.  
f150: 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67  Pgno pgno = pPag
f160: 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65  e->pgno;..  asse
f170: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
f180: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
f190: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
f1a0: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
f1b0: 49 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20  InitPage(pPage, 
f1c0: 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 29 3b  pPage->pParent);
f1d0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
f1e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
f1f0: 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61   set_child_ptrma
f200: 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43  ps_out;.  }.  nC
f210: 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ell = pPage->nCe
f220: 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ll;..  for(i=0; 
f230: 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
f240: 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66     u8 *pCell = f
f250: 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
f260: 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72  );..    rc = ptr
f270: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50  mapPutOvflPtr(pP
f280: 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20  age, pCell);.   
f290: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f2a0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
f2b0: 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61   set_child_ptrma
f2c0: 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20  ps_out;.    }.. 
f2d0: 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
f2e0: 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  eaf ){.      Pgn
f2f0: 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65  o childPgno = ge
f300: 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20  t4byte(pCell);. 
f310: 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
f320: 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67  Put(pBt, childPg
f330: 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45  no, PTRMAP_BTREE
f340: 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  , pgno);.       
f350: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
f360: 4b 20 29 20 67 6f 74 6f 20 73 65 74 5f 63 68 69  K ) goto set_chi
f370: 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a  ld_ptrmaps_out;.
f380: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
f390: 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
f3a0: 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64 50  .    Pgno childP
f3b0: 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26  gno = get4byte(&
f3c0: 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
f3d0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
f3e0: 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d  );.    rc = ptrm
f3f0: 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64  apPut(pBt, child
f400: 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  Pgno, PTRMAP_BTR
f410: 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a  EE, pgno);.  }..
f420: 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70  set_child_ptrmap
f430: 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e  s_out:.  pPage->
f440: 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f  isInit = isInitO
f450: 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  rig;.  return rc
f460: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77  ;.}../*.** Somew
f470: 68 65 72 65 20 6f 6e 20 70 50 61 67 65 2c 20 77  here on pPage, w
f480: 68 69 63 68 20 69 73 20 67 75 61 72 65 6e 74 65  hich is guarente
f490: 65 64 20 74 6f 20 62 65 20 61 20 62 74 72 65 65  ed to be a btree
f4a0: 20 70 61 67 65 2c 20 6e 6f 74 20 61 6e 20 6f 76   page, not an ov
f4b0: 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 2c 20  erflow.** page, 
f4c0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
f4d0: 70 61 67 65 20 69 46 72 6f 6d 2e 20 4d 6f 64 69  page iFrom. Modi
f4e0: 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72 20  fy this pointer 
f4f0: 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74  so that it point
f500: 73 20 74 6f 0a 2a 2a 20 69 54 6f 2e 20 50 61 72  s to.** iTo. Par
f510: 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65 73  ameter eType des
f520: 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65 20  cribes the type 
f530: 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 20 62 65  of pointer to be
f540: 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 0a 2a   modified, as .*
f550: 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  * follows:.**.**
f560: 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20 20   PTRMAP_BTREE:  
f570: 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62 74     pPage is a bt
f580: 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f  ree-page. The po
f590: 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20  inter points at 
f5a0: 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20  a child .**     
f5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61                pa
f5c0: 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a  ge of pPage..**.
f5d0: 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  ** PTRMAP_OVERFL
f5e0: 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61 20  OW1: pPage is a 
f5f0: 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
f600: 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
f610: 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  t an overflow.**
f620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f630: 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64 20     page pointed 
f640: 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68 65  to by one of the
f650: 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e   cells on pPage.
f660: 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56  .**.** PTRMAP_OV
f670: 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20 69  ERFLOW2: pPage i
f680: 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61  s an overflow-pa
f690: 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72 20  ge. The pointer 
f6a0: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e 65  points at the ne
f6b0: 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  xt.**           
f6c0: 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f 77          overflow
f6d0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69 73   page in the lis
f6e0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
f6f0: 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74   modifyPagePoint
f700: 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  er(MemPage *pPag
f710: 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50  e, Pgno iFrom, P
f720: 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79 70  gno iTo, u8 eTyp
f730: 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  e){.  assert( sq
f740: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
f750: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
f760: 65 78 29 20 29 3b 0a 20 20 69 66 28 20 65 54 79  ex) );.  if( eTy
f770: 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
f780: 4c 4f 57 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54  LOW2 ){.    /* T
f790: 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20 61 6c  he pointer is al
f7a0: 77 61 79 73 20 74 68 65 20 66 69 72 73 74 20 34  ways the first 4
f7b0: 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 70 61   bytes of the pa
f7c0: 67 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ge in this case.
f7d0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 67 65 74    */.    if( get
f7e0: 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61  4byte(pPage->aDa
f7f0: 74 61 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  ta)!=iFrom ){.  
f800: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f810: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
f820: 20 20 20 20 7d 0a 20 20 20 20 70 75 74 34 62 79      }.    put4by
f830: 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c  te(pPage->aData,
f840: 20 69 54 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a   iTo);.  }else{.
f850: 20 20 20 20 69 6e 74 20 69 73 49 6e 69 74 4f 72      int isInitOr
f860: 69 67 20 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e  ig = pPage->isIn
f870: 69 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  it;.    int i;. 
f880: 20 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20     int nCell;.. 
f890: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49     sqlite3BtreeI
f8a0: 6e 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 30  nitPage(pPage, 0
f8b0: 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20 70  );.    nCell = p
f8c0: 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a 20 20  Page->nCell;..  
f8d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
f8e0: 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
f8f0: 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e 64  u8 *pCell = find
f900: 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a  Cell(pPage, i);.
f910: 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d        if( eType=
f920: 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
f930: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43 65 6c  1 ){.        Cel
f940: 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
f950: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
f960: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
f970: 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
f980: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
f990: 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20 29 7b  nfo.iOverflow ){
f9a0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
f9b0: 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65 28 26  From==get4byte(&
f9c0: 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
f9d0: 66 6c 6f 77 5d 29 20 29 7b 0a 20 20 20 20 20 20  flow]) ){.      
f9e0: 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
f9f0: 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72  pCell[info.iOver
fa00: 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20 20 20  flow], iTo);.   
fa10: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
fa20: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
fa30: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
fa40: 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 67  e{.        if( g
fa50: 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3d 3d  et4byte(pCell)==
fa60: 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20 20 20  iFrom ){.       
fa70: 20 20 20 70 75 74 34 62 79 74 65 28 70 43 65 6c     put4byte(pCel
fa80: 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20  l, iTo);.       
fa90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
faa0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
fab0: 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69 3d 3d  }.  .    if( i==
fac0: 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69  nCell ){.      i
fad0: 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50  f( eType!=PTRMAP
fae0: 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20 20 20  _BTREE || .     
faf0: 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70       get4byte(&p
fb00: 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
fb10: 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
fb20: 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  !=iFrom ){.     
fb30: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fb40: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
fb50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 75 74       }.      put
fb60: 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
fb70: 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
fb80: 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b 0a 20  fset+8], iTo);. 
fb90: 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 2d     }..    pPage-
fba0: 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74  >isInit = isInit
fbb0: 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Orig;.  }.  retu
fbc0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
fbd0: 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
fbe0: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 70   open database p
fbf0: 61 67 65 20 70 44 62 50 61 67 65 20 74 6f 20 6c  age pDbPage to l
fc00: 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50 61 67  ocation iFreePag
fc10: 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64 61 74  e in the .** dat
fc20: 61 62 61 73 65 2e 20 54 68 65 20 70 44 62 50 61  abase. The pDbPa
fc30: 67 65 20 72 65 66 65 72 65 6e 63 65 20 72 65 6d  ge reference rem
fc40: 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2f 0a 73  ains valid..*/.s
fc50: 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f 63 61  tatic int reloca
fc60: 74 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  tePage(.  BtShar
fc70: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
fc80: 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f 0a 20     /* Btree */. 
fc90: 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50 61 67   MemPage *pDbPag
fca0: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65  e,        /* Ope
fcb0: 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20 2a  n page to move *
fcc0: 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20  /.  u8 eType,   
fcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fce0: 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74 79 70  Pointer map 'typ
fcf0: 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70 44 62  e' entry for pDb
fd00: 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69  Page */.  Pgno i
fd10: 50 74 72 50 61 67 65 2c 20 20 20 20 20 20 20 20  PtrPage,        
fd20: 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61     /* Pointer ma
fd30: 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e 74 72  p 'page-no' entr
fd40: 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a 2f  y for pDbPage */
fd50: 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67  .  Pgno iFreePag
fd60: 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  e           /* T
fd70: 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20 6d  he location to m
fd80: 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f 20 2a  ove pDbPage to *
fd90: 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  /.){.  MemPage *
fda0: 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20 54  pPtrPage;   /* T
fdb0: 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
fdc0: 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72 20  tains a pointer 
fdd0: 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20 20  to pDbPage */.  
fde0: 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20 70  Pgno iDbPage = p
fdf0: 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20  DbPage->pgno;.  
fe00: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
fe10: 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pBt->pPager;.  i
fe20: 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74  nt rc;..  assert
fe30: 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
fe40: 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54 79  OVERFLOW2 || eTy
fe50: 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
fe60: 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20 65  LOW1 || .      e
fe70: 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54 52  Type==PTRMAP_BTR
fe80: 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  EE || eType==PTR
fe90: 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b 0a  MAP_ROOTPAGE );.
fea0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
feb0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
fec0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
fed0: 73 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e 70  sert( pDbPage->p
fee0: 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f 2a  Bt==pBt );..  /*
fef0: 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50 61   Move page iDbPa
ff00: 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72 72  ge from its curr
ff10: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f 20  ent location to 
ff20: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72 65  page number iFre
ff30: 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43 45  ePage */.  TRACE
ff40: 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20 4d  (("AUTOVACUUM: M
ff50: 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65 65  oving %d to free
ff60: 20 70 61 67 65 20 25 64 20 28 70 74 72 20 70 61   page %d (ptr pa
ff70: 67 65 20 25 64 20 74 79 70 65 20 25 64 29 5c 6e  ge %d type %d)\n
ff80: 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61 67  ", .      iDbPag
ff90: 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69 50  e, iFreePage, iP
ffa0: 74 72 50 61 67 65 2c 20 65 54 79 70 65 29 29 3b  trPage, eType));
ffb0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
ffc0: 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50 61  agerMovepage(pPa
ffd0: 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70 44  ger, pDbPage->pD
ffe0: 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67 65  bPage, iFreePage
fff0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
10000 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
10010 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70  turn rc;.  }.  p
10020 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 69  DbPage->pgno = i
10030 46 72 65 65 50 61 67 65 3b 0a 0a 20 20 2f 2a 20  FreePage;..  /* 
10040 49 66 20 70 44 62 50 61 67 65 20 77 61 73 20 61  If pDbPage was a
10050 20 62 74 72 65 65 2d 70 61 67 65 2c 20 74 68 65   btree-page, the
10060 6e 20 69 74 20 6d 61 79 20 68 61 76 65 20 63 68  n it may have ch
10070 69 6c 64 20 70 61 67 65 73 20 61 6e 64 2f 6f 72  ild pages and/or
10080 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74 68 61 74   cells.  ** that
10090 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c   point to overfl
100a0 6f 77 20 70 61 67 65 73 2e 20 54 68 65 20 70 6f  ow pages. The po
100b0 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
100c0 73 20 66 6f 72 20 61 6c 6c 20 74 68 65 73 65 0a  s for all these.
100d0 20 20 2a 2a 20 70 61 67 65 73 20 6e 65 65 64 20    ** pages need 
100e0 74 6f 20 62 65 20 63 68 61 6e 67 65 64 2e 0a 20  to be changed.. 
100f0 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 44 62 50   **.  ** If pDbP
10100 61 67 65 20 69 73 20 61 6e 20 6f 76 65 72 66 6c  age is an overfl
10110 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ow page, then th
10120 65 20 66 69 72 73 74 20 34 20 62 79 74 65 73 20  e first 4 bytes 
10130 6d 61 79 20 73 74 6f 72 65 20 61 0a 20 20 2a 2a  may store a.  **
10140 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 75   pointer to a su
10150 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
10160 77 20 70 61 67 65 2e 20 49 66 20 74 68 69 73 20  w page. If this 
10170 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 65  is the case, the
10180 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74  n.  ** the point
10190 65 72 20 6d 61 70 20 6e 65 65 64 73 20 74 6f 20  er map needs to 
101a0 62 65 20 75 70 64 61 74 65 64 20 66 6f 72 20 74  be updated for t
101b0 68 65 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76  he subsequent ov
101c0 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 2a  erflow page..  *
101d0 2f 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50  /.  if( eType==P
101e0 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
101f0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
10200 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72 63 20  TPAGE ){.    rc 
10210 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70  = setChildPtrmap
10220 73 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  s(pDbPage);.    
10230 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10240 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
10250 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  n rc;.    }.  }e
10260 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 65  lse{.    Pgno ne
10270 78 74 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74  xtOvfl = get4byt
10280 65 28 70 44 62 50 61 67 65 2d 3e 61 44 61 74 61  e(pDbPage->aData
10290 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 78 74 4f  );.    if( nextO
102a0 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  vfl!=0 ){.      
102b0 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70  rc = ptrmapPut(p
102c0 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c 20 50 54  Bt, nextOvfl, PT
102d0 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 2c 20  RMAP_OVERFLOW2, 
102e0 69 46 72 65 65 50 61 67 65 29 3b 0a 20 20 20 20  iFreePage);.    
102f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10300 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
10310 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
10320 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
10330 2a 20 46 69 78 20 74 68 65 20 64 61 74 61 62 61  * Fix the databa
10340 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e 20 70 61  se pointer on pa
10350 67 65 20 69 50 74 72 50 61 67 65 20 74 68 61 74  ge iPtrPage that
10360 20 70 6f 69 6e 74 65 64 20 61 74 20 69 44 62 50   pointed at iDbP
10370 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  age so.  ** that
10380 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 69 46   it points at iF
10390 72 65 65 50 61 67 65 2e 20 41 6c 73 6f 20 66 69  reePage. Also fi
103a0 78 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  x the pointer ma
103b0 70 20 65 6e 74 72 79 20 66 6f 72 0a 20 20 2a 2a  p entry for.  **
103c0 20 69 50 74 72 50 61 67 65 2e 0a 20 20 2a 2f 0a   iPtrPage..  */.
103d0 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
103e0 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
103f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10400 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
10410 2c 20 69 50 74 72 50 61 67 65 2c 20 26 70 50 74  , iPtrPage, &pPt
10420 72 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69  rPage, 0);.    i
10430 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10440 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
10450 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
10460 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
10470 57 72 69 74 65 28 70 50 74 72 50 61 67 65 2d 3e  Write(pPtrPage->
10480 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66  pDbPage);.    if
10490 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
104a0 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  ){.      release
104b0 50 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a  Page(pPtrPage);.
104c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
104d0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
104e0 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65  modifyPagePointe
104f0 72 28 70 50 74 72 50 61 67 65 2c 20 69 44 62 50  r(pPtrPage, iDbP
10500 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
10510 65 54 79 70 65 29 3b 0a 20 20 20 20 72 65 6c 65  eType);.    rele
10520 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65  asePage(pPtrPage
10530 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
10540 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
10550 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
10560 28 70 42 74 2c 20 69 46 72 65 65 50 61 67 65 2c  (pBt, iFreePage,
10570 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67 65   eType, iPtrPage
10580 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
10590 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
105a0 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 61 67  tic int pagerPag
105b0 65 63 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50  ecount(Pager *pP
105c0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
105d0 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 20 20  .  int nPage;.  
105e0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
105f0 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
10600 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 72 65  r, &nPage);.  re
10610 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
10620 5f 4f 4b 3f 6e 50 61 67 65 3a 2d 31 29 3b 0a 7d  _OK?nPage:-1);.}
10630 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63  ../* Forward dec
10640 6c 61 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65  laration require
10650 64 20 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53  d by incrVacuumS
10660 74 65 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63  tep(). */.static
10670 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
10680 65 65 50 61 67 65 28 42 74 53 68 61 72 65 64 20  eePage(BtShared 
10690 2a 2c 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50  *, MemPage **, P
106a0 67 6e 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29  gno *, Pgno, u8)
106b0 3b 0a 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d  ;../*.** Perform
106c0 20 61 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f   a single step o
106d0 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  f an incremental
106e0 2d 76 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63  -vacuum. If succ
106f0 65 73 73 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72  essful,.** retur
10700 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20  n SQLITE_OK. If 
10710 74 68 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b  there is no work
10720 20 74 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72   to do (and ther
10730 65 66 6f 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e  efore no.** poin
10740 74 20 69 6e 20 63 61 6c 6c 69 6e 67 20 74 68 69  t in calling thi
10750 73 20 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e  s function again
10760 29 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ), return SQLITE
10770 5f 44 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72  _DONE..**.** Mor
10780 65 20 73 70 65 63 69 66 69 63 6c 79 2c 20 74 68  e specificly, th
10790 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65  is function atte
107a0 6d 70 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e  mpts to re-organ
107b0 69 7a 65 20 74 68 65 20 0a 2a 2a 20 64 61 74 61  ize the .** data
107c0 62 61 73 65 20 73 6f 20 74 68 61 74 20 74 68 65  base so that the
107d0 20 6c 61 73 74 20 70 61 67 65 20 6f 66 20 74 68   last page of th
107e0 65 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79  e file currently
107f0 20 69 6e 20 75 73 65 0a 2a 2a 20 69 73 20 6e 6f   in use.** is no
10800 20 6c 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a   longer in use..
10810 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 46 69  **.** If the nFi
10820 6e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  n parameter is n
10830 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 69 6d 70  on-zero, the imp
10840 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 61 73 73 75  lementation assu
10850 6d 65 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  mes.** that the 
10860 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70  caller will keep
10870 20 63 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63   calling incrVac
10880 75 75 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 0a  uumStep() until.
10890 2a 2a 20 69 74 20 72 65 74 75 72 6e 73 20 53 51  ** it returns SQ
108a0 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20  LITE_DONE or an 
108b0 65 72 72 6f 72 2c 20 61 6e 64 20 74 68 61 74 20  error, and that 
108c0 6e 46 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20 6e  nFin is the.** n
108d0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
108e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
108f0 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 66   will contain af
10900 74 65 72 20 74 68 69 73 20 0a 2a 2a 20 70 72 6f  ter this .** pro
10910 63 65 73 73 20 69 73 20 63 6f 6d 70 6c 65 74 65  cess is complete
10920 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10930 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 42  incrVacuumStep(B
10940 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
10950 6e 6f 20 6e 46 69 6e 29 7b 0a 20 20 50 67 6e 6f  no nFin){.  Pgno
10960 20 69 4c 61 73 74 50 67 3b 20 20 20 20 20 20 20   iLastPg;       
10970 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 61        /* Last pa
10980 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
10990 73 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 72  se */.  Pgno nFr
109a0 65 65 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  eeList;         
109b0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
109c0 61 67 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68  ages still on th
109d0 65 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a  e free-list */..
109e0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
109f0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
10a00 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 4c  ->mutex) );.  iL
10a10 61 73 74 50 67 20 3d 20 70 42 74 2d 3e 6e 54 72  astPg = pBt->nTr
10a20 75 6e 63 3b 0a 20 20 69 66 28 20 69 4c 61 73 74  unc;.  if( iLast
10a30 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4c 61  Pg==0 ){.    iLa
10a40 73 74 50 67 20 3d 20 70 61 67 65 72 50 61 67 65  stPg = pagerPage
10a50 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
10a60 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  r);.  }..  if( !
10a70 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
10a80 74 2c 20 69 4c 61 73 74 50 67 29 20 26 26 20 69  t, iLastPg) && i
10a90 4c 61 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f  LastPg!=PENDING_
10aa0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
10ab0 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  {.    int rc;.  
10ac0 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
10ad0 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a  Pgno iPtrPage;..
10ae0 20 20 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20      nFreeList = 
10af0 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70  get4byte(&pBt->p
10b00 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d  Page1->aData[36]
10b10 29 3b 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65  );.    if( nFree
10b20 4c 69 73 74 3d 3d 30 20 7c 7c 20 6e 46 69 6e 3d  List==0 || nFin=
10b30 3d 69 4c 61 73 74 50 67 20 29 7b 0a 20 20 20 20  =iLastPg ){.    
10b40 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10b50 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  DONE;.    }..   
10b60 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
10b70 70 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65  pBt, iLastPg, &e
10b80 54 79 70 65 2c 20 26 69 50 74 72 50 61 67 65 29  Type, &iPtrPage)
10b90 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
10ba0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10bb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
10bc0 7d 0a 20 20 20 20 69 66 28 20 65 54 79 70 65 3d  }.    if( eType=
10bd0 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
10be0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
10bf0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
10c00 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  BKPT;.    }..   
10c10 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d   if( eType==PTRM
10c20 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20  AP_FREEPAGE ){. 
10c30 20 20 20 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30       if( nFin==0
10c40 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52   ){.        /* R
10c50 65 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20 66  emove the page f
10c60 72 6f 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72  rom the files fr
10c70 65 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73  ee-list. This is
10c80 20 6e 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20   not required.  
10c90 20 20 20 20 20 20 2a 2a 20 69 66 20 6e 46 69 6e        ** if nFin
10ca0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e   is non-zero. In
10cb0 20 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 20   that case, the 
10cc0 66 72 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62  free-list will b
10cd0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75  e.        ** tru
10ce0 6e 63 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61  ncated to zero a
10cf0 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
10d00 6f 6e 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69  on returns, so i
10d10 74 20 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20  t doesn't .     
10d20 20 20 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20     ** matter if 
10d30 69 74 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e  it still contain
10d40 73 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65  s some garbage e
10d50 6e 74 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20  ntries..        
10d60 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  */.        Pgno 
10d70 69 46 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20  iFreePg;.       
10d80 20 4d 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50   MemPage *pFreeP
10d90 67 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  g;.        rc = 
10da0 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67  allocateBtreePag
10db0 65 28 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c  e(pBt, &pFreePg,
10dc0 20 26 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74   &iFreePg, iLast
10dd0 50 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20  Pg, 1);.        
10de0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10df0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
10e00 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
10e10 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
10e20 72 74 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61  rt( iFreePg==iLa
10e30 73 74 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20  stPg );.        
10e40 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
10e50 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ePg);.      }.  
10e60 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
10e70 20 50 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20   Pgno iFreePg;  
10e80 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
10e90 64 65 78 20 6f 66 20 66 72 65 65 20 70 61 67 65  dex of free page
10ea0 20 74 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67   to move pLastPg
10eb0 20 74 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d   to */.      Mem
10ec0 50 61 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 0a  Page *pLastPg;..
10ed0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10ee0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
10ef0 42 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c  Bt, iLastPg, &pL
10f00 61 73 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20  astPg, 0);.     
10f10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10f20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
10f30 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
10f40 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 46  ..      /* If nF
10f50 69 6e 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73  in is zero, this
10f60 20 6c 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74   loop runs exact
10f70 6c 79 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65  ly once and page
10f80 20 70 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a   pLastPg.      *
10f90 2a 20 69 73 20 73 77 61 70 70 65 64 20 77 69 74  * is swapped wit
10fa0 68 20 74 68 65 20 66 69 72 73 74 20 66 72 65 65  h the first free
10fb0 20 70 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66   page pulled off
10fc0 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a   the free list..
10fd0 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
10fe0 2a 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  * On the other h
10ff0 61 6e 64 2c 20 69 66 20 6e 46 69 6e 20 69 73 20  and, if nFin is 
11000 67 72 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72  greater than zer
11010 6f 2c 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20  o, then keep.   
11020 20 20 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e     ** looping un
11030 74 69 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20  til a free-page 
11040 6c 6f 63 61 74 65 64 20 77 69 74 68 69 6e 20 74  located within t
11050 68 65 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61  he first nFin pa
11060 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20  ges.      ** of 
11070 74 68 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e  the file is foun
11080 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
11090 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d    do {.        M
110a0 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
110b0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
110c0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
110d0 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
110e0 69 46 72 65 65 50 67 2c 20 30 2c 20 30 29 3b 0a  iFreePg, 0, 0);.
110f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
11100 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11110 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
11120 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20  ge(pLastPg);.   
11130 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
11140 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11150 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
11160 70 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20  pFreePg);.      
11170 7d 77 68 69 6c 65 28 20 6e 46 69 6e 21 3d 30 20  }while( nFin!=0 
11180 26 26 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20  && iFreePg>nFin 
11190 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
111a0 20 69 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67   iFreePg<iLastPg
111b0 20 29 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20   );.      .     
111c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
111d0 65 72 57 72 69 74 65 28 70 4c 61 73 74 50 67 2d  erWrite(pLastPg-
111e0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
111f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11200 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
11210 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28   = relocatePage(
11220 70 42 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54  pBt, pLastPg, eT
11230 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69  ype, iPtrPage, i
11240 46 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d  FreePg);.      }
11250 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
11260 67 65 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20  ge(pLastPg);.   
11270 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11280 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
11290 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
112a0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
112b0 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 69 4c  pBt->nTrunc = iL
112c0 61 73 74 50 67 20 2d 20 31 3b 0a 20 20 77 68 69  astPg - 1;.  whi
112d0 6c 65 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 3d  le( pBt->nTrunc=
112e0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
112f0 47 45 28 70 42 74 29 7c 7c 50 54 52 4d 41 50 5f  GE(pBt)||PTRMAP_
11300 49 53 50 41 47 45 28 70 42 74 2c 20 70 42 74 2d  ISPAGE(pBt, pBt-
11310 3e 6e 54 72 75 6e 63 29 20 29 7b 0a 20 20 20 20  >nTrunc) ){.    
11320 70 42 74 2d 3e 6e 54 72 75 6e 63 2d 2d 3b 0a 20  pBt->nTrunc--;. 
11330 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
11340 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
11350 41 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  A write-transact
11360 69 6f 6e 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ion must be open
11370 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e  ed before callin
11380 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  g this function.
11390 0a 2a 2a 20 49 74 20 70 65 72 66 6f 72 6d 73 20  .** It performs 
113a0 61 20 73 69 6e 67 6c 65 20 75 6e 69 74 20 6f 66  a single unit of
113b0 20 77 6f 72 6b 20 74 6f 77 61 72 64 73 20 61 6e   work towards an
113c0 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63   incremental vac
113d0 75 75 6d 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  uum..**.** If th
113e0 65 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61  e incremental va
113f0 63 75 75 6d 20 69 73 20 66 69 6e 69 73 68 65 64  cuum is finished
11400 20 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63   after this func
11410 74 69 6f 6e 20 68 61 73 20 72 75 6e 2c 0a 2a 2a  tion has run,.**
11420 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 20   SQLITE_DONE is 
11430 72 65 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20  returned. If it 
11440 69 73 20 6e 6f 74 20 66 69 6e 69 73 68 65 64 2c  is not finished,
11450 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63   but no error oc
11460 63 75 72 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45  cured,.** SQLITE
11470 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
11480 20 4f 74 68 65 72 77 69 73 65 20 61 6e 20 53 51   Otherwise an SQ
11490 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e  Lite error code.
114a0 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
114b0 42 74 72 65 65 49 6e 63 72 56 61 63 75 75 6d 28  BtreeIncrVacuum(
114c0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
114d0 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
114e0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a  *pBt = p->pBt;..
114f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
11500 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64  ter(p);.  pBt->d
11510 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73  b = p->db;.  ass
11520 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
11530 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
11540 52 49 54 45 20 26 26 20 70 2d 3e 69 6e 54 72 61  RITE && p->inTra
11550 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns==TRANS_WRITE 
11560 29 3b 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 61  );.  if( !pBt->a
11570 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
11580 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
11590 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
115a0 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65  invalidateAllOve
115b0 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b  rflowCache(pBt);
115c0 0a 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61  .    rc = incrVa
115d0 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 30 29  cuumStep(pBt, 0)
115e0 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
115f0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
11600 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
11610 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
11620 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f 72   is called prior
11630 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
11640 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74 72  Commit when a tr
11650 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
11660 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e 20  commited for an 
11670 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
11680 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 53  base..**.** If S
11690 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
116a0 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54 72  rned, then *pnTr
116b0 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74 68  unc is set to th
116c0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
116d0 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  s.** the databas
116e0 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  e file should be
116f0 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64 75   truncated to du
11700 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20  ring the commit 
11710 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e 65  process. .** i.e
11720 2e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  . the database h
11730 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e 69  as been reorgani
11740 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c 79  zed so that only
11750 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54 72   the first *pnTr
11760 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72 65  unc.** pages are
11770 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74   in use..*/.stat
11780 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75  ic int autoVacuu
11790 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65 64  mCommit(BtShared
117a0 20 2a 70 42 74 2c 20 50 67 6e 6f 20 2a 70 6e 54   *pBt, Pgno *pnT
117b0 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20  runc){.  int rc 
117c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
117d0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
117e0 42 74 2d 3e 70 50 61 67 65 72 3b 0a 23 69 66 6e  Bt->pPager;.#ifn
117f0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69 6e 74  def NDEBUG.  int
11800 20 6e 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50   nRef = sqlite3P
11810 61 67 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61  agerRefcount(pPa
11820 67 65 72 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  ger);.#endif..  
11830 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
11840 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
11850 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 6e 76 61  mutex) );.  inva
11860 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
11870 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 61  wCache(pBt);.  a
11880 73 73 65 72 74 28 70 42 74 2d 3e 61 75 74 6f 56  ssert(pBt->autoV
11890 61 63 75 75 6d 29 3b 0a 20 20 69 66 28 20 21 70  acuum);.  if( !p
118a0 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 29  Bt->incrVacuum )
118b0 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 46 69 6e 20  {.    Pgno nFin 
118c0 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 70 42  = 0;..    if( pB
118d0 74 2d 3e 6e 54 72 75 6e 63 3d 3d 30 20 29 7b 0a  t->nTrunc==0 ){.
118e0 20 20 20 20 20 20 50 67 6e 6f 20 6e 46 72 65 65        Pgno nFree
118f0 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 74  ;.      Pgno nPt
11900 72 6d 61 70 3b 0a 20 20 20 20 20 20 63 6f 6e 73  rmap;.      cons
11910 74 20 69 6e 74 20 70 67 73 7a 20 3d 20 70 42 74  t int pgsz = pBt
11920 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
11930 20 20 69 6e 74 20 6e 4f 72 69 67 20 3d 20 70 61    int nOrig = pa
11940 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
11950 2d 3e 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20  ->pPager);..    
11960 20 20 69 66 28 20 50 54 52 4d 41 50 5f 49 53 50    if( PTRMAP_ISP
11970 41 47 45 28 70 42 74 2c 20 6e 4f 72 69 67 29 20  AGE(pBt, nOrig) 
11980 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
11990 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
119a0 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d 0a 20  _BKPT;.      }. 
119b0 20 20 20 20 20 69 66 28 20 6e 4f 72 69 67 3d 3d       if( nOrig==
119c0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
119d0 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  E(pBt) ){.      
119e0 20 20 6e 4f 72 69 67 2d 2d 3b 0a 20 20 20 20 20    nOrig--;.     
119f0 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20 3d   }.      nFree =
11a00 20 67 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e   get4byte(&pBt->
11a10 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
11a20 5d 29 3b 0a 20 20 20 20 20 20 6e 50 74 72 6d 61  ]);.      nPtrma
11a30 70 20 3d 20 28 6e 46 72 65 65 2d 6e 4f 72 69 67  p = (nFree-nOrig
11a40 2b 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  +PTRMAP_PAGENO(p
11a50 42 74 2c 20 6e 4f 72 69 67 29 2b 70 67 73 7a 2f  Bt, nOrig)+pgsz/
11a60 35 29 2f 28 70 67 73 7a 2f 35 29 3b 0a 20 20 20  5)/(pgsz/5);.   
11a70 20 20 20 6e 46 69 6e 20 3d 20 6e 4f 72 69 67 20     nFin = nOrig 
11a80 2d 20 6e 46 72 65 65 20 2d 20 6e 50 74 72 6d 61  - nFree - nPtrma
11a90 70 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 72  p;.      if( nOr
11aa0 69 67 3e 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  ig>PENDING_BYTE_
11ab0 50 41 47 45 28 70 42 74 29 20 26 26 20 6e 46 69  PAGE(pBt) && nFi
11ac0 6e 3c 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  n<=PENDING_BYTE_
11ad0 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
11ae0 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20       nFin--;.   
11af0 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65     }.      while
11b00 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
11b10 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46  pBt, nFin) || nF
11b20 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  in==PENDING_BYTE
11b30 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
11b40 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20        nFin--;.  
11b50 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
11b60 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
11b70 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
11b80 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d 53 74  c = incrVacuumSt
11b90 65 70 28 70 42 74 2c 20 6e 46 69 6e 29 3b 0a 20  ep(pBt, nFin);. 
11ba0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
11bb0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
11bc0 20 20 20 20 20 20 61 73 73 65 72 74 28 6e 46 69        assert(nFi
11bd0 6e 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e 6e 54 72  n==0 || pBt->nTr
11be0 75 6e 63 3d 3d 30 20 7c 7c 20 6e 46 69 6e 3c 3d  unc==0 || nFin<=
11bf0 70 42 74 2d 3e 6e 54 72 75 6e 63 29 3b 0a 20 20  pBt->nTrunc);.  
11c00 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
11c10 4f 4b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 42  OK;.      if( pB
11c20 74 2d 3e 6e 54 72 75 6e 63 20 26 26 20 6e 46 69  t->nTrunc && nFi
11c30 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  n ){.        rc 
11c40 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
11c50 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  ite(pBt->pPage1-
11c60 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
11c70 20 20 20 70 75 74 34 62 79 74 65 28 26 70 42 74     put4byte(&pBt
11c80 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  ->pPage1->aData[
11c90 33 32 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  32], 0);.       
11ca0 20 70 75 74 34 62 79 74 65 28 26 70 42 74 2d 3e   put4byte(&pBt->
11cb0 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36  pPage1->aData[36
11cc0 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  ], 0);.        p
11cd0 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 6e 46 69  Bt->nTrunc = nFi
11ce0 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  n;.      }.    }
11cf0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
11d00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
11d10 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
11d20 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
11d30 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
11d40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11d50 20 20 20 20 2a 70 6e 54 72 75 6e 63 20 3d 20 70      *pnTrunc = p
11d60 42 74 2d 3e 6e 54 72 75 6e 63 3b 0a 20 20 20 20  Bt->nTrunc;.    
11d70 70 42 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 30 3b  pBt->nTrunc = 0;
11d80 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6e  .  }.  assert( n
11d90 52 65 66 3d 3d 73 71 6c 69 74 65 33 50 61 67 65  Ref==sqlite3Page
11da0 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72  rRefcount(pPager
11db0 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ) );.  return rc
11dc0 3b 0a 7d 0a 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ;.}..#endif../*.
11dd0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
11de0 64 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70  does the first p
11df0 68 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68  hase of a two-ph
11e00 61 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69  ase commit.  Thi
11e10 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75  s routine.** cau
11e20 73 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  ses a rollback j
11e30 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65  ournal to be cre
11e40 61 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73  ated (if it does
11e50 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69   not already exi
11e60 73 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c  st).** and popul
11e70 61 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68  ated with enough
11e80 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20   information so 
11e90 74 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20  that if a power 
11ea0 6c 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74  loss occurs.** t
11eb0 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20  he database can 
11ec0 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  be restored to i
11ed0 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
11ee0 65 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63  e by playing bac
11ef0 6b 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k.** the journal
11f00 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74  .  Then the cont
11f10 65 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ents of the jour
11f20 6e 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20  nal are flushed 
11f30 6f 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69  out to.** the di
11f40 73 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a  sk.  After the j
11f50 6f 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79  ournal is safely
11f60 20 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63   on oxide, the c
11f70 68 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a  hanges to the.**
11f80 20 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72   database are wr
11f90 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64  itten into the d
11fa0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
11fb0 20 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64   flushed to oxid
11fc0 65 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64  e..** At the end
11fd0 20 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74   of this call, t
11fe0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
11ff0 6e 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73  nal still exists
12000 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20   on the.** disk 
12010 61 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c  and we are still
12020 20 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63   holding all loc
12030 6b 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73  ks, so the trans
12040 61 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a  action has not.*
12050 2a 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65  * committed.  Se
12060 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  e sqlite3BtreeCo
12070 6d 6d 69 74 28 29 20 66 6f 72 20 74 68 65 20 73  mmit() for the s
12080 65 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74  econd phase of t
12090 68 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f  he.** commit pro
120a0 63 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  cess..**.** This
120b0 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
120c0 20 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61   if no write-tra
120d0 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72  nsaction is curr
120e0 65 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20  ently active on 
120f0 70 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  pBt..**.** Other
12100 77 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64  wise, sync the d
12110 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
12120 20 74 68 65 20 62 74 72 65 65 20 70 42 74 2e 20   the btree pBt. 
12130 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74  zMaster points t
12140 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66  o.** the name of
12150 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
12160 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75  l file that shou
12170 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ld be written in
12180 74 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69  to the.** indivi
12190 64 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  dual journal fil
121a0 65 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69  e, or is NULL, i
121b0 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73  ndicating no mas
121c0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
121d0 20 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74   .** (single dat
121e0 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
121f0 6e 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  n)..**.** When t
12200 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  his is called, t
12210 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
12220 6c 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79  l should already
12230 20 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72   have been.** cr
12240 65 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64  eated, populated
12250 20 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e   with this journ
12260 61 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73  al pointer and s
12270 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a  ynced to disk..*
12280 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69  *.** Once this i
12290 73 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65  s routine has re
122a0 74 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79  turned, the only
122b0 20 74 68 69 6e 67 20 72 65 71 75 69 72 65 64 20   thing required 
122c0 74 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65  to commit.** the
122d0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
122e0 6f 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74 61  on for this data
122f0 62 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20  base file is to 
12300 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
12310 61 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  al..*/.int sqlit
12320 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
12330 73 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20  seOne(Btree *p, 
12340 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
12350 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ter){.  int rc =
12360 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
12370 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
12380 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
12390 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
123a0 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 50 67 6e   p->pBt;.    Pgn
123b0 6f 20 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 20 20  o nTrunc = 0;.  
123c0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
123d0 74 65 72 28 70 29 3b 0a 20 20 20 20 70 42 74 2d  ter(p);.    pBt-
123e0 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 23 69 66  >db = p->db;.#if
123f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12400 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
12410 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  if( pBt->autoVac
12420 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 72 63 20  uum ){.      rc 
12430 3d 20 61 75 74 6f 56 61 63 75 75 6d 43 6f 6d 6d  = autoVacuumComm
12440 69 74 28 70 42 74 2c 20 26 6e 54 72 75 6e 63 29  it(pBt, &nTrunc)
12450 3b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  ; .      if( rc!
12460 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12470 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
12480 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
12490 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
124a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
124b0 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  dif.    rc = sql
124c0 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
124d0 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61  haseOne(pBt->pPa
124e0 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54  ger, zMaster, nT
124f0 72 75 6e 63 2c 20 30 29 3b 0a 20 20 20 20 73 71  runc, 0);.    sq
12500 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
12510 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
12520 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   rc;.}../*.** Co
12530 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63  mmit the transac
12540 74 69 6f 6e 20 63 75 72 72 65 6e 74 6c 79 20 69  tion currently i
12550 6e 20 70 72 6f 67 72 65 73 73 2e 0a 2a 2a 0a 2a  n progress..**.*
12560 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
12570 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 73 65  mplements the se
12580 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 61 20  cond phase of a 
12590 32 2d 70 68 61 73 65 20 63 6f 6d 6d 69 74 2e 20  2-phase commit. 
125a0 20 54 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 42   The.** sqlite3B
125b0 74 72 65 65 53 79 6e 63 28 29 20 72 6f 75 74 69  treeSync() routi
125c0 6e 65 20 64 6f 65 73 20 74 68 65 20 66 69 72 73  ne does the firs
125d0 74 20 70 68 61 73 65 20 61 6e 64 20 73 68 6f 75  t phase and shou
125e0 6c 64 20 62 65 20 69 6e 76 6f 6b 65 64 0a 2a 2a  ld be invoked.**
125f0 20 70 72 69 6f 72 20 74 6f 20 63 61 6c 6c 69 6e   prior to callin
12600 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20  g this routine. 
12610 20 54 68 65 20 73 71 6c 69 74 65 33 42 74 72 65   The sqlite3Btre
12620 65 53 79 6e 63 28 29 20 72 6f 75 74 69 6e 65 20  eSync() routine 
12630 64 69 64 0a 2a 2a 20 61 6c 6c 20 74 68 65 20 77  did.** all the w
12640 6f 72 6b 20 6f 66 20 77 72 69 74 69 6e 67 20 69  ork of writing i
12650 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75 74 20 74  nformation out t
12660 6f 20 64 69 73 6b 20 61 6e 64 20 66 6c 75 73 68  o disk and flush
12670 69 6e 67 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65  ing the.** conte
12680 6e 74 73 20 73 6f 20 74 68 61 74 20 74 68 65 79  nts so that they
12690 20 61 72 65 20 77 72 69 74 74 65 6e 20 6f 6e 74   are written ont
126a0 6f 20 74 68 65 20 64 69 73 6b 20 70 6c 61 74 74  o the disk platt
126b0 65 72 2e 20 20 41 6c 6c 20 74 68 69 73 0a 2a 2a  er.  All this.**
126c0 20 72 6f 75 74 69 6e 65 20 68 61 73 20 74 6f 20   routine has to 
126d0 64 6f 20 69 73 20 64 65 6c 65 74 65 20 6f 72 20  do is delete or 
126e0 74 72 75 6e 63 61 74 65 20 74 68 65 20 72 6f 6c  truncate the rol
126f0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  lback journal.**
12700 20 28 77 68 69 63 68 20 63 61 75 73 65 73 20 74   (which causes t
12710 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  he transaction t
12720 6f 20 63 6f 6d 6d 69 74 29 20 61 6e 64 20 64 72  o commit) and dr
12730 6f 70 20 6c 6f 63 6b 73 2e 0a 2a 2a 0a 2a 2a 20  op locks..**.** 
12740 54 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73  This will releas
12750 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
12760 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
12770 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65   file.  If there
12780 0a 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76  .** are no activ
12790 65 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c  e cursors, it al
127a0 73 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20  so releases the 
127b0 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e  read lock..*/.in
127c0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
127d0 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 42 74 72  mmitPhaseTwo(Btr
127e0 65 65 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72  ee *p){.  BtShar
127f0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
12800 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
12810 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
12820 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
12830 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
12840 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
12850 68 61 6e 64 6c 65 20 68 61 73 20 61 20 77 72 69  handle has a wri
12860 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  te-transaction o
12870 70 65 6e 2c 20 63 6f 6d 6d 69 74 20 74 68 65 20  pen, commit the 
12880 73 68 61 72 65 64 2d 62 74 72 65 65 73 20 0a 20  shared-btrees . 
12890 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
128a0 61 6e 64 20 73 65 74 20 74 68 65 20 73 68 61 72  and set the shar
128b0 65 64 20 73 74 61 74 65 20 74 6f 20 54 52 41 4e  ed state to TRAN
128c0 53 5f 52 45 41 44 2e 0a 20 20 2a 2f 0a 20 20 69  S_READ..  */.  i
128d0 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
128e0 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
128f0 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73    int rc;.    as
12900 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
12910 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
12920 57 52 49 54 45 20 29 3b 0a 20 20 20 20 61 73 73  WRITE );.    ass
12930 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73  ert( pBt->nTrans
12940 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20  action>0 );.    
12950 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
12960 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  rCommitPhaseTwo(
12970 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
12980 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
12990 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
129a0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
129b0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
129c0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 42  rc;.    }.    pB
129d0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
129e0 20 3d 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20   = TRANS_READ;. 
129f0 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d     pBt->inStmt =
12a00 20 30 3b 0a 20 20 7d 0a 20 20 75 6e 6c 6f 63 6b   0;.  }.  unlock
12a10 41 6c 6c 54 61 62 6c 65 73 28 70 29 3b 0a 0a 20  AllTables(p);.. 
12a20 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
12a30 65 20 68 61 73 20 61 6e 79 20 6b 69 6e 64 20 6f  e has any kind o
12a40 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  f transaction op
12a50 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68  en, decrement th
12a60 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  e transaction.  
12a70 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20  ** count of the 
12a80 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66  shared btree. If
12a90 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
12aa0 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 30   count reaches 0
12ab0 2c 20 73 65 74 0a 20 20 2a 2a 20 74 68 65 20 73  , set.  ** the s
12ac0 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
12ad0 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75  RANS_NONE. The u
12ae0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
12af0 65 64 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77 0a  ed() call below.
12b00 20 20 2a 2a 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b    ** will unlock
12b10 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f   the pager..  */
12b20 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
12b30 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s!=TRANS_NONE ){
12b40 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73  .    pBt->nTrans
12b50 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66  action--;.    if
12b60 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73  ( 0==pBt->nTrans
12b70 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
12b80 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
12b90 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  on = TRANS_NONE;
12ba0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
12bb0 20 53 65 74 20 74 68 65 20 68 61 6e 64 6c 65 73   Set the handles
12bc0 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
12bd0 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52  tion state to TR
12be0 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c  ANS_NONE and unl
12bf0 6f 63 6b 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  ock.  ** the pag
12c00 65 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20  er if this call 
12c10 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20  closed the only 
12c20 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
12c30 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
12c40 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
12c50 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 75 6e 6c  RANS_NONE;.  unl
12c60 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64  ockBtreeIfUnused
12c70 28 70 42 74 29 3b 0a 0a 20 20 62 74 72 65 65 49  (pBt);..  btreeI
12c80 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 73  ntegrity(p);.  s
12c90 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
12ca0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (p);.  return SQ
12cb0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
12cc0 2a 20 44 6f 20 62 6f 74 68 20 70 68 61 73 65 73  * Do both phases
12cd0 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f   of a commit..*/
12ce0 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
12cf0 65 43 6f 6d 6d 69 74 28 42 74 72 65 65 20 2a 70  eCommit(Btree *p
12d00 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
12d10 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
12d20 28 70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  (p);.  rc = sqli
12d30 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68  te3BtreeCommitPh
12d40 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20  aseOne(p, 0);.  
12d50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
12d60 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
12d70 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74  lite3BtreeCommit
12d80 50 68 61 73 65 54 77 6f 28 70 29 3b 0a 20 20 7d  PhaseTwo(p);.  }
12d90 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
12da0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
12db0 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
12dc0 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65   NDEBUG./*.** Re
12dd0 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
12de0 6f 66 20 77 72 69 74 65 2d 63 75 72 73 6f 72 73  of write-cursors
12df0 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73 20 68 61   open on this ha
12e00 6e 64 6c 65 2e 20 54 68 69 73 20 69 73 20 66 6f  ndle. This is fo
12e10 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65  r use.** in asse
12e20 72 74 28 29 20 65 78 70 72 65 73 73 69 6f 6e 73  rt() expressions
12e30 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20  , so it is only 
12e40 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e 44 45 42  compiled if NDEB
12e50 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66  UG is not.** def
12e60 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  ined..**.** For 
12e70 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
12e80 74 68 69 73 20 72 6f 75 74 69 6e 65 2c 20 61 20  this routine, a 
12e90 77 72 69 74 65 2d 63 75 72 73 6f 72 20 69 73 20  write-cursor is 
12ea0 61 6e 79 20 63 75 72 73 6f 72 20 74 68 61 74 0a  any cursor that.
12eb0 2a 2a 20 69 73 20 63 61 70 61 62 6c 65 20 6f 66  ** is capable of
12ec0 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
12ed0 64 61 74 61 62 73 65 2e 20 20 54 68 61 74 20 6d  databse.  That m
12ee0 65 61 6e 73 20 74 68 65 20 63 75 72 73 6f 72 20  eans the cursor 
12ef0 77 61 73 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 6c  was.** originall
12f00 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69  y opened for wri
12f10 74 69 6e 67 20 61 6e 64 20 74 68 65 20 63 75 72  ting and the cur
12f20 73 6f 72 20 68 61 73 20 6e 6f 74 20 62 65 20 64  sor has not be d
12f30 69 73 61 62 6c 65 64 0a 2a 2a 20 62 79 20 68 61  isabled.** by ha
12f40 76 69 6e 67 20 69 74 73 20 73 74 61 74 65 20 63  ving its state c
12f50 68 61 6e 67 65 64 20 74 6f 20 43 55 52 53 4f 52  hanged to CURSOR
12f60 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74 61 74 69  _FAULT..*/.stati
12f70 63 20 69 6e 74 20 63 6f 75 6e 74 57 72 69 74 65  c int countWrite
12f80 43 75 72 73 6f 72 73 28 42 74 53 68 61 72 65 64  Cursors(BtShared
12f90 20 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73   *pBt){.  BtCurs
12fa0 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20  or *pCur;.  int 
12fb0 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 43 75  r = 0;.  for(pCu
12fc0 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  r=pBt->pCursor; 
12fd0 70 43 75 72 3b 20 70 43 75 72 3d 70 43 75 72 2d  pCur; pCur=pCur-
12fe0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66 28  >pNext){.    if(
12ff0 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 26 26   pCur->wrFlag &&
13000 20 70 43 75 72 2d 3e 65 53 74 61 74 65 21 3d 43   pCur->eState!=C
13010 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b  URSOR_FAULT ) r+
13020 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  +; .  }.  return
13030 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   r;.}.#endif../*
13040 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
13050 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65 20   sets the state 
13060 74 6f 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  to CURSOR_FAULT 
13070 61 6e 64 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a  and the error.**
13080 20 63 6f 64 65 20 74 6f 20 65 72 72 43 6f 64 65   code to errCode
13090 20 66 6f 72 20 65 76 65 72 79 20 63 75 72 73 6f   for every curso
130a0 72 20 6f 6e 20 42 74 53 68 61 72 65 64 20 74 68  r on BtShared th
130b0 61 74 20 70 42 74 72 65 65 0a 2a 2a 20 72 65 66  at pBtree.** ref
130c0 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45  erences..**.** E
130d0 76 65 72 79 20 63 75 72 73 6f 72 20 69 73 20 74  very cursor is t
130e0 72 69 70 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e  ripped, includin
130f0 67 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 62  g cursors that b
13100 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68 65  elong.** to othe
13110 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
13120 63 74 69 6f 6e 73 20 74 68 61 74 20 68 61 70 70  ctions that happ
13130 65 6e 20 74 6f 20 62 65 20 73 68 61 72 69 6e 67  en to be sharing
13140 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 77 69  .** the cache wi
13150 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a  th pBtree..**.**
13160 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 67 65   This routine ge
13170 74 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  ts called when a
13180 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
13190 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73  ..** All cursors
131a0 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20   using the same 
131b0 63 61 63 68 65 20 6d 75 73 74 20 62 65 20 74 72  cache must be tr
131c0 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70 72 65 76  ipped.** to prev
131d0 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d 20 74 72  ent them from tr
131e0 79 69 6e 67 20 74 6f 20 75 73 65 20 74 68 65 20  ying to use the 
131f0 62 74 72 65 65 20 61 66 74 65 72 0a 2a 2a 20 74  btree after.** t
13200 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68  he rollback.  Th
13210 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68  e rollback may h
13220 61 76 65 20 64 65 6c 65 74 65 64 20 74 61 62 6c  ave deleted tabl
13230 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65 64 20 72  es.** or moved r
13240 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f 20 69 74  oot pages, so it
13250 20 69 73 20 6e 6f 74 20 73 75 66 66 69 63 69 65   is not sufficie
13260 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65 20 74 68  nt to.** save th
13270 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63  e state of the c
13280 75 72 73 6f 72 2e 20 20 54 68 65 20 63 75 72 73  ursor.  The curs
13290 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e  or must be.** in
132a0 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f  validated..*/.vo
132b0 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 54  id sqlite3BtreeT
132c0 72 69 70 41 6c 6c 43 75 72 73 6f 72 73 28 42 74  ripAllCursors(Bt
132d0 72 65 65 20 2a 70 42 74 72 65 65 2c 20 69 6e 74  ree *pBtree, int
132e0 20 65 72 72 43 6f 64 65 29 7b 0a 20 20 42 74 43   errCode){.  BtC
132f0 75 72 73 6f 72 20 2a 70 3b 0a 20 20 73 71 6c 69  ursor *p;.  sqli
13300 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 42  te3BtreeEnter(pB
13310 74 72 65 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70  tree);.  for(p=p
13320 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72  Btree->pBt->pCur
13330 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  sor; p; p=p->pNe
13340 78 74 29 7b 0a 20 20 20 20 63 6c 65 61 72 43 75  xt){.    clearCu
13350 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 3b  rsorPosition(p);
13360 0a 20 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d  .    p->eState =
13370 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b 0a 20   CURSOR_FAULT;. 
13380 20 20 20 70 2d 3e 73 6b 69 70 20 3d 20 65 72 72     p->skip = err
13390 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Code;.  }.  sqli
133a0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42  te3BtreeLeave(pB
133b0 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tree);.}../*.** 
133c0 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72 61  Rollback the tra
133d0 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67  nsaction in prog
133e0 72 65 73 73 2e 20 20 41 6c 6c 20 63 75 72 73 6f  ress.  All curso
133f0 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69 6e  rs will be.** in
13400 76 61 6c 69 64 65 64 20 62 79 20 74 68 69 73 20  valided by this 
13410 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79 20  operation.  Any 
13420 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61  attempt to use a
13430 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74 20   cursor.** that 
13440 77 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65 20  was open at the 
13450 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 69  beginning of thi
13460 73 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c 6c  s operation will
13470 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61 6e   result.** in an
13480 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54 68   error..**.** Th
13490 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 20  is will release 
134a0 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20 6f  the write lock o
134b0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
134c0 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a 2a  ile.  If there.*
134d0 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20  * are no active 
134e0 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73 6f  cursors, it also
134f0 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72 65   releases the re
13500 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74 20  ad lock..*/.int 
13510 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
13520 62 61 63 6b 28 42 74 72 65 65 20 2a 70 29 7b 0a  back(Btree *p){.
13530 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68    int rc;.  BtSh
13540 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
13550 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  Bt;.  MemPage *p
13560 50 61 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74 65  Page1;..  sqlite
13570 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
13580 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64    pBt->db = p->d
13590 62 3b 0a 20 20 72 63 20 3d 20 73 61 76 65 41 6c  b;.  rc = saveAl
135a0 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30 2c  lCursors(pBt, 0,
135b0 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   0);.#ifndef SQL
135c0 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
135d0 43 41 43 48 45 0a 20 20 69 66 28 20 72 63 21 3d  CACHE.  if( rc!=
135e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
135f0 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 68 6f   /* This is a ho
13600 72 72 69 62 6c 65 20 73 69 74 75 61 74 69 6f 6e  rrible situation
13610 2e 20 41 6e 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f  . An IO or mallo
13620 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 65  c() error occure
13630 64 20 77 68 69 6c 73 74 0a 20 20 20 20 2a 2a 20  d whilst.    ** 
13640 74 72 79 69 6e 67 20 74 6f 20 73 61 76 65 20 63  trying to save c
13650 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 73 2e  ursor positions.
13660 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61   If this is an a
13670 75 74 6f 6d 61 74 69 63 20 72 6f 6c 6c 62 61 63  utomatic rollbac
13680 6b 20 28 61 73 0a 20 20 20 20 2a 2a 20 74 68 65  k (as.    ** the
13690 20 72 65 73 75 6c 74 20 6f 66 20 61 20 63 6f 6e   result of a con
136a0 73 74 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28  straint, malloc(
136b0 29 20 66 61 69 6c 75 72 65 20 6f 72 20 49 4f 20  ) failure or IO 
136c0 65 72 72 6f 72 29 20 74 68 65 6e 20 0a 20 20 20  error) then .   
136d0 20 2a 2a 20 74 68 65 20 63 61 63 68 65 20 6d 61   ** the cache ma
136e0 79 20 62 65 20 69 6e 74 65 72 6e 61 6c 6c 79 20  y be internally 
136f0 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 28 6e 6f  inconsistent (no
13700 74 20 63 6f 6e 74 61 69 6e 20 76 61 6c 69 64 20  t contain valid 
13710 74 72 65 65 73 29 20 73 6f 0a 20 20 20 20 2a 2a  trees) so.    **
13720 20 77 65 20 63 61 6e 6e 6f 74 20 73 69 6d 70 6c   we cannot simpl
13730 79 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72  y return the err
13740 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  or to the caller
13750 2e 20 49 6e 73 74 65 61 64 2c 20 61 62 6f 72 74  . Instead, abort
13760 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 71 75 65   .    ** all que
13770 72 69 65 73 20 74 68 61 74 20 6d 61 79 20 62 65  ries that may be
13780 20 75 73 69 6e 67 20 61 6e 79 20 6f 66 20 74 68   using any of th
13790 65 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 66  e cursors that f
137a0 61 69 6c 65 64 20 74 6f 20 73 61 76 65 2e 0a 20  ailed to save.. 
137b0 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
137c0 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
137d0 73 6f 72 73 28 70 2c 20 72 63 29 3b 0a 20 20 7d  sors(p, rc);.  }
137e0 0a 23 65 6e 64 69 66 0a 20 20 62 74 72 65 65 49  .#endif.  btreeI
137f0 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20 75  ntegrity(p);.  u
13800 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73 28 70  nlockAllTables(p
13810 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  );..  if( p->inT
13820 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
13830 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  E ){.    int rc2
13840 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
13850 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
13860 4d 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e  M.    pBt->nTrun
13870 63 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20  c = 0;.#endif.. 
13880 20 20 20 61 73 73 65 72 74 28 20 54 52 41 4e 53     assert( TRANS
13890 5f 57 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54  _WRITE==pBt->inT
138a0 72 61 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20  ransaction );.  
138b0 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50    rc2 = sqlite3P
138c0 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74  agerRollback(pBt
138d0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  ->pPager);.    i
138e0 66 28 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f  f( rc2!=SQLITE_O
138f0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
13900 72 63 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  rc2;.    }..    
13910 2f 2a 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20  /* The rollback 
13920 6d 61 79 20 68 61 76 65 20 64 65 73 74 72 6f 79  may have destroy
13930 65 64 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61  ed the pPage1->a
13940 44 61 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a  Data value.  So.
13950 20 20 20 20 2a 2a 20 63 61 6c 6c 20 73 71 6c 69      ** call sqli
13960 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
13970 29 20 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69  ) on page 1 agai
13980 6e 20 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  n to make.    **
13990 20 73 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44   sure pPage1->aD
139a0 61 74 61 20 69 73 20 73 65 74 20 63 6f 72 72 65  ata is set corre
139b0 63 74 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ctly. */.    if(
139c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
139d0 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50  Page(pBt, 1, &pP
139e0 61 67 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45  age1, 0)==SQLITE
139f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
13a00 65 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29  easePage(pPage1)
13a10 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
13a20 72 74 28 20 63 6f 75 6e 74 57 72 69 74 65 43 75  rt( countWriteCu
13a30 72 73 6f 72 73 28 70 42 74 29 3d 3d 30 20 29 3b  rsors(pBt)==0 );
13a40 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e  .    pBt->inTran
13a50 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
13a60 52 45 41 44 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  READ;.  }..  if(
13a70 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41   p->inTrans!=TRA
13a80 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 61  NS_NONE ){.    a
13a90 73 73 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61  ssert( pBt->nTra
13aa0 6e 73 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20  nsaction>0 );.  
13ab0 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
13ac0 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66 28 20 30  ion--;.    if( 0
13ad0 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74  ==pBt->nTransact
13ae0 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74  ion ){.      pBt
13af0 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
13b00 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
13b10 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 6e    }.  }..  p->in
13b20 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f  Trans = TRANS_NO
13b30 4e 45 3b 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d  NE;.  pBt->inStm
13b40 74 20 3d 20 30 3b 0a 20 20 75 6e 6c 6f 63 6b 42  t = 0;.  unlockB
13b50 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74  treeIfUnused(pBt
13b60 29 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65 67  );..  btreeInteg
13b70 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74  rity(p);.  sqlit
13b80 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
13b90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13ba0 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20 73  ./*.** Start a s
13bb0 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
13bc0 73 61 63 74 69 6f 6e 2e 20 20 54 68 65 20 73 75  saction.  The su
13bd0 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61 6e  btransaction can
13be0 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c 65  .** can be rolle
13bf0 64 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64 65  d back independe
13c00 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69 6e  ntly of the main
13c10 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
13c20 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74 20   You must start 
13c30 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  a transaction be
13c40 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61 20  fore starting a 
13c50 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  subtransaction..
13c60 2a 2a 20 54 68 65 20 73 75 62 74 72 61 6e 73 61  ** The subtransa
13c70 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61  ction is ended a
13c80 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 69 66 20  utomatically if 
13c90 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63  the main transac
13ca0 74 69 6f 6e 0a 2a 2a 20 63 6f 6d 6d 69 74 73 20  tion.** commits 
13cb0 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a 2a  or rolls back..*
13cc0 2a 0a 2a 2a 20 4f 6e 6c 79 20 6f 6e 65 20 73 75  *.** Only one su
13cd0 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79  btransaction may
13ce0 20 62 65 20 61 63 74 69 76 65 20 61 74 20 61 20   be active at a 
13cf0 74 69 6d 65 2e 20 20 49 74 20 69 73 20 61 6e 20  time.  It is an 
13d00 65 72 72 6f 72 20 74 6f 20 74 72 79 0a 2a 2a 20  error to try.** 
13d10 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20 73  to start a new s
13d20 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66  ubtransaction if
13d30 20 61 6e 6f 74 68 65 72 20 73 75 62 74 72 61 6e   another subtran
13d40 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61  saction is alrea
13d50 64 79 20 61 63 74 69 76 65 2e 0a 2a 2a 0a 2a 2a  dy active..**.**
13d60 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72   Statement subtr
13d70 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 75  ansactions are u
13d80 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69 76  sed around indiv
13d90 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65 6d  idual SQL statem
13da0 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72 65  ents.** that are
13db0 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68 69   contained withi
13dc0 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d 4d  n a BEGIN...COMM
13dd0 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61 20  IT block.  If a 
13de0 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65 72  constraint.** er
13df0 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68 69  ror occurs withi
13e00 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c  n the statement,
13e10 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 74   the effect of t
13e20 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65 6e  hat one statemen
13e30 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c  t.** can be roll
13e40 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74 20  ed back without 
13e50 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61  having to rollba
13e60 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  ck the entire tr
13e70 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  ansaction..*/.in
13e80 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  t sqlite3BtreeBe
13e90 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a 70  ginStmt(Btree *p
13ea0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42  ){.  int rc;.  B
13eb0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
13ec0 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
13ed0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
13ee0 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62   pBt->db = p->db
13ef0 3b 0a 20 20 69 66 28 20 28 70 2d 3e 69 6e 54 72  ;.  if( (p->inTr
13f00 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans!=TRANS_WRITE
13f10 29 20 7c 7c 20 70 42 74 2d 3e 69 6e 53 74 6d 74  ) || pBt->inStmt
13f20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 42 74   ){.    rc = pBt
13f30 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c  ->readOnly ? SQL
13f40 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53  ITE_READONLY : S
13f50 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
13f60 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
13f70 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
13f80 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
13f90 45 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 42  E );.    rc = pB
13fa0 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51  t->readOnly ? SQ
13fb0 4c 49 54 45 5f 4f 4b 20 3a 20 73 71 6c 69 74 65  LITE_OK : sqlite
13fc0 33 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28  3PagerStmtBegin(
13fd0 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
13fe0 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20    pBt->inStmt = 
13ff0 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  1;.  }.  sqlite3
14000 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
14010 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
14020 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65  /*.** Commit the
14030 20 73 74 61 74 6d 65 6e 74 20 73 75 62 74 72 61   statment subtra
14040 6e 73 61 63 74 69 6f 6e 20 63 75 72 72 65 6e 74  nsaction current
14050 6c 79 20 69 6e 20 70 72 6f 67 72 65 73 73 2e 20  ly in progress. 
14060 20 49 66 20 6e 6f 0a 2a 2a 20 73 75 62 74 72 61   If no.** subtra
14070 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
14080 76 65 2c 20 74 68 69 73 20 69 73 20 61 20 6e 6f  ve, this is a no
14090 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  -op..*/.int sqli
140a0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 53 74  te3BtreeCommitSt
140b0 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  mt(Btree *p){.  
140c0 69 6e 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72  int rc;.  BtShar
140d0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
140e0 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
140f0 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d  Enter(p);.  pBt-
14100 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69  >db = p->db;.  i
14110 66 28 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 26  f( pBt->inStmt &
14120 26 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  & !pBt->readOnly
14130 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
14140 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d  ite3PagerStmtCom
14150 6d 69 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  mit(pBt->pPager)
14160 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
14170 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
14180 20 7d 0a 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74   }.  pBt->inStmt
14190 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42   = 0;.  sqlite3B
141a0 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
141b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
141c0 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65  .** Rollback the
141d0 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e   active statemen
141e0 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
141f0 2e 20 20 49 66 20 6e 6f 20 73 75 62 74 72 61 6e  .  If no subtran
14200 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 61 63  saction.** is ac
14210 74 69 76 65 20 74 68 69 73 20 72 6f 75 74 69 6e  tive this routin
14220 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  e is a no-op..**
14230 0a 2a 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73 20  .** All cursors 
14240 77 69 6c 6c 20 62 65 20 69 6e 76 61 6c 69 64 61  will be invalida
14250 74 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72  ted by this oper
14260 61 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65  ation.  Any atte
14270 6d 70 74 0a 2a 2a 20 74 6f 20 75 73 65 20 61 20  mpt.** to use a 
14280 63 75 72 73 6f 72 20 74 68 61 74 20 77 61 73 20  cursor that was 
14290 6f 70 65 6e 20 61 74 20 74 68 65 20 62 65 67 69  open at the begi
142a0 6e 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70  nning of this op
142b0 65 72 61 74 69 6f 6e 0a 2a 2a 20 77 69 6c 6c 20  eration.** will 
142c0 72 65 73 75 6c 74 20 69 6e 20 61 6e 20 65 72 72  result in an err
142d0 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  or..*/.int sqlit
142e0 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 53  e3BtreeRollbackS
142f0 74 6d 74 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  tmt(Btree *p){. 
14300 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
14310 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20  _OK;.  BtShared 
14320 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
14330 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
14340 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62  er(p);.  pBt->db
14350 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20   = p->db;.  if( 
14360 70 42 74 2d 3e 69 6e 53 74 6d 74 20 26 26 20 21  pBt->inStmt && !
14370 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  pBt->readOnly ){
14380 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
14390 33 50 61 67 65 72 53 74 6d 74 52 6f 6c 6c 62 61  3PagerStmtRollba
143a0 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b  ck(pBt->pPager);
143b0 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74  .    pBt->inStmt
143c0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
143d0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
143e0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
143f0 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
14400 20 6e 65 77 20 63 75 72 73 6f 72 20 66 6f 72 20   new cursor for 
14410 74 68 65 20 42 54 72 65 65 20 77 68 6f 73 65 20  the BTree whose 
14420 72 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 70  root is on the p
14430 61 67 65 0a 2a 2a 20 69 54 61 62 6c 65 2e 20 20  age.** iTable.  
14440 54 68 65 20 61 63 74 20 6f 66 20 61 63 71 75 69  The act of acqui
14450 72 69 6e 67 20 61 20 63 75 72 73 6f 72 20 67 65  ring a cursor ge
14460 74 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f  ts a read lock o
14470 6e 20 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  n .** the databa
14480 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
14490 66 20 77 72 46 6c 61 67 3d 3d 30 2c 20 74 68 65  f wrFlag==0, the
144a0 6e 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e  n the cursor can
144b0 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 66 6f   only be used fo
144c0 72 20 72 65 61 64 69 6e 67 2e 0a 2a 2a 20 49 66  r reading..** If
144d0 20 77 72 46 6c 61 67 3d 3d 31 2c 20 74 68 65 6e   wrFlag==1, then
144e0 20 74 68 65 20 63 75 72 73 6f 72 20 63 61 6e 20   the cursor can 
144f0 62 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64  be used for read
14500 69 6e 67 20 6f 72 20 66 6f 72 0a 2a 2a 20 77 72  ing or for.** wr
14510 69 74 69 6e 67 20 69 66 20 6f 74 68 65 72 20 63  iting if other c
14520 6f 6e 64 69 74 69 6f 6e 73 20 66 6f 72 20 77 72  onditions for wr
14530 69 74 69 6e 67 20 61 72 65 20 61 6c 73 6f 20 6d  iting are also m
14540 65 74 2e 20 20 54 68 65 73 65 0a 2a 2a 20 61 72  et.  These.** ar
14550 65 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 73  e the conditions
14560 20 74 68 61 74 20 6d 75 73 74 20 62 65 20 6d 65   that must be me
14570 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 77  t in order for w
14580 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20 62 65 20  riting to.** be 
14590 61 6c 6c 6f 77 65 64 3a 0a 2a 2a 0a 2a 2a 20 31  allowed:.**.** 1
145a0 3a 20 20 54 68 65 20 63 75 72 73 6f 72 20 6d 75  :  The cursor mu
145b0 73 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  st have been ope
145c0 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61 67 3d  ned with wrFlag=
145d0 3d 31 0a 2a 2a 0a 2a 2a 20 32 3a 20 20 4f 74 68  =1.**.** 2:  Oth
145e0 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
145f0 65 63 74 69 6f 6e 73 20 74 68 61 74 20 73 68 61  ections that sha
14600 72 65 20 74 68 65 20 73 61 6d 65 20 70 61 67 65  re the same page
14610 72 20 63 61 63 68 65 0a 2a 2a 20 20 20 20 20 62  r cache.**     b
14620 75 74 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74  ut which are not
14630 20 69 6e 20 74 68 65 20 52 45 41 44 5f 55 4e 43   in the READ_UNC
14640 4f 4d 4d 49 54 54 45 44 20 73 74 61 74 65 20 6d  OMMITTED state m
14650 61 79 20 6e 6f 74 20 68 61 76 65 0a 2a 2a 20 20  ay not have.**  
14660 20 20 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20     cursors open 
14670 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 6f  with wrFlag==0 o
14680 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65  n the same table
14690 2e 20 20 4f 74 68 65 72 77 69 73 65 0a 2a 2a 20  .  Otherwise.** 
146a0 20 20 20 20 74 68 65 20 63 68 61 6e 67 65 73 20      the changes 
146b0 6d 61 64 65 20 62 79 20 74 68 69 73 20 77 72 69  made by this wri
146c0 74 65 20 63 75 72 73 6f 72 20 77 6f 75 6c 64 20  te cursor would 
146d0 62 65 20 76 69 73 69 62 6c 65 20 74 6f 0a 2a 2a  be visible to.**
146e0 20 20 20 20 20 74 68 65 20 72 65 61 64 20 63 75       the read cu
146f0 72 73 6f 72 73 20 69 6e 20 74 68 65 20 6f 74 68  rsors in the oth
14700 65 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  er database conn
14710 65 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 33 3a  ection..**.** 3:
14720 20 20 54 68 65 20 64 61 74 61 62 61 73 65 20 6d    The database m
14730 75 73 74 20 62 65 20 77 72 69 74 61 62 6c 65 20  ust be writable 
14740 28 6e 6f 74 20 6f 6e 20 72 65 61 64 2d 6f 6e 6c  (not on read-onl
14750 79 20 6d 65 64 69 61 29 0a 2a 2a 0a 2a 2a 20 34  y media).**.** 4
14760 3a 20 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  :  There must be
14770 20 61 6e 20 61 63 74 69 76 65 20 74 72 61 6e 73   an active trans
14780 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  action..**.** No
14790 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e   checking is don
147a0 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
147b0 68 61 74 20 70 61 67 65 20 69 54 61 62 6c 65 20  hat page iTable 
147c0 72 65 61 6c 6c 79 20 69 73 20 74 68 65 0a 2a 2a  really is the.**
147d0 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61 20   root page of a 
147e0 62 2d 74 72 65 65 2e 20 20 49 66 20 69 74 20 69  b-tree.  If it i
147f0 73 20 6e 6f 74 2c 20 74 68 65 6e 20 74 68 65 20  s not, then the 
14800 63 75 72 73 6f 72 20 61 63 71 75 69 72 65 64 0a  cursor acquired.
14810 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b  ** will not work
14820 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 73   correctly..*/.s
14830 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43  tatic int btreeC
14840 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
14850 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
14860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14870 2f 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a  /* The btree */.
14880 20 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20    int iTable,   
14890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148a0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74           /* Root
148b0 20 70 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74   page of table t
148c0 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
148d0 77 72 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20  wrFlag,         
148e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148f0 20 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65     /* 1 to write
14900 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f  . 0 read-only */
14910 0a 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66  .  struct KeyInf
14920 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20  o *pKeyInfo,    
14930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
14940 73 74 20 61 72 67 20 74 6f 20 63 6f 6d 70 61 72  st arg to compar
14950 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  ison function */
14960 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75  .  BtCursor *pCu
14970 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
14980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
14990 63 65 20 66 6f 72 20 6e 65 77 20 63 75 72 73 6f  ce for new curso
149a0 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  r */.){.  int rc
149b0 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
149c0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61  t = p->pBt;..  a
149d0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
149e0 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
149f0 20 29 3b 0a 20 20 69 66 28 20 77 72 46 6c 61 67   );.  if( wrFlag
14a00 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 2d   ){.    if( pBt-
14a10 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20  >readOnly ){.   
14a20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14a30 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d  _READONLY;.    }
14a40 0a 20 20 20 20 69 66 28 20 63 68 65 63 6b 52 65  .    if( checkRe
14a50 61 64 4c 6f 63 6b 73 28 70 2c 20 69 54 61 62 6c  adLocks(p, iTabl
14a60 65 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20  e, 0, 0) ){.    
14a70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14a80 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20  LOCKED;.    }.  
14a90 7d 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 50  }..  if( pBt->pP
14aa0 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72  age1==0 ){.    r
14ab0 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 57 69 74  c = lockBtreeWit
14ac0 68 52 65 74 72 79 28 70 29 3b 0a 20 20 20 20 69  hRetry(p);.    i
14ad0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14ae0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
14af0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   rc;.    }.    i
14b00 66 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  f( pBt->readOnly
14b10 20 26 26 20 77 72 46 6c 61 67 20 29 7b 0a 20 20   && wrFlag ){.  
14b20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
14b30 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  E_READONLY;.    
14b40 7d 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 70 67  }.  }.  pCur->pg
14b50 6e 6f 52 6f 6f 74 20 3d 20 28 50 67 6e 6f 29 69  noRoot = (Pgno)i
14b60 54 61 62 6c 65 3b 0a 20 20 69 66 28 20 69 54 61  Table;.  if( iTa
14b70 62 6c 65 3d 3d 31 20 26 26 20 70 61 67 65 72 50  ble==1 && pagerP
14b80 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
14b90 61 67 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ager)==0 ){.    
14ba0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 4d 50 54  rc = SQLITE_EMPT
14bb0 59 3b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61  Y;.    goto crea
14bc0 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74  te_cursor_except
14bd0 69 6f 6e 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ion;.  }.  rc = 
14be0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
14bf0 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
14c00 6f 74 2c 20 26 70 43 75 72 2d 3e 70 50 61 67 65  ot, &pCur->pPage
14c10 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
14c20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14c30 20 67 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72   goto create_cur
14c40 73 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20  sor_exception;. 
14c50 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 74 68 61   }..  /* Now tha
14c60 74 20 6e 6f 20 6f 74 68 65 72 20 65 72 72 6f 72  t no other error
14c70 73 20 63 61 6e 20 6f 63 63 75 72 2c 20 66 69 6e  s can occur, fin
14c80 69 73 68 20 66 69 6c 6c 69 6e 67 20 69 6e 20 74  ish filling in t
14c90 68 65 20 42 74 43 75 72 73 6f 72 0a 20 20 2a 2a  he BtCursor.  **
14ca0 20 76 61 72 69 61 62 6c 65 73 2c 20 6c 69 6e 6b   variables, link
14cb0 20 74 68 65 20 63 75 72 73 6f 72 20 69 6e 74 6f   the cursor into
14cc0 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6c 69   the BtShared li
14cd0 73 74 20 61 6e 64 20 73 65 74 20 2a 70 70 43 75  st and set *ppCu
14ce0 72 20 28 74 68 65 0a 20 20 2a 2a 20 6f 75 74 70  r (the.  ** outp
14cf0 75 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74  ut argument to t
14d00 68 69 73 20 66 75 6e 63 74 69 6f 6e 29 2e 0a 20  his function).. 
14d10 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 70 4b 65 79   */.  pCur->pKey
14d20 49 6e 66 6f 20 3d 20 70 4b 65 79 49 6e 66 6f 3b  Info = pKeyInfo;
14d30 0a 20 20 70 43 75 72 2d 3e 70 42 74 72 65 65 20  .  pCur->pBtree 
14d40 3d 20 70 3b 0a 20 20 70 43 75 72 2d 3e 70 42 74  = p;.  pCur->pBt
14d50 20 3d 20 70 42 74 3b 0a 20 20 70 43 75 72 2d 3e   = pBt;.  pCur->
14d60 77 72 46 6c 61 67 20 3d 20 77 72 46 6c 61 67 3b  wrFlag = wrFlag;
14d70 0a 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d  .  pCur->pNext =
14d80 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20   pBt->pCursor;. 
14d90 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78 74   if( pCur->pNext
14da0 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e   ){.    pCur->pN
14db0 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75  ext->pPrev = pCu
14dc0 72 3b 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43  r;.  }.  pBt->pC
14dd0 75 72 73 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20  ursor = pCur;.  
14de0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
14df0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 0a  URSOR_INVALID;..
14e00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14e10 4f 4b 3b 0a 0a 63 72 65 61 74 65 5f 63 75 72 73  OK;..create_curs
14e20 6f 72 5f 65 78 63 65 70 74 69 6f 6e 3a 0a 20 20  or_exception:.  
14e30 69 66 28 20 70 43 75 72 20 29 7b 0a 20 20 20 20  if( pCur ){.    
14e40 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
14e50 2d 3e 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  ->pPage);.  }.  
14e60 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
14e70 73 65 64 28 70 42 74 29 3b 0a 20 20 72 65 74 75  sed(pBt);.  retu
14e80 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rn rc;.}.int sql
14e90 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 28  ite3BtreeCursor(
14ea0 0a 20 20 42 74 72 65 65 20 2a 70 2c 20 20 20 20  .  Btree *p,    
14eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14ed0 2a 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20  * The btree */. 
14ee0 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 20 20 20   int iTable,    
14ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14f10 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62  Root page of tab
14f20 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
14f30 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20  int wrFlag,     
14f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
14f60 20 74 6f 20 77 72 69 74 65 2e 20 30 20 72 65 61   to write. 0 rea
14f70 64 2d 6f 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75  d-only */.  stru
14f80 63 74 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79  ct KeyInfo *pKey
14f90 49 6e 66 6f 2c 20 20 20 20 20 20 20 20 20 20 20  Info,           
14fa0 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
14fb0 20 61 72 67 20 74 6f 20 78 43 6f 6d 70 61 72 65   arg to xCompare
14fc0 28 29 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72  () */.  BtCursor
14fd0 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20   *pCur          
14fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ff0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6e 65 77      /* Write new
15000 20 63 75 72 73 6f 72 20 68 65 72 65 20 2a 2f 0a   cursor here */.
15010 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
15020 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
15030 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 64  (p);.  p->pBt->d
15040 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20  b = p->db;.  rc 
15050 3d 20 62 74 72 65 65 43 75 72 73 6f 72 28 70 2c  = btreeCursor(p,
15060 20 69 54 61 62 6c 65 2c 20 77 72 46 6c 61 67 2c   iTable, wrFlag,
15070 20 70 4b 65 79 49 6e 66 6f 2c 20 70 43 75 72 29   pKeyInfo, pCur)
15080 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
15090 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
150a0 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c  rn rc;.}.int sql
150b0 69 74 65 33 42 74 72 65 65 43 75 72 73 6f 72 53  ite3BtreeCursorS
150c0 69 7a 65 28 29 7b 0a 20 20 72 65 74 75 72 6e 20  ize(){.  return 
150d0 73 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29  sizeof(BtCursor)
150e0 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f  ;.}..../*.** Clo
150f0 73 65 20 61 20 63 75 72 73 6f 72 2e 20 20 54 68  se a cursor.  Th
15100 65 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  e read lock on t
15110 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
15120 20 69 73 20 72 65 6c 65 61 73 65 64 0a 2a 2a 20   is released.** 
15130 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 63 75  when the last cu
15140 72 73 6f 72 20 69 73 20 63 6c 6f 73 65 64 2e 0a  rsor is closed..
15150 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
15160 72 65 65 43 6c 6f 73 65 43 75 72 73 6f 72 28 42  reeCloseCursor(B
15170 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
15180 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 20    Btree *pBtree 
15190 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
151a0 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b 0a    if( pBtree ){.
151b0 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
151c0 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20  t = pCur->pBt;. 
151d0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
151e0 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
151f0 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 42 74 72    pBt->db = pBtr
15200 65 65 2d 3e 64 62 3b 0a 20 20 20 20 63 6c 65 61  ee->db;.    clea
15210 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
15220 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 70  pCur);.    if( p
15230 43 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  Cur->pPrev ){.  
15240 20 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d      pCur->pPrev-
15250 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70  >pNext = pCur->p
15260 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
15270 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72  .      pBt->pCur
15280 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  sor = pCur->pNex
15290 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
152a0 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a   pCur->pNext ){.
152b0 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78        pCur->pNex
152c0 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d  t->pPrev = pCur-
152d0 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20  >pPrev;.    }.  
152e0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
152f0 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20 20 20 20  ur->pPage);.    
15300 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
15310 73 65 64 28 70 42 74 29 3b 0a 20 20 20 20 69 6e  sed(pBt);.    in
15320 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
15330 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 20  Cache(pCur);.   
15340 20 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65   /* sqlite3_free
15350 28 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73  (pCur); */.    s
15360 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
15370 28 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20  (pBtree);.  }.  
15380 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
15390 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  ;.}../*.** Make 
153a0 61 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73  a temporary curs
153b0 6f 72 20 62 79 20 66 69 6c 6c 69 6e 67 20 69 6e  or by filling in
153c0 20 74 68 65 20 66 69 65 6c 64 73 20 6f 66 20 70   the fields of p
153d0 54 65 6d 70 43 75 72 2e 0a 2a 2a 20 54 68 65 20  TempCur..** The 
153e0 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72  temporary cursor
153f0 20 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63   is not on the c
15400 75 72 73 6f 72 20 6c 69 73 74 20 66 6f 72 20 74  ursor list for t
15410 68 65 20 42 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69  he Btree..*/.voi
15420 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  d sqlite3BtreeGe
15430 74 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75  tTempCursor(BtCu
15440 72 73 6f 72 20 2a 70 43 75 72 2c 20 42 74 43 75  rsor *pCur, BtCu
15450 72 73 6f 72 20 2a 70 54 65 6d 70 43 75 72 29 7b  rsor *pTempCur){
15460 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
15470 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
15480 29 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54  ) );.  memcpy(pT
15490 65 6d 70 43 75 72 2c 20 70 43 75 72 2c 20 73 69  empCur, pCur, si
154a0 7a 65 6f 66 28 2a 70 43 75 72 29 29 3b 0a 20 20  zeof(*pCur));.  
154b0 70 54 65 6d 70 43 75 72 2d 3e 70 4e 65 78 74 20  pTempCur->pNext 
154c0 3d 20 30 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d  = 0;.  pTempCur-
154d0 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 69 66  >pPrev = 0;.  if
154e0 28 20 70 54 65 6d 70 43 75 72 2d 3e 70 50 61 67  ( pTempCur->pPag
154f0 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
15500 50 61 67 65 72 52 65 66 28 70 54 65 6d 70 43 75  PagerRef(pTempCu
15510 72 2d 3e 70 50 61 67 65 2d 3e 70 44 62 50 61 67  r->pPage->pDbPag
15520 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
15530 20 44 65 6c 65 74 65 20 61 20 74 65 6d 70 6f 72   Delete a tempor
15540 61 72 79 20 63 75 72 73 6f 72 20 73 75 63 68 20  ary cursor such 
15550 61 73 20 77 61 73 20 6d 61 64 65 20 62 79 20 74  as was made by t
15560 68 65 20 43 72 65 61 74 65 54 65 6d 70 6f 72 61  he CreateTempora
15570 72 79 43 75 72 73 6f 72 28 29 0a 2a 2a 20 66 75  ryCursor().** fu
15580 6e 63 74 69 6f 6e 20 61 62 6f 76 65 2e 0a 2a 2f  nction above..*/
15590 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
155a0 65 65 52 65 6c 65 61 73 65 54 65 6d 70 43 75 72  eeReleaseTempCur
155b0 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
155c0 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  ur){.  assert( c
155d0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
155e0 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70  pCur) );.  if( p
155f0 43 75 72 2d 3e 70 50 61 67 65 20 29 7b 0a 20 20  Cur->pPage ){.  
15600 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
15610 72 65 66 28 70 43 75 72 2d 3e 70 50 61 67 65 2d  ref(pCur->pPage-
15620 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d  >pDbPage);.  }.}
15630 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
15640 65 20 74 68 65 20 42 74 43 75 72 73 6f 72 2a 20  e the BtCursor* 
15650 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
15660 75 6d 65 6e 74 20 68 61 73 20 61 20 76 61 6c 69  ument has a vali
15670 64 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e  d.** BtCursor.in
15680 66 6f 20 73 74 72 75 63 74 75 72 65 2e 20 20 49  fo structure.  I
15690 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72 65  f it is not alre
156a0 61 64 79 20 76 61 6c 69 64 2c 20 63 61 6c 6c 0a  ady valid, call.
156b0 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  ** sqlite3BtreeP
156c0 61 72 73 65 43 65 6c 6c 28 29 20 74 6f 20 66 69  arseCell() to fi
156d0 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a 0a 2a 2a 20  ll it in..**.** 
156e0 42 74 43 75 72 73 6f 72 2e 69 6e 66 6f 20 69 73  BtCursor.info is
156f0 20 61 20 63 61 63 68 65 20 6f 66 20 74 68 65 20   a cache of the 
15700 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
15710 68 65 20 63 75 72 72 65 6e 74 20 63 65 6c 6c 2e  he current cell.
15720 0a 2a 2a 20 55 73 69 6e 67 20 74 68 69 73 20 63  .** Using this c
15730 61 63 68 65 20 72 65 64 75 63 65 73 20 74 68 65  ache reduces the
15740 20 6e 75 6d 62 65 72 20 6f 66 20 63 61 6c 6c 73   number of calls
15750 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65   to sqlite3Btree
15760 50 61 72 73 65 43 65 6c 6c 28 29 2e 0a 2a 2a 0a  ParseCell()..**.
15770 2a 2a 20 32 30 30 37 2d 30 36 2d 32 35 3a 20 20  ** 2007-06-25:  
15780 54 68 65 72 65 20 69 73 20 61 20 62 75 67 20 69  There is a bug i
15790 6e 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 20  n some versions 
157a0 6f 66 20 4d 53 56 43 20 74 68 61 74 20 63 61 75  of MSVC that cau
157b0 73 65 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69 6c  se the.** compil
157c0 65 72 20 74 6f 20 63 72 61 73 68 20 77 68 65 6e  er to crash when
157d0 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 29 20 69   getCellInfo() i
157e0 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
157f0 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a 20 42 75 74   a macro..** But
15800 20 74 68 65 72 65 20 69 73 20 61 20 6d 65 61 73   there is a meas
15810 75 72 65 61 62 6c 65 20 73 70 65 65 64 20 61 64  ureable speed ad
15820 76 61 6e 74 61 67 65 20 74 6f 20 75 73 69 6e 67  vantage to using
15830 20 74 68 65 20 6d 61 63 72 6f 20 6f 6e 20 67 63   the macro on gc
15840 63 0a 2a 2a 20 28 77 68 65 6e 20 6c 65 73 73 20  c.** (when less 
15850 63 6f 6d 70 69 6c 65 72 20 6f 70 74 69 6d 69 7a  compiler optimiz
15860 61 74 69 6f 6e 73 20 6c 69 6b 65 20 2d 4f 73 20  ations like -Os 
15870 6f 72 20 2d 4f 30 20 61 72 65 20 75 73 65 64 20  or -O0 are used 
15880 61 6e 64 20 74 68 65 0a 2a 2a 20 63 6f 6d 70 69  and the.** compi
15890 6c 65 72 20 69 73 20 6e 6f 74 20 64 6f 69 6e 67  ler is not doing
158a0 20 61 67 72 65 73 73 69 76 65 20 69 6e 6c 69 6e   agressive inlin
158b0 69 6e 67 2e 29 20 20 53 6f 20 77 65 20 75 73 65  ing.)  So we use
158c0 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e   a real function
158d0 0a 2a 2a 20 66 6f 72 20 4d 53 56 43 20 61 6e 64  .** for MSVC and
158e0 20 61 20 6d 61 63 72 6f 20 66 6f 72 20 65 76 65   a macro for eve
158f0 72 79 74 68 69 6e 67 20 65 6c 73 65 2e 20 20 54  rything else.  T
15900 69 63 6b 65 74 20 23 32 34 35 37 2e 0a 2a 2f 0a  icket #2457..*/.
15910 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
15920 20 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73   static void ass
15930 65 72 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75  ertCellInfo(BtCu
15940 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20  rsor *pCur){.   
15950 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
15960 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66 6f      memset(&info
15970 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  , 0, sizeof(info
15980 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  ));.    sqlite3B
15990 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
159a0 75 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2d  ur->pPage, pCur-
159b0 3e 69 64 78 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  >idx, &info);.  
159c0 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63 6d 70    assert( memcmp
159d0 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d 3e 69  (&info, &pCur->i
159e0 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e 66 6f  nfo, sizeof(info
159f0 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23 65 6c  ))==0 );.  }.#el
15a00 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61 73 73  se.  #define ass
15a10 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29 0a 23  ertCellInfo(x).#
15a20 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f 4d 53  endif.#ifdef _MS
15a30 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65 20 61  C_VER.  /* Use a
15a40 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 69   real function i
15a50 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b 20 61  n MSVC to work a
15a60 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20 74 68  round bugs in th
15a70 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a 2f 0a  at compiler. */.
15a80 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 67 65    static void ge
15a90 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75 72 73  tCellInfo(BtCurs
15aa0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20 20 69  or *pCur){.    i
15ab0 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53  f( pCur->info.nS
15ac0 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ize==0 ){.      
15ad0 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
15ae0 65 43 65 6c 6c 28 70 43 75 72 2d 3e 70 50 61 67  eCell(pCur->pPag
15af0 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 26 70  e, pCur->idx, &p
15b00 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20  Cur->info);.    
15b10 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
15b20 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  y = 1;.    }else
15b30 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 43 65  {.      assertCe
15b40 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
15b50 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a    }.  }.#else /*
15b60 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52   if not _MSC_VER
15b70 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d   */.  /* Use a m
15b80 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65  acro in all othe
15b90 72 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74  r compilers so t
15ba0 68 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  hat the function
15bb0 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23   is inlined */.#
15bc0 64 65 66 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e  define getCellIn
15bd0 66 6f 28 70 43 75 72 29 20 20 20 20 20 20 20 20  fo(pCur)        
15be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c00 20 20 20 20 20 20 20 5c 0a 20 20 69 66 28 20 70         \.  if( p
15c10 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 3d  Cur->info.nSize=
15c20 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
15c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c50 20 5c 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   \.    sqlite3Bt
15c60 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75  reeParseCell(pCu
15c70 72 2d 3e 70 50 61 67 65 2c 20 70 43 75 72 2d 3e  r->pPage, pCur->
15c80 69 64 78 2c 20 26 70 43 75 72 2d 3e 69 6e 66 6f  idx, &pCur->info
15c90 29 3b 20 20 20 20 20 20 20 20 20 5c 0a 20 20 20  );         \.   
15ca0 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
15cb0 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20   = 1;           
15cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15ce0 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20       \.  }else{ 
15cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
15d30 0a 20 20 20 20 61 73 73 65 72 74 43 65 6c 6c 49  .    assertCellI
15d40 6e 66 6f 28 70 43 75 72 29 3b 20 20 20 20 20 20  nfo(pCur);      
15d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15d70 20 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23           \.  }.#
15d80 65 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45  endif /* _MSC_VE
15d90 52 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  R */../*.** Set 
15da0 2a 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69  *pSize to the si
15db0 7a 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  ze of the buffer
15dc0 20 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20   needed to hold 
15dd0 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20  the value of.** 
15de0 74 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20  the key for the 
15df0 63 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20  current entry.  
15e00 49 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  If the cursor is
15e10 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a   not pointing.**
15e20 20 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72   to a valid entr
15e30 79 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74  y, *pSize is set
15e40 20 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f   to 0. .**.** Fo
15e50 72 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74  r a table with t
15e60 68 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73  he INTKEY flag s
15e70 65 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  et, this routine
15e80 20 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79   returns the key
15e90 0a 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20  .** itself, not 
15ea0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
15eb0 74 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a  tes in the key..
15ec0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
15ed0 72 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72  reeKeySize(BtCur
15ee0 73 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a  sor *pCur, i64 *
15ef0 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63  pSize){.  int rc
15f00 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
15f10 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
15f20 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
15f30 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73  storeOrClearCurs
15f40 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
15f50 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
15f60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
15f70 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
15f80 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
15f90 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
15fa0 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
15fb0 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  );.    if( pCur-
15fc0 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
15fd0 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  INVALID ){.     
15fe0 20 2a 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20   *pSize = 0;.   
15ff0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 65   }else{.      ge
16000 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
16010 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  .      *pSize = 
16020 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
16030 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
16040 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
16050 20 53 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 74   Set *pSize to t
16060 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
16070 65 73 20 6f 66 20 64 61 74 61 20 69 6e 20 74 68  es of data in th
16080 65 20 65 6e 74 72 79 20 74 68 65 0a 2a 2a 20 63  e entry the.** c
16090 75 72 73 6f 72 20 63 75 72 72 65 6e 74 6c 79 20  ursor currently 
160a0 70 6f 69 6e 74 73 20 74 6f 2e 20 20 41 6c 77 61  points to.  Alwa
160b0 79 73 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ys return SQLITE
160c0 5f 4f 4b 2e 0a 2a 2a 20 46 61 69 6c 75 72 65 20  _OK..** Failure 
160d0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e  is not possible.
160e0 20 20 49 66 20 74 68 65 20 63 75 72 73 6f 72 20    If the cursor 
160f0 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
16100 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20  .** pointing to 
16110 61 6e 20 65 6e 74 72 79 20 28 77 68 69 63 68 20  an entry (which 
16120 63 61 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72 20  can happen, for 
16130 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a 2a 20 74  example, if.** t
16140 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 65  he database is e
16150 6d 70 74 79 29 20 74 68 65 6e 20 2a 70 53 69 7a  mpty) then *pSiz
16160 65 20 69 73 20 73 65 74 20 74 6f 20 30 2e 0a 2a  e is set to 0..*
16170 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
16180 65 65 44 61 74 61 53 69 7a 65 28 42 74 43 75 72  eeDataSize(BtCur
16190 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32 20 2a  sor *pCur, u32 *
161a0 70 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63  pSize){.  int rc
161b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
161c0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
161d0 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
161e0 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73  storeOrClearCurs
161f0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
16200 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
16210 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
16220 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
16230 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
16240 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74  D || pCur->eStat
16250 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
16260 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  );.    if( pCur-
16270 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
16280 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20  INVALID ){.     
16290 20 2f 2a 20 4e 6f 74 20 70 6f 69 6e 74 69 6e 67   /* Not pointing
162a0 20 61 74 20 61 20 76 61 6c 69 64 20 65 6e 74 72   at a valid entr
162b0 79 20 2d 20 73 65 74 20 2a 70 53 69 7a 65 20 74  y - set *pSize t
162c0 6f 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 70  o 0. */.      *p
162d0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Size = 0;.    }e
162e0 6c 73 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65  lse{.      getCe
162f0 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
16300 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75      *pSize = pCu
16310 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20  r->info.nData;. 
16320 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
16330 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n rc;.}../*.** G
16340 69 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75  iven the page nu
16350 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66  mber of an overf
16360 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
16370 64 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65  database (parame
16380 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68  ter.** ovfl), th
16390 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64  is function find
163a0 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  s the page numbe
163b0 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61  r of the next pa
163c0 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69  ge in the .** li
163d0 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65  nked list of ove
163e0 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20  rflow pages. If 
163f0 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65  possible, it use
16400 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  s the auto-vacuu
16410 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70  m.** pointer-map
16420 20 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66   data instead of
16430 20 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e   reading the con
16440 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66  tent of page ovf
16450 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a  l to do so. .**.
16460 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
16470 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20  ccurs an SQLite 
16480 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
16490 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
164a0 65 3a 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  e:.**.** Unless 
164b0 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 4e 55 4c  pPgnoNext is NUL
164c0 4c 2c 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  L, the page numb
164d0 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 6f  er of the next o
164e0 76 65 72 66 6c 6f 77 20 0a 2a 2a 20 70 61 67 65  verflow .** page
164f0 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c   in the linked l
16500 69 73 74 20 69 73 20 77 72 69 74 74 65 6e 20 74  ist is written t
16510 6f 20 2a 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66  o *pPgnoNext. If
16520 20 70 61 67 65 20 6f 76 66 6c 0a 2a 2a 20 69 73   page ovfl.** is
16530 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
16540 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 6c 69 73  n its linked lis
16550 74 2c 20 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73  t, *pPgnoNext is
16560 20 73 65 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a   set to zero. .*
16570 2a 0a 2a 2a 20 49 66 20 70 70 50 61 67 65 20 69  *.** If ppPage i
16580 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 2a 70 70 50  s not NULL, *ppP
16590 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  age is set to th
165a0 65 20 4d 65 6d 50 61 67 65 2a 20 68 61 6e 64 6c  e MemPage* handl
165b0 65 0a 2a 2a 20 66 6f 72 20 70 61 67 65 20 6f 76  e.** for page ov
165c0 66 6c 2e 20 54 68 65 20 75 6e 64 65 72 6c 79 69  fl. The underlyi
165d0 6e 67 20 70 61 67 65 72 20 70 61 67 65 20 6d 61  ng pager page ma
165e0 79 20 68 61 76 65 20 62 65 65 6e 20 72 65 71 75  y have been requ
165f0 65 73 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  ested.** with th
16600 65 20 6e 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67  e noContent flag
16610 20 73 65 74 2c 20 73 6f 20 74 68 65 20 70 61 67   set, so the pag
16620 65 20 64 61 74 61 20 61 63 63 65 73 73 61 62 6c  e data accessabl
16630 65 20 76 69 61 0a 2a 2a 20 74 68 69 73 20 68 61  e via.** this ha
16640 6e 64 6c 65 20 6d 61 79 20 6e 6f 74 20 62 65 20  ndle may not be 
16650 74 72 75 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  trusted..*/.stat
16660 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c  ic int getOverfl
16670 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  owPage(.  BtShar
16680 65 64 20 2a 70 42 74 2c 20 0a 20 20 50 67 6e 6f  ed *pBt, .  Pgno
16690 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20   ovfl,          
166a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 76 65 72           /* Over
166b0 66 6c 6f 77 20 70 61 67 65 20 2a 2f 0a 20 20 4d  flow page */.  M
166c0 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
166d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
166e0 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64  UT: MemPage hand
166f0 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50  le */.  Pgno *pP
16700 67 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20  gnoNext         
16710 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78       /* OUT: Nex
16720 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  t overflow page 
16730 6e 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50  number */.){.  P
16740 67 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20  gno next = 0;.  
16750 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
16760 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
16770 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
16780 29 20 29 3b 0a 20 20 2f 2a 20 4f 6e 65 20 6f 66  ) );.  /* One of
16790 20 74 68 65 73 65 20 6d 75 73 74 20 6e 6f 74 20   these must not 
167a0 62 65 20 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69  be NULL. Otherwi
167b0 73 65 2c 20 77 68 79 20 63 61 6c 6c 20 74 68 69  se, why call thi
167c0 73 20 66 75 6e 63 74 69 6f 6e 3f 20 2a 2f 0a 20  s function? */. 
167d0 20 61 73 73 65 72 74 28 70 70 50 61 67 65 20 7c   assert(ppPage |
167e0 7c 20 70 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 20  | pPgnoNext);.. 
167f0 20 2f 2a 20 49 66 20 70 50 67 6e 6f 4e 65 78 74   /* If pPgnoNext
16800 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74   is NULL, then t
16810 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
16820 62 65 69 6e 67 20 63 61 6c 6c 65 64 20 74 6f 20  being called to 
16830 6f 62 74 61 69 6e 0a 20 20 2a 2a 20 61 20 4d 65  obtain.  ** a Me
16840 6d 50 61 67 65 2a 20 72 65 66 65 72 65 6e 63 65  mPage* reference
16850 20 6f 6e 6c 79 2e 20 4e 6f 20 70 61 67 65 2d 64   only. No page-d
16860 61 74 61 20 69 73 20 72 65 71 75 69 72 65 64 20  ata is required 
16870 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
16880 2a 2f 0a 20 20 69 66 28 20 21 70 50 67 6e 6f 4e  */.  if( !pPgnoN
16890 65 78 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ext ){.    retur
168a0 6e 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  n sqlite3BtreeGe
168b0 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c  tPage(pBt, ovfl,
168c0 20 70 70 50 61 67 65 2c 20 31 29 3b 0a 20 20 7d   ppPage, 1);.  }
168d0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
168e0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
168f0 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e  .  /* Try to fin
16900 64 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  d the next page 
16910 69 6e 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  in the overflow 
16920 6c 69 73 74 20 75 73 69 6e 67 20 74 68 65 0a 20  list using the. 
16930 20 2a 2a 20 61 75 74 6f 76 61 63 75 75 6d 20 70   ** autovacuum p
16940 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73  ointer-map pages
16950 2e 20 47 75 65 73 73 20 74 68 61 74 20 74 68 65  . Guess that the
16960 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 0a 20   next page in . 
16970 20 2a 2a 20 74 68 65 20 6f 76 65 72 66 6c 6f 77   ** the overflow
16980 20 6c 69 73 74 20 69 73 20 70 61 67 65 20 6e 75   list is page nu
16990 6d 62 65 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49  mber (ovfl+1). I
169a0 66 20 74 68 61 74 20 67 75 65 73 73 20 74 75 72  f that guess tur
169b0 6e 73 20 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20  ns .  ** out to 
169c0 62 65 20 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62  be wrong, fall b
169d0 61 63 6b 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74  ack to loading t
169e0 68 65 20 64 61 74 61 20 6f 66 20 70 61 67 65 20  he data of page 
169f0 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66  .  ** number ovf
16a00 6c 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  l to determine t
16a10 68 65 20 6e 65 78 74 20 70 61 67 65 20 6e 75 6d  he next page num
16a20 62 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ber..  */.  if( 
16a30 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
16a40 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f  ){.    Pgno pgno
16a50 3b 0a 20 20 20 20 50 67 6e 6f 20 69 47 75 65 73  ;.    Pgno iGues
16a60 73 20 3d 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20  s = ovfl+1;.    
16a70 75 38 20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77  u8 eType;..    w
16a80 68 69 6c 65 28 20 50 54 52 4d 41 50 5f 49 53 50  hile( PTRMAP_ISP
16a90 41 47 45 28 70 42 74 2c 20 69 47 75 65 73 73 29  AGE(pBt, iGuess)
16aa0 20 7c 7c 20 69 47 75 65 73 73 3d 3d 50 45 4e 44   || iGuess==PEND
16ab0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
16ac0 74 29 20 29 7b 0a 20 20 20 20 20 20 69 47 75 65  t) ){.      iGue
16ad0 73 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ss++;.    }..   
16ae0 20 69 66 28 20 69 47 75 65 73 73 3c 3d 70 61 67   if( iGuess<=pag
16af0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
16b00 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  >pPager) ){.    
16b10 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
16b20 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65  (pBt, iGuess, &e
16b30 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20  Type, &pgno);.  
16b40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
16b50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
16b60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
16b70 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65 54    }.      if( eT
16b80 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
16b90 46 4c 4f 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f  FLOW2 && pgno==o
16ba0 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  vfl ){.        n
16bb0 65 78 74 20 3d 20 69 47 75 65 73 73 3b 0a 20 20  ext = iGuess;.  
16bc0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
16bd0 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 6e 65  #endif..  if( ne
16be0 78 74 3d 3d 30 20 7c 7c 20 70 70 50 61 67 65 20  xt==0 || ppPage 
16bf0 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  ){.    MemPage *
16c00 70 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20  pPage = 0;..    
16c10 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
16c20 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6f 76  eGetPage(pBt, ov
16c30 66 6c 2c 20 26 70 50 61 67 65 2c 20 6e 65 78 74  fl, &pPage, next
16c40 21 3d 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  !=0);.    assert
16c50 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  (rc==SQLITE_OK |
16c60 7c 20 70 50 61 67 65 3d 3d 30 29 3b 0a 20 20 20  | pPage==0);.   
16c70 20 69 66 28 20 6e 65 78 74 3d 3d 30 20 26 26 20   if( next==0 && 
16c80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
16c90 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20 67 65  .      next = ge
16ca0 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
16cb0 61 74 61 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ata);.    }..   
16cc0 20 69 66 28 20 70 70 50 61 67 65 20 29 7b 0a 20   if( ppPage ){. 
16cd0 20 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70       *ppPage = p
16ce0 50 61 67 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Page;.    }else{
16cf0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
16d00 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  ge(pPage);.    }
16d10 0a 20 20 7d 0a 20 20 2a 70 50 67 6e 6f 4e 65 78  .  }.  *pPgnoNex
16d20 74 20 3d 20 6e 65 78 74 3b 0a 0a 20 20 72 65 74  t = next;..  ret
16d30 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
16d40 20 43 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   Copy data from 
16d50 61 20 62 75 66 66 65 72 20 74 6f 20 61 20 70 61  a buffer to a pa
16d60 67 65 2c 20 6f 72 20 66 72 6f 6d 20 61 20 70 61  ge, or from a pa
16d70 67 65 20 74 6f 20 61 20 62 75 66 66 65 72 2e 0a  ge to a buffer..
16d80 2a 2a 0a 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69  **.** pPayload i
16d90 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 64  s a pointer to d
16da0 61 74 61 20 73 74 6f 72 65 64 20 6f 6e 20 64 61  ata stored on da
16db0 74 61 62 61 73 65 20 70 61 67 65 20 70 44 62 50  tabase page pDbP
16dc0 61 67 65 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d  age..** If argum
16dd0 65 6e 74 20 65 4f 70 20 69 73 20 66 61 6c 73 65  ent eOp is false
16de0 2c 20 74 68 65 6e 20 6e 42 79 74 65 20 62 79 74  , then nByte byt
16df0 65 73 20 6f 66 20 64 61 74 61 20 61 72 65 20 63  es of data are c
16e00 6f 70 69 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50  opied.** from pP
16e10 61 79 6c 6f 61 64 20 74 6f 20 74 68 65 20 62 75  ayload to the bu
16e20 66 66 65 72 20 70 6f 69 6e 74 65 64 20 61 74 20  ffer pointed at 
16e30 62 79 20 70 42 75 66 2e 20 49 66 20 65 4f 70 20  by pBuf. If eOp 
16e40 69 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e  is true,.** then
16e50 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
16e60 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  te() is called o
16e70 6e 20 70 44 62 50 61 67 65 20 61 6e 64 20 6e 42  n pDbPage and nB
16e80 79 74 65 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20  yte bytes.** of 
16e90 64 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 20  data are copied 
16ea0 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20  from the buffer 
16eb0 70 42 75 66 20 74 6f 20 70 50 61 79 6c 6f 61 64  pBuf to pPayload
16ec0 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f  ..**.** SQLITE_O
16ed0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 6f 6e  K is returned on
16ee0 20 73 75 63 63 65 73 73 2c 20 6f 74 68 65 72 77   success, otherw
16ef0 69 73 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ise an error cod
16f00 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
16f10 20 63 6f 70 79 50 61 79 6c 6f 61 64 28 0a 20 20   copyPayload(.  
16f20 76 6f 69 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20  void *pPayload, 
16f30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
16f40 6e 74 65 72 20 74 6f 20 70 61 67 65 20 64 61 74  nter to page dat
16f50 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75  a */.  void *pBu
16f60 66 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f,              
16f70 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62   /* Pointer to b
16f80 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e  uffer */.  int n
16f90 42 79 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  Byte,           
16fa0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
16fb0 66 20 62 79 74 65 73 20 74 6f 20 63 6f 70 79 20  f bytes to copy 
16fc0 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 2c 20 20 20  */.  int eOp,   
16fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16fe0 2a 20 30 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d  * 0 -> copy from
16ff0 20 70 61 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79   page, 1 -> copy
17000 20 74 6f 20 70 61 67 65 20 2a 2f 0a 20 20 44 62   to page */.  Db
17010 50 61 67 65 20 2a 70 44 62 50 61 67 65 20 20 20  Page *pDbPage   
17020 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
17030 63 6f 6e 74 61 69 6e 69 6e 67 20 70 50 61 79 6c  containing pPayl
17040 6f 61 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  oad */.){.  if( 
17050 65 4f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  eOp ){.    /* Co
17060 70 79 20 64 61 74 61 20 66 72 6f 6d 20 62 75 66  py data from buf
17070 66 65 72 20 74 6f 20 70 61 67 65 20 28 61 20 77  fer to page (a w
17080 72 69 74 65 20 6f 70 65 72 61 74 69 6f 6e 29 20  rite operation) 
17090 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  */.    int rc = 
170a0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
170b0 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  e(pDbPage);.    
170c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
170d0 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
170e0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
170f0 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c  memcpy(pPayload,
17100 20 70 42 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20   pBuf, nByte);. 
17110 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43   }else{.    /* C
17120 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20 70 61  opy data from pa
17130 67 65 20 74 6f 20 62 75 66 66 65 72 20 28 61 20  ge to buffer (a 
17140 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 29 20  read operation) 
17150 2a 2f 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42  */.    memcpy(pB
17160 75 66 2c 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42  uf, pPayload, nB
17170 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  yte);.  }.  retu
17180 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
17190 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
171a0 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
171b0 72 65 61 64 20 6f 72 20 6f 76 65 72 77 72 69 74  read or overwrit
171c0 65 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d  e payload inform
171d0 61 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65  ation.** for the
171e0 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
171f0 70 43 75 72 20 63 75 72 73 6f 72 20 69 73 20 70  pCur cursor is p
17200 6f 69 6e 74 69 6e 67 20 74 6f 2e 20 49 66 20 74  ointing to. If t
17210 68 65 20 65 4f 70 0a 2a 2a 20 70 61 72 61 6d 65  he eOp.** parame
17220 74 65 72 20 69 73 20 30 2c 20 74 68 69 73 20 69  ter is 0, this i
17230 73 20 61 20 72 65 61 64 20 6f 70 65 72 61 74 69  s a read operati
17240 6f 6e 20 28 64 61 74 61 20 63 6f 70 69 65 64 20  on (data copied 
17250 69 6e 74 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70  into.** buffer p
17260 42 75 66 29 2e 20 49 66 20 69 74 20 69 73 20 6e  Buf). If it is n
17270 6f 6e 2d 7a 65 72 6f 2c 20 61 20 77 72 69 74 65  on-zero, a write
17280 20 28 64 61 74 61 20 63 6f 70 69 65 64 20 66 72   (data copied fr
17290 6f 6d 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75  om.** buffer pBu
172a0 66 29 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61  f)..**.** A tota
172b0 6c 20 6f 66 20 22 61 6d 74 22 20 62 79 74 65 73  l of "amt" bytes
172c0 20 61 72 65 20 72 65 61 64 20 6f 72 20 77 72 69   are read or wri
172d0 74 74 65 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61  tten beginning a
172e0 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44  t "offset"..** D
172f0 61 74 61 20 69 73 20 72 65 61 64 20 74 6f 20 6f  ata is read to o
17300 72 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65  r from the buffe
17310 72 20 70 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68  r pBuf..**.** Th
17320 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
17330 6e 6f 74 20 6d 61 6b 65 20 61 20 64 69 73 74 69  not make a disti
17340 6e 63 74 69 6f 6e 20 62 65 74 77 65 65 6e 20 6b  nction between k
17350 65 79 20 61 6e 64 20 64 61 74 61 2e 0a 2a 2a 20  ey and data..** 
17360 49 74 20 6a 75 73 74 20 72 65 61 64 73 20 6f 72  It just reads or
17370 20 77 72 69 74 65 73 20 62 79 74 65 73 20 66 72   writes bytes fr
17380 6f 6d 20 74 68 65 20 70 61 79 6c 6f 61 64 20 61  om the payload a
17390 72 65 61 2e 20 20 44 61 74 61 20 6d 69 67 68 74  rea.  Data might
173a0 20 0a 2a 2a 20 61 70 70 65 61 72 20 6f 6e 20 74   .** appear on t
173b0 68 65 20 6d 61 69 6e 20 70 61 67 65 20 6f 72 20  he main page or 
173c0 62 65 20 73 63 61 74 74 65 72 65 64 20 6f 75 74  be scattered out
173d0 20 6f 6e 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65   on multiple ove
173e0 72 66 6c 6f 77 20 0a 2a 2a 20 70 61 67 65 73 2e  rflow .** pages.
173f0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 42 74  .**.** If the Bt
17400 43 75 72 73 6f 72 2e 69 73 49 6e 63 72 62 6c 6f  Cursor.isIncrblo
17410 62 48 61 6e 64 6c 65 20 66 6c 61 67 20 69 73 20  bHandle flag is 
17420 73 65 74 2c 20 61 6e 64 20 74 68 65 20 63 75 72  set, and the cur
17430 72 65 6e 74 0a 2a 2a 20 63 75 72 73 6f 72 20 65  rent.** cursor e
17440 6e 74 72 79 20 75 73 65 73 20 6f 6e 65 20 6f 72  ntry uses one or
17450 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
17460 61 67 65 73 2c 20 74 68 69 73 20 66 75 6e 63 74  ages, this funct
17470 69 6f 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73  ion.** allocates
17480 20 73 70 61 63 65 20 66 6f 72 20 61 6e 64 20 6c   space for and l
17490 61 7a 69 6c 79 20 70 6f 70 6c 75 61 74 65 73 20  azily popluates 
174a0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
174b0 65 2d 6c 69 73 74 20 0a 2a 2a 20 63 61 63 68 65  e-list .** cache
174c0 20 61 72 72 61 79 20 28 42 74 43 75 72 73 6f 72   array (BtCursor
174d0 2e 61 4f 76 65 72 66 6c 6f 77 29 2e 20 53 75 62  .aOverflow). Sub
174e0 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 75 73  sequent calls us
174f0 65 20 74 68 69 73 0a 2a 2a 20 63 61 63 68 65 20  e this.** cache 
17500 74 6f 20 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20  to make seeking 
17510 74 6f 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  to the supplied 
17520 6f 66 66 73 65 74 20 6d 6f 72 65 20 65 66 66 69  offset more effi
17530 63 69 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63  cient..**.** Onc
17540 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
17550 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20 68 61  ge-list cache ha
17560 73 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  s been allocated
17570 2c 20 69 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69  , it may be.** i
17580 6e 76 61 6c 69 64 61 74 65 64 20 69 66 20 73 6f  nvalidated if so
17590 6d 65 20 6f 74 68 65 72 20 63 75 72 73 6f 72 20  me other cursor 
175a0 77 72 69 74 65 73 20 74 6f 20 74 68 65 20 73 61  writes to the sa
175b0 6d 65 20 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a  me table, or if.
175c0 2a 2a 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  ** the cursor is
175d0 20 6d 6f 76 65 64 20 74 6f 20 61 20 64 69 66 66   moved to a diff
175e0 65 72 65 6e 74 20 72 6f 77 2e 20 41 64 64 69 74  erent row. Addit
175f0 69 6f 6e 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f  ionally, in auto
17600 2d 76 61 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c  -vacuum.** mode,
17610 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65   the following e
17620 76 65 6e 74 73 20 6d 61 79 20 69 6e 76 61 6c 69  vents may invali
17630 64 61 74 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  date an overflow
17640 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65   page-list cache
17650 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69  ..**.**   * An i
17660 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
17670 6d 2c 0a 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d  m,.**   * A comm
17680 69 74 20 69 6e 20 61 75 74 6f 5f 76 61 63 75 75  it in auto_vacuu
17690 6d 3d 22 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a  m="full" mode,.*
176a0 2a 20 20 20 2a 20 43 72 65 61 74 69 6e 67 20 61  *   * Creating a
176b0 20 74 61 62 6c 65 20 28 6d 61 79 20 72 65 71 75   table (may requ
176c0 69 72 65 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76  ire moving an ov
176d0 65 72 66 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f  erflow page)..*/
176e0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 63 63 65  .static int acce
176f0 73 73 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43  ssPayload(.  BtC
17700 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
17710 20 20 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e    /* Cursor poin
17720 74 69 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f  ting to entry to
17730 20 72 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20   read from */.  
17740 69 6e 74 20 6f 66 66 73 65 74 2c 20 20 20 20 20  int offset,     
17750 20 20 20 20 20 2f 2a 20 42 65 67 69 6e 20 72 65       /* Begin re
17760 61 64 69 6e 67 20 74 68 69 73 20 66 61 72 20 69  ading this far i
17770 6e 74 6f 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  nto payload */. 
17780 20 69 6e 74 20 61 6d 74 2c 20 20 20 20 20 20 20   int amt,       
17790 20 20 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68        /* Read th
177a0 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f  is many bytes */
177b0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
177c0 20 2a 70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65   *pBuf, /* Write
177d0 20 74 68 65 20 62 79 74 65 73 20 69 6e 74 6f 20   the bytes into 
177e0 74 68 69 73 20 62 75 66 66 65 72 20 2a 2f 20 0a  this buffer */ .
177f0 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 2c 20 20    int skipKey,  
17800 20 20 20 20 20 20 20 2f 2a 20 6f 66 66 73 65 74         /* offset
17810 20 62 65 67 69 6e 73 20 61 74 20 64 61 74 61 20   begins at data 
17820 69 66 20 74 68 69 73 20 69 73 20 74 72 75 65 20  if this is true 
17830 2a 2f 0a 20 20 69 6e 74 20 65 4f 70 20 20 20 20  */.  int eOp    
17840 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 65 72            /* zer
17850 6f 20 74 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a  o to read. non-z
17860 65 72 6f 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f  ero to write. */
17870 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  .){.  unsigned c
17880 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20  har *aPayload;. 
17890 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
178a0 5f 4f 4b 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b  _OK;.  u32 nKey;
178b0 0a 20 20 69 6e 74 20 69 49 64 78 20 3d 20 30 3b  .  int iIdx = 0;
178c0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
178d0 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
178e0 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 70 61       /* Btree pa
178f0 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 63 75  ge of current cu
17900 72 73 6f 72 20 65 6e 74 72 79 20 2a 2f 0a 20 20  rsor entry */.  
17910 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
17920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17930 20 2f 2a 20 42 74 72 65 65 20 74 68 69 73 20 63   /* Btree this c
17940 75 72 73 6f 72 20 62 65 6c 6f 6e 67 73 20 74 6f  ursor belongs to
17950 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
17960 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Page );.  assert
17970 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
17980 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
17990 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
179a0 69 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  idx>=0 && pCur->
179b0 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  idx<pPage->nCell
179c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
179d0 66 73 65 74 3e 3d 30 20 29 3b 0a 20 20 61 73 73  fset>=0 );.  ass
179e0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
179f0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a  Mutex(pCur) );..
17a00 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
17a10 75 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20  ur);.  aPayload 
17a20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65  = pCur->info.pCe
17a30 6c 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  ll + pCur->info.
17a40 6e 48 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20  nHeader;.  nKey 
17a50 3d 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  = (pPage->intKey
17a60 20 3f 20 30 20 3a 20 70 43 75 72 2d 3e 69 6e 66   ? 0 : pCur->inf
17a70 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69 66 28 20  o.nKey);..  if( 
17a80 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20 20 6f  skipKey ){.    o
17a90 66 66 73 65 74 20 2b 3d 20 6e 4b 65 79 3b 0a 20  ffset += nKey;. 
17aa0 20 7d 0a 20 20 69 66 28 20 6f 66 66 73 65 74 2b   }.  if( offset+
17ab0 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75 72 2d  amt > nKey+pCur-
17ac0 3e 69 6e 66 6f 2e 6e 44 61 74 61 20 29 7b 0a 20  >info.nData ){. 
17ad0 20 20 20 2f 2a 20 54 72 79 69 6e 67 20 74 6f 20     /* Trying to 
17ae0 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 70 61  read or write pa
17af0 73 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  st the end of th
17b00 65 20 64 61 74 61 20 69 73 20 61 6e 20 65 72 72  e data is an err
17b10 6f 72 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  or */.    return
17b20 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
17b30 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69   }..  /* Check i
17b40 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20 72  f data must be r
17b50 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66  ead/written to/f
17b60 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70 61  rom the btree pa
17b70 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20  ge itself. */.  
17b80 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d  if( offset<pCur-
17b90 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
17ba0 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b      int a = amt;
17bb0 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65  .    if( a+offse
17bc0 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  t>pCur->info.nLo
17bd0 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d  cal ){.      a =
17be0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
17bf0 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  al - offset;.   
17c00 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79   }.    rc = copy
17c10 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61  Payload(&aPayloa
17c20 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c  d[offset], pBuf,
17c30 20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e   a, eOp, pPage->
17c40 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66  pDbPage);.    of
17c50 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42  fset = 0;.    pB
17c60 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74  uf += a;.    amt
17c70 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a   -= a;.  }else{.
17c80 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43      offset -= pC
17c90 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  ur->info.nLocal;
17ca0 0a 20 20 7d 0a 0a 20 20 70 42 74 20 3d 20 70 43  .  }..  pBt = pC
17cb0 75 72 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20 72  ur->pBt;.  if( r
17cc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
17cd0 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e  amt>0 ){.    con
17ce0 73 74 20 69 6e 74 20 6f 76 66 6c 53 69 7a 65 20  st int ovflSize 
17cf0 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
17d00 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73  e - 4;  /* Bytes
17d10 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66   content per ovf
17d20 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67  l page */.    Pg
17d30 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20  no nextPage;..  
17d40 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74    nextPage = get
17d50 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b  4byte(&aPayload[
17d60 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
17d70 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  l]);..#ifndef SQ
17d80 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
17d90 4f 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  OB.    /* If the
17da0 20 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c   isIncrblobHandl
17db0 65 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e  e flag is set an
17dc0 64 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61  d the BtCursor.a
17dd0 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a  Overflow[].    *
17de0 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61  * has not been a
17df0 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61  llocated, alloca
17e00 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 20 61  te it now. The a
17e10 72 72 61 79 20 69 73 20 73 69 7a 65 64 20 61 74  rray is sized at
17e20 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 65 6e 74 72  .    ** one entr
17e30 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66  y for each overf
17e40 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20  low page in the 
17e50 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20  overflow chain. 
17e60 54 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 20  The.    ** page 
17e70 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69  number of the fi
17e80 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  rst overflow pag
17e90 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61  e is stored in a
17ea0 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20  Overflow[0],.   
17eb0 20 2a 2a 20 65 74 63 2e 20 41 20 76 61 6c 75 65   ** etc. A value
17ec0 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76   of 0 in the aOv
17ed0 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d  erflow[] array m
17ee0 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e  eans "not yet kn
17ef0 6f 77 6e 22 0a 20 20 20 20 2a 2a 20 28 74 68 65  own".    ** (the
17f00 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79   cache is lazily
17f10 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20   populated)..   
17f20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72   */.    if( pCur
17f30 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  ->isIncrblobHand
17f40 6c 65 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76  le && !pCur->aOv
17f50 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20  erflow ){.      
17f60 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75  int nOvfl = (pCu
17f70 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  r->info.nPayload
17f80 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  -pCur->info.nLoc
17f90 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f  al+ovflSize-1)/o
17fa0 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 70  vflSize;.      p
17fb0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d  Cur->aOverflow =
17fc0 20 28 50 67 6e 6f 20 2a 29 73 71 6c 69 74 65 33   (Pgno *)sqlite3
17fd0 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f  MallocZero(sizeo
17fe0 66 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a  f(Pgno)*nOvfl);.
17ff0 20 20 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20        if( nOvfl 
18000 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66  && !pCur->aOverf
18010 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72  low ){.        r
18020 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
18030 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18040 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f  .    /* If the o
18050 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
18060 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e  t cache has been
18070 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74   allocated and t
18080 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20  he.    ** entry 
18090 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65  for the first re
180a0 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20  quired overflow 
180b0 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73  page is valid, s
180c0 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63  kip.    ** direc
180d0 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a  tly to it..    *
180e0 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  /.    if( pCur->
180f0 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75  aOverflow && pCu
18100 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66  r->aOverflow[off
18110 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b  set/ovflSize] ){
18120 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f  .      iIdx = (o
18130 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b  ffset/ovflSize);
18140 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20  .      nextPage 
18150 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  = pCur->aOverflo
18160 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f  w[iIdx];.      o
18170 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25  ffset = (offset%
18180 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d  ovflSize);.    }
18190 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72  .#endif..    for
181a0 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( ; rc==SQLITE_O
181b0 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65  K && amt>0 && ne
181c0 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b  xtPage; iIdx++){
181d0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
181e0 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
181f0 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69       /* If requi
18200 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68  red, populate th
18210 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  e overflow page-
18220 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20  list cache. */. 
18230 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61       if( pCur->a
18240 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20  Overflow ){.    
18250 20 20 20 20 61 73 73 65 72 74 28 21 70 43 75 72      assert(!pCur
18260 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
18270 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72  ] || pCur->aOver
18280 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74  flow[iIdx]==next
18290 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Page);.        p
182a0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
182b0 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b  Idx] = nextPage;
182c0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
182d0 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65  .      if( offse
182e0 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20  t>=ovflSize ){. 
182f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e         /* The on
18300 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61  ly reason to rea
18310 64 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74  d this page is t
18320 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67  o obtain the pag
18330 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d  e.        ** num
18340 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74  ber for the next
18350 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
18360 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65  rflow chain. The
18370 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
18380 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71   data is not req
18390 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20  uired. So first 
183a0 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68  try to lookup th
183b0 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20  e overflow.     
183c0 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20     ** page-list 
183d0 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74  cache, if any, t
183e0 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  hen fall back to
183f0 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77   the getOverflow
18400 50 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a  Page().        *
18410 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  * function..    
18420 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53      */.#ifndef S
18430 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
18440 4c 4f 42 0a 20 20 20 20 20 20 20 20 69 66 28 20  LOB.        if( 
18450 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
18460 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  && pCur->aOverfl
18470 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20  ow[iIdx+1] ){.  
18480 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
18490 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c   = pCur->aOverfl
184a0 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20  ow[iIdx+1];.    
184b0 20 20 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64      } else .#end
184c0 69 66 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  if.          rc 
184d0 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  = getOverflowPag
184e0 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c  e(pBt, nextPage,
184f0 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a   0, &nextPage);.
18500 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d          offset -
18510 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20  = ovflSize;.    
18520 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
18530 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64   /* Need to read
18540 20 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65   this page prope
18550 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73  rly. It contains
18560 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20   some of the.   
18570 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66       ** range of
18580 20 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65   data that is be
18590 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30  ing read (eOp==0
185a0 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f  ) or written (eO
185b0 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a  p!=0)..        *
185c0 2f 0a 20 20 20 20 20 20 20 20 44 62 50 61 67 65  /.        DbPage
185d0 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20   *pDbPage;.     
185e0 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a     int a = amt;.
185f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
18600 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
18610 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61  ->pPager, nextPa
18620 67 65 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20  ge, &pDbPage);. 
18630 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
18640 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18650 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d        aPayload =
18660 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
18670 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20  Data(pDbPage);. 
18680 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
18690 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61  e = get4byte(aPa
186a0 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20  yload);.        
186b0 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74    if( a + offset
186c0 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20   > ovflSize ){. 
186d0 20 20 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f             a = o
186e0 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74  vflSize - offset
186f0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
18700 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70          rc = cop
18710 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
18720 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42  ad[offset+4], pB
18730 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 50  uf, a, eOp, pDbP
18740 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
18750 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
18760 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  f(pDbPage);.    
18770 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30        offset = 0
18780 3b 0a 20 20 20 20 20 20 20 20 20 20 61 6d 74 20  ;.          amt 
18790 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 20 20  -= a;.          
187a0 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20  pBuf += a;.     
187b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
187c0 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
187d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
187e0 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75  mt>0 ){.    retu
187f0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
18800 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65  T_BKPT;.  }.  re
18810 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18820 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74  * Read part of t
18830 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65  he key associate
18840 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43  d with cursor pC
18850 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20  ur.  Exactly.** 
18860 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c  "amt" bytes will
18870 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69   be transfered i
18880 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65  nto pBuf[].  The
18890 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67   transfer.** beg
188a0 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e  ins at "offset".
188b0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
188c0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
188d0 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
188e0 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
188f0 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20  goes.** wrong.  
18900 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  An error is retu
18910 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b  rned if "offset+
18920 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74  amt" is larger t
18930 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c  han.** the avail
18940 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f  able payload..*/
18950 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
18960 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70  eKey(BtCursor *p
18970 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c  Cur, u32 offset,
18980 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a   u32 amt, void *
18990 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pBuf){.  int rc;
189a0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
189b0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
189c0 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
189d0 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f  toreOrClearCurso
189e0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
189f0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
18a00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
18a10 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
18a20 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
18a30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  ;.    assert( pC
18a40 75 72 2d 3e 70 50 61 67 65 21 3d 30 20 29 3b 0a  ur->pPage!=0 );.
18a50 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50      if( pCur->pP
18a60 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
18a70 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
18a80 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
18a90 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
18aa0 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t( pCur->pPage->
18ab0 69 6e 74 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 20  intKey==0 );.   
18ac0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69   assert( pCur->i
18ad0 64 78 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 69  dx>=0 && pCur->i
18ae0 64 78 3c 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  dx<pCur->pPage->
18af0 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20  nCell );.    rc 
18b00 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
18b10 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
18b20 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  t, (unsigned cha
18b30 72 2a 29 70 42 75 66 2c 20 30 2c 20 30 29 3b 0a  r*)pBuf, 0, 0);.
18b40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
18b50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
18b60 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
18b70 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
18b80 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78  cursor pCur.  Ex
18b90 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62  actly.** "amt" b
18ba0 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61  ytes will be tra
18bb0 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75  nsfered into pBu
18bc0 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66  f[].  The transf
18bd0 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20  er.** begins at 
18be0 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20  "offset"..**.** 
18bf0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
18c00 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
18c10 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
18c20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
18c30 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f   wrong.  An erro
18c40 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  r is returned if
18c50 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73   "offset+amt" is
18c60 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20   larger than.** 
18c70 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61  the available pa
18c80 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  yload..*/.int sq
18c90 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28 42  lite3BtreeData(B
18ca0 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
18cb0 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
18cc0 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
18cd0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e  .  int rc;..#ifn
18ce0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18cf0 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20  INCRBLOB.  if ( 
18d00 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
18d10 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
18d20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
18d30 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e  E_ABORT;.  }.#en
18d40 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63  dif..  assert( c
18d50 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
18d60 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
18d70 72 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75  restoreOrClearCu
18d80 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75  rsorPosition(pCu
18d90 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
18da0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61  LITE_OK ){.    a
18db0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
18dc0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
18dd0 44 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  D );.    assert(
18de0 20 70 43 75 72 2d 3e 70 50 61 67 65 21 3d 30 20   pCur->pPage!=0 
18df0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
18e00 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70  Cur->idx>=0 && p
18e10 43 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70  Cur->idx<pCur->p
18e20 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
18e30 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50 61     rc = accessPa
18e40 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66 73  yload(pCur, offs
18e50 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20 31  et, amt, pBuf, 1
18e60 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
18e70 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
18e80 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
18e90 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66 6f   to payload info
18ea0 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65  rmation from the
18eb0 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20   entry that the 
18ec0 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72 20  .** pCur cursor 
18ed0 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
18ee0 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73 20   The pointer is 
18ef0 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
18f00 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20 69   of.** the key i
18f10 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61 6e 64  f skipKey==0 and
18f20 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 68   it points to th
18f30 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64  e beginning of d
18f40 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70 4b 65  ata if.** skipKe
18f50 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d 62 65  y==1.  The numbe
18f60 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61 76  r of bytes of av
18f70 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61 74 61  ailable key/data
18f80 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69   is written.** i
18f90 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20 2a  nto *pAmt.  If *
18fa0 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74 68  pAmt==0, then th
18fb0 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
18fc0 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a 20   will not be.** 
18fd0 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72 2e  a valid pointer.
18fe0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
18ff0 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d 69  ine is an optimi
19000 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20 63  zation.  It is c
19010 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65 6e  ommon for the en
19020 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64 20  tire key.** and 
19030 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20 74  data to fit on t
19040 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61 6e  he local page an
19050 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20 62  d for there to b
19060 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a  e no overflow.**
19070 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74 68   pages.  When th
19080 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20 72  at is so, this r
19090 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75 73  outine can be us
190a0 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68 65  ed to access the
190b0 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74 61  .** key and data
190c0 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67 20   without making 
190d0 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65 20  a copy.  If the 
190e0 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61 20  key and/or data 
190f0 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20 6f  spills.** onto o
19100 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74  verflow pages, t
19110 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f 61  hen accessPayloa
19120 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65 64  d() must be used
19130 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 79 0a 2a   to reassembly.*
19140 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20 61  * the key/data a
19150 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f 20  nd copy it into 
19160 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20 62  a preallocated b
19170 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  uffer..**.** The
19180 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e 65   pointer returne
19190 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e  d by this routin
191a0 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c 79  e looks directly
191b0 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 64   into the cached
191c0 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65 20  .** page of the 
191d0 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 64  database.  The d
191e0 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67 65  ata might change
191f0 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65 78   or move the nex
19200 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62 74  t time.** any bt
19210 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20 63  ree routine is c
19220 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  alled..*/.static
19230 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20   const unsigned 
19240 63 68 61 72 20 2a 66 65 74 63 68 50 61 79 6c 6f  char *fetchPaylo
19250 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ad(.  BtCursor *
19260 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75  pCur,      /* Cu
19270 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
19280 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66   entry to read f
19290 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41  rom */.  int *pA
192a0 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  mt,           /*
192b0 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
192c0 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62  r of available b
192d0 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 69  ytes here */.  i
192e0 6e 74 20 73 6b 69 70 4b 65 79 20 20 20 20 20 20  nt skipKey      
192f0 20 20 20 20 2f 2a 20 72 65 61 64 20 62 65 67 69      /* read begi
19300 6e 6e 69 6e 67 20 61 74 20 64 61 74 61 20 69 66  nning at data if
19310 20 74 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f   this is true */
19320 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  .){.  unsigned c
19330 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20  har *aPayload;. 
19340 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
19350 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69  .  u32 nKey;.  i
19360 6e 74 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61 73  nt nLocal;..  as
19370 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 26 26  sert( pCur!=0 &&
19380 20 70 43 75 72 2d 3e 70 50 61 67 65 21 3d 30 20   pCur->pPage!=0 
19390 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
193a0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
193b0 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
193c0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
193d0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
193e0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70   pPage = pCur->p
193f0 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20  Page;.  assert( 
19400 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20  pCur->idx>=0 && 
19410 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d  pCur->idx<pPage-
19420 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 67 65 74 43  >nCell );.  getC
19430 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
19440 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72   aPayload = pCur
19450 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20  ->info.pCell;.  
19460 61 50 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72  aPayload += pCur
19470 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a  ->info.nHeader;.
19480 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
19490 4b 65 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20  Key ){.    nKey 
194a0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
194b0 20 20 6e 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69    nKey = pCur->i
194c0 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20  nfo.nKey;.  }.  
194d0 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20  if( skipKey ){. 
194e0 20 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e     aPayload += n
194f0 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20  Key;.    nLocal 
19500 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
19510 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65  cal - nKey;.  }e
19520 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20  lse{.    nLocal 
19530 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
19540 63 61 6c 3b 0a 20 20 20 20 69 66 28 20 6e 4c 6f  cal;.    if( nLo
19550 63 61 6c 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20  cal>nKey ){.    
19560 20 20 6e 4c 6f 63 61 6c 20 3d 20 6e 4b 65 79 3b    nLocal = nKey;
19570 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 41  .    }.  }.  *pA
19580 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72  mt = nLocal;.  r
19590 65 74 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a  eturn aPayload;.
195a0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68  }.../*.** For th
195b0 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72  e entry that cur
195c0 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e  sor pCur is poin
195d0 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a  t to, return as.
195e0 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66  ** many bytes of
195f0 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61   the key or data
19600 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c   as are availabl
19610 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a  e on the local.*
19620 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20  * b-tree page.  
19630 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72  Write the number
19640 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79   of available by
19650 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a  tes into *pAmt..
19660 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65  **.** The pointe
19670 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70  r returned is ep
19680 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65  hemeral.  The ke
19690 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a  y/data may move.
196a0 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79  ** or be destroy
196b0 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63  ed on the next c
196c0 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65  all to any Btree
196d0 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63   routine,.** inc
196e0 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f  luding calls fro
196f0 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20  m other threads 
19700 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65  against the same
19710 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65   cache..** Hence
19720 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65  , a mutex on the
19730 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64   BtShared should
19740 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74   be held prior t
19750 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69  o calling.** thi
19760 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
19770 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
19780 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71  is used to get q
19790 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b  uick access to k
197a0 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69  ey and data.** i
197b0 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73  n the common cas
197c0 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66  e where no overf
197d0 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73  low pages are us
197e0 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69  ed..*/.const voi
197f0 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b  d *sqlite3BtreeK
19800 65 79 46 65 74 63 68 28 42 74 43 75 72 73 6f 72  eyFetch(BtCursor
19810 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d   *pCur, int *pAm
19820 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75  t){.  assert( cu
19830 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
19840 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43  Cur) );.  if( pC
19850 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
19860 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  OR_VALID ){.    
19870 72 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f  return (const vo
19880 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64  id*)fetchPayload
19890 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b  (pCur, pAmt, 0);
198a0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
198b0 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73  .}.const void *s
198c0 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46  qlite3BtreeDataF
198d0 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70  etch(BtCursor *p
198e0 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b  Cur, int *pAmt){
198f0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
19900 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
19910 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d  ) );.  if( pCur-
19920 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
19930 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74  VALID ){.    ret
19940 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a  urn (const void*
19950 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43  )fetchPayload(pC
19960 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20  ur, pAmt, 1);.  
19970 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
19980 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
19990 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
199a0 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  a new child page
199b0 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61  .  The newPgno a
199c0 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a  rgument is the.*
199d0 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  * page number of
199e0 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
199f0 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f 0a 73  to move to..*/.s
19a00 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
19a10 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a  Child(BtCursor *
19a20 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e  pCur, u32 newPgn
19a30 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  o){.  int rc;.  
19a40 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 50 61 67  MemPage *pNewPag
19a50 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  e;.  MemPage *pO
19a60 6c 64 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72  ldPage;.  BtShar
19a70 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
19a80 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
19a90 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
19aa0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
19ab0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
19ac0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
19ad0 3b 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49  ;.  rc = getAndI
19ae0 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77  nitPage(pBt, new
19af0 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65 2c  Pgno, &pNewPage,
19b00 20 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a 20   pCur->pPage);. 
19b10 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
19b20 20 72 63 3b 0a 20 20 70 4e 65 77 50 61 67 65 2d   rc;.  pNewPage-
19b30 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 70 43 75  >idxParent = pCu
19b40 72 2d 3e 69 64 78 3b 0a 20 20 70 4f 6c 64 50 61  r->idx;.  pOldPa
19b50 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
19b60 3b 0a 20 20 70 4f 6c 64 50 61 67 65 2d 3e 69 64  ;.  pOldPage->id
19b70 78 53 68 69 66 74 20 3d 20 30 3b 0a 20 20 72 65  xShift = 0;.  re
19b80 6c 65 61 73 65 50 61 67 65 28 70 4f 6c 64 50 61  leasePage(pOldPa
19b90 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e 70 50 61  ge);.  pCur->pPa
19ba0 67 65 20 3d 20 70 4e 65 77 50 61 67 65 3b 0a 20  ge = pNewPage;. 
19bb0 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 30 3b 0a   pCur->idx = 0;.
19bc0 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
19bd0 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
19be0 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
19bf0 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e   if( pNewPage->n
19c00 43 65 6c 6c 3c 31 20 29 7b 0a 20 20 20 20 72 65  Cell<1 ){.    re
19c10 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
19c20 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
19c30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19c40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
19c50 6e 20 74 72 75 65 20 69 66 20 74 68 65 20 70 61  n true if the pa
19c60 67 65 20 69 73 20 74 68 65 20 76 69 72 74 75 61  ge is the virtua
19c70 6c 20 72 6f 6f 74 20 6f 66 20 69 74 73 20 74 61  l root of its ta
19c80 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76  ble..**.** The v
19c90 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65  irtual root page
19ca0 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67   is the root pag
19cb0 65 20 66 6f 72 20 6d 6f 73 74 20 74 61 62 6c 65  e for most table
19cc0 73 2e 20 20 42 75 74 0a 2a 2a 20 66 6f 72 20 74  s.  But.** for t
19cd0 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20  he table rooted 
19ce0 6f 6e 20 70 61 67 65 20 31 2c 20 73 6f 6d 65 74  on page 1, somet
19cf0 69 6d 65 20 74 68 65 20 72 65 61 6c 20 72 6f 6f  ime the real roo
19d00 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 65 6d 70  t page.** is emp
19d10 74 79 20 65 78 63 65 70 74 20 66 6f 72 20 74 68  ty except for th
19d20 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 2e  e right-pointer.
19d30 20 20 49 6e 20 73 75 63 68 20 63 61 73 65 73 20    In such cases 
19d40 74 68 65 0a 2a 2a 20 76 69 72 74 75 61 6c 20 72  the.** virtual r
19d50 6f 6f 74 20 70 61 67 65 20 69 73 20 74 68 65 20  oot page is the 
19d60 70 61 67 65 20 74 68 61 74 20 74 68 65 20 72 69  page that the ri
19d70 67 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66 20 70  ght-pointer of p
19d80 61 67 65 0a 2a 2a 20 31 20 69 73 20 70 6f 69 6e  age.** 1 is poin
19d90 74 69 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e 74 20  ting to..*/.int 
19da0 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 52 6f  sqlite3BtreeIsRo
19db0 6f 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  otPage(MemPage *
19dc0 70 50 61 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67  pPage){.  MemPag
19dd0 65 20 2a 70 50 61 72 65 6e 74 3b 0a 0a 20 20 61  e *pParent;..  a
19de0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
19df0 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
19e00 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
19e10 20 20 70 50 61 72 65 6e 74 20 3d 20 70 50 61 67    pParent = pPag
19e20 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20 69 66  e->pParent;.  if
19e30 28 20 70 50 61 72 65 6e 74 3d 3d 30 20 29 20 72  ( pParent==0 ) r
19e40 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 70  eturn 1;.  if( p
19e50 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3e 31 20 29  Parent->pgno>1 )
19e60 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
19e70 20 67 65 74 32 62 79 74 65 28 26 70 50 61 72 65   get2byte(&pPare
19e80 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
19e90 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 33 5d 29  t->hdrOffset+3])
19ea0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
19eb0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
19ec0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
19ed0 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70  rsor up to the p
19ee0 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a  arent page..**.*
19ef0 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  * pCur->idx is s
19f00 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69  et to the cell i
19f10 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69  ndex that contai
19f20 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  ns the pointer.*
19f30 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65  * to the page we
19f40 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
19f50 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d  .  If we are com
19f60 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ing from the.** 
19f70 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64  right-most child
19f80 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d   page then pCur-
19f90 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f  >idx is set to o
19fa0 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20  ne more than.** 
19fb0 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c  the largest cell
19fc0 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20   index..*/.void 
19fd0 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
19fe0 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f  ToParent(BtCurso
19ff0 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50  r *pCur){.  MemP
1a000 61 67 65 20 2a 70 50 61 72 65 6e 74 3b 0a 20 20  age *pParent;.  
1a010 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
1a020 20 20 69 6e 74 20 69 64 78 50 61 72 65 6e 74 3b    int idxParent;
1a030 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1a040 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1a050 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1a060 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1a070 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1a080 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
1a090 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70  age;.  assert( p
1a0a0 50 61 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73  Page!=0 );.  ass
1a0b0 65 72 74 28 20 21 73 71 6c 69 74 65 33 42 74 72  ert( !sqlite3Btr
1a0c0 65 65 49 73 52 6f 6f 74 50 61 67 65 28 70 50 61  eeIsRootPage(pPa
1a0d0 67 65 29 20 29 3b 0a 20 20 70 50 61 72 65 6e 74  ge) );.  pParent
1a0e0 20 3d 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e   = pPage->pParen
1a0f0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  t;.  assert( pPa
1a100 72 65 6e 74 21 3d 30 20 29 3b 0a 20 20 69 64 78  rent!=0 );.  idx
1a110 50 61 72 65 6e 74 20 3d 20 70 50 61 67 65 2d 3e  Parent = pPage->
1a120 69 64 78 50 61 72 65 6e 74 3b 0a 20 20 73 71 6c  idxParent;.  sql
1a130 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50 61  ite3PagerRef(pPa
1a140 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  rent->pDbPage);.
1a150 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
1a160 61 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e 70 50  age);.  pCur->pP
1a170 61 67 65 20 3d 20 70 50 61 72 65 6e 74 3b 0a 20  age = pParent;. 
1a180 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1a190 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76  e = 0;.  pCur->v
1a1a0 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
1a1b0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
1a1c0 3e 69 64 78 53 68 69 66 74 3d 3d 30 20 29 3b 0a  >idxShift==0 );.
1a1d0 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 69 64    pCur->idx = id
1a1e0 78 50 61 72 65 6e 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  xParent;.}../*.*
1a1f0 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
1a200 72 20 74 6f 20 74 68 65 20 72 6f 6f 74 20 70 61  r to the root pa
1a210 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ge.*/.static int
1a220 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 42 74 43 75   moveToRoot(BtCu
1a230 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d  rsor *pCur){.  M
1a240 65 6d 50 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20  emPage *pRoot;. 
1a250 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1a260 5f 4f 4b 3b 0a 20 20 42 74 72 65 65 20 2a 70 20  _OK;.  Btree *p 
1a270 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a  = pCur->pBtree;.
1a280 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
1a290 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73  = p->pBt;..  ass
1a2a0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1a2b0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1a2c0 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f   assert( CURSOR_
1a2d0 49 4e 56 41 4c 49 44 20 3c 20 43 55 52 53 4f 52  INVALID < CURSOR
1a2e0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
1a2f0 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
1a300 5f 56 41 4c 49 44 20 20 20 3c 20 43 55 52 53 4f  _VALID   < CURSO
1a310 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b  R_REQUIRESEEK );
1a320 0a 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f  .  assert( CURSO
1a330 52 5f 46 41 55 4c 54 20 20 20 3e 20 43 55 52 53  R_FAULT   > CURS
1a340 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29  OR_REQUIRESEEK )
1a350 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  ;.  if( pCur->eS
1a360 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51  tate>=CURSOR_REQ
1a370 55 49 52 45 53 45 45 4b 20 29 7b 0a 20 20 20 20  UIRESEEK ){.    
1a380 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
1a390 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
1a3a0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  {.      return p
1a3b0 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 20 20 7d  Cur->skip;.    }
1a3c0 0a 20 20 20 20 63 6c 65 61 72 43 75 72 73 6f 72  .    clearCursor
1a3d0 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a  Position(pCur);.
1a3e0 20 20 7d 0a 20 20 70 52 6f 6f 74 20 3d 20 70 43    }.  pRoot = pC
1a3f0 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28  ur->pPage;.  if(
1a400 20 70 52 6f 6f 74 20 26 26 20 70 52 6f 6f 74 2d   pRoot && pRoot-
1a410 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70 67 6e  >pgno==pCur->pgn
1a420 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20 61 73 73  oRoot ){.    ass
1a430 65 72 74 28 20 70 52 6f 6f 74 2d 3e 69 73 49 6e  ert( pRoot->isIn
1a440 69 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  it );.  }else{. 
1a450 20 20 20 69 66 28 20 0a 20 20 20 20 20 20 53 51     if( .      SQ
1a460 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 67  LITE_OK!=(rc = g
1a470 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
1a480 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t, pCur->pgnoRoo
1a490 74 2c 20 26 70 52 6f 6f 74 2c 20 30 29 29 0a 20  t, &pRoot, 0)). 
1a4a0 20 20 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72     ){.      pCur
1a4b0 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
1a4c0 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
1a4d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1a4e0 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  }.    releasePag
1a4f0 65 28 70 43 75 72 2d 3e 70 50 61 67 65 29 3b 0a  e(pCur->pPage);.
1a500 20 20 20 20 70 43 75 72 2d 3e 70 50 61 67 65 20      pCur->pPage 
1a510 3d 20 70 52 6f 6f 74 3b 0a 20 20 7d 0a 20 20 70  = pRoot;.  }.  p
1a520 43 75 72 2d 3e 69 64 78 20 3d 20 30 3b 0a 20 20  Cur->idx = 0;.  
1a530 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1a540 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 74   = 0;.  pCur->at
1a550 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 43 75 72  Last = 0;.  pCur
1a560 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
1a570 0a 20 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43  .  if( pRoot->nC
1a580 65 6c 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74  ell==0 && !pRoot
1a590 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67  ->leaf ){.    Pg
1a5a0 6e 6f 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20  no subpage;.    
1a5b0 61 73 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70  assert( pRoot->p
1a5c0 67 6e 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 73 75  gno==1 );.    su
1a5d0 62 70 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  bpage = get4byte
1a5e0 28 26 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70  (&pRoot->aData[p
1a5f0 52 6f 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Root->hdrOffset+
1a600 38 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  8]);.    assert(
1a610 20 73 75 62 70 61 67 65 3e 30 20 29 3b 0a 20 20   subpage>0 );.  
1a620 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
1a630 20 43 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20   CURSOR_VALID;. 
1a640 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
1a650 69 6c 64 28 70 43 75 72 2c 20 73 75 62 70 61 67  ild(pCur, subpag
1a660 65 29 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  e);.  }.  pCur->
1a670 65 53 74 61 74 65 20 3d 20 28 28 70 43 75 72 2d  eState = ((pCur-
1a680 3e 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e 30 29  >pPage->nCell>0)
1a690 3f 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55  ?CURSOR_VALID:CU
1a6a0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20  RSOR_INVALID);. 
1a6b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1a6c0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
1a6d0 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65  rsor down to the
1a6e0 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66 20   left-most leaf 
1a6f0 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
1a700 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77 68  e.** entry to wh
1a710 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e  ich it is curren
1a720 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a  tly pointing..**
1a730 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73  .** The left-mos
1a740 74 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f 6e  t leaf is the on
1a750 65 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c 6c  e with the small
1a760 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66 69  est key - the fi
1a770 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e 64  rst.** in ascend
1a780 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ing order..*/.st
1a790 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 4c  atic int moveToL
1a7a0 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  eftmost(BtCursor
1a7b0 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
1a7c0 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pgno;.  int rc =
1a7d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
1a7e0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
1a7f0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1a800 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1a810 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1a820 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1a830 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68 69  R_VALID );.  whi
1a840 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
1a850 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20 70  K && !(pPage = p
1a860 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65 61  Cur->pPage)->lea
1a870 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  f ){.    assert(
1a880 20 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26   pCur->idx>=0 &&
1a890 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65   pCur->idx<pPage
1a8a0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70  ->nCell );.    p
1a8b0 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66  gno = get4byte(f
1a8c0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
1a8d0 43 75 72 2d 3e 69 64 78 29 29 3b 0a 20 20 20 20  Cur->idx));.    
1a8e0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
1a8f0 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
1a900 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1a910 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
1a920 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
1a930 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c  the right-most l
1a940 65 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74  eaf entry beneat
1a950 68 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f  h the.** page to
1a960 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
1a970 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
1a980 20 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66    Notice the dif
1a990 66 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65  ference.** betwe
1a9a0 65 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73  en moveToLeftmos
1a9b0 74 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69  t() and moveToRi
1a9c0 67 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65  ghtmost().  move
1a9d0 54 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20  ToLeftmost().** 
1a9e0 66 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d  finds the left-m
1a9f0 6f 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74  ost entry beneat
1aa00 68 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68  h the *entry* wh
1aa10 65 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68  ereas moveToRigh
1aa20 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73  tmost().** finds
1aa30 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
1aa40 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68  entry beneath th
1aa50 65 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20  e *page*..**.** 
1aa60 54 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  The right-most e
1aa70 6e 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20  ntry is the one 
1aa80 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74  with the largest
1aa90 20 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a   key - the last.
1aaa0 2a 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64  ** key in ascend
1aab0 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74  ing order..*/.st
1aac0 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52  atic int moveToR
1aad0 69 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f  ightmost(BtCurso
1aae0 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f  r *pCur){.  Pgno
1aaf0 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20   pgno;.  int rc 
1ab00 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d  = SQLITE_OK;.  M
1ab10 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
1ab20 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1ab30 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1ab40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1ab50 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1ab60 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68  OR_VALID );.  wh
1ab70 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
1ab80 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20  OK && !(pPage = 
1ab90 70 43 75 72 2d 3e 70 50 61 67 65 29 2d 3e 6c 65  pCur->pPage)->le
1aba0 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
1abb0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
1abc0 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
1abd0 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
1abe0 20 20 70 43 75 72 2d 3e 69 64 78 20 3d 20 70 50    pCur->idx = pP
1abf0 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20  age->nCell;.    
1ac00 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
1ac10 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
1ac20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1ac30 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75  TE_OK ){.    pCu
1ac40 72 2d 3e 69 64 78 20 3d 20 70 50 61 67 65 2d 3e  r->idx = pPage->
1ac50 6e 43 65 6c 6c 20 2d 20 31 3b 0a 20 20 20 20 70  nCell - 1;.    p
1ac60 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1ac70 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76  = 0;.    pCur->v
1ac80 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
1ac90 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1aca0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65  E_OK;.}../* Move
1acb0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
1acc0 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
1acd0 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 52 65  n the table.  Re
1ace0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  turn SQLITE_OK.*
1acf0 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 53  * on success.  S
1ad00 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20 69 66  et *pRes to 0 if
1ad10 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 74 75   the cursor actu
1ad20 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 73  ally points to s
1ad30 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73  omething.** or s
1ad40 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20 69 66  et *pRes to 1 if
1ad50 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
1ad60 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  pty..*/.int sqli
1ad70 74 65 33 42 74 72 65 65 46 69 72 73 74 28 42 74  te3BtreeFirst(Bt
1ad80 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e  Cursor *pCur, in
1ad90 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74 20  t *pRes){.  int 
1ada0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  rc;..  assert( c
1adb0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1adc0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1add0 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
1ade0 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42 74 72  _held(pCur->pBtr
1adf0 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  ee->db->mutex) )
1ae00 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ;.  rc = moveToR
1ae10 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
1ae20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1ae30 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  {.    if( pCur->
1ae40 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
1ae50 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
1ae60 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
1ae70 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  age->nCell==0 );
1ae80 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
1ae90 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
1aea0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73  ITE_OK;.    }els
1aeb0 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
1aec0 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 6e 43   pCur->pPage->nC
1aed0 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a  ell>0 );.      *
1aee0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
1aef0 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
1af00 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ost(pCur);.    }
1af10 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1af20 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
1af30 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c   cursor to the l
1af40 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
1af50 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
1af60 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
1af70 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
1af80 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
1af90 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
1afa0 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
1afb0 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
1afc0 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
1afd0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
1afe0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1aff0 72 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72  reeLast(BtCursor
1b000 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
1b010 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a  s){.  int rc;. .
1b020 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1b030 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1b040 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
1b050 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1b060 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
1b070 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
1b080 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
1b090 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
1b0a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b0b0 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
1b0c0 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
1b0d0 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
1b0e0 74 28 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e  t( pCur->pPage->
1b0f0 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
1b100 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
1b110 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
1b120 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1b130 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1b140 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
1b150 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
1b160 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
1b170 70 43 75 72 29 3b 0a 20 20 20 20 20 20 67 65 74  pCur);.      get
1b180 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
1b190 20 20 20 20 20 20 70 43 75 72 2d 3e 61 74 4c 61        pCur->atLa
1b1a0 73 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f  st = rc==SQLITE_
1b1b0 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
1b1c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1b1d0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
1b1e0 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
1b1f0 74 73 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 6e  ts to an entry n
1b200 65 61 72 20 74 68 65 20 6b 65 79 20 0a 2a 2a 20  ear the key .** 
1b210 73 70 65 63 69 66 69 65 64 20 62 79 20 70 4b 65  specified by pKe
1b220 79 2f 6e 4b 65 79 2f 70 55 6e 4b 65 79 2e 20 52  y/nKey/pUnKey. R
1b230 65 74 75 72 6e 20 61 20 73 75 63 63 65 73 73 20  eturn a success 
1b240 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  code..**.** For 
1b250 49 4e 54 4b 45 59 20 74 61 62 6c 65 73 2c 20 6f  INTKEY tables, o
1b260 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20 70 61 72  nly the nKey par
1b270 61 6d 65 74 65 72 20 69 73 20 75 73 65 64 2e 20  ameter is used. 
1b280 20 70 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 70 55   pKey .** and pU
1b290 6e 4b 65 79 20 6d 75 73 74 20 62 65 20 4e 55 4c  nKey must be NUL
1b2a0 4c 2e 20 20 46 6f 72 20 69 6e 64 65 78 20 74 61  L.  For index ta
1b2b0 62 6c 65 73 2c 20 65 69 74 68 65 72 20 70 55 6e  bles, either pUn
1b2c0 4b 65 79 0a 2a 2a 20 6d 75 73 74 20 70 6f 69 6e  Key.** must poin
1b2d0 74 20 74 6f 20 61 20 6b 65 79 20 74 68 61 74 20  t to a key that 
1b2e0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1b2f0 20 75 6e 70 61 63 6b 65 64 2c 20 6f 72 20 65 6c   unpacked, or el
1b300 73 65 0a 2a 2a 20 70 4b 65 79 2f 6e 4b 65 79 20  se.** pKey/nKey 
1b310 64 65 73 63 72 69 62 65 73 20 61 20 62 6c 6f 62  describes a blob
1b320 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
1b330 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  key..**.** If an
1b340 20 65 78 61 63 74 20 6d 61 74 63 68 20 69 73 20   exact match is 
1b350 6e 6f 74 20 66 6f 75 6e 64 2c 20 74 68 65 6e 20  not found, then 
1b360 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
1b370 77 61 79 73 0a 2a 2a 20 6c 65 66 74 20 70 6f 69  ways.** left poi
1b380 6e 74 69 6e 67 20 61 74 20 61 20 6c 65 61 66 20  nting at a leaf 
1b390 70 61 67 65 20 77 68 69 63 68 20 77 6f 75 6c 64  page which would
1b3a0 20 68 6f 6c 64 20 74 68 65 20 65 6e 74 72 79 20   hold the entry 
1b3b0 69 66 20 69 74 0a 2a 2a 20 77 65 72 65 20 70 72  if it.** were pr
1b3c0 65 73 65 6e 74 2e 20 20 54 68 65 20 63 75 72 73  esent.  The curs
1b3d0 6f 72 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  or might point t
1b3e0 6f 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 20  o an entry that 
1b3f0 63 6f 6d 65 73 0a 2a 2a 20 62 65 66 6f 72 65 20  comes.** before 
1b400 6f 72 20 61 66 74 65 72 20 74 68 65 20 6b 65 79  or after the key
1b410 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73 75  ..**.** The resu
1b420 6c 74 20 6f 66 20 63 6f 6d 70 61 72 69 6e 67 20  lt of comparing 
1b430 74 68 65 20 6b 65 79 20 77 69 74 68 20 74 68 65  the key with the
1b440 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20   entry to which 
1b450 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 69 73  the.** cursor is
1b460 20 77 72 69 74 74 65 6e 20 74 6f 20 2a 70 52 65   written to *pRe
1b470 73 20 69 66 20 70 52 65 73 21 3d 4e 55 4c 4c 2e  s if pRes!=NULL.
1b480 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66    The meaning of
1b490 0a 2a 2a 20 74 68 69 73 20 76 61 6c 75 65 20 69  .** this value i
1b4a0 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  s as follows:.**
1b4b0 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c 30 20  .**     *pRes<0 
1b4c0 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72 20       The cursor 
1b4d0 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
1b4e0 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68 61   at an entry tha
1b4f0 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  t.**            
1b500 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c 65 72        is smaller
1b510 20 74 68 61 6e 20 70 4b 65 79 20 6f 72 20 69 66   than pKey or if
1b520 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d   the table is em
1b530 70 74 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  pty.**          
1b540 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 20          and the 
1b550 63 75 72 73 6f 72 20 69 73 20 74 68 65 72 65 66  cursor is theref
1b560 6f 72 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74  ore left point t
1b570 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a  o nothing..**.**
1b580 20 20 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20       *pRes==0   
1b590 20 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20    The cursor is 
1b5a0 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
1b5b0 20 61 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a   an entry that.*
1b5c0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1b5d0 20 20 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68     exactly match
1b5e0 65 73 20 70 4b 65 79 2e 0a 2a 2a 0a 2a 2a 20 20  es pKey..**.**  
1b5f0 20 20 20 2a 70 52 65 73 3e 30 20 20 20 20 20 20     *pRes>0      
1b600 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
1b610 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
1b620 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
1b630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b640 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
1b650 70 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20  pKey..**.*/.int 
1b660 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
1b670 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  to(.  BtCursor *
1b680 70 43 75 72 2c 20 20 20 20 20 20 20 20 2f 2a 20  pCur,        /* 
1b690 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20 62 65  The cursor to be
1b6a0 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 63 6f 6e 73   moved */.  cons
1b6b0 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
1b6c0 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 63 6f     /* The key co
1b6d0 6e 74 65 6e 74 20 66 6f 72 20 69 6e 64 69 63 65  ntent for indice
1b6e0 73 2e 20 20 4e 6f 74 20 75 73 65 64 20 62 79 20  s.  Not used by 
1b6f0 74 61 62 6c 65 73 20 2a 2f 0a 20 20 55 6e 70 61  tables */.  Unpa
1b700 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 55 6e 4b  ckedRecord *pUnK
1b710 65 79 2c 2f 2a 20 55 6e 70 61 63 6b 65 64 20 76  ey,/* Unpacked v
1b720 65 72 73 69 6f 6e 20 6f 66 20 70 4b 65 79 20 2a  ersion of pKey *
1b730 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20 20 20  /.  i64 nKey,   
1b740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
1b750 7a 65 20 6f 66 20 70 4b 65 79 2e 20 20 4f 72 20  ze of pKey.  Or 
1b760 74 68 65 20 6b 65 79 20 66 6f 72 20 74 61 62 6c  the key for tabl
1b770 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73  es */.  int bias
1b780 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20 2f  Right,         /
1b790 2a 20 49 66 20 74 72 75 65 2c 20 62 69 61 73 20  * If true, bias 
1b7a0 74 68 65 20 73 65 61 72 63 68 20 74 6f 20 74 68  the search to th
1b7b0 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20  e high end */.  
1b7c0 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20  int *pRes       
1b7d0 20 20 20 20 20 20 20 2f 2a 20 53 65 61 72 63 68         /* Search
1b7e0 20 72 65 73 75 6c 74 20 66 6c 61 67 20 2a 2f 0a   result flag */.
1b7f0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  ){.  int rc;.  c
1b800 68 61 72 20 61 53 70 61 63 65 5b 32 30 30 5d 3b  har aSpace[200];
1b810 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1b820 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1b830 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1b840 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1b850 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
1b860 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  >db->mutex) );..
1b870 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73    /* If the curs
1b880 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f  or is already po
1b890 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20  sitioned at the 
1b8a0 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72 79  point we are try
1b8b0 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65  ing.  ** to move
1b8c0 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72   to, then just r
1b8d0 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
1b8e0 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a  ing any work */.
1b8f0 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1b900 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1b910 20 26 26 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e   && pCur->validN
1b920 4b 65 79 20 26 26 20 70 43 75 72 2d 3e 70 50 61  Key && pCur->pPa
1b930 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
1b940 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
1b950 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 7b 0a 20  .nKey==nKey ){. 
1b960 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
1b970 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1b980 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1b990 20 20 69 66 28 20 70 43 75 72 2d 3e 61 74 4c 61    if( pCur->atLa
1b9a0 73 74 20 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f  st && pCur->info
1b9b0 2e 6e 4b 65 79 3c 6e 4b 65 79 20 29 7b 0a 20 20  .nKey<nKey ){.  
1b9c0 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
1b9d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
1b9e0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
1b9f0 7d 0a 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54  }...  rc = moveT
1ba00 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
1ba10 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
1ba20 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
1ba30 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50 61 67  sert( pCur->pPag
1ba40 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
1ba50 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 73 49 6e  Cur->pPage->isIn
1ba60 69 74 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  it );.  if( pCur
1ba70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1ba80 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
1ba90 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20  *pRes = -1;.    
1baa0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 70 50  assert( pCur->pP
1bab0 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  age->nCell==0 );
1bac0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1bad0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
1bae0 20 70 43 75 72 2d 3e 70 50 61 67 65 2d 3e 69 6e   pCur->pPage->in
1baf0 74 4b 65 79 20 29 7b 0a 20 20 20 20 2f 2a 20 57  tKey ){.    /* W
1bb00 65 20 61 72 65 20 67 69 76 65 6e 20 61 6e 20 53  e are given an S
1bb10 51 4c 20 74 61 62 6c 65 20 74 6f 20 73 65 61 72  QL table to sear
1bb20 63 68 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20  ch.  The key is 
1bb30 74 68 65 20 69 6e 74 65 67 65 72 0a 20 20 20 20  the integer.    
1bb40 2a 2a 20 72 6f 77 69 64 20 63 6f 6e 74 61 69 6e  ** rowid contain
1bb50 65 64 20 69 6e 20 6e 4b 65 79 2e 20 20 70 4b 65  ed in nKey.  pKe
1bb60 79 20 61 6e 64 20 70 55 6e 4b 65 79 20 73 68 6f  y and pUnKey sho
1bb70 75 6c 64 20 62 6f 74 68 20 62 65 20 4e 55 4c 4c  uld both be NULL
1bb80 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
1bb90 70 55 6e 4b 65 79 3d 3d 30 20 29 3b 0a 20 20 20  pUnKey==0 );.   
1bba0 20 61 73 73 65 72 74 28 20 70 4b 65 79 3d 3d 30   assert( pKey==0
1bbb0 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
1bbc0 70 55 6e 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  pUnKey==0 ){.   
1bbd0 20 2f 2a 20 57 65 20 61 72 65 20 74 6f 20 73 65   /* We are to se
1bbe0 61 72 63 68 20 61 6e 20 53 51 4c 20 69 6e 64 65  arch an SQL inde
1bbf0 78 20 75 73 69 6e 67 20 61 20 6b 65 79 20 65 6e  x using a key en
1bc00 63 6f 64 65 64 20 61 73 20 61 20 62 6c 6f 62 2e  coded as a blob.
1bc10 0a 20 20 20 20 2a 2a 20 54 68 65 20 62 6c 6f 62  .    ** The blob
1bc20 20 69 73 20 66 6f 75 6e 64 20 61 74 20 70 4b 65   is found at pKe
1bc30 79 20 61 6e 64 20 69 73 20 6e 4b 65 79 20 62 79  y and is nKey by
1bc40 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 20  tes in length.  
1bc50 55 6e 70 61 63 6b 0a 20 20 20 20 2a 2a 20 74 68  Unpack.    ** th
1bc60 69 73 20 6b 65 79 20 73 6f 20 74 68 61 74 20 77  is key so that w
1bc70 65 20 63 61 6e 20 75 73 65 20 69 74 2e 20 2a 2f  e can use it. */
1bc80 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4b 65  .    assert( pKe
1bc90 79 21 3d 30 20 29 3b 0a 20 20 20 20 70 55 6e 4b  y!=0 );.    pUnK
1bca0 65 79 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  ey = sqlite3Vdbe
1bcb0 52 65 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75  RecordUnpack(pCu
1bcc0 72 2d 3e 70 4b 65 79 49 6e 66 6f 2c 20 6e 4b 65  r->pKeyInfo, nKe
1bcd0 79 2c 20 70 4b 65 79 2c 0a 20 20 20 20 20 20 20  y, pKey,.       
1bce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bcf0 20 20 20 20 20 20 20 20 20 20 20 20 61 53 70 61              aSpa
1bd00 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70 61 63  ce, sizeof(aSpac
1bd10 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70 55 6e  e));.    if( pUn
1bd20 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Key==0 ) return 
1bd30 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1bd40 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 65  }else{.    /* We
1bd50 20 61 72 65 20 74 6f 20 73 65 61 72 63 68 20 61   are to search a
1bd60 6e 20 53 51 4c 20 69 6e 64 65 78 20 75 73 69 6e  n SQL index usin
1bd70 67 20 61 20 6b 65 79 20 74 68 61 74 20 69 73 20  g a key that is 
1bd80 61 6c 72 65 61 64 79 20 75 6e 70 61 63 6b 65 64  already unpacked
1bd90 0a 20 20 20 20 2a 2a 20 61 6e 64 20 68 61 6e 64  .    ** and hand
1bda0 65 64 20 74 6f 20 75 73 20 69 6e 20 70 55 6e 4b  ed to us in pUnK
1bdb0 65 79 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ey. */.    asser
1bdc0 74 28 20 70 4b 65 79 3d 3d 30 20 29 3b 0a 20 20  t( pKey==0 );.  
1bdd0 7d 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20  }.  for(;;){.   
1bde0 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 3b 0a 20   int lwr, upr;. 
1bdf0 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b 0a     Pgno chldPg;.
1be00 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
1be10 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65  ge = pCur->pPage
1be20 3b 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 2d 31  ;.    int c = -1
1be30 3b 20 20 2f 2a 20 70 52 65 73 20 72 65 74 75 72  ;  /* pRes retur
1be40 6e 20 69 66 20 74 61 62 6c 65 20 69 73 20 65 6d  n if table is em
1be50 70 74 79 20 6d 75 73 74 20 62 65 20 2d 31 20 2a  pty must be -1 *
1be60 2f 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20  /.    lwr = 0;. 
1be70 20 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e     upr = pPage->
1be80 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28  nCell-1;.    if(
1be90 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   !pPage->intKey 
1bea0 26 26 20 70 55 6e 4b 65 79 3d 3d 30 20 29 7b 0a  && pUnKey==0 ){.
1beb0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1bec0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1bed0 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
1bee0 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a  o_finish;.    }.
1bef0 20 20 20 20 69 66 28 20 62 69 61 73 52 69 67 68      if( biasRigh
1bf00 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  t ){.      pCur-
1bf10 3e 69 64 78 20 3d 20 75 70 72 3b 0a 20 20 20 20  >idx = upr;.    
1bf20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75  }else{.      pCu
1bf30 72 2d 3e 69 64 78 20 3d 20 28 75 70 72 2b 6c 77  r->idx = (upr+lw
1bf40 72 29 2f 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20  r)/2;.    }.    
1bf50 69 66 28 20 6c 77 72 3c 3d 75 70 72 20 29 20 66  if( lwr<=upr ) f
1bf60 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 76 6f  or(;;){.      vo
1bf70 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20  id *pCellKey;.  
1bf80 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79      i64 nCellKey
1bf90 3b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 69 6e  ;.      pCur->in
1bfa0 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1bfb0 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
1bfc0 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 69  Key = 1;.      i
1bfd0 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
1bfe0 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a   ){.        u8 *
1bff0 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70  pCell;.        p
1c000 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
1c010 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78  pPage, pCur->idx
1c020 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69 6c 64  ) + pPage->child
1c030 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  PtrSize;.       
1c040 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44   if( pPage->hasD
1c050 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ata ){.         
1c060 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20   u32 dummy;.    
1c070 20 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d 20 67        pCell += g
1c080 65 74 56 61 72 69 6e 74 33 32 28 70 43 65 6c 6c  etVarint32(pCell
1c090 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20 20 20  , dummy);.      
1c0a0 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65 74 56    }.        getV
1c0b0 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28 75 36  arint(pCell, (u6
1c0c0 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b 0a 20  4*)&nCellKey);. 
1c0d0 20 20 20 20 20 20 20 69 66 28 20 6e 43 65 6c 6c         if( nCell
1c0e0 4b 65 79 3d 3d 6e 4b 65 79 20 29 7b 0a 20 20 20  Key==nKey ){.   
1c0f0 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20         c = 0;.  
1c100 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1c110 6e 43 65 6c 6c 4b 65 79 3c 6e 4b 65 79 20 29 7b  nCellKey<nKey ){
1c120 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 2d  .          c = -
1c130 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
1c140 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
1c150 72 74 28 20 6e 43 65 6c 6c 4b 65 79 3e 6e 4b 65  rt( nCellKey>nKe
1c160 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63  y );.          c
1c170 20 3d 20 2b 31 3b 0a 20 20 20 20 20 20 20 20 7d   = +1;.        }
1c180 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1c190 20 20 20 20 20 20 69 6e 74 20 61 76 61 69 6c 61        int availa
1c1a0 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 70 43 65  ble;.        pCe
1c1b0 6c 6c 4b 65 79 20 3d 20 28 76 6f 69 64 20 2a 29  llKey = (void *)
1c1c0 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75  fetchPayload(pCu
1c1d0 72 2c 20 26 61 76 61 69 6c 61 62 6c 65 2c 20 30  r, &available, 0
1c1e0 29 3b 0a 20 20 20 20 20 20 20 20 6e 43 65 6c 6c  );.        nCell
1c1f0 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  Key = pCur->info
1c200 2e 6e 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 69  .nKey;.        i
1c210 66 28 20 61 76 61 69 6c 61 62 6c 65 3e 3d 6e 43  f( available>=nC
1c220 65 6c 6c 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  ellKey ){.      
1c230 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56      c = sqlite3V
1c240 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1c250 28 6e 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c  (nCellKey, pCell
1c260 4b 65 79 2c 20 70 55 6e 4b 65 79 29 3b 0a 20 20  Key, pUnKey);.  
1c270 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1c280 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20         pCellKey 
1c290 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
1c2a0 20 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a 20 20 20   nCellKey );.   
1c2b0 20 20 20 20 20 20 20 69 66 28 20 70 43 65 6c 6c         if( pCell
1c2c0 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Key==0 ){.      
1c2d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1c2e0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
1c2f0 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f       goto moveto
1c300 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20  _finish;.       
1c310 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72     }.          r
1c320 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1c330 4b 65 79 28 70 43 75 72 2c 20 30 2c 20 6e 43 65  Key(pCur, 0, nCe
1c340 6c 6c 4b 65 79 2c 20 28 76 6f 69 64 20 2a 29 70  llKey, (void *)p
1c350 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
1c360 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 56      c = sqlite3V
1c370 64 62 65 52 65 63 6f 72 64 43 6f 6d 70 61 72 65  dbeRecordCompare
1c380 28 6e 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c  (nCellKey, pCell
1c390 4b 65 79 2c 20 70 55 6e 4b 65 79 29 3b 0a 20 20  Key, pUnKey);.  
1c3a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1c3b0 66 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a  free(pCellKey);.
1c3c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1c3d0 20 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66   ) goto moveto_f
1c3e0 69 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d  inish;.        }
1c3f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1c400 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( c==0 ){.     
1c410 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b     pCur->info.nK
1c420 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20  ey = nCellKey;. 
1c430 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
1c440 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 20 21 70  ->leafData && !p
1c450 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1c460 20 20 20 20 20 20 20 20 6c 77 72 20 3d 20 70 43          lwr = pC
1c470 75 72 2d 3e 69 64 78 3b 0a 20 20 20 20 20 20 20  ur->idx;.       
1c480 20 20 20 75 70 72 20 3d 20 6c 77 72 20 2d 20 31     upr = lwr - 1
1c490 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
1c4a0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  k;.        }else
1c4b0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1c4c0 70 52 65 73 20 29 20 2a 70 52 65 73 20 3d 20 30  pRes ) *pRes = 0
1c4d0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
1c4e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1c4f0 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
1c500 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 20 20  o_finish;.      
1c510 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1c520 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20    if( c<0 ){.   
1c530 20 20 20 20 20 6c 77 72 20 3d 20 70 43 75 72 2d       lwr = pCur-
1c540 3e 69 64 78 2b 31 3b 0a 20 20 20 20 20 20 7d 65  >idx+1;.      }e
1c550 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 70 72  lse{.        upr
1c560 20 3d 20 70 43 75 72 2d 3e 69 64 78 2d 31 3b 0a   = pCur->idx-1;.
1c570 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1c580 28 20 6c 77 72 3e 75 70 72 20 29 7b 0a 20 20 20  ( lwr>upr ){.   
1c590 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e       pCur->info.
1c5a0 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b  nKey = nCellKey;
1c5b0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1c5c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43        }.      pC
1c5d0 75 72 2d 3e 69 64 78 20 3d 20 28 6c 77 72 2b 75  ur->idx = (lwr+u
1c5e0 70 72 29 2f 32 3b 0a 20 20 20 20 7d 0a 20 20 20  pr)/2;.    }.   
1c5f0 20 61 73 73 65 72 74 28 20 6c 77 72 3d 3d 75 70   assert( lwr==up
1c600 72 2b 31 20 29 3b 0a 20 20 20 20 61 73 73 65 72  r+1 );.    asser
1c610 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
1c620 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
1c630 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
1c640 20 63 68 6c 64 50 67 20 3d 20 30 3b 0a 20 20 20   chldPg = 0;.   
1c650 20 7d 65 6c 73 65 20 69 66 28 20 6c 77 72 3e 3d   }else if( lwr>=
1c660 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
1c670 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 67        chldPg = g
1c680 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
1c690 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
1c6a0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
1c6b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 6c  }else{.      chl
1c6c0 64 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 66  dPg = get4byte(f
1c6d0 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 6c  indCell(pPage, l
1c6e0 77 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  wr));.    }.    
1c6f0 69 66 28 20 63 68 6c 64 50 67 3d 3d 30 20 29 7b  if( chldPg==0 ){
1c700 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
1c710 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20 70  Cur->idx>=0 && p
1c720 43 75 72 2d 3e 69 64 78 3c 70 43 75 72 2d 3e 70  Cur->idx<pCur->p
1c730 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
1c740 20 20 20 20 20 69 66 28 20 70 52 65 73 20 29 20       if( pRes ) 
1c750 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20 20  *pRes = c;.     
1c760 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1c770 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65  .      goto move
1c780 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d  to_finish;.    }
1c790 0a 20 20 20 20 70 43 75 72 2d 3e 69 64 78 20 3d  .    pCur->idx =
1c7a0 20 6c 77 72 3b 0a 20 20 20 20 70 43 75 72 2d 3e   lwr;.    pCur->
1c7b0 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
1c7c0 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
1c7d0 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  Key = 0;.    rc 
1c7e0 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
1c7f0 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20 20  ur, chldPg);.   
1c800 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 6d   if( rc ) goto m
1c810 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
1c820 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3a  }.moveto_finish:
1c830 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20  .  if( pKey ){. 
1c840 20 20 20 2f 2a 20 49 66 20 77 65 20 63 72 65 61     /* If we crea
1c850 74 65 64 20 6f 75 72 20 6f 77 6e 20 75 6e 70 61  ted our own unpa
1c860 63 6b 65 64 20 6b 65 79 20 61 74 20 74 68 65 20  cked key at the 
1c870 74 6f 70 20 6f 66 20 74 68 69 73 0a 20 20 20 20  top of this.    
1c880 2a 2a 20 70 72 6f 63 65 64 75 72 65 2c 20 74 68  ** procedure, th
1c890 65 6e 20 64 65 73 74 72 6f 79 20 74 68 61 74 20  en destroy that 
1c8a0 6b 65 79 20 62 65 66 6f 72 65 20 72 65 74 75 72  key before retur
1c8b0 6e 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  ning. */.    sql
1c8c0 69 74 65 33 56 64 62 65 44 65 6c 65 74 65 55 6e  ite3VdbeDeleteUn
1c8d0 70 61 63 6b 65 64 52 65 63 6f 72 64 28 70 55 6e  packedRecord(pUn
1c8e0 4b 65 79 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Key);.  }.  retu
1c8f0 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
1c900 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
1c910 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
1c920 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e  t pointing at an
1c930 20 65 6e 74 72 79 20 6f 66 20 74 68 65 20 74 61   entry of the ta
1c940 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 52 55 45 20  ble..**.** TRUE 
1c950 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
1c960 20 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f   after a call to
1c970 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
1c980 74 28 29 20 6d 6f 76 65 73 0a 2a 2a 20 70 61 73  t() moves.** pas
1c990 74 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  t the last entry
1c9a0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6f 72   in the table or
1c9b0 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
1c9c0 76 28 29 20 6d 6f 76 65 73 20 70 61 73 74 0a 2a  v() moves past.*
1c9d0 2a 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  * the first entr
1c9e0 79 2e 20 20 54 52 55 45 20 69 73 20 61 6c 73 6f  y.  TRUE is also
1c9f0 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
1ca00 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e   table is empty.
1ca10 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1ca20 74 72 65 65 45 6f 66 28 42 74 43 75 72 73 6f 72  treeEof(BtCursor
1ca30 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f   *pCur){.  /* TO
1ca40 44 4f 3a 20 57 68 61 74 20 69 66 20 74 68 65 20  DO: What if the 
1ca50 63 75 72 73 6f 72 20 69 73 20 69 6e 20 43 55 52  cursor is in CUR
1ca60 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45 4b 20  SOR_REQUIRESEEK 
1ca70 62 75 74 20 61 6c 6c 20 74 61 62 6c 65 20 65 6e  but all table en
1ca80 74 72 69 65 73 0a 20 20 2a 2a 20 68 61 76 65 20  tries.  ** have 
1ca90 62 65 65 6e 20 64 65 6c 65 74 65 64 3f 20 54 68  been deleted? Th
1caa0 69 73 20 41 50 49 20 77 69 6c 6c 20 6e 65 65 64  is API will need
1cab0 20 74 6f 20 63 68 61 6e 67 65 20 74 6f 20 72 65   to change to re
1cac0 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f  turn an error co
1cad0 64 65 0a 20 20 2a 2a 20 61 73 20 77 65 6c 6c 20  de.  ** as well 
1cae0 61 73 20 74 68 65 20 62 6f 6f 6c 65 61 6e 20 72  as the boolean r
1caf0 65 73 75 6c 74 20 76 61 6c 75 65 2e 0a 20 20 2a  esult value..  *
1cb00 2f 0a 20 20 72 65 74 75 72 6e 20 28 43 55 52 53  /.  return (CURS
1cb10 4f 52 5f 56 41 4c 49 44 21 3d 70 43 75 72 2d 3e  OR_VALID!=pCur->
1cb20 65 53 74 61 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  eState);.}../*.*
1cb30 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 61 74  * Return the dat
1cb40 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
1cb50 20 68 61 6e 64 6c 65 20 66 6f 72 20 61 20 63 75   handle for a cu
1cb60 72 73 6f 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  rsor..*/.sqlite3
1cb70 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 43 75   *sqlite3BtreeCu
1cb80 72 73 6f 72 44 62 28 63 6f 6e 73 74 20 42 74 43  rsorDb(const BtC
1cb90 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1cba0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1cbb0 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
1cbc0 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
1cbd0 65 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ex) );.  return 
1cbe0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
1cbf0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 76 61 6e  ;.}../*.** Advan
1cc00 63 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f  ce the cursor to
1cc10 20 74 68 65 20 6e 65 78 74 20 65 6e 74 72 79 20   the next entry 
1cc20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
1cc30 20 20 49 66 0a 2a 2a 20 73 75 63 63 65 73 73 66    If.** successf
1cc40 75 6c 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65  ul then set *pRe
1cc50 73 3d 30 2e 20 20 49 66 20 74 68 65 20 63 75 72  s=0.  If the cur
1cc60 73 6f 72 0a 2a 2a 20 77 61 73 20 61 6c 72 65 61  sor.** was alrea
1cc70 64 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  dy pointing to t
1cc80 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e  he last entry in
1cc90 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65   the database be
1cca0 66 6f 72 65 0a 2a 2a 20 74 68 69 73 20 72 6f 75  fore.** this rou
1ccb0 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2c  tine was called,
1ccc0 20 74 68 65 6e 20 73 65 74 20 2a 70 52 65 73 3d   then set *pRes=
1ccd0 31 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1..*/.int sqlite
1cce0 33 42 74 72 65 65 4e 65 78 74 28 42 74 43 75 72  3BtreeNext(BtCur
1ccf0 73 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a  sor *pCur, int *
1cd00 70 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b  pRes){.  int rc;
1cd10 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1cd20 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
1cd30 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1cd40 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
1cd50 65 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72  estoreOrClearCur
1cd60 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
1cd70 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
1cd80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
1cd90 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61  turn rc;.  }.  a
1cda0 73 73 65 72 74 28 20 70 52 65 73 21 3d 30 20 29  ssert( pRes!=0 )
1cdb0 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ;.  pPage = pCur
1cdc0 2d 3e 70 50 61 67 65 3b 0a 20 20 69 66 28 20 43  ->pPage;.  if( C
1cdd0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70  URSOR_INVALID==p
1cde0 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20  Cur->eState ){. 
1cdf0 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
1ce00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1ce10 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  OK;.  }.  if( pC
1ce20 75 72 2d 3e 73 6b 69 70 3e 30 20 29 7b 0a 20 20  ur->skip>0 ){.  
1ce30 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30    pCur->skip = 0
1ce40 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b  ;.    *pRes = 0;
1ce50 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1ce60 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75  TE_OK;.  }.  pCu
1ce70 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20  r->skip = 0;..  
1ce80 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
1ce90 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72  sInit );.  asser
1cea0 74 28 20 70 43 75 72 2d 3e 69 64 78 3c 70 50 61  t( pCur->idx<pPa
1ceb0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20  ge->nCell );..  
1cec0 70 43 75 72 2d 3e 69 64 78 2b 2b 3b 0a 20 20 70  pCur->idx++;.  p
1ced0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1cee0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c  = 0;.  pCur->val
1cef0 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 69 66  idNKey = 0;.  if
1cf00 28 20 70 43 75 72 2d 3e 69 64 78 3e 3d 70 50 61  ( pCur->idx>=pPa
1cf10 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  ge->nCell ){.   
1cf20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
1cf30 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  f ){.      rc = 
1cf40 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
1cf50 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  , get4byte(&pPag
1cf60 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
1cf70 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a  hdrOffset+8]));.
1cf80 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72        if( rc ) r
1cf90 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1cfa0 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
1cfb0 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20  ost(pCur);.     
1cfc0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
1cfd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1cfe0 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20   }.    do{.     
1cff0 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
1d000 65 49 73 52 6f 6f 74 50 61 67 65 28 70 50 61 67  eIsRootPage(pPag
1d010 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  e) ){.        *p
1d020 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Res = 1;.       
1d030 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
1d040 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
1d050 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
1d060 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
1d070 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  }.      sqlite3B
1d080 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65 6e 74  treeMoveToParent
1d090 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 70 50  (pCur);.      pP
1d0a0 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67  age = pCur->pPag
1d0b0 65 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70  e;.    }while( p
1d0c0 43 75 72 2d 3e 69 64 78 3e 3d 70 50 61 67 65 2d  Cur->idx>=pPage-
1d0d0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70  >nCell );.    *p
1d0e0 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Res = 0;.    if(
1d0f0 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61 74 61   pPage->leafData
1d100 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1d110 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
1d120 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20  pCur, pRes);.   
1d130 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1d140 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1d150 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
1d160 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d  c;.  }.  *pRes =
1d170 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   0;.  if( pPage-
1d180 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74  >leaf ){.    ret
1d190 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1d1a0 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f   }.  rc = moveTo
1d1b0 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
1d1c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1d1d0 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20  ./*.** Step the 
1d1e0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61  cursor to the ba
1d1f0 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f  ck to the previo
1d200 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  us entry in the 
1d210 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a  database.  If.**
1d220 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e   successful then
1d230 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49   set *pRes=0.  I
1d240 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  f the cursor.** 
1d250 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  was already poin
1d260 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73  ting to the firs
1d270 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
1d280 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
1d290 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * this routine w
1d2a0 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  as called, then 
1d2b0 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a  set *pRes=1..*/.
1d2c0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1d2d0 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f  Previous(BtCurso
1d2e0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
1d2f0 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
1d300 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 4d 65   Pgno pgno;.  Me
1d310 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
1d320 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1d330 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1d340 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
1d350 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f  eOrClearCursorPo
1d360 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
1d370 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1d380 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
1d390 72 63 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e  rc;.  }.  pCur->
1d3a0 61 74 4c 61 73 74 20 3d 20 30 3b 0a 20 20 69 66  atLast = 0;.  if
1d3b0 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ( CURSOR_INVALID
1d3c0 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
1d3d0 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b  {.    *pRes = 1;
1d3e0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1d3f0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
1d400 20 70 43 75 72 2d 3e 73 6b 69 70 3c 30 20 29 7b   pCur->skip<0 ){
1d410 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20  .    pCur->skip 
1d420 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d  = 0;.    *pRes =
1d430 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   0;.    return S
1d440 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
1d450 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a  pCur->skip = 0;.
1d460 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
1d470 3e 70 50 61 67 65 3b 0a 20 20 61 73 73 65 72 74  >pPage;.  assert
1d480 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20  ( pPage->isInit 
1d490 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1d4a0 72 2d 3e 69 64 78 3e 3d 30 20 29 3b 0a 20 20 69  r->idx>=0 );.  i
1d4b0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
1d4c0 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67 65  ){.    pgno = ge
1d4d0 74 34 62 79 74 65 28 20 66 69 6e 64 43 65 6c 6c  t4byte( findCell
1d4e0 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64  (pPage, pCur->id
1d4f0 78 29 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d  x) );.    rc = m
1d500 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
1d510 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20   pgno);.    if( 
1d520 72 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  rc ){.      retu
1d530 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
1d540 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68   rc = moveToRigh
1d550 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d  tmost(pCur);.  }
1d560 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28  else{.    while(
1d570 20 70 43 75 72 2d 3e 69 64 78 3d 3d 30 20 29 7b   pCur->idx==0 ){
1d580 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1d590 65 33 42 74 72 65 65 49 73 52 6f 6f 74 50 61 67  e3BtreeIsRootPag
1d5a0 65 28 70 50 61 67 65 29 20 29 7b 0a 20 20 20 20  e(pPage) ){.    
1d5b0 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65      pCur->eState
1d5c0 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
1d5d0 44 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73  D;.        *pRes
1d5e0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65   = 1;.        re
1d5f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1d600 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1d610 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f  lite3BtreeMoveTo
1d620 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20  Parent(pCur);.  
1d630 20 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72      pPage = pCur
1d640 2d 3e 70 50 61 67 65 3b 0a 20 20 20 20 7d 0a 20  ->pPage;.    }. 
1d650 20 20 20 70 43 75 72 2d 3e 69 64 78 2d 2d 3b 0a     pCur->idx--;.
1d660 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
1d670 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43  Size = 0;.    pC
1d680 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
1d690 30 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  0;.    if( pPage
1d6a0 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 20 21 70  ->leafData && !p
1d6b0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
1d6c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1d6d0 42 74 72 65 65 50 72 65 76 69 6f 75 73 28 70 43  BtreePrevious(pC
1d6e0 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d  ur, pRes);.    }
1d6f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1d700 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1d710 7d 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20  }.  }.  *pRes = 
1d720 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
1d730 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
1d740 65 20 61 20 6e 65 77 20 70 61 67 65 20 66 72 6f  e a new page fro
1d750 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  m the database f
1d760 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ile..**.** The n
1d770 65 77 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65  ew page is marke
1d780 64 20 61 73 20 64 69 72 74 79 2e 20 20 28 49 6e  d as dirty.  (In
1d790 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 71   other words, sq
1d7a0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1d7b0 29 0a 2a 2a 20 68 61 73 20 61 6c 72 65 61 64 79  ).** has already
1d7c0 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20   been called on 
1d7d0 74 68 65 20 6e 65 77 20 70 61 67 65 2e 29 20 20  the new page.)  
1d7e0 54 68 65 20 6e 65 77 20 70 61 67 65 20 68 61 73  The new page has
1d7f0 20 61 6c 73 6f 0a 2a 2a 20 62 65 65 6e 20 72 65   also.** been re
1d800 66 65 72 65 6e 63 65 64 20 61 6e 64 20 74 68 65  ferenced and the
1d810 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
1d820 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
1d830 66 6f 72 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 73  for calling.** s
1d840 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1d850 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  () on the new pa
1d860 67 65 20 77 68 65 6e 20 69 74 20 69 73 20 64 6f  ge when it is do
1d870 6e 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  ne..**.** SQLITE
1d880 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
1d890 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 41 6e 79  on success.  Any
1d8a0 20 6f 74 68 65 72 20 72 65 74 75 72 6e 20 76 61   other return va
1d8b0 6c 75 65 20 69 6e 64 69 63 61 74 65 73 0a 2a 2a  lue indicates.**
1d8c0 20 61 6e 20 65 72 72 6f 72 2e 20 20 2a 70 70 50   an error.  *ppP
1d8d0 61 67 65 20 61 6e 64 20 2a 70 50 67 6e 6f 20 61  age and *pPgno a
1d8e0 72 65 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20  re undefined in 
1d8f0 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 6e 20  the event of an 
1d900 65 72 72 6f 72 2e 0a 2a 2a 20 44 6f 20 6e 6f 74  error..** Do not
1d910 20 69 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 50   invoke sqlite3P
1d920 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 2a  agerUnref() on *
1d930 70 70 50 61 67 65 20 69 66 20 61 6e 20 65 72 72  ppPage if an err
1d940 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  or is returned..
1d950 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 6e 65  **.** If the "ne
1d960 61 72 62 79 22 20 70 61 72 61 6d 65 74 65 72 20  arby" parameter 
1d970 69 73 20 6e 6f 74 20 30 2c 20 74 68 65 6e 20 61  is not 0, then a
1d980 20 28 66 65 65 62 6c 65 29 20 65 66 66 6f 72 74   (feeble) effort
1d990 20 69 73 20 6d 61 64 65 20 74 6f 20 0a 2a 2a 20   is made to .** 
1d9a0 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 63 6c  locate a page cl
1d9b0 6f 73 65 20 74 6f 20 74 68 65 20 70 61 67 65 20  ose to the page 
1d9c0 6e 75 6d 62 65 72 20 22 6e 65 61 72 62 79 22 2e  number "nearby".
1d9d0 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
1d9e0 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 61 74 74 65  ed in an.** atte
1d9f0 6d 70 74 20 74 6f 20 6b 65 65 70 20 72 65 6c 61  mpt to keep rela
1da00 74 65 64 20 70 61 67 65 73 20 63 6c 6f 73 65 20  ted pages close 
1da10 74 6f 20 65 61 63 68 20 6f 74 68 65 72 20 69 6e  to each other in
1da20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1da30 6c 65 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e 20  le,.** which in 
1da40 74 75 72 6e 20 63 61 6e 20 6d 61 6b 65 20 64 61  turn can make da
1da50 74 61 62 61 73 65 20 61 63 63 65 73 73 20 66 61  tabase access fa
1da60 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ster..**.** If t
1da70 68 65 20 22 65 78 61 63 74 22 20 70 61 72 61 6d  he "exact" param
1da80 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20 61  eter is not 0, a
1da90 6e 64 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62  nd the page-numb
1daa0 65 72 20 6e 65 61 72 62 79 20 65 78 69 73 74 73  er nearby exists
1dab0 20 0a 2a 2a 20 61 6e 79 77 68 65 72 65 20 6f 6e   .** anywhere on
1dac0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 2c 20   the free-list, 
1dad0 74 68 65 6e 20 69 74 20 69 73 20 67 75 61 72 65  then it is guare
1dae0 6e 74 65 65 64 20 74 6f 20 62 65 20 72 65 74 75  nteed to be retu
1daf0 72 6e 65 64 2e 20 54 68 69 73 0a 2a 2a 20 69 73  rned. This.** is
1db00 20 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 61 75   only used by au
1db10 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
1db20 73 65 73 20 77 68 65 6e 20 61 6c 6c 6f 63 61 74  ses when allocat
1db30 69 6e 67 20 61 20 6e 65 77 20 74 61 62 6c 65 2e  ing a new table.
1db40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
1db50 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
1db60 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
1db70 74 2c 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a  t, .  MemPage **
1db80 70 70 50 61 67 65 2c 20 0a 20 20 50 67 6e 6f 20  ppPage, .  Pgno 
1db90 2a 70 50 67 6e 6f 2c 20 0a 20 20 50 67 6e 6f 20  *pPgno, .  Pgno 
1dba0 6e 65 61 72 62 79 2c 0a 20 20 75 38 20 65 78 61  nearby,.  u8 exa
1dbb0 63 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  ct.){.  MemPage 
1dbc0 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72  *pPage1;.  int r
1dbd0 63 3b 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  c;.  int n;     
1dbe0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
1dbf0 65 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69  es on the freeli
1dc00 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6b 3b 20 20  st */.  int k;  
1dc10 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1dc20 6c 65 61 76 65 73 20 6f 6e 20 74 68 65 20 74 72  leaves on the tr
1dc30 75 6e 6b 20 6f 66 20 74 68 65 20 66 72 65 65 6c  unk of the freel
1dc40 69 73 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ist */.  MemPage
1dc50 20 2a 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20   *pTrunk = 0;.  
1dc60 4d 65 6d 50 61 67 65 20 2a 70 50 72 65 76 54 72  MemPage *pPrevTr
1dc70 75 6e 6b 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  unk = 0;..  asse
1dc80 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
1dc90 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
1dca0 78 29 20 29 3b 0a 20 20 70 50 61 67 65 31 20 3d  x) );.  pPage1 =
1dcb0 20 70 42 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20   pBt->pPage1;.  
1dcc0 6e 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  n = get4byte(&pP
1dcd0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29  age1->aData[36])
1dce0 3b 0a 20 20 69 66 28 20 6e 3e 30 20 29 7b 0a 20  ;.  if( n>0 ){. 
1dcf0 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20     /* There are 
1dd00 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
1dd10 65 6c 69 73 74 2e 20 20 52 65 75 73 65 20 6f 6e  elist.  Reuse on
1dd20 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73  e of those pages
1dd30 2e 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 69 54  . */.    Pgno iT
1dd40 72 75 6e 6b 3b 0a 20 20 20 20 75 38 20 73 65 61  runk;.    u8 sea
1dd50 72 63 68 4c 69 73 74 20 3d 20 30 3b 20 2f 2a 20  rchList = 0; /* 
1dd60 49 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  If the free-list
1dd70 20 6d 75 73 74 20 62 65 20 73 65 61 72 63 68 65   must be searche
1dd80 64 20 66 6f 72 20 27 6e 65 61 72 62 79 27 20 2a  d for 'nearby' *
1dd90 2f 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 49 66  /.    .    /* If
1dda0 20 74 68 65 20 27 65 78 61 63 74 27 20 70 61 72   the 'exact' par
1ddb0 61 6d 65 74 65 72 20 77 61 73 20 74 72 75 65 20  ameter was true 
1ddc0 61 6e 64 20 61 20 71 75 65 72 79 20 6f 66 20 74  and a query of t
1ddd0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
1dde0 20 20 20 2a 2a 20 73 68 6f 77 73 20 74 68 61 74     ** shows that
1ddf0 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
1de00 79 27 20 69 73 20 73 6f 6d 65 77 68 65 72 65 20  y' is somewhere 
1de10 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  on the free-list
1de20 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68  , then.    ** th
1de30 65 20 65 6e 74 69 72 65 2d 6c 69 73 74 20 77 69  e entire-list wi
1de40 6c 6c 20 62 65 20 73 65 61 72 63 68 65 64 20 66  ll be searched f
1de50 6f 72 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  or that page..  
1de60 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
1de70 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
1de80 55 55 4d 0a 20 20 20 20 69 66 28 20 65 78 61 63  UUM.    if( exac
1de90 74 20 26 26 20 6e 65 61 72 62 79 3c 3d 70 61 67  t && nearby<=pag
1dea0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
1deb0 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  >pPager) ){.    
1dec0 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
1ded0 20 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79    assert( nearby
1dee0 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >0 );.      asse
1def0 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
1df00 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 72 63 20  uum );.      rc 
1df10 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
1df20 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c   nearby, &eType,
1df30 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
1df40 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
1df50 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
1df60 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
1df70 29 7b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63  ){.        searc
1df80 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20  hList = 1;.     
1df90 20 7d 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f 20   }.      *pPgno 
1dfa0 3d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 7d 0a  = nearby;.    }.
1dfb0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44  #endif..    /* D
1dfc0 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ecrement the fre
1dfd0 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20  e-list count by 
1dfe0 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f  1. Set iTrunk to
1dff0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
1e000 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66  e.    ** first f
1e010 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
1e020 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20  age. iPrevTrunk 
1e030 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a  is initially 1..
1e040 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
1e050 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1e060 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
1e070 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
1e080 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1e090 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
1e0a0 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31  ->aData[36], n-1
1e0b0 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  );..    /* The c
1e0c0 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69 73 20  ode within this 
1e0d0 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79  loop is run only
1e0e0 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73 65   once if the 'se
1e0f0 61 72 63 68 4c 69 73 74 27 20 76 61 72 69 61 62  archList' variab
1e100 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  le.    ** is not
1e110 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65   true. Otherwise
1e120 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66  , it runs once f
1e130 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61  or each trunk-pa
1e140 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ge on the.    **
1e150 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c   free-list until
1e160 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
1e170 79 27 20 69 73 20 6c 6f 63 61 74 65 64 2e 0a 20  y' is located.. 
1e180 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20     */.    do {. 
1e190 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20       pPrevTrunk 
1e1a0 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
1e1b0 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29  if( pPrevTrunk )
1e1c0 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b  {.        iTrunk
1e1d0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72   = get4byte(&pPr
1e1e0 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
1e1f0 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ]);.      }else{
1e200 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20  .        iTrunk 
1e210 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
1e220 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a  e1->aData[32]);.
1e230 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
1e240 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
1e250 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75  etPage(pBt, iTru
1e260 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b  nk, &pTrunk, 0);
1e270 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
1e280 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
1e290 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 0;.        got
1e2a0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
1e2b0 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  age;.      }..  
1e2c0 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65      k = get4byte
1e2d0 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
1e2e0 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b  4]);.      if( k
1e2f0 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c 69  ==0 && !searchLi
1e300 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  st ){.        /*
1e310 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e   The trunk has n
1e320 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65  o leaves and the
1e330 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69   list is not bei
1e340 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20  ng searched. .  
1e350 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72        ** So extr
1e360 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61  act the trunk pa
1e370 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73  ge itself and us
1e380 65 20 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c  e it as the newl
1e390 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  y .        ** al
1e3a0 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a  located page */.
1e3b0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1e3c0 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b  pPrevTrunk==0 );
1e3d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1e3e0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1e3f0 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
1e400 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1e410 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
1e420 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
1e430 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
1e440 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
1e450 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   iTrunk;.       
1e460 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d   memcpy(&pPage1-
1e470 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72  >aData[32], &pTr
1e480 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
1e490 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  );.        *ppPa
1e4a0 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  ge = pTrunk;.   
1e4b0 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
1e4c0 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
1e4d0 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72  "ALLOCATE: %d tr
1e4e0 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61  unk - %d free pa
1e4f0 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50  ges left\n", *pP
1e500 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20  gno, n-1));.    
1e510 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 70 42    }else if( k>pB
1e520 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
1e530 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  - 2 ){.        /
1e540 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20  * Value of k is 
1e550 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44  out of range.  D
1e560 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
1e570 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  on */.        rc
1e580 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
1e590 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
1e5a0 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
1e5b0 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20  e_page;.#ifndef 
1e5c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1e5d0 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c  VACUUM.      }el
1e5e0 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69 73  se if( searchLis
1e5f0 74 20 26 26 20 6e 65 61 72 62 79 3d 3d 69 54 72  t && nearby==iTr
1e600 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  unk ){.        /
1e610 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65  * The list is be
1e620 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64  ing searched and
1e630 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65   this trunk page
1e640 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20   is the page.   
1e650 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63       ** to alloc
1e660 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20  ate, regardless 
1e670 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61  of whether it ha
1e680 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20  s leaves..      
1e690 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
1e6a0 65 72 74 28 20 2a 70 50 67 6e 6f 3d 3d 69 54 72  ert( *pPgno==iTr
1e6b0 75 6e 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 2a  unk );.        *
1e6c0 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
1e6d0 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c  .        searchL
1e6e0 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
1e6f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1e700 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
1e710 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
1e720 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1e730 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
1e740 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
1e750 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e760 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  if( k==0 ){.    
1e770 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
1e780 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
1e790 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
1e7a0 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
1e7b0 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
1e7c0 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
1e7d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e7e0 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65      memcpy(&pPre
1e7f0 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
1e800 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
1e810 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
1e820 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
1e830 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
1e840 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   The trunk page 
1e850 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  is required by t
1e860 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74  he caller but it
1e870 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20   contains .     
1e880 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73       ** pointers
1e890 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65   to free-list le
1e8a0 61 76 65 73 2e 20 54 68 65 20 66 69 72 73 74 20  aves. The first 
1e8b0 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74  leaf becomes a t
1e8c0 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a  runk.          *
1e8d0 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  * page in this c
1e8e0 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ase..          *
1e8f0 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50  /.          MemP
1e900 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a  age *pNewTrunk;.
1e910 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69            Pgno i
1e920 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62  NewTrunk = get4b
1e930 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
1e940 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20  ta[8]);.        
1e950 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1e960 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
1e970 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77  iNewTrunk, &pNew
1e980 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
1e990 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1e9a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1e9b0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
1e9c0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
1e9d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e9e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1e9f0 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 54  PagerWrite(pNewT
1ea00 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
1ea10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1ea20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1ea30 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
1ea40 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b  sePage(pNewTrunk
1ea50 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
1ea60 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
1ea70 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
1ea80 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d   }.          mem
1ea90 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  cpy(&pNewTrunk->
1eaa0 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e  aData[0], &pTrun
1eab0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
1eac0 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
1ead0 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  yte(&pNewTrunk->
1eae0 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a  aData[4], k-1);.
1eaf0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1eb00 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
1eb10 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[8], &pTrunk->
1eb20 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29  aData[12], (k-1)
1eb30 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  *4);.          r
1eb40 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54  eleasePage(pNewT
1eb50 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
1eb60 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b   if( !pPrevTrunk
1eb70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1eb80 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
1eb90 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65  ->aData[32], iNe
1eba0 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
1ebb0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ebc0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1ebd0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72  e3PagerWrite(pPr
1ebe0 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  evTrunk->pDbPage
1ebf0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
1ec00 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
1ec10 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1ec20 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
1ec30 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1ec40 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
1ec50 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  e(&pPrevTrunk->a
1ec60 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75  Data[0], iNewTru
1ec70 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nk);.          }
1ec80 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1ec90 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
1eca0 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
1ecb0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e  LLOCATE: %d trun
1ecc0 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65  k - %d free page
1ecd0 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e  s left\n", *pPgn
1ece0 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66  o, n-1));.#endif
1ecf0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1ed00 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74        /* Extract
1ed10 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65   a leaf from the
1ed20 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20   trunk */.      
1ed30 20 20 69 6e 74 20 63 6c 6f 73 65 73 74 3b 0a 20    int closest;. 
1ed40 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67         Pgno iPag
1ed50 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67  e;.        unsig
1ed60 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20  ned char *aData 
1ed70 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b  = pTrunk->aData;
1ed80 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
1ed90 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1eda0 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
1edb0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1edc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
1edd0 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
1ede0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
1edf0 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72          if( near
1ee00 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  by>0 ){.        
1ee10 20 20 69 6e 74 20 69 2c 20 64 69 73 74 3b 0a 20    int i, dist;. 
1ee20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
1ee30 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1ee40 64 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28  dist = get4byte(
1ee50 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61  &aData[8]) - nea
1ee60 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69  rby;.          i
1ee70 66 28 20 64 69 73 74 3c 30 20 29 20 64 69 73 74  f( dist<0 ) dist
1ee80 20 3d 20 2d 64 69 73 74 3b 0a 20 20 20 20 20 20   = -dist;.      
1ee90 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b      for(i=1; i<k
1eea0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
1eeb0 20 20 20 20 69 6e 74 20 64 32 20 3d 20 67 65 74      int d2 = get
1eec0 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69  4byte(&aData[8+i
1eed0 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20  *4]) - nearby;. 
1eee0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64             if( d
1eef0 32 3c 30 20 29 20 64 32 20 3d 20 2d 64 32 3b 0a  2<0 ) d2 = -d2;.
1ef00 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1ef10 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20  d2<dist ){.     
1ef20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
1ef30 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
1ef40 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20      dist = d2;. 
1ef50 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
1ef60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ef70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1ef80 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20    closest = 0;. 
1ef90 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
1efa0 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79    iPage = get4by
1efb0 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  te(&aData[8+clos
1efc0 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20  est*4]);.       
1efd0 20 69 66 28 20 21 73 65 61 72 63 68 4c 69 73 74   if( !searchList
1efe0 20 7c 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72 62   || iPage==nearb
1eff0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  y ){.          i
1f000 6e 74 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20  nt nPage;.      
1f010 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69 50 61      *pPgno = iPa
1f020 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 50  ge;.          nP
1f030 61 67 65 20 3d 20 70 61 67 65 72 50 61 67 65 63  age = pagerPagec
1f040 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
1f050 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1f060 20 2a 70 50 67 6e 6f 3e 6e 50 61 67 65 20 29 7b   *pPgno>nPage ){
1f070 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
1f080 46 72 65 65 20 70 61 67 65 20 6f 66 66 20 74 68  Free page off th
1f090 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
1f0a0 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
1f0b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
1f0c0 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
1f0d0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1f0e0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
1f0f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1f100 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
1f110 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65  OCATE: %d was le
1f120 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74  af %d of %d on t
1f130 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20  runk %d".       
1f140 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64 20            ": %d 
1f150 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73 5c  more free pages\
1f160 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1f170 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f       *pPgno, clo
1f180 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e  sest+1, k, pTrun
1f190 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a  k->pgno, n-1));.
1f1a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c            if( cl
1f1b0 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20  osest<k-1 ){.   
1f1c0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
1f1d0 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74  &aData[8+closest
1f1e0 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a  *4], &aData[4+k*
1f1f0 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  4], 4);.        
1f200 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75    }.          pu
1f210 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d  t4byte(&aData[4]
1f220 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  , k-1);.        
1f230 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1f240 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
1f250 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65 2c 20  *pPgno, ppPage, 
1f260 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  1);.          if
1f270 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1f280 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
1f290 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
1f2a0 6f 6c 6c 62 61 63 6b 28 28 2a 70 70 50 61 67 65  ollback((*ppPage
1f2b0 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  )->pDbPage);.   
1f2c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1f2d0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1f2e0 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
1f2f0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
1f300 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f310 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
1f320 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1f330 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  *ppPage);.      
1f340 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f350 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 65    }.          se
1f360 61 72 63 68 4c 69 73 74 20 3d 20 30 3b 0a 20 20  archList = 0;.  
1f370 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1f380 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1f390 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b 0a 20  e(pPrevTrunk);. 
1f3a0 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20       pPrevTrunk 
1f3b0 3d 20 30 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  = 0;.    }while(
1f3c0 20 73 65 61 72 63 68 4c 69 73 74 20 29 3b 0a 20   searchList );. 
1f3d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54   }else{.    /* T
1f3e0 68 65 72 65 20 61 72 65 20 6e 6f 20 70 61 67 65  here are no page
1f3f0 73 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73  s on the freelis
1f400 74 2c 20 73 6f 20 63 72 65 61 74 65 20 61 20 6e  t, so create a n
1f410 65 77 20 70 61 67 65 20 61 74 20 74 68 65 0a 20  ew page at the. 
1f420 20 20 20 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65     ** end of the
1f430 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74   file */.    int
1f440 20 6e 50 61 67 65 20 3d 20 70 61 67 65 72 50 61   nPage = pagerPa
1f450 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
1f460 67 65 72 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f  ger);.    *pPgno
1f470 20 3d 20 6e 50 61 67 65 20 2b 20 31 3b 0a 0a 23   = nPage + 1;..#
1f480 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1f490 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1f4a0 20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e    if( pBt->nTrun
1f4b0 63 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e  c ){.      /* An
1f4c0 20 69 6e 63 72 2d 76 61 63 75 75 6d 20 68 61 73   incr-vacuum has
1f4d0 20 61 6c 72 65 61 64 79 20 72 75 6e 20 77 69 74   already run wit
1f4e0 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63  hin this transac
1f4f0 74 69 6f 6e 2e 20 53 6f 20 74 68 65 0a 20 20 20  tion. So the.   
1f500 20 20 20 2a 2a 20 70 61 67 65 20 74 6f 20 61 6c     ** page to al
1f510 6c 6f 63 61 74 65 20 69 73 20 6e 6f 74 20 66 72  locate is not fr
1f520 6f 6d 20 74 68 65 20 70 68 79 73 69 63 61 6c 20  om the physical 
1f530 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 2c  end of the file,
1f540 20 62 75 74 0a 20 20 20 20 20 20 2a 2a 20 61 74   but.      ** at
1f550 20 70 42 74 2d 3e 6e 54 72 75 6e 63 2e 20 0a 20   pBt->nTrunc. . 
1f560 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 2a 70       */.      *p
1f570 50 67 6e 6f 20 3d 20 70 42 74 2d 3e 6e 54 72 75  Pgno = pBt->nTru
1f580 6e 63 2b 31 3b 0a 20 20 20 20 20 20 69 66 28 20  nc+1;.      if( 
1f590 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f  *pPgno==PENDING_
1f5a0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1f5b0 7b 0a 20 20 20 20 20 20 20 20 28 2a 70 50 67 6e  {.        (*pPgn
1f5c0 6f 29 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  o)++;.      }.  
1f5d0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 74 2d    }.    if( pBt-
1f5e0 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 50  >autoVacuum && P
1f5f0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
1f600 2c 20 2a 70 50 67 6e 6f 29 20 29 7b 0a 20 20 20  , *pPgno) ){.   
1f610 20 20 20 2f 2a 20 49 66 20 2a 70 50 67 6e 6f 20     /* If *pPgno 
1f620 72 65 66 65 72 73 20 74 6f 20 61 20 70 6f 69 6e  refers to a poin
1f630 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20 61 6c  ter-map page, al
1f640 6c 6f 63 61 74 65 20 74 77 6f 20 6e 65 77 20 70  locate two new p
1f650 61 67 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 74  ages.      ** at
1f660 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1f670 66 69 6c 65 20 69 6e 73 74 65 61 64 20 6f 66 20  file instead of 
1f680 6f 6e 65 2e 20 54 68 65 20 66 69 72 73 74 20 61  one. The first a
1f690 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 0a 20 20  llocated page.  
1f6a0 20 20 20 20 2a 2a 20 62 65 63 6f 6d 65 73 20 61      ** becomes a
1f6b0 20 6e 65 77 20 70 6f 69 6e 74 65 72 2d 6d 61 70   new pointer-map
1f6c0 20 70 61 67 65 2c 20 74 68 65 20 73 65 63 6f 6e   page, the secon
1f6d0 64 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  d is used by the
1f6e0 20 63 61 6c 6c 65 72 2e 0a 20 20 20 20 20 20 2a   caller..      *
1f6f0 2f 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  /.      TRACE(("
1f700 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f  ALLOCATE: %d fro
1f710 6d 20 65 6e 64 20 6f 66 20 66 69 6c 65 20 28 70  m end of file (p
1f720 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 29  ointer-map page)
1f730 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b 0a 20  \n", *pPgno));. 
1f740 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 50       assert( *pP
1f750 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno!=PENDING_BYT
1f760 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 20  E_PAGE(pBt) );. 
1f770 20 20 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b       (*pPgno)++;
1f780 0a 20 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e  .      if( *pPgn
1f790 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  o==PENDING_BYTE_
1f7a0 50 41 47 45 28 70 42 74 29 20 29 7b 20 28 2a 70  PAGE(pBt) ){ (*p
1f7b0 50 67 6e 6f 29 2b 2b 3b 20 7d 0a 20 20 20 20 7d  Pgno)++; }.    }
1f7c0 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 6e 54  .    if( pBt->nT
1f7d0 72 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 70 42  runc ){.      pB
1f7e0 74 2d 3e 6e 54 72 75 6e 63 20 3d 20 2a 70 50 67  t->nTrunc = *pPg
1f7f0 6e 6f 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  no;.    }.#endif
1f800 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  ..    assert( *p
1f810 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
1f820 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
1f830 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f840 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
1f850 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65  , *pPgno, ppPage
1f860 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
1f870 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1f880 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1f890 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67  gerWrite((*ppPag
1f8a0 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e)->pDbPage);.  
1f8b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1f8c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
1f8d0 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
1f8e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41  );.    }.    TRA
1f8f0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
1f900 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69  d from end of fi
1f910 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b  le\n", *pPgno));
1f920 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1f930 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
1f940 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
1f950 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  ;..end_allocate_
1f960 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50  page:.  releaseP
1f970 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72  age(pTrunk);.  r
1f980 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76  eleasePage(pPrev
1f990 54 72 75 6e 6b 29 3b 0a 20 20 72 65 74 75 72 6e  Trunk);.  return
1f9a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
1f9b0 64 20 61 20 70 61 67 65 20 6f 66 20 74 68 65 20  d a page of the 
1f9c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
1f9d0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
1f9e0 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  *.** sqlite3Page
1f9f0 72 55 6e 72 65 66 28 29 20 69 73 20 4e 4f 54 20  rUnref() is NOT 
1fa00 63 61 6c 6c 65 64 20 66 6f 72 20 70 50 61 67 65  called for pPage
1fa10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1fa20 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65  freePage(MemPage
1fa30 20 2a 70 50 61 67 65 29 7b 0a 20 20 42 74 53 68   *pPage){.  BtSh
1fa40 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
1fa50 65 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67  e->pBt;.  MemPag
1fa60 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
1fa70 3e 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72  >pPage1;.  int r
1fa80 63 2c 20 6e 2c 20 6b 3b 0a 0a 20 20 2f 2a 20 50  c, n, k;..  /* P
1fa90 72 65 70 61 72 65 20 74 68 65 20 70 61 67 65 20  repare the page 
1faa0 66 6f 72 20 66 72 65 65 69 6e 67 20 2a 2f 0a 20  for freeing */. 
1fab0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1fac0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
1fad0 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
1fae0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1faf0 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70  e->pgno>1 );.  p
1fb00 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
1fb10 3b 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  ;.  releasePage(
1fb20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 29 3b  pPage->pParent);
1fb30 0a 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e  .  pPage->pParen
1fb40 74 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 6e 63  t = 0;..  /* Inc
1fb50 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20  rement the free 
1fb60 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50  page count on pP
1fb70 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73  age1 */.  rc = s
1fb80 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1fb90 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
1fba0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
1fbb0 74 75 72 6e 20 72 63 3b 0a 20 20 6e 20 3d 20 67  turn rc;.  n = g
1fbc0 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
1fbd0 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 70  >aData[36]);.  p
1fbe0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  ut4byte(&pPage1-
1fbf0 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2b 31 29  >aData[36], n+1)
1fc00 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
1fc10 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20  _SECURE_DELETE. 
1fc20 20 2f 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54   /* If the SQLIT
1fc30 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  E_SECURE_DELETE 
1fc40 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
1fc50 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ion is enabled, 
1fc60 74 68 65 6e 0a 20 20 2a 2a 20 61 6c 77 61 79 73  then.  ** always
1fc70 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65   fully overwrite
1fc80 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61   deleted informa
1fc90 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e  tion with zeros.
1fca0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
1fcb0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
1fcc0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
1fcd0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1fce0 6e 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74 28 70  n rc;.  memset(p
1fcf0 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20  Page->aData, 0, 
1fd00 70 50 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65  pPage->pBt->page
1fd10 53 69 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 23  Size);.#endif..#
1fd20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1fd30 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
1fd40 2f 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  /* If the databa
1fd50 73 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f  se supports auto
1fd60 2d 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61  -vacuum, write a
1fd70 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70  n entry in the p
1fd80 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20  ointer-map.  ** 
1fd90 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74  to indicate that
1fda0 20 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65   the page is fre
1fdb0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  e..  */.  if( pB
1fdc0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
1fdd0 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
1fde0 50 75 74 28 70 42 74 2c 20 70 50 61 67 65 2d 3e  Put(pBt, pPage->
1fdf0 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 46 52 45  pgno, PTRMAP_FRE
1fe00 45 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69  EPAGE, 0);.    i
1fe10 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1fe20 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  c;.  }.#endif.. 
1fe30 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20   if( n==0 ){.   
1fe40 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68 65 20   /* This is the 
1fe50 66 69 72 73 74 20 66 72 65 65 20 70 61 67 65 20  first free page 
1fe60 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
1fe70 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
1fe80 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
1fe90 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1fea0 72 6e 20 72 63 3b 0a 20 20 20 20 6d 65 6d 73 65  rn rc;.    memse
1feb0 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20  t(pPage->aData, 
1fec0 30 2c 20 38 29 3b 0a 20 20 20 20 70 75 74 34 62  0, 8);.    put4b
1fed0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
1fee0 74 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d 3e 70  ta[32], pPage->p
1fef0 67 6e 6f 29 3b 0a 20 20 20 20 54 52 41 43 45 28  gno);.    TRACE(
1ff00 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20  ("FREE-PAGE: %d 
1ff10 66 69 72 73 74 5c 6e 22 2c 20 70 50 61 67 65 2d  first\n", pPage-
1ff20 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65  >pgno));.  }else
1ff30 7b 0a 20 20 20 20 2f 2a 20 4f 74 68 65 72 20 66  {.    /* Other f
1ff40 72 65 65 20 70 61 67 65 73 20 61 6c 72 65 61 64  ree pages alread
1ff50 79 20 65 78 69 73 74 2e 20 20 52 65 74 72 69 76  y exist.  Retriv
1ff60 65 20 74 68 65 20 66 69 72 73 74 20 74 72 75 6e  e the first trun
1ff70 6b 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 6f 66  k page.    ** of
1ff80 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e   the freelist an
1ff90 64 20 66 69 6e 64 20 6f 75 74 20 68 6f 77 20 6d  d find out how m
1ffa0 61 6e 79 20 6c 65 61 76 65 73 20 69 74 20 68 61  any leaves it ha
1ffb0 73 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67  s. */.    MemPag
1ffc0 65 20 2a 70 54 72 75 6e 6b 3b 0a 20 20 20 20 72  e *pTrunk;.    r
1ffd0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1ffe0 47 65 74 50 61 67 65 28 70 42 74 2c 20 67 65 74  GetPage(pBt, get
1fff0 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
20000 44 61 74 61 5b 33 32 5d 29 2c 20 26 70 54 72 75  Data[32]), &pTru
20010 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  nk, 0);.    if( 
20020 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
20030 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65      k = get4byte
20040 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
20050 34 5d 29 3b 0a 20 20 20 20 69 66 28 20 6b 3e 3d  4]);.    if( k>=
20060 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f  pBt->usableSize/
20070 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20 20 2f  4 - 8 ){.      /
20080 2a 20 54 68 65 20 74 72 75 6e 6b 20 69 73 20 66  * The trunk is f
20090 75 6c 6c 2e 20 20 54 75 72 6e 20 74 68 65 20 70  ull.  Turn the p
200a0 61 67 65 20 62 65 69 6e 67 20 66 72 65 65 64 20  age being freed 
200b0 69 6e 74 6f 20 61 20 6e 65 77 0a 20 20 20 20 20  into a new.     
200c0 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65 20 77   ** trunk page w
200d0 69 74 68 20 6e 6f 20 6c 65 61 76 65 73 2e 0a 20  ith no leaves.. 
200e0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
200f0 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 74   Note that the t
20100 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e 6f 74  runk page is not
20110 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75 6e 74   really full unt
20120 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73 0a 20  il it contains. 
20130 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65 53 69       ** usableSi
20140 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69 65 73  ze/4 - 2 entries
20150 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69 7a 65  , not usableSize
20160 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 61  /4 - 8 entries a
20170 73 20 77 65 20 68 61 76 65 0a 20 20 20 20 20 20  s we have.      
20180 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74 20 64  ** coded.  But d
20190 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65  ue to a coding e
201a0 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f 6e 73  rror in versions
201b0 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69 6f 72   of SQLite prior
201c0 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33 2e 36   to.      ** 3.6
201d0 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20 77 69  .0, databases wi
201e0 74 68 20 66 72 65 65 6c 69 73 74 20 74 72 75 6e  th freelist trun
201f0 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e 67 20  k pages holding 
20200 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20 20 20  more than.      
20210 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ** usableSize/4 
20220 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69 6c 6c  - 8 entries will
20230 20 62 65 20 72 65 70 6f 72 74 65 64 20 61 73 20   be reported as 
20240 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f 72 64  corrupt.  In ord
20250 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 6d  er.      ** to m
20260 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61 72 64  aintain backward
20270 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20  s compatibility 
20280 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72 73 69  with older versi
20290 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c 0a 20  ons of SQLite,. 
202a0 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c 6c 20       ** we will 
202b0 63 6f 6e 74 61 69 6e 20 74 6f 20 72 65 73 74 72  contain to restr
202c0 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ict the number o
202d0 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75 73 61  f entries to usa
202e0 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a 20 20  bleSize/4 - 8.  
202f0 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77 2e 20      ** for now. 
20300 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69   At some point i
20310 6e 20 74 68 65 20 66 75 74 75 72 65 20 28 6f 6e  n the future (on
20320 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61 73 20  ce everyone has 
20330 75 70 67 72 61 64 65 64 0a 20 20 20 20 20 20 2a  upgraded.      *
20340 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20 6c 61  * to 3.6.0 or la
20350 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64 20 63  ter) we should c
20360 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67 20 74  onsider fixing t
20370 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c 20 61  he conditional a
20380 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 74 6f  bove.      ** to
20390 20 72 65 61 64 20 22 75 73 61 62 6c 65 53 69 7a   read "usableSiz
203a0 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64 20 6f  e/4-2" instead o
203b0 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d  f "usableSize/4-
203c0 38 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  8"..      */.   
203d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
203e0 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
203f0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
20400 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
20410 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 75  OK ){.        pu
20420 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e 61 44  t4byte(pPage->aD
20430 61 74 61 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e  ata, pTrunk->pgn
20440 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34  o);.        put4
20450 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
20460 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 20 20 20  ta[4], 0);.     
20470 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
20480 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
20490 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
204a0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 46 52        TRACE(("FR
204b0 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65 77 20  EE-PAGE: %d new 
204c0 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70 6c 61  trunk page repla
204d0 63 69 6e 67 20 25 64 5c 6e 22 2c 0a 20 20 20 20  cing %d\n",.    
204e0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
204f0 65 2d 3e 70 67 6e 6f 2c 20 70 54 72 75 6e 6b 2d  e->pgno, pTrunk-
20500 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d  >pgno));.      }
20510 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b  .    }else if( k
20520 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  <0 ){.      rc =
20530 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
20540 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20550 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e 65 77    /* Add the new
20560 6c 79 20 66 72 65 65 64 20 70 61 67 65 20 61 73  ly freed page as
20570 20 61 20 6c 65 61 66 20 6f 6e 20 74 68 65 20 63   a leaf on the c
20580 75 72 72 65 6e 74 20 74 72 75 6e 6b 20 2a 2f 0a  urrent trunk */.
20590 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
205a0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54 72  e3PagerWrite(pTr
205b0 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  unk->pDbPage);. 
205c0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
205d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
205e0 20 20 70 75 74 34 62 79 74 65 28 26 70 54 72 75    put4byte(&pTru
205f0 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20 6b 2b  nk->aData[4], k+
20600 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34  1);.        put4
20610 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44  byte(&pTrunk->aD
20620 61 74 61 5b 38 2b 6b 2a 34 5d 2c 20 70 50 61 67  ata[8+k*4], pPag
20630 65 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65  e->pgno);.#ifnde
20640 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
20650 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20 20 73  DELETE.        s
20660 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
20670 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
20680 61 67 65 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  age);.#endif.   
20690 20 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45     }.      TRACE
206a0 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25 64  (("FREE-PAGE: %d
206b0 20 6c 65 61 66 20 6f 6e 20 74 72 75 6e 6b 20 70   leaf on trunk p
206c0 61 67 65 20 25 64 5c 6e 22 2c 70 50 61 67 65 2d  age %d\n",pPage-
206d0 3e 70 67 6e 6f 2c 70 54 72 75 6e 6b 2d 3e 70 67  >pgno,pTrunk->pg
206e0 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  no));.    }.    
206f0 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72 75  releasePage(pTru
20700 6e 6b 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  nk);.  }.  retur
20710 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
20720 72 65 65 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77  ree any overflow
20730 20 70 61 67 65 73 20 61 73 73 6f 63 69 61 74 65   pages associate
20740 64 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e  d with the given
20750 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   Cell..*/.static
20760 20 69 6e 74 20 63 6c 65 61 72 43 65 6c 6c 28 4d   int clearCell(M
20770 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75  emPage *pPage, u
20780 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
20790 65 6c 6c 29 7b 0a 20 20 42 74 53 68 61 72 65 64  ell){.  BtShared
207a0 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70   *pBt = pPage->p
207b0 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69  Bt;.  CellInfo i
207c0 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f 76 66 6c  nfo;.  Pgno ovfl
207d0 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Pgno;.  int rc;.
207e0 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a 20 20 69    int nOvfl;.  i
207f0 6e 74 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b  nt ovflPageSize;
20800 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
20810 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
20820 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
20830 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
20840 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
20850 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
20860 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69 6e 66 6f  nfo);.  if( info
20870 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 7b  .iOverflow==0 ){
20880 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
20890 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f 20 6f 76  TE_OK;  /* No ov
208a0 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 52 65  erflow pages. Re
208b0 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69  turn without doi
208c0 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a 2f 0a 20  ng anything */. 
208d0 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f 20 3d 20   }.  ovflPgno = 
208e0 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
208f0 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
20900 3b 0a 20 20 6f 76 66 6c 50 61 67 65 53 69 7a 65  ;.  ovflPageSize
20910 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
20920 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f 76 66 6c 20  ze - 4;.  nOvfl 
20930 3d 20 28 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64  = (info.nPayload
20940 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 2b   - info.nLocal +
20950 20 6f 76 66 6c 50 61 67 65 53 69 7a 65 20 2d 20   ovflPageSize - 
20960 31 29 2f 6f 76 66 6c 50 61 67 65 53 69 7a 65 3b  1)/ovflPageSize;
20970 0a 20 20 61 73 73 65 72 74 28 20 6f 76 66 6c 50  .  assert( ovflP
20980 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f 76 66 6c 3e  gno==0 || nOvfl>
20990 30 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 6e 4f  0 );.  while( nO
209a0 76 66 6c 2d 2d 20 29 7b 0a 20 20 20 20 4d 65 6d  vfl-- ){.    Mem
209b0 50 61 67 65 20 2a 70 4f 76 66 6c 3b 0a 20 20 20  Page *pOvfl;.   
209c0 20 69 66 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30   if( ovflPgno==0
209d0 20 7c 7c 20 6f 76 66 6c 50 67 6e 6f 3e 70 61 67   || ovflPgno>pag
209e0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
209f0 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  >pPager) ){.    
20a00 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
20a10 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
20a20 20 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 67 65    }..    rc = ge
20a30 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70 42  tOverflowPage(pB
20a40 74 2c 20 6f 76 66 6c 50 67 6e 6f 2c 20 26 70 4f  t, ovflPgno, &pO
20a50 76 66 6c 2c 20 28 6e 4f 76 66 6c 3d 3d 30 29 3f  vfl, (nOvfl==0)?
20a60 30 3a 26 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20  0:&ovflPgno);.  
20a70 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
20a80 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 66  n rc;.    rc = f
20a90 72 65 65 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a  reePage(pOvfl);.
20aa0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
20ab0 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44 62  Unref(pOvfl->pDb
20ac0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
20ad0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
20ae0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
20af0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
20b00 43 72 65 61 74 65 20 74 68 65 20 62 79 74 65 20  Create the byte 
20b10 73 65 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f  sequence used to
20b20 20 72 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c   represent a cel
20b30 6c 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a  l on page pPage.
20b40 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 61  ** and write tha
20b50 74 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20  t byte sequence 
20b60 69 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f  into pCell[].  O
20b70 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72  verflow pages ar
20b80 65 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61  e.** allocated a
20b90 6e 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20  nd filled in as 
20ba0 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 20  necessary.  The 
20bb0 63 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72  calling procedur
20bc0 65 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69  e.** is responsi
20bd0 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73  ble for making s
20be0 75 72 65 20 73 75 66 66 69 63 69 65 6e 74 20 73  ure sufficient s
20bf0 70 61 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c  pace has been al
20c00 6c 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70  located.** for p
20c10 43 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  Cell[]..**.** No
20c20 74 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f  te that pCell do
20c30 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  es not necessary
20c40 20 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74   need to point t
20c50 6f 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61  o the pPage->aDa
20c60 74 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65  ta.** area.  pCe
20c70 6c 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  ll might point t
20c80 6f 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79  o some temporary
20c90 20 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63   storage.  The c
20ca0 65 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63  ell will.** be c
20cb0 6f 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74 68  onstructed in th
20cc0 69 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65  is temporary are
20cd0 61 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e  a then copied in
20ce0 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  to pPage->aData.
20cf0 2a 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61  ** later..*/.sta
20d00 74 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65  tic int fillInCe
20d10 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ll(.  MemPage *p
20d20 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
20d30 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
20d40 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
20d50 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73  he cell */.  uns
20d60 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c  igned char *pCel
20d70 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  l,          /* C
20d80 6f 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20  omplete text of 
20d90 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f  the cell */.  co
20da0 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
20db0 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20  i64 nKey,    /* 
20dc0 54 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e  The key */.  con
20dd0 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69  st void *pData,i
20de0 6e 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54  nt nData,   /* T
20df0 68 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74  he data */.  int
20e00 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20   nZero,         
20e10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
20e20 78 74 72 61 20 7a 65 72 6f 20 62 79 74 65 73 20  xtra zero bytes 
20e30 74 6f 20 61 70 70 65 6e 64 20 74 6f 20 70 44 61  to append to pDa
20e40 74 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53  ta */.  int *pnS
20e50 69 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ize             
20e60 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20         /* Write 
20e70 63 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a  cell size here *
20e80 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c  /.){.  int nPayl
20e90 6f 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20  oad;.  const u8 
20ea0 2a 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72  *pSrc;.  int nSr
20eb0 63 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20  c, n, rc;.  int 
20ec0 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d  spaceLeft;.  Mem
20ed0 50 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b  Page *pOvfl = 0;
20ee0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52  .  MemPage *pToR
20ef0 65 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e  elease = 0;.  un
20f00 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72  signed char *pPr
20f10 69 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ior;.  unsigned 
20f20 63 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a  char *pPayload;.
20f30 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
20f40 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
20f50 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20  Pgno pgnoOvfl = 
20f60 30 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72  0;.  int nHeader
20f70 3b 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66  ;.  CellInfo inf
20f80 6f 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  o;..  assert( sq
20f90 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
20fa0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
20fb0 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  ex) );..  /* Fil
20fc0 6c 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  l in the header.
20fd0 20 2a 2f 0a 20 20 6e 48 65 61 64 65 72 20 3d 20   */.  nHeader = 
20fe0 30 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d  0;.  if( !pPage-
20ff0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 6e 48 65  >leaf ){.    nHe
21000 61 64 65 72 20 2b 3d 20 34 3b 0a 20 20 7d 0a 20  ader += 4;.  }. 
21010 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44   if( pPage->hasD
21020 61 74 61 20 29 7b 0a 20 20 20 20 6e 48 65 61 64  ata ){.    nHead
21030 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28  er += putVarint(
21040 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c  &pCell[nHeader],
21050 20 6e 44 61 74 61 2b 6e 5a 65 72 6f 29 3b 0a 20   nData+nZero);. 
21060 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 44 61 74   }else{.    nDat
21070 61 20 3d 20 6e 5a 65 72 6f 20 3d 20 30 3b 0a 20  a = nZero = 0;. 
21080 20 7d 0a 20 20 6e 48 65 61 64 65 72 20 2b 3d 20   }.  nHeader += 
21090 70 75 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  putVarint(&pCell
210a0 5b 6e 48 65 61 64 65 72 5d 2c 20 2a 28 75 36 34  [nHeader], *(u64
210b0 2a 29 26 6e 4b 65 79 29 3b 0a 20 20 73 71 6c 69  *)&nKey);.  sqli
210c0 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
210d0 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
210e0 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 61 73 73  l, &info);.  ass
210f0 65 72 74 28 20 69 6e 66 6f 2e 6e 48 65 61 64 65  ert( info.nHeade
21100 72 3d 3d 6e 48 65 61 64 65 72 20 29 3b 0a 20 20  r==nHeader );.  
21110 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 4b 65  assert( info.nKe
21120 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20 20 61 73 73  y==nKey );.  ass
21130 65 72 74 28 20 69 6e 66 6f 2e 6e 44 61 74 61 3d  ert( info.nData=
21140 3d 6e 44 61 74 61 2b 6e 5a 65 72 6f 20 29 3b 0a  =nData+nZero );.
21150 20 20 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20    .  /* Fill in 
21160 74 68 65 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20  the payload */. 
21170 20 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74   nPayload = nDat
21180 61 20 2b 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28  a + nZero;.  if(
21190 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
211a0 7b 0a 20 20 20 20 70 53 72 63 20 3d 20 70 44 61  {.    pSrc = pDa
211b0 74 61 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e  ta;.    nSrc = n
211c0 44 61 74 61 3b 0a 20 20 20 20 6e 44 61 74 61 20  Data;.    nData 
211d0 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
211e0 20 20 6e 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b    nPayload += nK
211f0 65 79 3b 0a 20 20 20 20 70 53 72 63 20 3d 20 70  ey;.    pSrc = p
21200 4b 65 79 3b 0a 20 20 20 20 6e 53 72 63 20 3d 20  Key;.    nSrc = 
21210 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53  nKey;.  }.  *pnS
21220 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65  ize = info.nSize
21230 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20  ;.  spaceLeft = 
21240 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70  info.nLocal;.  p
21250 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c  Payload = &pCell
21260 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70 50 72  [nHeader];.  pPr
21270 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66  ior = &pCell[inf
21280 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20  o.iOverflow];.. 
21290 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64   while( nPayload
212a0 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70  >0 ){.    if( sp
212b0 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20  aceLeft==0 ){.  
212c0 20 20 20 20 69 6e 74 20 69 73 45 78 61 63 74 20      int isExact 
212d0 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
212e0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
212f0 55 55 4d 0a 20 20 20 20 20 20 50 67 6e 6f 20 70  UUM.      Pgno p
21300 67 6e 6f 50 74 72 6d 61 70 20 3d 20 70 67 6e 6f  gnoPtrmap = pgno
21310 4f 76 66 6c 3b 20 2f 2a 20 4f 76 65 72 66 6c 6f  Ovfl; /* Overflo
21320 77 20 70 61 67 65 20 70 6f 69 6e 74 65 72 2d 6d  w page pointer-m
21330 61 70 20 65 6e 74 72 79 20 70 61 67 65 20 2a 2f  ap entry page */
21340 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e  .      if( pBt->
21350 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
21360 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
21370 20 20 20 20 70 67 6e 6f 4f 76 66 6c 2b 2b 3b 0a      pgnoOvfl++;.
21380 20 20 20 20 20 20 20 20 7d 20 77 68 69 6c 65 28          } while(
21390 20 0a 20 20 20 20 20 20 20 20 20 20 50 54 52 4d   .          PTRM
213a0 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 70  AP_ISPAGE(pBt, p
213b0 67 6e 6f 4f 76 66 6c 29 20 7c 7c 20 70 67 6e 6f  gnoOvfl) || pgno
213c0 4f 76 66 6c 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Ovfl==PENDING_BY
213d0 54 45 5f 50 41 47 45 28 70 42 74 29 20 0a 20 20  TE_PAGE(pBt) .  
213e0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
213f0 20 69 66 28 20 70 67 6e 6f 4f 76 66 6c 3e 31 20   if( pgnoOvfl>1 
21400 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
21410 69 73 45 78 61 63 74 20 3d 20 31 3b 20 2a 2f 0a  isExact = 1; */.
21420 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21430 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  }.#endif.      r
21440 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
21450 65 50 61 67 65 28 70 42 74 2c 20 26 70 4f 76 66  ePage(pBt, &pOvf
21460 6c 2c 20 26 70 67 6e 6f 4f 76 66 6c 2c 20 70 67  l, &pgnoOvfl, pg
21470 6e 6f 4f 76 66 6c 2c 20 69 73 45 78 61 63 74 29  noOvfl, isExact)
21480 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
21490 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
214a0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
214b0 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f 72   database suppor
214c0 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20  ts auto-vacuum, 
214d0 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20 6f  and the second o
214e0 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20 20  r subsequent.   
214f0 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70     ** overflow p
21500 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c 6c  age is being all
21510 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20 65  ocated, add an e
21520 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69 6e  ntry to the poin
21530 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a 2a  ter-map.      **
21540 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20 6e   for that page n
21550 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20  ow. .      **.  
21560 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69      ** If this i
21570 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65 72  s the first over
21580 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e 20  flow page, then 
21590 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c 20  write a partial 
215a0 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a 20  entry .      ** 
215b0 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
215c0 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65 20  ap. If we write 
215d0 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73 20  nothing to this 
215e0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f 74  pointer-map slot
215f0 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  ,.      ** then 
21600 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20 6f  the optimistic o
21610 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70 72  verflow chain pr
21620 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65 61  ocessing in clea
21630 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a 2a  rCell().      **
21640 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72 65   may misinterpre
21650 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c 69  t the uninitiali
21660 73 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20 64  sed values and d
21670 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20 20  elete the.      
21680 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20 66  ** wrong pages f
21690 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
216a0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
216b0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
216c0 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c 49  cuum && rc==SQLI
216d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
216e0 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67 6e   u8 eType = (pgn
216f0 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f 4f  oPtrmap?PTRMAP_O
21700 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50 5f  VERFLOW2:PTRMAP_
21710 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20 20  OVERFLOW1);.    
21720 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
21730 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c  ut(pBt, pgnoOvfl
21740 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74 72  , eType, pgnoPtr
21750 6d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66  map);.        if
21760 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
21770 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4f    releasePage(pO
21780 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  vfl);.        }.
21790 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
217a0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
217b0 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
217c0 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a  ge(pToRelease);.
217d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
217e0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
217f0 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72   put4byte(pPrior
21800 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20  , pgnoOvfl);.   
21810 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
21820 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20  ToRelease);.    
21830 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70    pToRelease = p
21840 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69  Ovfl;.      pPri
21850 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74  or = pOvfl->aDat
21860 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74  a;.      put4byt
21870 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20  e(pPrior, 0);.  
21880 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26      pPayload = &
21890 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b  pOvfl->aData[4];
218a0 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74  .      spaceLeft
218b0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
218c0 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20  ze - 4;.    }.  
218d0 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a    n = nPayload;.
218e0 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c      if( n>spaceL
218f0 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c  eft ) n = spaceL
21900 65 66 74 3b 0a 20 20 20 20 69 66 28 20 6e 53 72  eft;.    if( nSr
21910 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  c>0 ){.      if(
21920 20 6e 3e 6e 53 72 63 20 29 20 6e 20 3d 20 6e 53   n>nSrc ) n = nS
21930 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  rc;.      assert
21940 28 20 70 53 72 63 20 29 3b 0a 20 20 20 20 20 20  ( pSrc );.      
21950 6d 65 6d 63 70 79 28 70 50 61 79 6c 6f 61 64 2c  memcpy(pPayload,
21960 20 70 53 72 63 2c 20 6e 29 3b 0a 20 20 20 20 7d   pSrc, n);.    }
21970 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73  else{.      mems
21980 65 74 28 70 50 61 79 6c 6f 61 64 2c 20 30 2c 20  et(pPayload, 0, 
21990 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 50  n);.    }.    nP
219a0 61 79 6c 6f 61 64 20 2d 3d 20 6e 3b 0a 20 20 20  ayload -= n;.   
219b0 20 70 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 3b 0a   pPayload += n;.
219c0 20 20 20 20 70 53 72 63 20 2b 3d 20 6e 3b 0a 20      pSrc += n;. 
219d0 20 20 20 6e 53 72 63 20 2d 3d 20 6e 3b 0a 20 20     nSrc -= n;.  
219e0 20 20 73 70 61 63 65 4c 65 66 74 20 2d 3d 20 6e    spaceLeft -= n
219f0 3b 0a 20 20 20 20 69 66 28 20 6e 53 72 63 3d 3d  ;.    if( nSrc==
21a00 30 20 29 7b 0a 20 20 20 20 20 20 6e 53 72 63 20  0 ){.      nSrc 
21a10 3d 20 6e 44 61 74 61 3b 0a 20 20 20 20 20 20 70  = nData;.      p
21a20 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20  Src = pData;.   
21a30 20 7d 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65   }.  }.  release
21a40 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29  Page(pToRelease)
21a50 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
21a60 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
21a70 68 61 6e 67 65 20 74 68 65 20 4d 65 6d 50 61 67  hange the MemPag
21a80 65 2e 70 50 61 72 65 6e 74 20 70 6f 69 6e 74 65  e.pParent pointe
21a90 72 20 6f 6e 20 74 68 65 20 70 61 67 65 20 77 68  r on the page wh
21aa0 6f 73 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a  ose number is.**
21ab0 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20 73 65   given in the se
21ac0 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 73 6f  cond argument so
21ad0 20 74 68 61 74 20 4d 65 6d 50 61 67 65 2e 70 50   that MemPage.pP
21ae0 61 72 65 6e 74 20 68 6f 6c 64 73 20 74 68 65 0a  arent holds the.
21af0 2a 2a 20 70 6f 69 6e 74 65 72 20 69 6e 20 74 68  ** pointer in th
21b00 65 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74  e third argument
21b10 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
21b20 72 65 70 61 72 65 6e 74 50 61 67 65 28 42 74 53  reparentPage(BtS
21b30 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
21b40 20 70 67 6e 6f 2c 20 4d 65 6d 50 61 67 65 20 2a   pgno, MemPage *
21b50 70 4e 65 77 50 61 72 65 6e 74 2c 20 69 6e 74 20  pNewParent, int 
21b60 69 64 78 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  idx){.  MemPage 
21b70 2a 70 54 68 69 73 3b 0a 20 20 44 62 50 61 67 65  *pThis;.  DbPage
21b80 20 2a 70 44 62 50 61 67 65 3b 0a 0a 20 20 61 73   *pDbPage;..  as
21b90 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
21ba0 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
21bb0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
21bc0 28 20 70 4e 65 77 50 61 72 65 6e 74 21 3d 30 20  ( pNewParent!=0 
21bd0 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  );.  if( pgno==0
21be0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
21bf0 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70  _OK;.  assert( p
21c00 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b  Bt->pPager!=0 );
21c10 0a 20 20 70 44 62 50 61 67 65 20 3d 20 73 71 6c  .  pDbPage = sql
21c20 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
21c30 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70 67 6e  pBt->pPager, pgn
21c40 6f 29 3b 0a 20 20 69 66 28 20 70 44 62 50 61 67  o);.  if( pDbPag
21c50 65 20 29 7b 0a 20 20 20 20 70 54 68 69 73 20 3d  e ){.    pThis =
21c60 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69   (MemPage *)sqli
21c70 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
21c80 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69  (pDbPage);.    i
21c90 66 28 20 70 54 68 69 73 2d 3e 69 73 49 6e 69 74  f( pThis->isInit
21ca0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
21cb0 28 20 70 54 68 69 73 2d 3e 61 44 61 74 61 3d 3d  ( pThis->aData==
21cc0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
21cd0 61 74 61 28 70 44 62 50 61 67 65 29 20 29 3b 0a  ata(pDbPage) );.
21ce0 20 20 20 20 20 20 69 66 28 20 70 54 68 69 73 2d        if( pThis-
21cf0 3e 70 50 61 72 65 6e 74 21 3d 70 4e 65 77 50 61  >pParent!=pNewPa
21d00 72 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  rent ){.        
21d10 69 66 28 20 70 54 68 69 73 2d 3e 70 50 61 72 65  if( pThis->pPare
21d20 6e 74 20 29 20 73 71 6c 69 74 65 33 50 61 67 65  nt ) sqlite3Page
21d30 72 55 6e 72 65 66 28 70 54 68 69 73 2d 3e 70 50  rUnref(pThis->pP
21d40 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 3b  arent->pDbPage);
21d50 0a 20 20 20 20 20 20 20 20 70 54 68 69 73 2d 3e  .        pThis->
21d60 70 50 61 72 65 6e 74 20 3d 20 70 4e 65 77 50 61  pParent = pNewPa
21d70 72 65 6e 74 3b 0a 20 20 20 20 20 20 20 20 73 71  rent;.        sq
21d80 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70 4e  lite3PagerRef(pN
21d90 65 77 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  ewParent->pDbPag
21da0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
21db0 20 20 70 54 68 69 73 2d 3e 69 64 78 50 61 72 65    pThis->idxPare
21dc0 6e 74 20 3d 20 69 64 78 3b 0a 20 20 20 20 7d 0a  nt = idx;.    }.
21dd0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
21de0 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
21df0 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
21e00 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
21e10 55 55 4d 0a 20 20 69 66 28 20 70 42 74 2d 3e 61  UUM.  if( pBt->a
21e20 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
21e30 20 72 65 74 75 72 6e 20 70 74 72 6d 61 70 50 75   return ptrmapPu
21e40 74 28 70 42 74 2c 20 70 67 6e 6f 2c 20 50 54 52  t(pBt, pgno, PTR
21e50 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77 50  MAP_BTREE, pNewP
21e60 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20  arent->pgno);.  
21e70 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
21e80 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
21e90 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
21ea0 68 65 20 70 50 61 72 65 6e 74 20 70 6f 69 6e 74  he pParent point
21eb0 65 72 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 72  er of all childr
21ec0 65 6e 20 6f 66 20 70 50 61 67 65 20 74 6f 20 70  en of pPage to p
21ed0 6f 69 6e 74 20 62 61 63 6b 0a 2a 2a 20 74 6f 20  oint back.** to 
21ee0 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20  pPage..**.** In 
21ef0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 66 6f 72  other words, for
21f00 20 65 76 65 72 79 20 63 68 69 6c 64 20 6f 66 20   every child of 
21f10 70 50 61 67 65 2c 20 69 6e 76 6f 6b 65 20 72 65  pPage, invoke re
21f20 70 61 72 65 6e 74 50 61 67 65 28 29 0a 2a 2a 20  parentPage().** 
21f30 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  to make sure tha
21f40 74 20 65 61 63 68 20 63 68 69 6c 64 20 6b 6e 6f  t each child kno
21f50 77 73 20 74 68 61 74 20 70 50 61 67 65 20 69 73  ws that pPage is
21f60 20 69 74 73 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a   its parent..**.
21f70 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
21f80 67 65 74 73 20 63 61 6c 6c 65 64 20 61 66 74 65  gets called afte
21f90 72 20 79 6f 75 20 6d 65 6d 63 70 79 28 29 20 6f  r you memcpy() o
21fa0 6e 65 20 70 61 67 65 20 69 6e 74 6f 0a 2a 2a 20  ne page into.** 
21fb0 61 6e 6f 74 68 65 72 2e 0a 2a 2f 0a 73 74 61 74  another..*/.stat
21fc0 69 63 20 69 6e 74 20 72 65 70 61 72 65 6e 74 43  ic int reparentC
21fd0 68 69 6c 64 50 61 67 65 73 28 4d 65 6d 50 61 67  hildPages(MemPag
21fe0 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 69 6e 74  e *pPage){.  int
21ff0 20 69 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a   i;.  BtShared *
22000 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
22010 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
22020 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72  ITE_OK;..  asser
22030 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
22040 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
22050 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
22060 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 20  ( pPage->leaf ) 
22070 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
22080 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
22090 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  pPage->nCell; i+
220a0 2b 29 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c  +){.    u8 *pCel
220b0 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
220c0 67 65 2c 20 69 29 3b 0a 20 20 20 20 72 63 20 3d  ge, i);.    rc =
220d0 20 72 65 70 61 72 65 6e 74 50 61 67 65 28 70 42   reparentPage(pB
220e0 74 2c 20 67 65 74 34 62 79 74 65 28 70 43 65 6c  t, get4byte(pCel
220f0 6c 29 2c 20 70 50 61 67 65 2c 20 69 29 3b 0a 20  l), pPage, i);. 
22100 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
22110 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
22120 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 72 65 70  ;.  }.  rc = rep
22130 61 72 65 6e 74 50 61 67 65 28 70 42 74 2c 20 67  arentPage(pBt, g
22140 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
22150 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
22160 4f 66 66 73 65 74 2b 38 5d 29 2c 20 0a 20 20 20  Offset+8]), .   
22170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22180 20 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 70 50   pPage, i);.  pP
22190 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20  age->idxShift = 
221a0 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
221b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20  }../*.** Remove 
221c0 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72  the i-th cell fr
221d0 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20  om pPage.  This 
221e0 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20  routine effects 
221f0 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54  pPage only..** T
22200 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
22210 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20  is not freed or 
22220 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74  deallocated.  It
22230 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
22240 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e  .** the cell con
22250 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f  tent has been co
22260 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65  pied someplace e
22270 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  lse.  This routi
22280 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76  ne just.** remov
22290 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  es the reference
222a0 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f   to the cell fro
222b0 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22  m pPage..**.** "
222c0 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20  sz" must be the 
222d0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
222e0 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a  in the cell..*/.
222f0 73 74 61 74 69 63 20 76 6f 69 64 20 64 72 6f 70  static void drop
22300 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
22310 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e  age, int idx, in
22320 74 20 73 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 20  t sz){.  int i; 
22330 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
22340 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
22350 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  t pc;         /*
22360 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20   Offset to cell 
22370 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20  content of cell 
22380 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f  being deleted */
22390 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
223a0 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61     /* pPage->aDa
223b0 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b  ta */.  u8 *ptr;
223c0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
223d0 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72  to move bytes ar
223e0 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61  ound within data
223f0 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  [] */..  assert(
22400 20 69 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 70   idx>=0 && idx<p
22410 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
22420 20 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c   assert( sz==cel
22430 6c 53 69 7a 65 28 70 50 61 67 65 2c 20 69 64 78  lSize(pPage, idx
22440 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
22450 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
22460 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
22470 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
22480 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
22490 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
224a0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 64  t->mutex) );.  d
224b0 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
224c0 74 61 3b 0a 20 20 70 74 72 20 3d 20 26 64 61 74  ta;.  ptr = &dat
224d0 61 5b 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66  a[pPage->cellOff
224e0 73 65 74 20 2b 20 32 2a 69 64 78 5d 3b 0a 20 20  set + 2*idx];.  
224f0 70 63 20 3d 20 67 65 74 32 62 79 74 65 28 70 74  pc = get2byte(pt
22500 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 63  r);.  assert( pc
22510 3e 31 30 20 26 26 20 70 63 2b 73 7a 3c 3d 70 50  >10 && pc+sz<=pP
22520 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
22530 53 69 7a 65 20 29 3b 0a 20 20 66 72 65 65 53 70  Size );.  freeSp
22540 61 63 65 28 70 50 61 67 65 2c 20 70 63 2c 20 73  ace(pPage, pc, s
22550 7a 29 3b 0a 20 20 66 6f 72 28 69 3d 69 64 78 2b  z);.  for(i=idx+
22560 31 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c  1; i<pPage->nCel
22570 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b  l; i++, ptr+=2){
22580 0a 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74  .    ptr[0] = pt
22590 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72 5b 31 5d  r[2];.    ptr[1]
225a0 20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20   = ptr[3];.  }. 
225b0 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b   pPage->nCell--;
225c0 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
225d0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
225e0 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43  et+3], pPage->nC
225f0 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ell);.  pPage->n
22600 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 70 50 61  Free += 2;.  pPa
22610 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d 20 31  ge->idxShift = 1
22620 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72  ;.}../*.** Inser
22630 74 20 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20  t a new cell on 
22640 70 50 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e  pPage at cell in
22650 64 65 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20  dex "i".  pCell 
22660 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a  points to the.**
22670 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
22680 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  cell..**.** If t
22690 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
226a0 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20  will fit on the 
226b0 70 61 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69  page, then put i
226c0 74 20 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a  t there.  If it.
226d0 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c  ** will not fit,
226e0 20 74 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70   then make a cop
226f0 79 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  y of the cell co
22700 6e 74 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70  ntent into pTemp
22710 20 69 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20   if.** pTemp is 
22720 6e 6f 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72  not null.  Regar
22730 64 6c 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20  dless of pTemp, 
22740 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65  allocate a new e
22750 6e 74 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65  ntry.** in pPage
22760 2d 3e 61 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61  ->aOvfl[] and ma
22770 6b 65 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74  ke it point to t
22780 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
22790 28 65 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54  (either.** in pT
227a0 65 6d 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69  emp or the origi
227b0 6e 61 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61  nal pCell) and a
227c0 6c 73 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69  lso record its i
227d0 6e 64 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61  ndex. .** Alloca
227e0 74 69 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79  ting a new entry
227f0 20 69 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c   in pPage->aCell
22800 5b 5d 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  [] implies that 
22810 0a 2a 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  .** pPage->nOver
22820 66 6c 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e  flow is incremen
22830 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53  ted..**.** If nS
22840 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  kip is non-zero,
22850 20 74 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70   then do not cop
22860 79 20 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69  y the first nSki
22870 70 20 62 79 74 65 73 20 6f 66 20 74 68 65 0a 2a  p bytes of the.*
22880 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c  * cell. The call
22890 65 72 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74  er will overwrit
228a0 65 20 74 68 65 6d 20 61 66 74 65 72 20 74 68 69  e them after thi
228b0 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
228c0 6e 73 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20  ns. If.** nSkip 
228d0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
228e0 6e 20 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20  n pCell may not 
228f0 70 6f 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61  point to an inva
22900 6c 69 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  lid memory locat
22910 69 6f 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43 65  ion .** (but pCe
22920 6c 6c 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77 61  ll+nSkip is alwa
22930 79 73 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74  ys valid)..*/.st
22940 61 74 69 63 20 69 6e 74 20 69 6e 73 65 72 74 43  atic int insertC
22950 65 6c 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ell(.  MemPage *
22960 70 50 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65  pPage,   /* Page
22970 20 69 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61   into which we a
22980 72 65 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20  re copying */.  
22990 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20 20  int i,          
229a0 20 20 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65    /* New cell be
229b0 63 6f 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63  comes the i-th c
229c0 65 6c 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20  ell of the page 
229d0 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20  */.  u8 *pCell, 
229e0 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e         /* Conten
229f0 74 20 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c  t of the new cel
22a00 6c 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20  l */.  int sz,  
22a10 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65           /* Byte
22a20 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20  s of content in 
22a30 70 43 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70  pCell */.  u8 *p
22a40 54 65 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20  Temp,        /* 
22a50 54 65 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61  Temp storage spa
22a60 63 65 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66  ce for pCell, if
22a70 20 6e 65 65 64 65 64 20 2a 2f 0a 20 20 75 38 20   needed */.  u8 
22a80 6e 53 6b 69 70 20 20 20 20 20 20 20 20 20 20 2f  nSkip          /
22a90 2a 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 20 74  * Do not write t
22aa0 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62  he first nSkip b
22ab0 79 74 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c  ytes of the cell
22ac0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78   */.){.  int idx
22ad0 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  ;          /* Wh
22ae0 65 72 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77  ere to write new
22af0 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e   cell content in
22b00 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74   data[] */.  int
22b10 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   j;            /
22b20 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
22b30 2f 0a 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20  /.  int top;    
22b40 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62        /* First b
22b50 79 74 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 66  yte of content f
22b60 6f 72 20 61 6e 79 20 63 65 6c 6c 20 69 6e 20 64  or any cell in d
22b70 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 65  ata[] */.  int e
22b80 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  nd;          /* 
22b90 46 69 72 73 74 20 62 79 74 65 20 70 61 73 74 20  First byte past 
22ba0 74 68 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f  the last cell po
22bb0 69 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20  inter in data[] 
22bc0 2a 2f 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20 20  */.  int ins;   
22bd0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
22be0 69 6e 20 64 61 74 61 5b 5d 20 77 68 65 72 65 20  in data[] where 
22bf0 6e 65 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  new cell pointer
22c00 20 69 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a   is inserted */.
22c10 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
22c20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e      /* Offset in
22c30 74 6f 20 64 61 74 61 5b 5d 20 6f 66 20 74 68 65  to data[] of the
22c40 20 70 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a   page header */.
22c50 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74    int cellOffset
22c60 3b 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f  ;   /* Address o
22c70 66 20 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69  f first cell poi
22c80 6e 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a  nter in data[] *
22c90 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
22ca0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e        /* The con
22cb0 74 65 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c  tent of the whol
22cc0 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a  e page */.  u8 *
22cd0 70 74 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ptr;          /*
22ce0 20 55 73 65 64 20 66 6f 72 20 6d 6f 76 69 6e 67   Used for moving
22cf0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 72 6f   information aro
22d00 75 6e 64 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  und in data[] */
22d10 0a 0a 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30  ..  assert( i>=0
22d20 20 26 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43   && i<=pPage->nC
22d30 65 6c 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ell+pPage->nOver
22d40 66 6c 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74  flow );.  assert
22d50 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74  ( sz==cellSizePt
22d60 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20  r(pPage, pCell) 
22d70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
22d80 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
22d90 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
22da0 78 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  x) );.  if( pPag
22db0 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20  e->nOverflow || 
22dc0 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65  sz+2>pPage->nFre
22dd0 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65  e ){.    if( pTe
22de0 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  mp ){.      memc
22df0 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20  py(pTemp+nSkip, 
22e00 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d  pCell+nSkip, sz-
22e10 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43  nSkip);.      pC
22e20 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20  ell = pTemp;.   
22e30 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65   }.    j = pPage
22e40 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20  ->nOverflow++;. 
22e50 20 20 20 61 73 73 65 72 74 28 20 6a 3c 73 69 7a     assert( j<siz
22e60 65 6f 66 28 70 50 61 67 65 2d 3e 61 4f 76 66 6c  eof(pPage->aOvfl
22e70 29 2f 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  )/sizeof(pPage->
22e80 61 4f 76 66 6c 5b 30 5d 29 20 29 3b 0a 20 20 20  aOvfl[0]) );.   
22e90 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 6a 5d   pPage->aOvfl[j]
22ea0 2e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c 3b 0a  .pCell = pCell;.
22eb0 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c      pPage->aOvfl
22ec0 5b 6a 5d 2e 69 64 78 20 3d 20 69 3b 0a 20 20 20  [j].idx = i;.   
22ed0 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20   pPage->nFree = 
22ee0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
22ef0 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
22f00 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
22f10 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
22f20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
22f30 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
22f40 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
22f50 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
22f60 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
22f70 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
22f80 29 3b 0a 20 20 20 20 64 61 74 61 20 3d 20 70 50  );.    data = pP
22f90 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20  age->aData;.    
22fa0 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72  hdr = pPage->hdr
22fb0 4f 66 66 73 65 74 3b 0a 20 20 20 20 74 6f 70 20  Offset;.    top 
22fc0 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
22fd0 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 63 65  [hdr+5]);.    ce
22fe0 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
22ff0 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
23000 20 20 65 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73    end = cellOffs
23010 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43  et + 2*pPage->nC
23020 65 6c 6c 20 2b 20 32 3b 0a 20 20 20 20 69 6e 73  ell + 2;.    ins
23030 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
23040 32 2a 69 3b 0a 20 20 20 20 69 66 28 20 65 6e 64  2*i;.    if( end
23050 20 3e 20 74 6f 70 20 2d 20 73 7a 20 29 7b 0a 20   > top - sz ){. 
23060 20 20 20 20 20 72 63 20 3d 20 64 65 66 72 61 67       rc = defrag
23070 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b  mentPage(pPage);
23080 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
23090 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
230a0 6e 20 72 63 3b 0a 20 20 20 20 20 20 74 6f 70 20  n rc;.      top 
230b0 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
230c0 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20  [hdr+5]);.      
230d0 61 73 73 65 72 74 28 20 65 6e 64 20 2b 20 73 7a  assert( end + sz
230e0 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20 20 20 7d   <= top );.    }
230f0 0a 20 20 20 20 69 64 78 20 3d 20 61 6c 6c 6f 63  .    idx = alloc
23100 61 74 65 53 70 61 63 65 28 70 50 61 67 65 2c 20  ateSpace(pPage, 
23110 73 7a 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  sz);.    assert(
23120 20 69 64 78 3e 30 20 29 3b 0a 20 20 20 20 61 73   idx>0 );.    as
23130 73 65 72 74 28 20 65 6e 64 20 3c 3d 20 67 65 74  sert( end <= get
23140 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
23150 35 5d 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65  5]) );.    pPage
23160 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70  ->nCell++;.    p
23170 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32  Page->nFree -= 2
23180 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
23190 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70  ta[idx+nSkip], p
231a0 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e  Cell+nSkip, sz-n
231b0 53 6b 69 70 29 3b 0a 20 20 20 20 66 6f 72 28 6a  Skip);.    for(j
231c0 3d 65 6e 64 2d 32 2c 20 70 74 72 3d 26 64 61 74  =end-2, ptr=&dat
231d0 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d 3d  a[j]; j>ins; j-=
231e0 32 2c 20 70 74 72 2d 3d 32 29 7b 0a 20 20 20 20  2, ptr-=2){.    
231f0 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 2d    ptr[0] = ptr[-
23200 32 5d 3b 0a 20 20 20 20 20 20 70 74 72 5b 31 5d  2];.      ptr[1]
23210 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a 20 20 20 20   = ptr[-1];.    
23220 7d 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  }.    put2byte(&
23230 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b  data[ins], idx);
23240 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
23250 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67  ata[hdr+3], pPag
23260 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 70  e->nCell);.    p
23270 50 61 67 65 2d 3e 69 64 78 53 68 69 66 74 20 3d  Page->idxShift =
23280 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   1;.#ifndef SQLI
23290 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
232a0 55 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  UM.    if( pPage
232b0 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
232c0 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  m ){.      /* Th
232d0 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f 6e 74 61  e cell may conta
232e0 69 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  in a pointer to 
232f0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
23300 2e 20 49 66 20 73 6f 2c 20 77 72 69 74 65 0a 20  . If so, write. 
23310 20 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 72       ** the entr
23320 79 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c  y for the overfl
23330 6f 77 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  ow page into the
23340 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 20 20   pointer map..  
23350 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 43 65 6c      */.      Cel
23360 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 20 20  lInfo info;.    
23370 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
23380 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
23390 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
233a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
233b0 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67  info.nData+(pPag
233c0 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f  e->intKey?0:info
233d0 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50  .nKey))==info.nP
233e0 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 20 20  ayload );.      
233f0 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b  if( (info.nData+
23400 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30  (pPage->intKey?0
23410 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e 69 6e 66  :info.nKey))>inf
23420 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20  o.nLocal ){.    
23430 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66      Pgno pgnoOvf
23440 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43  l = get4byte(&pC
23450 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
23460 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ow]);.        rc
23470 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 50 61   = ptrmapPut(pPa
23480 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 4f 76 66  ge->pBt, pgnoOvf
23490 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  l, PTRMAP_OVERFL
234a0 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  OW1, pPage->pgno
234b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
234c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
234d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
234e0 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  }.    }.#endif. 
234f0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
23500 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
23510 20 41 64 64 20 61 20 6c 69 73 74 20 6f 66 20 63   Add a list of c
23520 65 6c 6c 73 20 74 6f 20 61 20 70 61 67 65 2e 20  ells to a page. 
23530 20 54 68 65 20 70 61 67 65 20 73 68 6f 75 6c 64   The page should
23540 20 62 65 20 69 6e 69 74 69 61 6c 6c 79 20 65 6d   be initially em
23550 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63 65 6c 6c  pty..** The cell
23560 73 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  s are guaranteed
23570 20 74 6f 20 66 69 74 20 6f 6e 20 74 68 65 20 70   to fit on the p
23580 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  age..*/.static v
23590 6f 69 64 20 61 73 73 65 6d 62 6c 65 50 61 67 65  oid assemblePage
235a0 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  (.  MemPage *pPa
235b0 67 65 2c 20 20 20 2f 2a 20 54 68 65 20 70 61 67  ge,   /* The pag
235c0 65 20 74 6f 20 62 65 20 61 73 73 65 6d 62 6c 69  e to be assembli
235d0 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  ed */.  int nCel
235e0 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  l,        /* The
235f0 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
23600 20 74 6f 20 61 64 64 20 74 6f 20 74 68 69 73 20   to add to this 
23610 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61  page */.  u8 **a
23620 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f 2a 20 50  pCell,      /* P
23630 6f 69 6e 74 65 72 73 20 74 6f 20 63 65 6c 6c 20  ointers to cell 
23640 62 6f 64 69 65 73 20 2a 2f 0a 20 20 75 31 36 20  bodies */.  u16 
23650 2a 61 53 69 7a 65 20 20 20 20 20 20 20 20 2f 2a  *aSize        /*
23660 20 53 69 7a 65 73 20 6f 66 20 74 68 65 20 63 65   Sizes of the ce
23670 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  lls */.){.  int 
23680 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
23690 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
236a0 0a 20 20 69 6e 74 20 74 6f 74 61 6c 53 69 7a 65  .  int totalSize
236b0 3b 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69  ;    /* Total si
236c0 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
236d0 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
236e0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
236f0 6f 66 20 70 61 67 65 20 68 65 61 64 65 72 20 2a  of page header *
23700 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 70 74 72 3b  /.  int cellptr;
23710 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
23720 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 70 6f   of next cell po
23730 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63  inter */.  int c
23740 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20 2f 2a 20  ellbody;     /* 
23750 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20  Address of next 
23760 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a 20 20 75  cell body */.  u
23770 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20 20  8 *data;        
23780 20 2f 2a 20 44 61 74 61 20 66 6f 72 20 74 68 65   /* Data for the
23790 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61 73 73 65   page */..  asse
237a0 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
237b0 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 61 73 73  flow==0 );.  ass
237c0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
237d0 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
237e0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
237f0 74 6f 74 61 6c 53 69 7a 65 20 3d 20 30 3b 0a 20  totalSize = 0;. 
23800 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c   for(i=0; i<nCel
23810 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 74 6f 74  l; i++){.    tot
23820 61 6c 53 69 7a 65 20 2b 3d 20 61 53 69 7a 65 5b  alSize += aSize[
23830 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  i];.  }.  assert
23840 28 20 74 6f 74 61 6c 53 69 7a 65 2b 32 2a 6e 43  ( totalSize+2*nC
23850 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6e 46 72 65  ell<=pPage->nFre
23860 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
23870 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29  Page->nCell==0 )
23880 3b 0a 20 20 63 65 6c 6c 70 74 72 20 3d 20 70 50  ;.  cellptr = pP
23890 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
238a0 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d  .  data = pPage-
238b0 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20  >aData;.  hdr = 
238c0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
238d0 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
238e0 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c  ta[hdr+3], nCell
238f0 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c 6c 20 29  );.  if( nCell )
23900 7b 0a 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 3d  {.    cellbody =
23910 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70   allocateSpace(p
23920 50 61 67 65 2c 20 74 6f 74 61 6c 53 69 7a 65 29  Page, totalSize)
23930 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 63 65  ;.    assert( ce
23940 6c 6c 62 6f 64 79 3e 30 20 29 3b 0a 20 20 20 20  llbody>0 );.    
23950 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
23960 46 72 65 65 20 3e 3d 20 32 2a 6e 43 65 6c 6c 20  Free >= 2*nCell 
23970 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  );.    pPage->nF
23980 72 65 65 20 2d 3d 20 32 2a 6e 43 65 6c 6c 3b 0a  ree -= 2*nCell;.
23990 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
239a0 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
239b0 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
239c0 5b 63 65 6c 6c 70 74 72 5d 2c 20 63 65 6c 6c 62  [cellptr], cellb
239d0 6f 64 79 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  ody);.      memc
239e0 70 79 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64  py(&data[cellbod
239f0 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61  y], apCell[i], a
23a00 53 69 7a 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20  Size[i]);.      
23a10 63 65 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20  cellptr += 2;.  
23a20 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 2b 3d 20      cellbody += 
23a30 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 7d 0a  aSize[i];.    }.
23a40 20 20 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c      assert( cell
23a50 62 6f 64 79 3d 3d 70 50 61 67 65 2d 3e 70 42 74  body==pPage->pBt
23a60 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
23a70 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65    }.  pPage->nCe
23a80 6c 6c 20 3d 20 6e 43 65 6c 6c 3b 0a 7d 0a 0a 2f  ll = nCell;.}../
23a90 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
23aa0 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 64 65  ng parameters de
23ab0 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e 79  termine how many
23ac0 20 61 64 6a 61 63 65 6e 74 20 70 61 67 65 73 20   adjacent pages 
23ad0 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a 20  get involved.** 
23ae0 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67 20 6f  in a balancing o
23af0 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69 73  peration.  NN is
23b00 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e   the number of n
23b10 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68  eighbors on eith
23b20 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74 68  er side.** of th
23b30 65 20 70 61 67 65 20 74 68 61 74 20 70 61 72 74  e page that part
23b40 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62  icipate in the b
23b50 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74 69  alancing operati
23b60 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68 65 0a 2a  on.  NB is the.*
23b70 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  * total number o
23b80 66 20 70 61 67 65 73 20 74 68 61 74 20 70 61 72  f pages that par
23b90 74 69 63 69 70 61 74 65 2c 20 69 6e 63 6c 75 64  ticipate, includ
23ba0 69 6e 67 20 74 68 65 20 74 61 72 67 65 74 20 70  ing the target p
23bb0 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e 65  age and.** NN ne
23bc0 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65  ighbors on eithe
23bd0 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  r side..**.** Th
23be0 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65 20  e minimum value 
23bf0 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f 66 20 63  of NN is 1 (of c
23c00 6f 75 72 73 65 29 2e 20 20 49 6e 63 72 65 61 73  ourse).  Increas
23c10 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a 2a  ing NN above 1.*
23c20 2a 20 28 74 6f 20 32 20 6f 72 20 33 29 20 67 69  * (to 2 or 3) gi
23c30 76 65 73 20 61 20 6d 6f 64 65 73 74 20 69 6d 70  ves a modest imp
23c40 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c 45  rovement in SELE
23c50 43 54 20 61 6e 64 20 44 45 4c 45 54 45 20 70 65  CT and DELETE pe
23c60 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e 20  rformance.** in 
23c70 65 78 63 68 61 6e 67 65 20 66 6f 72 20 61 20 6c  exchange for a l
23c80 61 72 67 65 72 20 64 65 67 72 61 64 61 74 69 6f  arger degradatio
23c90 6e 20 69 6e 20 49 4e 53 45 52 54 20 61 6e 64 20  n in INSERT and 
23ca0 55 50 44 41 54 45 20 70 65 72 66 6f 72 6d 61 6e  UPDATE performan
23cb0 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  ce..** The value
23cc0 20 6f 66 20 4e 4e 20 61 70 70 65 61 72 73 20 74   of NN appears t
23cd0 6f 20 67 69 76 65 20 74 68 65 20 62 65 73 74 20  o give the best 
23ce0 72 65 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c 2e  results overall.
23cf0 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20 31  .*/.#define NN 1
23d00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23d10 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68 62  Number of neighb
23d20 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73 69  ors on either si
23d30 64 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 23  de of pPage */.#
23d40 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32 2b  define NB (NN*2+
23d50 31 29 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c  1)      /* Total
23d60 20 70 61 67 65 73 20 69 6e 76 6f 6c 76 65 64 20   pages involved 
23d70 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 65 20 2a  in the balance *
23d80 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72 65  /../* Forward re
23d90 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69  ference */.stati
23da0 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 4d 65  c int balance(Me
23db0 6d 50 61 67 65 2a 2c 20 69 6e 74 29 3b 0a 0a 23  mPage*, int);..#
23dc0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
23dd0 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 0a  IT_QUICKBALANCE.
23de0 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72 73 69  /*.** This versi
23df0 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28 29 20  on of balance() 
23e00 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f 6d 6d  handles the comm
23e10 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73 65 20  on special case 
23e20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77 20 65  where.** a new e
23e30 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20 69 6e  ntry is being in
23e40 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20 65 78  serted on the ex
23e50 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e 64 20  treme right-end 
23e60 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65 2c 20  of the.** tree, 
23e70 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  in other words, 
23e80 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65 6e 74  when the new ent
23e90 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74  ry will become t
23ea0 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20 65 6e  he largest.** en
23eb0 74 72 79 20 69 6e 20 74 68 65 20 74 72 65 65 2e  try in the tree.
23ec0 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64 20 6f  .**.** Instead o
23ed0 66 20 74 72 79 69 6e 67 20 62 61 6c 61 6e 63 65  f trying balance
23ee0 20 74 68 65 20 33 20 72 69 67 68 74 2d 6d 6f 73   the 3 right-mos
23ef0 74 20 6c 65 61 66 20 70 61 67 65 73 2c 20 6a 75  t leaf pages, ju
23f00 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65 77 20  st add.** a new 
23f10 70 61 67 65 20 74 6f 20 74 68 65 20 72 69 67 68  page to the righ
23f20 74 2d 68 61 6e 64 20 73 69 64 65 20 61 6e 64 20  t-hand side and 
23f30 70 75 74 20 74 68 65 20 6f 6e 65 20 6e 65 77 20  put the one new 
23f40 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68 61 74  entry in.** that
23f50 20 70 61 67 65 2e 20 20 54 68 69 73 20 6c 65 61   page.  This lea
23f60 76 65 73 20 74 68 65 20 72 69 67 68 74 20 73 69  ves the right si
23f70 64 65 20 6f 66 20 74 68 65 20 74 72 65 65 20 73  de of the tree s
23f80 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62 61 6c  omewhat.** unbal
23f90 61 6e 63 65 64 2e 20 20 42 75 74 20 6f 64 64 73  anced.  But odds
23fa0 20 61 72 65 20 74 68 61 74 20 77 65 20 77 69 6c   are that we wil
23fb0 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67 20 6e  l be inserting n
23fc0 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20 61 74  ew entries.** at
23fd0 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20 61 66   the end soon af
23fe0 74 65 72 77 61 72 64 73 20 73 6f 20 74 68 65 20  terwards so the 
23ff0 6e 65 61 72 6c 79 20 65 6d 70 74 79 20 70 61 67  nearly empty pag
24000 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79 0a 2a  e will quickly.*
24010 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e 20 61  * fill up.  On a
24020 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 70 50  verage..**.** pP
24030 61 67 65 20 69 73 20 74 68 65 20 6c 65 61 66 20  age is the leaf 
24040 70 61 67 65 20 77 68 69 63 68 20 69 73 20 74 68  page which is th
24050 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 70 61 67  e right-most pag
24060 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e 0a 2a  e in the tree..*
24070 2a 20 70 50 61 72 65 6e 74 20 69 73 20 69 74 73  * pParent is its
24080 20 70 61 72 65 6e 74 2e 20 20 70 50 61 67 65 20   parent.  pPage 
24090 6d 75 73 74 20 68 61 76 65 20 61 20 73 69 6e 67  must have a sing
240a0 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e 74 72  le overflow entr
240b0 79 0a 2a 2a 20 77 68 69 63 68 20 69 73 20 61 6c  y.** which is al
240c0 73 6f 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  so the right-mos
240d0 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65 20 70  t entry on the p
240e0 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  age..*/.static i
240f0 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  nt balance_quick
24100 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
24110 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
24120 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  t){.  int rc;.  
24130 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20  MemPage *pNew;. 
24140 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 3b 0a 20   Pgno pgnoNew;. 
24150 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 75 31   u8 *pCell;.  u1
24160 36 20 73 7a 43 65 6c 6c 3b 0a 20 20 43 65 6c 6c  6 szCell;.  Cell
24170 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 42 74 53  Info info;.  BtS
24180 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
24190 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 70  ge->pBt;.  int p
241a0 61 72 65 6e 74 49 64 78 20 3d 20 70 50 61 72 65  arentIdx = pPare
241b0 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 20 20 2f 2a 20  nt->nCell;   /* 
241c0 70 50 61 72 65 6e 74 20 6e 65 77 20 64 69 76 69  pParent new divi
241d0 64 65 72 20 63 65 6c 6c 20 69 6e 64 65 78 20 2a  der cell index *
241e0 2f 0a 20 20 69 6e 74 20 70 61 72 65 6e 74 53 69  /.  int parentSi
241f0 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
24200 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
24210 20 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c   new divider cel
24220 6c 20 2a 2f 0a 20 20 75 38 20 70 61 72 65 6e 74  l */.  u8 parent
24230 43 65 6c 6c 5b 36 34 5d 3b 20 20 20 20 20 20 20  Cell[64];       
24240 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63           /* Spac
24250 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 64 69  e for the new di
24260 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 0a 20  vider cell */.. 
24270 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
24280 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
24290 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
242a0 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
242b0 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49 6e 73   a new page. Ins
242c0 65 72 74 20 74 68 65 20 6f 76 65 72 66 6c 6f 77  ert the overflow
242d0 20 63 65 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65   cell from pPage
242e0 0a 20 20 2a 2a 20 69 6e 74 6f 20 69 74 2e 20 54  .  ** into it. T
242f0 68 65 6e 20 72 65 6d 6f 76 65 20 74 68 65 20 6f  hen remove the o
24300 76 65 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f  verflow cell fro
24310 6d 20 70 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  m pPage..  */.  
24320 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72  rc = allocateBtr
24330 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65  eePage(pBt, &pNe
24340 77 2c 20 26 70 67 6e 6f 4e 65 77 2c 20 30 2c 20  w, &pgnoNew, 0, 
24350 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
24360 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
24370 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
24380 70 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 61  pCell = pPage->a
24390 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c 3b 0a 20  Ovfl[0].pCell;. 
243a0 20 73 7a 43 65 6c 6c 20 3d 20 63 65 6c 6c 53 69   szCell = cellSi
243b0 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  zePtr(pPage, pCe
243c0 6c 6c 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65 28  ll);.  zeroPage(
243d0 70 4e 65 77 2c 20 70 50 61 67 65 2d 3e 61 44 61  pNew, pPage->aDa
243e0 74 61 5b 30 5d 29 3b 0a 20 20 61 73 73 65 6d 62  ta[0]);.  assemb
243f0 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 31 2c 20  lePage(pNew, 1, 
24400 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29  &pCell, &szCell)
24410 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  ;.  pPage->nOver
24420 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  flow = 0;..  /* 
24430 53 65 74 20 74 68 65 20 70 61 72 65 6e 74 20 6f  Set the parent o
24440 66 20 74 68 65 20 6e 65 77 6c 79 20 61 6c 6c 6f  f the newly allo
24450 63 61 74 65 64 20 70 61 67 65 20 74 6f 20 70 50  cated page to pP
24460 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 70 4e 65 77  arent. */.  pNew
24470 2d 3e 70 50 61 72 65 6e 74 20 3d 20 70 50 61 72  ->pParent = pPar
24480 65 6e 74 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ent;.  sqlite3Pa
24490 67 65 72 52 65 66 28 70 50 61 72 65 6e 74 2d 3e  gerRef(pParent->
244a0 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 20  pDbPage);..  /* 
244b0 70 50 61 67 65 20 69 73 20 63 75 72 72 65 6e 74  pPage is current
244c0 6c 79 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  ly the right-chi
244d0 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 2e 20 43  ld of pParent. C
244e0 68 61 6e 67 65 20 74 68 69 73 0a 20 20 2a 2a 20  hange this.  ** 
244f0 73 6f 20 74 68 61 74 20 74 68 65 20 72 69 67 68  so that the righ
24500 74 2d 63 68 69 6c 64 20 69 73 20 74 68 65 20 6e  t-child is the n
24510 65 77 20 70 61 67 65 20 61 6c 6c 6f 63 61 74 65  ew page allocate
24520 64 20 61 62 6f 76 65 20 61 6e 64 0a 20 20 2a 2a  d above and.  **
24530 20 70 50 61 67 65 20 69 73 20 74 68 65 20 6e 65   pPage is the ne
24540 78 74 2d 74 6f 2d 72 69 67 68 74 20 63 68 69 6c  xt-to-right chil
24550 64 2e 20 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  d. .  */.  asser
24560 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
24570 30 20 29 3b 0a 20 20 70 43 65 6c 6c 20 3d 20 66  0 );.  pCell = f
24580 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
24590 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29 3b 0a  Page->nCell-1);.
245a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
245b0 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
245c0 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
245d0 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43 65  .  rc = fillInCe
245e0 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65  ll(pParent, pare
245f0 6e 74 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e  ntCell, 0, info.
24600 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 30 2c 20 26  nKey, 0, 0, 0, &
24610 70 61 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 69  parentSize);.  i
24620 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
24630 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
24640 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
24650 20 70 61 72 65 6e 74 53 69 7a 65 3c 36 34 20 29   parentSize<64 )
24660 3b 0a 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43  ;.  rc = insertC
24670 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 61 72  ell(pParent, par
24680 65 6e 74 49 64 78 2c 20 70 61 72 65 6e 74 43 65  entIdx, parentCe
24690 6c 6c 2c 20 70 61 72 65 6e 74 53 69 7a 65 2c 20  ll, parentSize, 
246a0 30 2c 20 34 29 3b 0a 20 20 69 66 28 20 72 63 21  0, 4);.  if( rc!
246b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
246c0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
246d0 0a 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64  .  put4byte(find
246e0 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61  OverflowCell(pPa
246f0 72 65 6e 74 2c 70 61 72 65 6e 74 49 64 78 29 2c  rent,parentIdx),
24700 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20   pPage->pgno);. 
24710 20 70 75 74 34 62 79 74 65 28 26 70 50 61 72 65   put4byte(&pPare
24720 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e  nt->aData[pParen
24730 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  t->hdrOffset+8],
24740 20 70 67 6e 6f 4e 65 77 29 3b 0a 0a 23 69 66 6e   pgnoNew);..#ifn
24750 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
24760 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20  AUTOVACUUM.  /* 
24770 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
24780 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
24790 73 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70  se, update the p
247a0 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 2a 2a 20  ointer map.  ** 
247b0 77 69 74 68 20 65 6e 74 72 69 65 73 20 66 6f 72  with entries for
247c0 20 74 68 65 20 6e 65 77 20 70 61 67 65 2c 20 61   the new page, a
247d0 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65 72 20 66  nd any pointer f
247e0 72 6f 6d 20 74 68 65 20 0a 20 20 2a 2a 20 63 65  rom the .  ** ce
247f0 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67 65 20 74  ll on the page t
24800 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
24810 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ge..  */.  if( p
24820 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
24830 7b 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  {.    rc = ptrma
24840 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4e 65  pPut(pBt, pgnoNe
24850 77 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  w, PTRMAP_BTREE,
24860 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 3b   pParent->pgno);
24870 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
24880 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
24890 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76  rc = ptrmapPutOv
248a0 66 6c 28 70 4e 65 77 2c 20 30 29 3b 0a 20 20 20  fl(pNew, 0);.   
248b0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53   }.    if( rc!=S
248c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
248d0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e    releasePage(pN
248e0 65 77 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ew);.      retur
248f0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n rc;.    }.  }.
24900 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 52 65 6c  #endif..  /* Rel
24910 65 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e  ease the referen
24920 63 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61  ce to the new pa
24930 67 65 20 61 6e 64 20 62 61 6c 61 6e 63 65 20 74  ge and balance t
24940 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c 0a  he parent page,.
24950 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 65    ** in case the
24960 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e   divider cell in
24970 73 65 72 74 65 64 20 63 61 75 73 65 64 20 69 74  serted caused it
24980 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65 72 66   to become overf
24990 75 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 72 65 6c 65  ull..  */.  rele
249a0 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20  asePage(pNew);. 
249b0 20 72 65 74 75 72 6e 20 62 61 6c 61 6e 63 65 28   return balance(
249c0 70 50 61 72 65 6e 74 2c 20 30 29 3b 0a 7d 0a 23  pParent, 0);.}.#
249d0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
249e0 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43  OMIT_QUICKBALANC
249f0 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  E */../*.** This
24a00 20 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72   routine redistr
24a10 69 62 75 74 65 73 20 43 65 6c 6c 73 20 6f 6e 20  ibutes Cells on 
24a20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20  pPage and up to 
24a30 4e 4e 2a 32 20 73 69 62 6c 69 6e 67 73 0a 2a 2a  NN*2 siblings.**
24a40 20 6f 66 20 70 50 61 67 65 20 73 6f 20 74 68 61   of pPage so tha
24a50 74 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65  t all pages have
24a60 20 61 62 6f 75 74 20 74 68 65 20 73 61 6d 65 20   about the same 
24a70 61 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73  amount of free s
24a80 70 61 63 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79  pace..** Usually
24a90 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20   NN siblings on 
24aa0 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70  either side of p
24ab0 50 61 67 65 20 69 73 20 75 73 65 64 20 69 6e 20  Page is used in 
24ac0 74 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 0a 2a  the balancing,.*
24ad0 2a 20 74 68 6f 75 67 68 20 6d 6f 72 65 20 73 69  * though more si
24ae0 62 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d  blings might com
24af0 65 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 20  e from one side 
24b00 69 66 20 70 50 61 67 65 20 69 73 20 74 68 65 20  if pPage is the 
24b10 66 69 72 73 74 0a 2a 2a 20 6f 72 20 6c 61 73 74  first.** or last
24b20 20 63 68 69 6c 64 20 6f 66 20 69 74 73 20 70 61   child of its pa
24b30 72 65 6e 74 2e 20 20 49 66 20 70 50 61 67 65 20  rent.  If pPage 
24b40 68 61 73 20 66 65 77 65 72 20 74 68 61 6e 20 32  has fewer than 2
24b50 2a 4e 4e 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20  *NN siblings.** 
24b60 28 73 6f 6d 65 74 68 69 6e 67 20 77 68 69 63 68  (something which
24b70 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
24b80 20 69 66 20 70 50 61 67 65 20 69 73 20 74 68 65   if pPage is the
24b90 20 72 6f 6f 74 20 70 61 67 65 20 6f 72 20 61 20   root page or a 
24ba0 0a 2a 2a 20 63 68 69 6c 64 20 6f 66 20 72 6f 6f  .** child of roo
24bb0 74 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69  t) then all avai
24bc0 6c 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 20 70  lable siblings p
24bd0 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68  articipate in th
24be0 65 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a  e balancing..**.
24bf0 2a 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** The number of
24c00 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 70 50 61   siblings of pPa
24c10 67 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72  ge might be incr
24c20 65 61 73 65 64 20 6f 72 20 64 65 63 72 65 61 73  eased or decreas
24c30 65 64 20 62 79 20 6f 6e 65 20 6f 72 0a 2a 2a 20  ed by one or.** 
24c40 74 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74  two in an effort
24c50 20 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e   to keep pages n
24c60 65 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e  early full but n
24c70 6f 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 54 68  ot over full. Th
24c80 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69  e root page.** i
24c90 73 20 73 70 65 63 69 61 6c 20 61 6e 64 20 69 73  s special and is
24ca0 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 6e   allowed to be n
24cb0 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 49 66 20  early empty. If 
24cc0 70 50 61 67 65 20 69 73 20 0a 2a 2a 20 74 68 65  pPage is .** the
24cd0 20 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e   root page, then
24ce0 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 74 68   the depth of th
24cf0 65 20 74 72 65 65 20 6d 69 67 68 74 20 62 65 20  e tree might be 
24d00 69 6e 63 72 65 61 73 65 64 0a 2a 2a 20 6f 72 20  increased.** or 
24d10 64 65 63 72 65 61 73 65 64 20 62 79 20 6f 6e 65  decreased by one
24d20 2c 20 61 73 20 6e 65 63 65 73 73 61 72 79 2c 20  , as necessary, 
24d30 74 6f 20 6b 65 65 70 20 74 68 65 20 72 6f 6f 74  to keep the root
24d40 20 70 61 67 65 20 66 72 6f 6d 20 62 65 69 6e 67   page from being
24d50 0a 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20  .** overfull or 
24d60 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79  completely empty
24d70 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
24d80 74 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  t when this rout
24d90 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73  ine is called, s
24da0 6f 6d 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 73  ome of the Cells
24db0 20 6f 6e 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67   on pPage.** mig
24dc0 68 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20  ht not actually 
24dd0 62 65 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61  be stored in pPa
24de0 67 65 2d 3e 61 44 61 74 61 5b 5d 2e 20 20 54 68  ge->aData[].  Th
24df0 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a  is can happen.**
24e00 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
24e10 6f 76 65 72 66 75 6c 6c 2e 20 20 50 61 72 74 20  overfull.  Part 
24e20 6f 66 20 74 68 65 20 6a 6f 62 20 6f 66 20 74 68  of the job of th
24e30 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f  is routine is to
24e40 0a 2a 2a 20 6d 61 6b 65 20 73 75 72 65 20 61 6c  .** make sure al
24e50 6c 20 43 65 6c 6c 73 20 66 6f 72 20 70 50 61 67  l Cells for pPag
24e60 65 20 6f 6e 63 65 20 61 67 61 69 6e 20 66 69 74  e once again fit
24e70 20 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61   in pPage->aData
24e80 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65  []..**.** In the
24e90 20 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e   course of balan
24ea0 63 69 6e 67 20 74 68 65 20 73 69 62 6c 69 6e 67  cing the sibling
24eb0 73 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 20  s of pPage, the 
24ec0 70 61 72 65 6e 74 20 6f 66 20 70 50 61 67 65 0a  parent of pPage.
24ed0 2a 2a 20 6d 69 67 68 74 20 62 65 63 6f 6d 65 20  ** might become 
24ee0 6f 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65  overfull or unde
24ef0 72 66 75 6c 6c 2e 20 20 49 66 20 74 68 61 74 20  rfull.  If that 
24f00 68 61 70 70 65 6e 73 2c 20 74 68 65 6e 20 74 68  happens, then th
24f10 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  is routine.** is
24f20 20 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76   called recursiv
24f30 65 6c 79 20 6f 6e 20 74 68 65 20 70 61 72 65 6e  ely on the paren
24f40 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  t..**.** If this
24f50 20 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 66   routine fails f
24f60 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69  or any reason, i
24f70 74 20 6d 69 67 68 74 20 6c 65 61 76 65 20 74 68  t might leave th
24f80 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e  e database.** in
24f90 20 61 20 63 6f 72 72 75 70 74 65 64 20 73 74 61   a corrupted sta
24fa0 74 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20  te.  So if this 
24fb0 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c 20 74  routine fails, t
24fc0 68 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75  he database shou
24fd0 6c 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20  ld.** be rolled 
24fe0 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
24ff0 69 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  int balance_nonr
25000 6f 6f 74 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  oot(MemPage *pPa
25010 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ge){.  MemPage *
25020 70 50 61 72 65 6e 74 3b 20 20 20 20 20 20 20 20  pParent;        
25030 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 65 6e      /* The paren
25040 74 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20 20  t of pPage */.  
25050 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
25060 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25070 54 68 65 20 77 68 6f 6c 65 20 64 61 74 61 62 61  The whole databa
25080 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 65 6c  se */.  int nCel
25090 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
250a0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
250b0 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  f cells in apCel
250c0 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d 61  l[] */.  int nMa
250d0 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20 20 20 20  xCells = 0;     
250e0 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
250f0 65 64 20 73 69 7a 65 20 6f 66 20 61 70 43 65 6c  ed size of apCel
25100 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46 72 6f 6d  l, szCell, aFrom
25110 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 6c 64 3b  . */.  int nOld;
25120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25130 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
25140 20 70 61 67 65 73 20 69 6e 20 61 70 4f 6c 64 5b   pages in apOld[
25150 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 65 77 3b  ] */.  int nNew;
25160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25170 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
25180 20 70 61 67 65 73 20 69 6e 20 61 70 4e 65 77 5b   pages in apNew[
25190 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 44 69 76 3b  ] */.  int nDiv;
251a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
251c0 20 63 65 6c 6c 73 20 69 6e 20 61 70 44 69 76 5b   cells in apDiv[
251d0 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  ] */.  int i, j,
251e0 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   k;             
251f0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
25200 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69 64  ters */.  int id
25210 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  x;              
25220 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
25230 6f 66 20 70 50 61 67 65 20 69 6e 20 70 50 61 72  of pPage in pPar
25240 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a  ent->aCell[] */.
25250 20 20 69 6e 74 20 6e 78 44 69 76 3b 20 20 20 20    int nxDiv;    
25260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25270 2a 20 4e 65 78 74 20 64 69 76 69 64 65 72 20 73  * Next divider s
25280 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e  lot in pParent->
25290 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74  aCell[] */.  int
252a0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
252b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
252c0 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
252d0 20 20 69 6e 74 20 6c 65 61 66 43 6f 72 72 65 63    int leafCorrec
252e0 74 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20 2f  tion;          /
252f0 2a 20 34 20 69 66 20 70 50 61 67 65 20 69 73 20  * 4 if pPage is 
25300 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20 6e 6f  a leaf.  0 if no
25310 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 44  t */.  int leafD
25320 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
25330 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
25340 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 20 6f  Page is a leaf o
25350 66 20 61 20 4c 45 41 46 44 41 54 41 20 74 72 65  f a LEAFDATA tre
25360 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 61 62 6c  e */.  int usabl
25370 65 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20  eSpace;         
25380 20 20 20 20 2f 2a 20 42 79 74 65 73 20 69 6e 20      /* Bytes in 
25390 70 50 61 67 65 20 62 65 79 6f 6e 64 20 74 68 65  pPage beyond the
253a0 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74   header */.  int
253b0 20 70 61 67 65 46 6c 61 67 73 3b 20 20 20 20 20   pageFlags;     
253c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
253d0 75 65 20 6f 66 20 70 50 61 67 65 2d 3e 61 44 61  ue of pPage->aDa
253e0 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e 74 20 73  ta[0] */.  int s
253f0 75 62 74 6f 74 61 6c 3b 20 20 20 20 20 20 20 20  ubtotal;        
25400 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 74 6f          /* Subto
25410 74 61 6c 20 6f 66 20 62 79 74 65 73 20 69 6e 20  tal of bytes in 
25420 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20 70 61 67  cells on one pag
25430 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61 63  e */.  int iSpac
25440 65 31 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  e1 = 0;         
25450 20 20 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75      /* First unu
25460 73 65 64 20 62 79 74 65 20 6f 66 20 61 53 70 61  sed byte of aSpa
25470 63 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  ce1[] */.  int i
25480 53 70 61 63 65 32 20 3d 20 30 3b 20 20 20 20 20  Space2 = 0;     
25490 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
254a0 20 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20   unused byte of 
254b0 61 53 70 61 63 65 32 5b 5d 20 2a 2f 0a 20 20 69  aSpace2[] */.  i
254c0 6e 74 20 73 7a 53 63 72 61 74 63 68 3b 20 20 20  nt szScratch;   
254d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
254e0 69 7a 65 20 6f 66 20 73 63 72 61 74 63 68 20 6d  ize of scratch m
254f0 65 6d 6f 72 79 20 72 65 71 75 65 73 74 65 64 20  emory requested 
25500 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
25510 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  Old[NB];        
25520 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64 20 75    /* pPage and u
25530 70 20 74 6f 20 74 77 6f 20 73 69 62 6c 69 6e 67  p to two sibling
25540 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  s */.  Pgno pgno
25550 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20  Old[NB];        
25560 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
25570 65 72 73 20 66 6f 72 20 65 61 63 68 20 70 61 67  ers for each pag
25580 65 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a  e in apOld[] */.
25590 20 20 4d 65 6d 50 61 67 65 20 2a 61 70 43 6f 70    MemPage *apCop
255a0 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f  y[NB];         /
255b0 2a 20 50 72 69 76 61 74 65 20 63 6f 70 69 65 73  * Private copies
255c0 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70 61 67 65   of apOld[] page
255d0 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  s */.  MemPage *
255e0 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  apNew[NB+2];    
255f0 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e 64      /* pPage and
25600 20 75 70 20 74 6f 20 4e 42 20 73 69 62 6c 69 6e   up to NB siblin
25610 67 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63 69  gs after balanci
25620 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ng */.  Pgno pgn
25630 6f 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20  oNew[NB+2];     
25640 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
25650 62 65 72 73 20 66 6f 72 20 65 61 63 68 20 70 61  bers for each pa
25660 67 65 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f  ge in apNew[] */
25670 0a 20 20 75 38 20 2a 61 70 44 69 76 5b 4e 42 5d  .  u8 *apDiv[NB]
25680 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
25690 2f 2a 20 44 69 76 69 64 65 72 20 63 65 6c 6c 73  /* Divider cells
256a0 20 69 6e 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20   in pParent */. 
256b0 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e 42 2b 32   int cntNew[NB+2
256c0 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ];            /*
256d0 20 49 6e 64 65 78 20 69 6e 20 61 43 65 6c 6c 5b   Index in aCell[
256e0 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74 65 72 20  ] of cell after 
256f0 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 69  i-th page */.  i
25700 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32 5d 3b 20  nt szNew[NB+2]; 
25710 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
25720 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20 6f 66 20  ombined size of 
25730 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f 6e 20 69  cells place on i
25740 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  -th page */.  u8
25750 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30 3b 20 20   **apCell = 0;  
25760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
25770 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e 20 62 61  l cells begin ba
25780 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75 31 36 20  lanced */.  u16 
25790 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  *szCell;        
257a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 63 61           /* Loca
257b0 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65  l size of all ce
257c0 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  lls in apCell[] 
257d0 2a 2f 0a 20 20 75 38 20 2a 61 43 6f 70 79 5b 4e  */.  u8 *aCopy[N
257e0 42 5d 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  B];         /* S
257f0 70 61 63 65 20 66 6f 72 20 68 6f 6c 64 69 6e 67  pace for holding
25800 20 64 61 74 61 20 6f 66 20 61 70 43 6f 70 79 5b   data of apCopy[
25810 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61 63  ] */.  u8 *aSpac
25820 65 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e1;           /*
25830 20 53 70 61 63 65 20 66 6f 72 20 63 6f 70 69 65   Space for copie
25840 73 20 6f 66 20 64 69 76 69 64 65 72 73 20 63 65  s of dividers ce
25850 6c 6c 73 20 62 65 66 6f 72 65 20 62 61 6c 61 6e  lls before balan
25860 63 65 20 2a 2f 0a 20 20 75 38 20 2a 61 53 70 61  ce */.  u8 *aSpa
25870 63 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ce2 = 0;       /
25880 2a 20 53 70 61 63 65 20 66 6f 72 20 6f 76 65 72  * Space for over
25890 66 6c 6f 77 20 64 69 76 69 64 65 72 73 20 63 65  flow dividers ce
258a0 6c 6c 73 20 61 66 74 65 72 20 62 61 6c 61 6e 63  lls after balanc
258b0 65 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  e */.#ifndef SQL
258c0 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
258d0 55 55 4d 0a 20 20 75 38 20 2a 61 46 72 6f 6d 20  UUM.  u8 *aFrom 
258e0 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 61  = 0;.#endif..  a
258f0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
25900 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
25910 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
25920 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 46 69 6e 64  .  /* .  ** Find
25930 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
25940 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
25950 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29   pPage->isInit )
25960 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
25970 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
25980 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
25990 67 65 29 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f  ge) || pPage->nO
259a0 76 65 72 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20  verflow==1 );.  
259b0 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74  pBt = pPage->pBt
259c0 3b 0a 20 20 70 50 61 72 65 6e 74 20 3d 20 70 50  ;.  pParent = pP
259d0 61 67 65 2d 3e 70 50 61 72 65 6e 74 3b 0a 20 20  age->pParent;.  
259e0 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 20  assert( pParent 
259f0 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  );.  if( SQLITE_
25a00 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65  OK!=(rc = sqlite
25a10 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 72  3PagerWrite(pPar
25a20 65 6e 74 2d 3e 70 44 62 50 61 67 65 29 29 20 29  ent->pDbPage)) )
25a30 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
25a40 0a 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22 42  .  }.  TRACE(("B
25a50 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20 70 61  ALANCE: begin pa
25a60 67 65 20 25 64 20 63 68 69 6c 64 20 6f 66 20 25  ge %d child of %
25a70 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e  d\n", pPage->pgn
25a80 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f  o, pParent->pgno
25a90 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ));..#ifndef SQL
25aa0 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41  ITE_OMIT_QUICKBA
25ab0 4c 41 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20  LANCE.  /*.  ** 
25ac0 41 20 73 70 65 63 69 61 6c 20 63 61 73 65 3a 20  A special case: 
25ad0 20 49 66 20 61 20 6e 65 77 20 65 6e 74 72 79 20   If a new entry 
25ae0 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 69 6e  has just been in
25af0 73 65 72 74 65 64 20 69 6e 74 6f 20 61 0a 20 20  serted into a.  
25b00 2a 2a 20 74 61 62 6c 65 20 28 74 68 61 74 20 69  ** table (that i
25b10 73 2c 20 61 20 62 74 72 65 65 20 77 69 74 68 20  s, a btree with 
25b20 69 6e 74 65 67 65 72 20 6b 65 79 73 20 61 6e 64  integer keys and
25b30 20 61 6c 6c 20 64 61 74 61 20 61 74 20 74 68 65   all data at the
25b40 20 6c 65 61 76 65 73 29 0a 20 20 2a 2a 20 61 6e   leaves).  ** an
25b50 64 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79 20  d the new entry 
25b60 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  is the right-mos
25b70 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
25b80 72 65 65 20 28 69 74 20 68 61 73 20 74 68 65 0a  ree (it has the.
25b90 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b 65 79    ** largest key
25ba0 29 20 74 68 65 6e 20 75 73 65 20 74 68 65 20 73  ) then use the s
25bb0 70 65 63 69 61 6c 20 62 61 6c 61 6e 63 65 5f 71  pecial balance_q
25bc0 75 69 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66  uick() routine f
25bd0 6f 72 0a 20 20 2a 2a 20 62 61 6c 61 6e 63 69 6e  or.  ** balancin
25be0 67 2e 20 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  g.  balance_quic
25bf0 6b 28 29 20 69 73 20 6d 75 63 68 20 66 61 73 74  k() is much fast
25c00 65 72 20 61 6e 64 20 72 65 73 75 6c 74 73 20 69  er and results i
25c10 6e 20 61 20 74 69 67 68 74 65 72 0a 20 20 2a 2a  n a tighter.  **
25c20 20 70 61 63 6b 69 6e 67 20 6f 66 20 64 61 74 61   packing of data
25c30 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63   in the common c
25c40 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ase..  */.  if( 
25c50 70 50 61 67 65 2d 3e 6c 65 61 66 20 26 26 0a 20  pPage->leaf &&. 
25c60 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e 74 4b       pPage->intK
25c70 65 79 20 26 26 0a 20 20 20 20 20 20 70 50 61 67  ey &&.      pPag
25c80 65 2d 3e 6c 65 61 66 44 61 74 61 20 26 26 0a 20  e->leafData &&. 
25c90 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65       pPage->nOve
25ca0 72 66 6c 6f 77 3d 3d 31 20 26 26 0a 20 20 20 20  rflow==1 &&.    
25cb0 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30    pPage->aOvfl[0
25cc0 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e 6e 43  ].idx==pPage->nC
25cd0 65 6c 6c 20 26 26 0a 20 20 20 20 20 20 70 50 61  ell &&.      pPa
25ce0 67 65 2d 3e 70 50 61 72 65 6e 74 2d 3e 70 67 6e  ge->pParent->pgn
25cf0 6f 21 3d 31 20 26 26 0a 20 20 20 20 20 20 67 65  o!=1 &&.      ge
25d00 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
25d10 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
25d20 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 70  hdrOffset+8])==p
25d30 50 61 67 65 2d 3e 70 67 6e 6f 0a 20 20 29 7b 0a  Page->pgno.  ){.
25d40 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 4f      /*.    ** TO
25d50 44 4f 3a 20 43 68 65 63 6b 20 74 68 65 20 73 69  DO: Check the si
25d60 62 6c 69 6e 67 73 20 74 6f 20 74 68 65 20 6c 65  blings to the le
25d70 66 74 20 6f 66 20 70 50 61 67 65 2e 20 49 74 20  ft of pPage. It 
25d80 6d 61 79 20 62 65 20 74 68 61 74 0a 20 20 20 20  may be that.    
25d90 2a 2a 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20  ** they are not 
25da0 66 75 6c 6c 20 61 6e 64 20 6e 6f 20 6e 65 77 20  full and no new 
25db0 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64  page is required
25dc0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74  ..    */.    ret
25dd0 75 72 6e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63  urn balance_quic
25de0 6b 28 70 50 61 67 65 2c 20 70 50 61 72 65 6e 74  k(pPage, pParent
25df0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
25e00 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d   if( SQLITE_OK!=
25e10 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (rc = sqlite3Pag
25e20 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
25e30 44 62 50 61 67 65 29 29 20 29 7b 0a 20 20 20 20  DbPage)) ){.    
25e40 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
25e50 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
25e60 68 65 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 70  he cell in the p
25e70 61 72 65 6e 74 20 70 61 67 65 20 77 68 6f 73 65  arent page whose
25e80 20 6c 65 66 74 20 63 68 69 6c 64 20 70 6f 69 6e   left child poin
25e90 74 73 20 62 61 63 6b 0a 20 20 2a 2a 20 74 6f 20  ts back.  ** to 
25ea0 70 50 61 67 65 2e 20 20 54 68 65 20 22 69 64 78  pPage.  The "idx
25eb0 22 20 76 61 72 69 61 62 6c 65 20 69 73 20 74 68  " variable is th
25ec0 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20  e index of that 
25ed0 63 65 6c 6c 2e 20 20 49 66 20 70 50 61 67 65 0a  cell.  If pPage.
25ee0 20 20 2a 2a 20 69 73 20 74 68 65 20 72 69 67 68    ** is the righ
25ef0 74 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66 20 70  tmost child of p
25f00 50 61 72 65 6e 74 20 74 68 65 6e 20 73 65 74 20  Parent then set 
25f10 69 64 78 20 74 6f 20 70 50 61 72 65 6e 74 2d 3e  idx to pParent->
25f20 6e 43 65 6c 6c 20 0a 20 20 2a 2f 0a 20 20 69 66  nCell .  */.  if
25f30 28 20 70 50 61 72 65 6e 74 2d 3e 69 64 78 53 68  ( pParent->idxSh
25f40 69 66 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20  ift ){.    Pgno 
25f50 70 67 6e 6f 3b 0a 20 20 20 20 70 67 6e 6f 20 3d  pgno;.    pgno =
25f60 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20 20   pPage->pgno;.  
25f70 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3d 3d    assert( pgno==
25f80 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
25f90 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44  number(pPage->pD
25fa0 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 66 6f  bPage) );.    fo
25fb0 72 28 69 64 78 3d 30 3b 20 69 64 78 3c 70 50 61  r(idx=0; idx<pPa
25fc0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 69 64 78  rent->nCell; idx
25fd0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 67  ++){.      if( g
25fe0 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
25ff0 28 70 50 61 72 65 6e 74 2c 20 69 64 78 29 29 3d  (pParent, idx))=
26000 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  =pgno ){.       
26010 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
26020 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
26030 28 20 69 64 78 3c 70 50 61 72 65 6e 74 2d 3e 6e  ( idx<pParent->n
26040 43 65 6c 6c 0a 20 20 20 20 20 20 20 20 20 20 20  Cell.           
26050 20 20 7c 7c 20 67 65 74 34 62 79 74 65 28 26 70    || get4byte(&p
26060 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
26070 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
26080 2b 38 5d 29 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20  +8])==pgno );.  
26090 7d 65 6c 73 65 7b 0a 20 20 20 20 69 64 78 20 3d  }else{.    idx =
260a0 20 70 50 61 67 65 2d 3e 69 64 78 50 61 72 65 6e   pPage->idxParen
260b0 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  t;.  }..  /*.  *
260c0 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 76 61 72  * Initialize var
260d0 69 61 62 6c 65 73 20 73 6f 20 74 68 61 74 20 69  iables so that i
260e0 74 20 77 69 6c 6c 20 62 65 20 73 61 66 65 20 74  t will be safe t
260f0 6f 20 6a 75 6d 70 0a 20 20 2a 2a 20 64 69 72 65  o jump.  ** dire
26100 63 74 6c 79 20 74 6f 20 62 61 6c 61 6e 63 65 5f  ctly to balance_
26110 63 6c 65 61 6e 75 70 20 61 74 20 61 6e 79 20 6d  cleanup at any m
26120 6f 6d 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 6e 4f  oment..  */.  nO
26130 6c 64 20 3d 20 6e 4e 65 77 20 3d 20 30 3b 0a 20  ld = nNew = 0;. 
26140 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
26150 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67  (pParent->pDbPag
26160 65 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46  e);..  /*.  ** F
26170 69 6e 64 20 73 69 62 6c 69 6e 67 20 70 61 67 65  ind sibling page
26180 73 20 74 6f 20 70 50 61 67 65 20 61 6e 64 20 74  s to pPage and t
26190 68 65 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  he cells in pPar
261a0 65 6e 74 20 74 68 61 74 20 64 69 76 69 64 65 0a  ent that divide.
261b0 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67    ** the sibling
261c0 73 2e 20 20 41 6e 20 61 74 74 65 6d 70 74 20 69  s.  An attempt i
261d0 73 20 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e  s made to find N
261e0 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69  N siblings on ei
261f0 74 68 65 72 0a 20 20 2a 2a 20 73 69 64 65 20 6f  ther.  ** side o
26200 66 20 70 50 61 67 65 2e 20 20 4d 6f 72 65 20 73  f pPage.  More s
26210 69 62 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65  iblings are take
26220 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c  n from one side,
26230 20 68 6f 77 65 76 65 72 2c 20 69 66 0a 20 20 2a   however, if.  *
26240 2a 20 70 50 61 67 65 20 74 68 65 72 65 20 61 72  * pPage there ar
26250 65 20 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20  e fewer than NN 
26260 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20  siblings on the 
26270 6f 74 68 65 72 20 73 69 64 65 2e 20 20 49 66 20  other side.  If 
26280 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73  pParent.  ** has
26290 20 4e 42 20 6f 72 20 66 65 77 65 72 20 63 68 69   NB or fewer chi
262a0 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63  ldren then all c
262b0 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65  hildren of pPare
262c0 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e 0a 20 20  nt are taken..  
262d0 2a 2f 0a 20 20 6e 78 44 69 76 20 3d 20 69 64 78  */.  nxDiv = idx
262e0 20 2d 20 4e 4e 3b 0a 20 20 69 66 28 20 6e 78 44   - NN;.  if( nxD
262f0 69 76 20 2b 20 4e 42 20 3e 20 70 50 61 72 65 6e  iv + NB > pParen
26300 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  t->nCell ){.    
26310 6e 78 44 69 76 20 3d 20 70 50 61 72 65 6e 74 2d  nxDiv = pParent-
26320 3e 6e 43 65 6c 6c 20 2d 20 4e 42 20 2b 20 31 3b  >nCell - NB + 1;
26330 0a 20 20 7d 0a 20 20 69 66 28 20 6e 78 44 69 76  .  }.  if( nxDiv
26340 3c 30 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20  <0 ){.    nxDiv 
26350 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 44 69 76 20  = 0;.  }.  nDiv 
26360 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20  = 0;.  for(i=0, 
26370 6b 3d 6e 78 44 69 76 3b 20 69 3c 4e 42 3b 20 69  k=nxDiv; i<NB; i
26380 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, k++){.    if
26390 28 20 6b 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65  ( k<pParent->nCe
263a0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 61 70 44 69  ll ){.      apDi
263b0 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28  v[i] = findCell(
263c0 70 50 61 72 65 6e 74 2c 20 6b 29 3b 0a 20 20 20  pParent, k);.   
263d0 20 20 20 6e 44 69 76 2b 2b 3b 0a 20 20 20 20 20     nDiv++;.     
263e0 20 61 73 73 65 72 74 28 20 21 70 50 61 72 65 6e   assert( !pParen
263f0 74 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 20  t->leaf );.     
26400 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65   pgnoOld[i] = ge
26410 74 34 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29  t4byte(apDiv[i])
26420 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
26430 6b 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c  k==pParent->nCel
26440 6c 20 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 4f  l ){.      pgnoO
26450 6c 64 5b 69 5d 20 3d 20 67 65 74 34 62 79 74 65  ld[i] = get4byte
26460 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
26470 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
26480 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c  set+8]);.    }el
26490 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  se{.      break;
264a0 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
264b0 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
264c0 42 74 2c 20 70 67 6e 6f 4f 6c 64 5b 69 5d 2c 20  Bt, pgnoOld[i], 
264d0 26 61 70 4f 6c 64 5b 69 5d 2c 20 70 50 61 72 65  &apOld[i], pPare
264e0 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  nt);.    if( rc 
264f0 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
26500 6c 65 61 6e 75 70 3b 0a 20 20 20 20 61 70 4f 6c  leanup;.    apOl
26510 64 5b 69 5d 2d 3e 69 64 78 50 61 72 65 6e 74 20  d[i]->idxParent 
26520 3d 20 6b 3b 0a 20 20 20 20 61 70 43 6f 70 79 5b  = k;.    apCopy[
26530 69 5d 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65  i] = 0;.    asse
26540 72 74 28 20 69 3d 3d 6e 4f 6c 64 20 29 3b 0a 20  rt( i==nOld );. 
26550 20 20 20 6e 4f 6c 64 2b 2b 3b 0a 20 20 20 20 6e     nOld++;.    n
26560 4d 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70  MaxCells += 1+ap
26570 4f 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70  Old[i]->nCell+ap
26580 4f 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f  Old[i]->nOverflo
26590 77 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  w;.  }..  /* Mak
265a0 65 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75  e nMaxCells a mu
265b0 6c 74 69 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f  ltiple of 4 in o
265c0 72 64 65 72 20 74 6f 20 70 72 65 73 65 72 76 65  rder to preserve
265d0 20 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69   8-byte.  ** ali
265e0 67 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78  gnment */.  nMax
265f0 43 65 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c  Cells = (nMaxCel
26600 6c 73 20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20 2f  ls + 3)&~3;..  /
26610 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  *.  ** Allocate 
26620 73 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79  space for memory
26630 20 73 74 72 75 63 74 75 72 65 73 0a 20 20 2a 2f   structures.  */
26640 0a 20 20 73 7a 53 63 72 61 74 63 68 20 3d 0a 20  .  szScratch =. 
26650 20 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a        nMaxCells*
26660 73 69 7a 65 6f 66 28 75 38 2a 29 20 20 20 20 20  sizeof(u8*)     
26670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26680 20 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20    /* apCell */. 
26690 20 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a      + nMaxCells*
266a0 73 69 7a 65 6f 66 28 75 31 36 29 20 20 20 20 20  sizeof(u16)     
266b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
266c0 20 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20    /* szCell */. 
266d0 20 20 20 20 2b 20 28 52 4f 55 4e 44 38 28 73 69      + (ROUND8(si
266e0 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 2b 70  zeof(MemPage))+p
266f0 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 2a 4e 42  Bt->pageSize)*NB
26700 20 20 2f 2a 20 61 43 6f 70 79 20 2a 2f 0a 20 20    /* aCopy */.  
26710 20 20 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69     + pBt->pageSi
26720 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
26730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26740 20 2f 2a 20 61 53 70 61 63 65 31 20 2a 2f 0a 20   /* aSpace1 */. 
26750 20 20 20 20 2b 20 28 49 53 41 55 54 4f 56 41 43      + (ISAUTOVAC
26760 55 55 4d 20 3f 20 6e 4d 61 78 43 65 6c 6c 73 20  UUM ? nMaxCells 
26770 3a 20 30 29 3b 20 20 20 20 20 20 20 20 20 20 20  : 0);           
26780 20 20 2f 2a 20 61 46 72 6f 6d 20 2a 2f 0a 20 20    /* aFrom */.  
26790 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33  apCell = sqlite3
267a0 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 20 73  ScratchMalloc( s
267b0 7a 53 63 72 61 74 63 68 20 29 3b 20 0a 20 20 69  zScratch ); .  i
267c0 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a  f( apCell==0 ){.
267d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
267e0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20  NOMEM;.    goto 
267f0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
26800 0a 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20  .  }.  szCell = 
26810 28 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d  (u16*)&apCell[nM
26820 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 43 6f 70  axCells];.  aCop
26830 79 5b 30 5d 20 3d 20 28 75 38 2a 29 26 73 7a 43  y[0] = (u8*)&szC
26840 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a  ell[nMaxCells];.
26850 20 20 61 73 73 65 72 74 28 20 28 28 61 43 6f 70    assert( ((aCop
26860 79 5b 30 5d 20 2d 20 28 75 38 2a 29 61 70 43 65  y[0] - (u8*)apCe
26870 6c 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f  ll) & 7)==0 ); /
26880 2a 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65  * 8-byte alignme
26890 6e 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20  nt required */. 
268a0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 42 3b 20   for(i=1; i<NB; 
268b0 69 2b 2b 29 7b 0a 20 20 20 20 61 43 6f 70 79 5b  i++){.    aCopy[
268c0 69 5d 20 3d 20 26 61 43 6f 70 79 5b 69 2d 31 5d  i] = &aCopy[i-1]
268d0 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52  [pBt->pageSize+R
268e0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d  OUND8(sizeof(Mem
268f0 50 61 67 65 29 29 5d 3b 0a 20 20 20 20 61 73 73  Page))];.    ass
26900 65 72 74 28 20 28 28 61 43 6f 70 79 5b 69 5d 20  ert( ((aCopy[i] 
26910 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29 20 26  - (u8*)apCell) &
26920 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62   7)==0 ); /* 8-b
26930 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65  yte alignment re
26940 71 75 69 72 65 64 20 2a 2f 0a 20 20 7d 0a 20 20  quired */.  }.  
26950 61 53 70 61 63 65 31 20 3d 20 26 61 43 6f 70 79  aSpace1 = &aCopy
26960 5b 4e 42 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65  [NB-1][pBt->page
26970 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65  Size+ROUND8(size
26980 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20  of(MemPage))];. 
26990 20 61 73 73 65 72 74 28 20 28 28 61 53 70 61 63   assert( ((aSpac
269a0 65 31 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c  e1 - (u8*)apCell
269b0 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20  ) & 7)==0 ); /* 
269c0 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74  8-byte alignment
269d0 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 23 69 66   required */.#if
269e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
269f0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69 66  _AUTOVACUUM.  if
26a00 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
26a10 6d 20 29 7b 0a 20 20 20 20 61 46 72 6f 6d 20 3d  m ){.    aFrom =
26a20 20 26 61 53 70 61 63 65 31 5b 70 42 74 2d 3e 70   &aSpace1[pBt->p
26a30 61 67 65 53 69 7a 65 5d 3b 0a 20 20 7d 0a 23 65  ageSize];.  }.#e
26a40 6e 64 69 66 0a 20 20 61 53 70 61 63 65 32 20 3d  ndif.  aSpace2 =
26a50 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c   sqlite3PageMall
26a60 6f 63 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  oc(pBt->pageSize
26a70 29 3b 0a 20 20 69 66 28 20 61 53 70 61 63 65 32  );.  if( aSpace2
26a80 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
26a90 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
26aa0 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63    goto balance_c
26ab0 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 0a 20  leanup;.  }.  . 
26ac0 20 2f 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 63 6f   /*.  ** Make co
26ad0 70 69 65 73 20 6f 66 20 74 68 65 20 63 6f 6e 74  pies of the cont
26ae0 65 6e 74 20 6f 66 20 70 50 61 67 65 20 61 6e 64  ent of pPage and
26af0 20 69 74 73 20 73 69 62 6c 69 6e 67 73 20 69 6e   its siblings in
26b00 74 6f 20 61 4f 6c 64 5b 5d 2e 0a 20 20 2a 2a 20  to aOld[]..  ** 
26b10 54 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73  The rest of this
26b20 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 75   function will u
26b30 73 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65  se data from the
26b40 20 63 6f 70 69 65 73 20 72 61 74 68 65 72 0a 20   copies rather. 
26b50 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 72 69   ** that the ori
26b60 67 69 6e 61 6c 20 70 61 67 65 73 20 73 69 6e 63  ginal pages sinc
26b70 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70  e the original p
26b80 61 67 65 73 20 77 69 6c 6c 20 62 65 20 69 6e 20  ages will be in 
26b90 74 68 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73 73  the.  ** process
26ba0 20 6f 66 20 62 65 69 6e 67 20 6f 76 65 72 77 72   of being overwr
26bb0 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 66 6f  itten..  */.  fo
26bc0 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69  r(i=0; i<nOld; i
26bd0 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  ++){.    MemPage
26be0 20 2a 70 20 3d 20 61 70 43 6f 70 79 5b 69 5d 20   *p = apCopy[i] 
26bf0 3d 20 28 4d 65 6d 50 61 67 65 2a 29 61 43 6f 70  = (MemPage*)aCop
26c00 79 5b 69 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  y[i];.    memcpy
26c10 28 70 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73 69  (p, apOld[i], si
26c20 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b 0a  zeof(MemPage));.
26c30 20 20 20 20 70 2d 3e 61 44 61 74 61 20 3d 20 28      p->aData = (
26c40 76 6f 69 64 2a 29 26 70 5b 31 5d 3b 0a 20 20 20  void*)&p[1];.   
26c50 20 6d 65 6d 63 70 79 28 70 2d 3e 61 44 61 74 61   memcpy(p->aData
26c60 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61 74  , apOld[i]->aDat
26c70 61 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  a, pBt->pageSize
26c80 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  );.  }..  /*.  *
26c90 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73 20  * Load pointers 
26ca0 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20  to all cells on 
26cb0 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61 6e  sibling pages an
26cc0 64 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  d the divider ce
26cd0 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74 68  lls.  ** into th
26ce0 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b 5d  e local apCell[]
26cf0 20 61 72 72 61 79 2e 20 20 4d 61 6b 65 20 63 6f   array.  Make co
26d00 70 69 65 73 20 6f 66 20 74 68 65 20 64 69 76 69  pies of the divi
26d10 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69  der cells.  ** i
26d20 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e  nto space obtain
26d30 65 64 20 66 6f 72 6d 20 61 53 70 61 63 65 31 5b  ed form aSpace1[
26d40 5d 20 61 6e 64 20 72 65 6d 6f 76 65 20 74 68 65  ] and remove the
26d50 20 74 68 65 20 64 69 76 69 64 65 72 20 43 65 6c   the divider Cel
26d60 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50 61  ls.  ** from pPa
26d70 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rent..  **.  ** 
26d80 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20  If the siblings 
26d90 61 72 65 20 6f 6e 20 6c 65 61 66 20 70 61 67 65  are on leaf page
26da0 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69 6c  s, then the chil
26db0 64 20 70 6f 69 6e 74 65 72 73 20 6f 66 20 74 68  d pointers of th
26dc0 65 0a 20 20 2a 2a 20 64 69 76 69 64 65 72 20 63  e.  ** divider c
26dd0 65 6c 6c 73 20 61 72 65 20 73 74 72 69 70 70 65  ells are strippe
26de0 64 20 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c 73  d from the cells
26df0 20 62 65 66 6f 72 65 20 74 68 65 79 20 61 72 65   before they are
26e00 20 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e 74   copied.  ** int
26e10 6f 20 61 53 70 61 63 65 31 5b 5d 2e 20 20 49 6e  o aSpace1[].  In
26e20 20 74 68 69 73 20 77 61 79 2c 20 61 6c 6c 20 63   this way, all c
26e30 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d  ells in apCell[]
26e40 20 61 72 65 20 77 69 74 68 6f 75 74 0a 20 20 2a   are without.  *
26e50 2a 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73  * child pointers
26e60 2e 20 20 49 66 20 73 69 62 6c 69 6e 67 73 20 61  .  If siblings a
26e70 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20 74  re not leaves, t
26e80 68 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e 0a  hen all cell in.
26e90 20 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69 6e    ** apCell[] in
26ea0 63 6c 75 64 65 20 63 68 69 6c 64 20 70 6f 69 6e  clude child poin
26eb0 74 65 72 73 2e 20 20 45 69 74 68 65 72 20 77 61  ters.  Either wa
26ec0 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20  y, all cells in 
26ed0 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61 72  apCell[].  ** ar
26ee0 65 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20 20  e alike..  **.  
26ef0 2a 2a 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  ** leafCorrectio
26f00 6e 3a 20 20 34 20 69 66 20 70 50 61 67 65 20 69  n:  4 if pPage i
26f10 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66 20  s a leaf.  0 if 
26f20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 61 20 6c  pPage is not a l
26f30 65 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20 20  eaf..  **       
26f40 6c 65 61 66 44 61 74 61 3a 20 20 31 20 69 66 20  leafData:  1 if 
26f50 70 50 61 67 65 20 68 6f 6c 64 73 20 6b 65 79 2b  pPage holds key+
26f60 64 61 74 61 20 61 6e 64 20 70 50 61 72 65 6e 74  data and pParent
26f70 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79 73   holds only keys
26f80 2e 0a 20 20 2a 2f 0a 20 20 6e 43 65 6c 6c 20 3d  ..  */.  nCell =
26f90 20 30 3b 0a 20 20 6c 65 61 66 43 6f 72 72 65 63   0;.  leafCorrec
26fa0 74 69 6f 6e 20 3d 20 70 50 61 67 65 2d 3e 6c 65  tion = pPage->le
26fb0 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74 61  af*4;.  leafData
26fc0 20 3d 20 70 50 61 67 65 2d 3e 6c 65 61 66 44 61   = pPage->leafDa
26fd0 74 61 20 26 26 20 70 50 61 67 65 2d 3e 6c 65 61  ta && pPage->lea
26fe0 66 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  f;.  for(i=0; i<
26ff0 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nOld; i++){.    
27000 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d 20  MemPage *pOld = 
27010 61 70 43 6f 70 79 5b 69 5d 3b 0a 20 20 20 20 69  apCopy[i];.    i
27020 6e 74 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64 2d  nt limit = pOld-
27030 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f 76  >nCell+pOld->nOv
27040 65 72 66 6c 6f 77 3b 0a 20 20 20 20 66 6f 72 28  erflow;.    for(
27050 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a 2b  j=0; j<limit; j+
27060 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
27070 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c  ( nCell<nMaxCell
27080 73 20 29 3b 0a 20 20 20 20 20 20 61 70 43 65 6c  s );.      apCel
27090 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64 4f  l[nCell] = findO
270a0 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c 64  verflowCell(pOld
270b0 2c 20 6a 29 3b 0a 20 20 20 20 20 20 73 7a 43 65  , j);.      szCe
270c0 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c 6c  ll[nCell] = cell
270d0 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61 70  SizePtr(pOld, ap
270e0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 23 69  Cell[nCell]);.#i
270f0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
27100 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
27110 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
27120 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20  Vacuum ){.      
27130 20 20 69 6e 74 20 61 3b 0a 20 20 20 20 20 20 20    int a;.       
27140 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20   aFrom[nCell] = 
27150 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 61  i;.        for(a
27160 3d 30 3b 20 61 3c 70 4f 6c 64 2d 3e 6e 4f 76 65  =0; a<pOld->nOve
27170 72 66 6c 6f 77 3b 20 61 2b 2b 29 7b 0a 20 20 20  rflow; a++){.   
27180 20 20 20 20 20 20 20 69 66 28 20 70 4f 6c 64 2d         if( pOld-
27190 3e 61 4f 76 66 6c 5b 61 5d 2e 70 43 65 6c 6c 3d  >aOvfl[a].pCell=
271a0 3d 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 29  =apCell[nCell] )
271b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 46  {.            aF
271c0 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46  rom[nCell] = 0xF
271d0 46 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  F;.            b
271e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
271f0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
27200 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
27210 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a   nCell++;.    }.
27220 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31      if( i<nOld-1
27230 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20 73 7a   ){.      u16 sz
27240 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
27250 50 61 72 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d  Parent, apDiv[i]
27260 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6c 65 61  );.      if( lea
27270 66 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  fData ){.       
27280 20 2f 2a 20 57 69 74 68 20 74 68 65 20 4c 45 41   /* With the LEA
27290 46 44 41 54 41 20 66 6c 61 67 2c 20 70 50 61 72  FDATA flag, pPar
272a0 65 6e 74 20 63 65 6c 6c 73 20 68 6f 6c 64 20 6f  ent cells hold o
272b0 6e 6c 79 20 49 4e 54 4b 45 59 73 20 74 68 61 74  nly INTKEYs that
272c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20  .        ** are 
272d0 64 75 70 6c 69 63 61 74 65 73 20 6f 66 20 6b 65  duplicates of ke
272e0 79 73 20 6f 6e 20 74 68 65 20 63 68 69 6c 64 20  ys on the child 
272f0 70 61 67 65 73 2e 20 20 57 65 20 6e 65 65 64 20  pages.  We need 
27300 74 6f 20 72 65 6d 6f 76 65 0a 20 20 20 20 20 20  to remove.      
27310 20 20 2a 2a 20 74 68 65 20 64 69 76 69 64 65 72    ** the divider
27320 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 50 61 72   cells from pPar
27330 65 6e 74 2c 20 62 75 74 20 74 68 65 20 64 69 76  ent, but the div
27340 69 64 65 72 73 20 63 65 6c 6c 73 20 61 72 65 20  iders cells are 
27350 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  not.        ** a
27360 64 64 65 64 20 74 6f 20 61 70 43 65 6c 6c 5b 5d  dded to apCell[]
27370 20 62 65 63 61 75 73 65 20 74 68 65 79 20 61 72   because they ar
27380 65 20 64 75 70 6c 69 63 61 74 65 73 20 6f 66 20  e duplicates of 
27390 63 68 69 6c 64 20 63 65 6c 6c 73 2e 0a 20 20 20  child cells..   
273a0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
273b0 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74  dropCell(pParent
273c0 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20  , nxDiv, sz);.  
273d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
273e0 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20     u8 *pTemp;.  
273f0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 43        assert( nC
27400 65 6c 6c 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ell<nMaxCells );
27410 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b  .        szCell[
27420 6e 43 65 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20  nCell] = sz;.   
27430 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61 53       pTemp = &aS
27440 70 61 63 65 31 5b 69 53 70 61 63 65 31 5d 3b 0a  pace1[iSpace1];.
27450 20 20 20 20 20 20 20 20 69 53 70 61 63 65 31 20          iSpace1 
27460 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 20 20 61  += sz;.        a
27470 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e  ssert( sz<=pBt->
27480 70 61 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20  pageSize/4 );.  
27490 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53        assert( iS
274a0 70 61 63 65 31 3c 3d 70 42 74 2d 3e 70 61 67 65  pace1<=pBt->page
274b0 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
274c0 6d 65 6d 63 70 79 28 70 54 65 6d 70 2c 20 61 70  memcpy(pTemp, ap
274d0 44 69 76 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20  Div[i], sz);.   
274e0 20 20 20 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c       apCell[nCel
274f0 6c 5d 20 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43  l] = pTemp+leafC
27500 6f 72 72 65 63 74 69 6f 6e 3b 0a 23 69 66 6e 64  orrection;.#ifnd
27510 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
27520 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
27530 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
27540 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20  acuum ){.       
27550 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20     aFrom[nCell] 
27560 3d 20 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20  = 0xFF;.        
27570 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
27580 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e   dropCell(pParen
27590 74 2c 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20  t, nxDiv, sz);. 
275a0 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43         szCell[nC
275b0 65 6c 6c 5d 20 2d 3d 20 6c 65 61 66 43 6f 72 72  ell] -= leafCorr
275c0 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20  ection;.        
275d0 61 73 73 65 72 74 28 20 67 65 74 34 62 79 74 65  assert( get4byte
275e0 28 70 54 65 6d 70 29 3d 3d 70 67 6e 6f 4f 6c 64  (pTemp)==pgnoOld
275f0 5b 69 5d 20 29 3b 0a 20 20 20 20 20 20 20 20 69  [i] );.        i
27600 66 28 20 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29  f( !pOld->leaf )
27610 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65  {.          asse
27620 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69  rt( leafCorrecti
27630 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  on==0 );.       
27640 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20     /* The right 
27650 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20 63  pointer of the c
27660 68 69 6c 64 20 70 61 67 65 20 70 4f 6c 64 20 62  hild page pOld b
27670 65 63 6f 6d 65 73 20 74 68 65 20 6c 65 66 74 0a  ecomes the left.
27680 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 69            ** poi
27690 6e 74 65 72 20 6f 66 20 74 68 65 20 64 69 76 69  nter of the divi
276a0 64 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20  der cell */.    
276b0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 61 70 43        memcpy(apC
276c0 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c  ell[nCell], &pOl
276d0 64 2d 3e 61 44 61 74 61 5b 70 4f 6c 64 2d 3e 68  d->aData[pOld->h
276e0 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 34 29 3b  drOffset+8], 4);
276f0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
27700 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
27710 28 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  ( leafCorrection
27720 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==4 );.         
27730 20 69 66 28 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c   if( szCell[nCel
27740 6c 5d 3c 34 20 29 7b 0a 20 20 20 20 20 20 20 20  l]<4 ){.        
27750 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c      /* Do not al
27760 6c 6f 77 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d  low any cells sm
27770 61 6c 6c 65 72 20 74 68 61 6e 20 34 20 62 79 74  aller than 4 byt
27780 65 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  es. */.         
27790 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d     szCell[nCell]
277a0 20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 20 20   = 4;.          
277b0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
277c0 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20      nCell++;.   
277d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
277e0 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65    /*.  ** Figure
277f0 20 6f 75 74 20 74 68 65 20 6e 75 6d 62 65 72 20   out the number 
27800 6f 66 20 70 61 67 65 73 20 6e 65 65 64 65 64 20  of pages needed 
27810 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c  to hold all nCel
27820 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74  l cells..  ** St
27830 6f 72 65 20 74 68 69 73 20 6e 75 6d 62 65 72 20  ore this number 
27840 69 6e 20 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f  in "k".  Also co
27850 6d 70 75 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68  mpute szNew[] wh
27860 69 63 68 20 69 73 20 74 68 65 20 74 6f 74 61 6c  ich is the total
27870 0a 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c  .  ** size of al
27880 6c 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69  l cells on the i
27890 2d 74 68 20 70 61 67 65 20 61 6e 64 20 63 6e 74  -th page and cnt
278a0 4e 65 77 5b 5d 20 77 68 69 63 68 20 69 73 20 74  New[] which is t
278b0 68 65 20 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e  he index.  ** in
278c0 20 61 70 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65   apCell[] of the
278d0 20 63 65 6c 6c 20 74 68 61 74 20 64 69 76 69 64   cell that divid
278e0 65 73 20 70 61 67 65 20 69 20 66 72 6f 6d 20 70  es page i from p
278f0 61 67 65 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20  age i+1.  .  ** 
27900 63 6e 74 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64  cntNew[k] should
27910 20 65 71 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20   equal nCell..  
27920 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75 65 73 20 63  **.  ** Values c
27930 6f 6d 70 75 74 65 64 20 62 79 20 74 68 69 73 20  omputed by this 
27940 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  block:.  **.  **
27950 20 20 20 20 20 20 20 20 20 20 20 6b 3a 20 54 68             k: Th
27960 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
27970 66 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 0a  f sibling pages.
27980 20 20 2a 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d    **    szNew[i]
27990 3a 20 53 70 61 63 65 64 20 75 73 65 64 20 6f 6e  : Spaced used on
279a0 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69 6e   the i-th siblin
279b0 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63  g page..  **   c
279c0 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20  ntNew[i]: Index 
279d0 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20  in apCell[] and 
279e0 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65  szCell[] for the
279f0 20 66 69 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20   first cell to. 
27a00 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20   **             
27a10 20 74 68 65 20 72 69 67 68 74 20 6f 66 20 74 68   the right of th
27a20 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70  e i-th sibling p
27a30 61 67 65 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65  age..  ** usable
27a40 53 70 61 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66  Space: Number of
27a50 20 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20   bytes of space 
27a60 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63  available on eac
27a70 68 20 73 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20  h sibling..  ** 
27a80 0a 20 20 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70  .  */.  usableSp
27a90 61 63 65 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c  ace = pBt->usabl
27aa0 65 53 69 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61  eSize - 12 + lea
27ab0 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66  fCorrection;.  f
27ac0 6f 72 28 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d  or(subtotal=k=i=
27ad0 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
27ae0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3c  {.    assert( i<
27af0 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20  nMaxCells );.   
27b00 20 73 75 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43   subtotal += szC
27b10 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20  ell[i] + 2;.    
27b20 69 66 28 20 73 75 62 74 6f 74 61 6c 20 3e 20 75  if( subtotal > u
27b30 73 61 62 6c 65 53 70 61 63 65 20 29 7b 0a 20 20  sableSpace ){.  
27b40 20 20 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73      szNew[k] = s
27b50 75 62 74 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c  ubtotal - szCell
27b60 5b 69 5d 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65  [i];.      cntNe
27b70 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20  w[k] = i;.      
27b80 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 20  if( leafData ){ 
27b90 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 73 75 62  i--; }.      sub
27ba0 74 6f 74 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20  total = 0;.     
27bb0 20 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   k++;.    }.  }.
27bc0 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62    szNew[k] = sub
27bd0 74 6f 74 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b  total;.  cntNew[
27be0 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b  k] = nCell;.  k+
27bf0 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68  +;..  /*.  ** Th
27c00 65 20 70 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74  e packing comput
27c10 65 64 20 62 79 20 74 68 65 20 70 72 65 76 69 6f  ed by the previo
27c20 75 73 20 62 6c 6f 63 6b 20 69 73 20 62 69 61 73  us block is bias
27c30 65 64 20 74 6f 77 61 72 64 20 74 68 65 20 73 69  ed toward the si
27c40 62 6c 69 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74  blings.  ** on t
27c50 68 65 20 6c 65 66 74 20 73 69 64 65 2e 20 20 54  he left side.  T
27c60 68 65 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 73  he left siblings
27c70 20 61 72 65 20 61 6c 77 61 79 73 20 6e 65 61 72   are always near
27c80 6c 79 20 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74  ly full, while t
27c90 68 65 0a 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f  he.  ** right-mo
27ca0 73 74 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74  st sibling might
27cb0 20 62 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79   be nearly empty
27cc0 2e 20 20 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66  .  This block of
27cd0 20 63 6f 64 65 20 61 74 74 65 6d 70 74 73 0a 20   code attempts. 
27ce0 20 2a 2a 20 74 6f 20 61 64 6a 75 73 74 20 74 68   ** to adjust th
27cf0 65 20 70 61 63 6b 69 6e 67 20 6f 66 20 73 69 62  e packing of sib
27d00 6c 69 6e 67 73 20 74 6f 20 67 65 74 20 61 20 62  lings to get a b
27d10 65 74 74 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20  etter balance.. 
27d20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 61 64   **.  ** This ad
27d30 6a 75 73 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65  justment is more
27d40 20 74 68 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a   than an optimiz
27d50 61 74 69 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b  ation.  The pack
27d60 69 6e 67 20 61 62 6f 76 65 20 6d 69 67 68 74 0a  ing above might.
27d70 20 20 2a 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f    ** be so out o
27d80 66 20 62 61 6c 61 6e 63 65 20 61 73 20 74 6f 20  f balance as to 
27d90 62 65 20 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72  be illegal.  For
27da0 20 65 78 61 6d 70 6c 65 2c 20 74 68 65 20 72 69   example, the ri
27db0 67 68 74 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69  ght-most.  ** si
27dc0 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 63  bling might be c
27dd0 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e  ompletely empty.
27de0 20 20 54 68 69 73 20 61 64 6a 75 73 74 6d 65 6e    This adjustmen
27df0 74 20 69 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61  t is not optiona
27e00 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  l..  */.  for(i=
27e10 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a  k-1; i>0; i--){.
27e20 20 20 20 20 69 6e 74 20 73 7a 52 69 67 68 74 20      int szRight 
27e30 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20  = szNew[i];  /* 
27e40 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20  Size of sibling 
27e50 6f 6e 20 74 68 65 20 72 69 67 68 74 20 2a 2f 0a  on the right */.
27e60 20 20 20 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d      int szLeft =
27e70 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20   szNew[i-1]; /* 
27e80 53 69 7a 65 20 6f 66 20 73 69 62 6c 69 6e 67 20  Size of sibling 
27e90 6f 6e 20 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20  on the left */. 
27ea0 20 20 20 69 6e 74 20 72 3b 20 20 20 20 20 20 20     int r;       
27eb0 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
27ec0 6f 66 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 65  of right-most ce
27ed0 6c 6c 20 69 6e 20 6c 65 66 74 20 73 69 62 6c 69  ll in left sibli
27ee0 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b  ng */.    int d;
27ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27f00 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
27f10 63 65 6c 6c 20 74 6f 20 74 68 65 20 6c 65 66 74  cell to the left
27f20 20 6f 66 20 72 69 67 68 74 20 73 69 62 6c 69 6e   of right siblin
27f30 67 20 2a 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e  g */..    r = cn
27f40 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20  tNew[i-1] - 1;. 
27f50 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c     d = r + 1 - l
27f60 65 61 66 44 61 74 61 3b 0a 20 20 20 20 61 73 73  eafData;.    ass
27f70 65 72 74 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73  ert( d<nMaxCells
27f80 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
27f90 72 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  r<nMaxCells );. 
27fa0 20 20 20 77 68 69 6c 65 28 20 73 7a 52 69 67 68     while( szRigh
27fb0 74 3d 3d 30 20 7c 7c 20 73 7a 52 69 67 68 74 2b  t==0 || szRight+
27fc0 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c  szCell[d]+2<=szL
27fd0 65 66 74 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32  eft-(szCell[r]+2
27fe0 29 20 29 7b 0a 20 20 20 20 20 20 73 7a 52 69 67  ) ){.      szRig
27ff0 68 74 20 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20  ht += szCell[d] 
28000 2b 20 32 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66  + 2;.      szLef
28010 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b  t -= szCell[r] +
28020 20 32 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77   2;.      cntNew
28030 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72  [i-1]--;.      r
28040 20 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d   = cntNew[i-1] -
28050 20 31 3b 0a 20 20 20 20 20 20 64 20 3d 20 72 20   1;.      d = r 
28060 2b 20 31 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a  + 1 - leafData;.
28070 20 20 20 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b      }.    szNew[
28080 69 5d 20 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20  i] = szRight;.  
28090 20 20 73 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73    szNew[i-1] = s
280a0 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  zLeft;.  }..  /*
280b0 20 45 69 74 68 65 72 20 77 65 20 66 6f 75 6e 64   Either we found
280c0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c   one or more cel
280d0 6c 73 20 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30  ls (cntnew[0])>0
280e0 29 20 6f 72 20 77 65 20 61 72 65 20 74 68 65 0a  ) or we are the.
280f0 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20 72    ** a virtual r
28100 6f 6f 74 20 70 61 67 65 2e 20 20 41 20 76 69 72  oot page.  A vir
28110 74 75 61 6c 20 72 6f 6f 74 20 70 61 67 65 20 69  tual root page i
28120 73 20 77 68 65 6e 20 74 68 65 20 72 65 61 6c 20  s when the real 
28130 72 6f 6f 74 0a 20 20 2a 2a 20 70 61 67 65 20 69  root.  ** page i
28140 73 20 70 61 67 65 20 31 20 61 6e 64 20 77 65 20  s page 1 and we 
28150 61 72 65 20 74 68 65 20 6f 6e 6c 79 20 63 68 69  are the only chi
28160 6c 64 20 6f 66 20 74 68 61 74 20 70 61 67 65 2e  ld of that page.
28170 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
28180 63 6e 74 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28  cntNew[0]>0 || (
28190 70 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31  pParent->pgno==1
281a0 20 26 26 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65   && pParent->nCe
281b0 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 0a  ll==0) );..  /*.
281c0 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20    ** Allocate k 
281d0 6e 65 77 20 70 61 67 65 73 2e 20 20 52 65 75 73  new pages.  Reus
281e0 65 20 6f 6c 64 20 70 61 67 65 73 20 77 68 65 72  e old pages wher
281f0 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f  e possible..  */
28200 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
28210 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70 61  ->pgno>1 );.  pa
28220 67 65 46 6c 61 67 73 20 3d 20 70 50 61 67 65 2d  geFlags = pPage-
28230 3e 61 44 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72  >aData[0];.  for
28240 28 69 3d 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b  (i=0; i<k; i++){
28250 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  .    MemPage *pN
28260 65 77 3b 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f  ew;.    if( i<nO
28270 6c 64 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77  ld ){.      pNew
28280 20 3d 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70   = apNew[i] = ap
28290 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67  Old[i];.      pg
282a0 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4f  noNew[i] = pgnoO
282b0 6c 64 5b 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f  ld[i];.      apO
282c0 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ld[i] = 0;.     
282d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
282e0 65 72 57 72 69 74 65 28 70 4e 65 77 2d 3e 70 44  erWrite(pNew->pD
282f0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e  bPage);.      nN
28300 65 77 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  ew++;.      if( 
28310 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
28320 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d  e_cleanup;.    }
28330 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
28340 72 74 28 20 69 3e 30 20 29 3b 0a 20 20 20 20 20  rt( i>0 );.     
28350 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
28360 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 4e  reePage(pBt, &pN
28370 65 77 2c 20 26 70 67 6e 6f 4e 65 77 5b 69 5d 2c  ew, &pgnoNew[i],
28380 20 70 67 6e 6f 4e 65 77 5b 69 2d 31 5d 2c 20 30   pgnoNew[i-1], 0
28390 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
283a0 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
283b0 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 61 70  leanup;.      ap
283c0 4e 65 77 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20  New[i] = pNew;. 
283d0 20 20 20 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20       nNew++;.   
283e0 20 7d 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28   }.    zeroPage(
283f0 70 4e 65 77 2c 20 70 61 67 65 46 6c 61 67 73 29  pNew, pageFlags)
28400 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65  ;.  }..  /* Free
28410 20 61 6e 79 20 6f 6c 64 20 70 61 67 65 73 20 74   any old pages t
28420 68 61 74 20 77 65 72 65 20 6e 6f 74 20 72 65 75  hat were not reu
28430 73 65 64 20 61 73 20 6e 65 77 20 70 61 67 65 73  sed as new pages
28440 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  ..  */.  while( 
28450 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 72 63  i<nOld ){.    rc
28460 20 3d 20 66 72 65 65 50 61 67 65 28 61 70 4f 6c   = freePage(apOl
28470 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72  d[i]);.    if( r
28480 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65  c ) goto balance
28490 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72 65  _cleanup;.    re
284a0 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b  leasePage(apOld[
284b0 69 5d 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69  i]);.    apOld[i
284c0 5d 20 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a  ] = 0;.    i++;.
284d0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50    }..  /*.  ** P
284e0 75 74 20 74 68 65 20 6e 65 77 20 70 61 67 65 73  ut the new pages
284f0 20 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72   in accending or
28500 64 65 72 2e 20 20 54 68 69 73 20 68 65 6c 70 73  der.  This helps
28510 20 74 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e   to.  ** keep en
28520 74 72 69 65 73 20 69 6e 20 74 68 65 20 64 69 73  tries in the dis
28530 6b 20 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20  k file in order 
28540 73 6f 20 74 68 61 74 20 61 20 73 63 61 6e 0a 20  so that a scan. 
28550 20 2a 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65   ** of the table
28560 20 69 73 20 61 20 6c 69 6e 65 61 72 20 73 63 61   is a linear sca
28570 6e 20 74 68 72 6f 75 67 68 20 74 68 65 20 66 69  n through the fi
28580 6c 65 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20 69  le.  That.  ** i
28590 6e 20 74 75 72 6e 20 68 65 6c 70 73 20 74 68 65  n turn helps the
285a0 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
285b0 6d 20 74 6f 20 64 65 6c 69 76 65 72 20 70 61 67  m to deliver pag
285c0 65 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65  es.  ** from the
285d0 20 64 69 73 6b 20 6d 6f 72 65 20 72 61 70 69 64   disk more rapid
285e0 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e  ly..  **.  ** An
285f0 20 4f 28 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f   O(n^2) insertio
28600 6e 20 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d  n sort algorithm
28610 20 69 73 20 75 73 65 64 2c 20 62 75 74 20 73 69   is used, but si
28620 6e 63 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65  nce.  ** n is ne
28630 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42  ver more than NB
28640 20 28 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61   (a small consta
28650 6e 74 29 2c 20 74 68 61 74 20 73 68 6f 75 6c 64  nt), that should
28660 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70  .  ** not be a p
28670 72 6f 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a  roblem..  **.  *
28680 2a 20 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68  * When NB==3, th
28690 69 73 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74  is one optimizat
286a0 69 6f 6e 20 6d 61 6b 65 73 20 74 68 65 20 64 61  ion makes the da
286b0 74 61 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75  tabase.  ** abou
286c0 74 20 32 35 25 20 66 61 73 74 65 72 20 66 6f 72  t 25% faster for
286d0 20 6c 61 72 67 65 20 69 6e 73 65 72 74 69 6f 6e   large insertion
286e0 73 20 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e  s and deletions.
286f0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
28700 20 69 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20   i<k-1; i++){.  
28710 20 20 69 6e 74 20 6d 69 6e 56 20 3d 20 70 67 6e    int minV = pgn
28720 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 69 6e 74  oNew[i];.    int
28730 20 6d 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66   minI = i;.    f
28740 6f 72 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a  or(j=i+1; j<k; j
28750 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
28760 67 6e 6f 4e 65 77 5b 6a 5d 3c 28 75 6e 73 69 67  gnoNew[j]<(unsig
28770 6e 65 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20  ned)minV ){.    
28780 20 20 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20      minI = j;.  
28790 20 20 20 20 20 20 6d 69 6e 56 20 3d 20 70 67 6e        minV = pgn
287a0 6f 4e 65 77 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d  oNew[j];.      }
287b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d  .    }.    if( m
287c0 69 6e 49 3e 69 20 29 7b 0a 20 20 20 20 20 20 69  inI>i ){.      i
287d0 6e 74 20 74 3b 0a 20 20 20 20 20 20 4d 65 6d 50  nt t;.      MemP
287e0 61 67 65 20 2a 70 54 3b 0a 20 20 20 20 20 20 74  age *pT;.      t
287f0 20 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20   = pgnoNew[i];. 
28800 20 20 20 20 20 70 54 20 3d 20 61 70 4e 65 77 5b       pT = apNew[
28810 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65  i];.      pgnoNe
28820 77 5b 69 5d 20 3d 20 70 67 6e 6f 4e 65 77 5b 6d  w[i] = pgnoNew[m
28830 69 6e 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65  inI];.      apNe
28840 77 5b 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e  w[i] = apNew[min
28850 49 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65  I];.      pgnoNe
28860 77 5b 6d 69 6e 49 5d 20 3d 20 74 3b 0a 20 20 20  w[minI] = t;.   
28870 20 20 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d     apNew[minI] =
28880 20 70 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   pT;.    }.  }. 
28890 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
288a0 3a 20 6f 6c 64 3a 20 25 64 20 25 64 20 25 64 20  : old: %d %d %d 
288b0 20 6e 65 77 3a 20 25 64 28 25 64 29 20 25 64 28   new: %d(%d) %d(
288c0 25 64 29 20 25 64 28 25 64 29 20 25 64 28 25 64  %d) %d(%d) %d(%d
288d0 29 20 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20  ) %d(%d)\n",.   
288e0 20 70 67 6e 6f 4f 6c 64 5b 30 5d 2c 20 0a 20 20   pgnoOld[0], .  
288f0 20 20 6e 4f 6c 64 3e 3d 32 20 3f 20 70 67 6e 6f    nOld>=2 ? pgno
28900 4f 6c 64 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20  Old[1] : 0,.    
28910 6e 4f 6c 64 3e 3d 33 20 3f 20 70 67 6e 6f 4f 6c  nOld>=3 ? pgnoOl
28920 64 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20 70 67  d[2] : 0,.    pg
28930 6e 6f 4e 65 77 5b 30 5d 2c 20 73 7a 4e 65 77 5b  noNew[0], szNew[
28940 30 5d 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20  0],.    nNew>=2 
28950 3f 20 70 67 6e 6f 4e 65 77 5b 31 5d 20 3a 20 30  ? pgnoNew[1] : 0
28960 2c 20 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65  , nNew>=2 ? szNe
28970 77 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e  w[1] : 0,.    nN
28980 65 77 3e 3d 33 20 3f 20 70 67 6e 6f 4e 65 77 5b  ew>=3 ? pgnoNew[
28990 32 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20  2] : 0, nNew>=3 
289a0 3f 20 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a  ? szNew[2] : 0,.
289b0 20 20 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 70 67      nNew>=4 ? pg
289c0 6e 6f 4e 65 77 5b 33 5d 20 3a 20 30 2c 20 6e 4e  noNew[3] : 0, nN
289d0 65 77 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d  ew>=4 ? szNew[3]
289e0 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d   : 0,.    nNew>=
289f0 35 20 3f 20 70 67 6e 6f 4e 65 77 5b 34 5d 20 3a  5 ? pgnoNew[4] :
28a00 20 30 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a   0, nNew>=5 ? sz
28a10 4e 65 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20  New[4] : 0));.. 
28a20 20 2f 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20   /*.  ** Evenly 
28a30 64 69 73 74 72 69 62 75 74 65 20 74 68 65 20 64  distribute the d
28a40 61 74 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  ata in apCell[] 
28a50 61 63 72 6f 73 73 20 74 68 65 20 6e 65 77 20 70  across the new p
28a60 61 67 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72  ages..  ** Inser
28a70 74 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20  t divider cells 
28a80 69 6e 74 6f 20 70 50 61 72 65 6e 74 20 61 73 20  into pParent as 
28a90 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a  necessary..  */.
28aa0 20 20 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69    j = 0;.  for(i
28ab0 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29  =0; i<nNew; i++)
28ac0 7b 0a 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c  {.    /* Assembl
28ad0 65 20 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e  e the new siblin
28ae0 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d  g page. */.    M
28af0 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61  emPage *pNew = a
28b00 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73  pNew[i];.    ass
28b10 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73  ert( j<nMaxCells
28b20 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
28b30 70 4e 65 77 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f  pNew->pgno==pgno
28b40 4e 65 77 5b 69 5d 20 29 3b 0a 20 20 20 20 61 73  New[i] );.    as
28b50 73 65 6d 62 6c 65 50 61 67 65 28 70 4e 65 77 2c  semblePage(pNew,
28b60 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61   cntNew[i]-j, &a
28b70 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c  pCell[j], &szCel
28b80 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  l[j]);.    asser
28b90 74 28 20 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30  t( pNew->nCell>0
28ba0 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20   || (nNew==1 && 
28bb0 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b  cntNew[0]==0) );
28bc0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
28bd0 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  w->nOverflow==0 
28be0 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  );..#ifndef SQLI
28bf0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
28c00 55 4d 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  UM.    /* If thi
28c10 73 20 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63  s is an auto-vac
28c20 75 75 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70  uum database, up
28c30 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
28c40 20 6d 61 70 20 65 6e 74 72 69 65 73 0a 20 20 20   map entries.   
28c50 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74   ** that point t
28c60 6f 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 74  o the siblings t
28c70 68 61 74 20 77 65 72 65 20 72 65 61 72 72 61 6e  hat were rearran
28c80 67 65 64 2e 20 54 68 65 73 65 20 63 61 6e 20 62  ged. These can b
28c90 65 3a 20 6c 65 66 74 0a 20 20 20 20 2a 2a 20 63  e: left.    ** c
28ca0 68 69 6c 64 72 65 6e 20 6f 66 20 63 65 6c 6c 73  hildren of cells
28cb0 2c 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  , the right-chil
28cc0 64 20 6f 66 20 74 68 65 20 70 61 67 65 2c 20 6f  d of the page, o
28cd0 72 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  r overflow pages
28ce0 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20  .    ** pointed 
28cf0 74 6f 20 62 79 20 63 65 6c 6c 73 2e 0a 20 20 20  to by cells..   
28d00 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 42 74 2d   */.    if( pBt-
28d10 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
28d20 20 20 20 20 20 66 6f 72 28 6b 3d 6a 3b 20 6b 3c       for(k=j; k<
28d30 63 6e 74 4e 65 77 5b 69 5d 3b 20 6b 2b 2b 29 7b  cntNew[i]; k++){
28d40 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
28d50 20 6b 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   k<nMaxCells );.
28d60 20 20 20 20 20 20 20 20 69 66 28 20 61 46 72 6f          if( aFro
28d70 6d 5b 6b 5d 3d 3d 30 78 46 46 20 7c 7c 20 61 70  m[k]==0xFF || ap
28d80 43 6f 70 79 5b 61 46 72 6f 6d 5b 6b 5d 5d 2d 3e  Copy[aFrom[k]]->
28d90 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67 6e 6f  pgno!=pNew->pgno
28da0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
28db0 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c   = ptrmapPutOvfl
28dc0 28 70 4e 65 77 2c 20 6b 2d 6a 29 3b 0a 20 20 20  (pNew, k-j);.   
28dd0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
28de0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
28df0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c          goto bal
28e00 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
28e10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
28e20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
28e30 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 6a 20  }.#endif..    j 
28e40 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a 20 20  = cntNew[i];..  
28e50 20 20 2f 2a 20 49 66 20 74 68 65 20 73 69 62 6c    /* If the sibl
28e60 69 6e 67 20 70 61 67 65 20 61 73 73 65 6d 62 6c  ing page assembl
28e70 65 64 20 61 62 6f 76 65 20 77 61 73 20 6e 6f 74  ed above was not
28e80 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
28e90 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a 2a 20  sibling,.    ** 
28ea0 69 6e 73 65 72 74 20 61 20 64 69 76 69 64 65 72  insert a divider
28eb0 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65 20 70   cell into the p
28ec0 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20 20 20  arent page..    
28ed0 2a 2f 0a 20 20 20 20 69 66 28 20 69 3c 6e 4e 65  */.    if( i<nNe
28ee0 77 2d 31 20 26 26 20 6a 3c 6e 43 65 6c 6c 20 29  w-1 && j<nCell )
28ef0 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c  {.      u8 *pCel
28f00 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a 70 54 65  l;.      u8 *pTe
28f10 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a  mp;.      int sz
28f20 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ;..      assert(
28f30 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   j<nMaxCells );.
28f40 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 61 70        pCell = ap
28f50 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 73  Cell[j];.      s
28f60 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20 2b 20  z = szCell[j] + 
28f70 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
28f80 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20 26 61        pTemp = &a
28f90 53 70 61 63 65 32 5b 69 53 70 61 63 65 32 5d 3b  Space2[iSpace2];
28fa0 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e 65 77  .      if( !pNew
28fb0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
28fc0 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 2d 3e    memcpy(&pNew->
28fd0 61 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c 6c 2c  aData[8], pCell,
28fe0 20 34 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   4);.      }else
28ff0 20 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b   if( leafData ){
29000 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
29010 68 65 20 74 72 65 65 20 69 73 20 61 20 6c 65 61  he tree is a lea
29020 66 2d 64 61 74 61 20 74 72 65 65 2c 20 61 6e 64  f-data tree, and
29030 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 61 72   the siblings ar
29040 65 20 6c 65 61 76 65 73 2c 20 0a 20 20 20 20 20  e leaves, .     
29050 20 20 20 2a 2a 20 74 68 65 6e 20 74 68 65 72 65     ** then there
29060 20 69 73 20 6e 6f 20 64 69 76 69 64 65 72 20 63   is no divider c
29070 65 6c 6c 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e  ell in apCell[].
29080 20 49 6e 73 74 65 61 64 2c 20 74 68 65 20 64 69   Instead, the di
29090 76 69 64 65 72 20 0a 20 20 20 20 20 20 20 20 2a  vider .        *
290a0 2a 20 63 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20  * cell consists 
290b0 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 20 6b  of the integer k
290c0 65 79 20 66 6f 72 20 74 68 65 20 72 69 67 68 74  ey for the right
290d0 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20  -most cell of . 
290e0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 73 69         ** the si
290f0 62 6c 69 6e 67 2d 70 61 67 65 20 61 73 73 65 6d  bling-page assem
29100 62 6c 65 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e  bled above only.
29110 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
29120 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66      CellInfo inf
29130 6f 3b 0a 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a  o;.        j--;.
29140 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42          sqlite3B
29150 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
29160 28 70 4e 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d  (pNew, apCell[j]
29170 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20  , &info);.      
29180 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b    pCell = pTemp;
29190 0a 20 20 20 20 20 20 20 20 66 69 6c 6c 49 6e 43  .        fillInC
291a0 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 43 65  ell(pParent, pCe
291b0 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79  ll, 0, info.nKey
291c0 2c 20 30 2c 20 30 2c 20 30 2c 20 26 73 7a 29 3b  , 0, 0, 0, &sz);
291d0 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20 3d  .        pTemp =
291e0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
291f0 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2d  .        pCell -
29200 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  = 4;.        /* 
29210 4f 62 73 63 75 72 65 20 63 61 73 65 20 66 6f 72  Obscure case for
29220 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 20 74   non-leaf-data t
29230 72 65 65 73 3a 20 49 66 20 74 68 65 20 63 65 6c  rees: If the cel
29240 6c 20 61 74 20 70 43 65 6c 6c 20 77 61 73 0a 20  l at pCell was. 
29250 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76 69 6f         ** previo
29260 75 73 6c 79 20 73 74 6f 72 65 64 20 6f 6e 20 61  usly stored on a
29270 20 6c 65 61 66 20 6e 6f 64 65 2c 20 61 6e 64 20   leaf node, and 
29280 69 74 73 20 72 65 70 6f 72 74 65 64 20 73 69 7a  its reported siz
29290 65 20 77 61 73 20 34 0a 20 20 20 20 20 20 20 20  e was 4.        
292a0 2a 2a 20 62 79 74 65 73 2c 20 74 68 65 6e 20 69  ** bytes, then i
292b0 74 20 6d 61 79 20 61 63 74 75 61 6c 6c 79 20 62  t may actually b
292c0 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  e smaller than t
292d0 68 69 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  his .        ** 
292e0 28 73 65 65 20 73 71 6c 69 74 65 33 42 74 72 65  (see sqlite3Btre
292f0 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2c  eParseCellPtr(),
29300 20 34 20 62 79 74 65 73 20 69 73 20 74 68 65 20   4 bytes is the 
29310 6d 69 6e 69 6d 75 6d 20 73 69 7a 65 20 6f 66 0a  minimum size of.
29320 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 79 20 63          ** any c
29330 65 6c 6c 29 2e 20 42 75 74 20 69 74 20 69 73 20  ell). But it is 
29340 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 70 61 73  important to pas
29350 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 73 69  s the correct si
29360 7a 65 20 74 6f 20 0a 20 20 20 20 20 20 20 20 2a  ze to .        *
29370 2a 20 69 6e 73 65 72 74 43 65 6c 6c 28 29 2c 20  * insertCell(), 
29380 73 6f 20 72 65 70 61 72 73 65 20 74 68 65 20 63  so reparse the c
29390 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20 20 20 20 20  ell now..       
293a0 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e   **.        ** N
293b0 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 63 61  ote that this ca
293c0 6e 20 6e 65 76 65 72 20 68 61 70 70 65 6e 20 69  n never happen i
293d0 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61  n an SQLite data
293e0 20 66 69 6c 65 2c 20 61 73 20 61 6c 6c 0a 20 20   file, as all.  
293f0 20 20 20 20 20 20 2a 2a 20 63 65 6c 6c 73 20 61        ** cells a
29400 72 65 20 61 74 20 6c 65 61 73 74 20 34 20 62 79  re at least 4 by
29410 74 65 73 2e 20 49 74 20 6f 6e 6c 79 20 68 61 70  tes. It only hap
29420 70 65 6e 73 20 69 6e 20 62 2d 74 72 65 65 73 20  pens in b-trees 
29430 75 73 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  used.        ** 
29440 74 6f 20 65 76 61 6c 75 61 74 65 20 22 49 4e 20  to evaluate "IN 
29450 28 53 45 4c 45 43 54 20 2e 2e 2e 29 22 20 61 6e  (SELECT ...)" an
29460 64 20 73 69 6d 69 6c 61 72 20 63 6c 61 75 73 65  d similar clause
29470 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
29480 20 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c        if( szCell
29490 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20  [j]==4 ){.      
294a0 20 20 20 20 61 73 73 65 72 74 28 6c 65 61 66 43      assert(leafC
294b0 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 29 3b 0a 20  orrection==4);. 
294c0 20 20 20 20 20 20 20 20 20 73 7a 20 3d 20 63 65           sz = ce
294d0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72 65 6e  llSizePtr(pParen
294e0 74 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 20  t, pCell);.     
294f0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
29500 20 20 20 69 53 70 61 63 65 32 20 2b 3d 20 73 7a     iSpace2 += sz
29510 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
29520 73 7a 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  sz<=pBt->pageSiz
29530 65 2f 34 20 29 3b 0a 20 20 20 20 20 20 61 73 73  e/4 );.      ass
29540 65 72 74 28 20 69 53 70 61 63 65 32 3c 3d 70 42  ert( iSpace2<=pB
29550 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  t->pageSize );. 
29560 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65 72 74       rc = insert
29570 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78  Cell(pParent, nx
29580 44 69 76 2c 20 70 43 65 6c 6c 2c 20 73 7a 2c 20  Div, pCell, sz, 
29590 70 54 65 6d 70 2c 20 34 29 3b 0a 20 20 20 20 20  pTemp, 4);.     
295a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
295b0 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  OK ) goto balanc
295c0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20  e_cleanup;.     
295d0 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76   put4byte(findOv
295e0 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65  erflowCell(pPare
295f0 6e 74 2c 6e 78 44 69 76 29 2c 20 70 4e 65 77 2d  nt,nxDiv), pNew-
29600 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65 66 20  >pgno);.#ifndef 
29610 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
29620 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20  VACUUM.      /* 
29630 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75  If this is an au
29640 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61  to-vacuum databa
29650 73 65 2c 20 61 6e 64 20 6e 6f 74 20 61 20 6c 65  se, and not a le
29660 61 66 2d 64 61 74 61 20 74 72 65 65 2c 0a 20 20  af-data tree,.  
29670 20 20 20 20 2a 2a 20 74 68 65 6e 20 75 70 64 61      ** then upda
29680 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  te the pointer m
29690 61 70 20 77 69 74 68 20 61 6e 20 65 6e 74 72 79  ap with an entry
296a0 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
296b0 77 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  w page.      ** 
296c0 74 68 61 74 20 74 68 65 20 63 65 6c 6c 20 6a 75  that the cell ju
296d0 73 74 20 69 6e 73 65 72 74 65 64 20 70 6f 69 6e  st inserted poin
296e0 74 73 20 74 6f 20 28 69 66 20 61 6e 79 29 2e 0a  ts to (if any)..
296f0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
29700 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
29710 75 6d 20 26 26 20 21 6c 65 61 66 44 61 74 61 20  um && !leafData 
29720 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
29730 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 50  ptrmapPutOvfl(pP
29740 61 72 65 6e 74 2c 20 6e 78 44 69 76 29 3b 0a 20  arent, nxDiv);. 
29750 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
29760 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29770 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
29780 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
29790 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65      }.      }.#e
297a0 6e 64 69 66 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a  ndif.      j++;.
297b0 20 20 20 20 20 20 6e 78 44 69 76 2b 2b 3b 0a 20        nxDiv++;. 
297c0 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
297d0 74 28 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20  t( j==nCell );. 
297e0 20 61 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20   assert( nOld>0 
297f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65  );.  assert( nNe
29800 77 3e 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61  w>0 );.  if( (pa
29810 67 65 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45  geFlags & PTF_LE
29820 41 46 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6d 65  AF)==0 ){.    me
29830 6d 63 70 79 28 26 61 70 4e 65 77 5b 6e 4e 65 77  mcpy(&apNew[nNew
29840 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 26  -1]->aData[8], &
29850 61 70 43 6f 70 79 5b 6e 4f 6c 64 2d 31 5d 2d 3e  apCopy[nOld-1]->
29860 61 44 61 74 61 5b 38 5d 2c 20 34 29 3b 0a 20 20  aData[8], 4);.  
29870 7d 0a 20 20 69 66 28 20 6e 78 44 69 76 3d 3d 70  }.  if( nxDiv==p
29880 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 2b 70 50  Parent->nCell+pP
29890 61 72 65 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77  arent->nOverflow
298a0 20 29 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68 74   ){.    /* Right
298b0 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69 73  -most sibling is
298c0 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
298d0 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74  child of pParent
298e0 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65   */.    put4byte
298f0 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61  (&pParent->aData
29900 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66  [pParent->hdrOff
29910 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 5b  set+8], pgnoNew[
29920 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 65 6c 73  nNew-1]);.  }els
29930 65 7b 0a 20 20 20 20 2f 2a 20 52 69 67 68 74 2d  e{.    /* Right-
29940 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 69 73 20  most sibling is 
29950 74 68 65 20 6c 65 66 74 20 63 68 69 6c 64 20 6f  the left child o
29960 66 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72  f the first entr
29970 79 20 69 6e 20 70 50 61 72 65 6e 74 0a 20 20 20  y in pParent.   
29980 20 2a 2a 20 70 61 73 74 20 74 68 65 20 72 69 67   ** past the rig
29990 68 74 2d 6d 6f 73 74 20 64 69 76 69 64 65 72 20  ht-most divider 
299a0 65 6e 74 72 79 20 2a 2f 0a 20 20 20 20 70 75 74  entry */.    put
299b0 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66 6c  4byte(findOverfl
299c0 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  owCell(pParent, 
299d0 6e 78 44 69 76 29 2c 20 70 67 6e 6f 4e 65 77 5b  nxDiv), pgnoNew[
299e0 6e 4e 65 77 2d 31 5d 29 3b 0a 20 20 7d 0a 0a 20  nNew-1]);.  }.. 
299f0 20 2f 2a 0a 20 20 2a 2a 20 52 65 70 61 72 65 6e   /*.  ** Reparen
29a00 74 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 61 6c  t children of al
29a10 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20 20  l cells..  */.  
29a20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b  for(i=0; i<nNew;
29a30 20 69 2b 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20   i++){.    rc = 
29a40 72 65 70 61 72 65 6e 74 43 68 69 6c 64 50 61 67  reparentChildPag
29a50 65 73 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20  es(apNew[i]);.  
29a60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29a70 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e  _OK ) goto balan
29a80 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  ce_cleanup;.  }.
29a90 20 20 72 63 20 3d 20 72 65 70 61 72 65 6e 74 43    rc = reparentC
29aa0 68 69 6c 64 50 61 67 65 73 28 70 50 61 72 65 6e  hildPages(pParen
29ab0 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  t);.  if( rc!=SQ
29ac0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62  LITE_OK ) goto b
29ad0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
29ae0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42 61 6c 61 6e  .  /*.  ** Balan
29af0 63 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  ce the parent pa
29b00 67 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74  ge.  Note that t
29b10 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
29b20 28 70 50 61 67 65 29 20 6d 69 67 68 74 0a 20 20  (pPage) might.  
29b30 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 61 64 64  ** have been add
29b40 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
29b50 73 74 20 73 6f 20 69 74 20 6d 69 67 68 74 20 6e  st so it might n
29b60 6f 20 6c 6f 6e 67 65 72 20 62 65 20 69 6e 69 74  o longer be init
29b70 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2a 20 42 75  ialized..  ** Bu
29b80 74 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  t the parent pag
29b90 65 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 62 65  e will always be
29ba0 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20   initialized..  
29bb0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
29bc0 72 65 6e 74 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  rent->isInit );.
29bd0 20 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68    sqlite3Scratch
29be0 46 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20 20  Free(apCell);.  
29bf0 61 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 72 63  apCell = 0;.  rc
29c00 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 72 65   = balance(pPare
29c10 6e 74 2c 20 30 29 3b 0a 20 20 0a 20 20 2f 2a 0a  nt, 0);.  .  /*.
29c20 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62 65 66    ** Cleanup bef
29c30 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 20  ore returning.. 
29c40 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c 65 61   */.balance_clea
29c50 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33 50 61  nup:.  sqlite3Pa
29c60 67 65 46 72 65 65 28 61 53 70 61 63 65 32 29 3b  geFree(aSpace2);
29c70 0a 20 20 73 71 6c 69 74 65 33 53 63 72 61 74 63  .  sqlite3Scratc
29c80 68 46 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a 20  hFree(apCell);. 
29c90 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64   for(i=0; i<nOld
29ca0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65  ; i++){.    rele
29cb0 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d  asePage(apOld[i]
29cc0 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
29cd0 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a  ; i<nNew; i++){.
29ce0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
29cf0 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a 20  apNew[i]);.  }. 
29d00 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
29d10 72 65 6e 74 29 3b 0a 20 20 54 52 41 43 45 28 28  rent);.  TRACE((
29d20 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68  "BALANCE: finish
29d30 65 64 20 77 69 74 68 20 25 64 3a 20 6f 6c 64 3d  ed with %d: old=
29d40 25 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c 73 3d  %d new=%d cells=
29d50 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
29d60 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 6e 4f   pPage->pgno, nO
29d70 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29  ld, nNew, nCell)
29d80 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
29d90 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
29da0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
29db0 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67  for the root pag
29dc0 65 20 6f 66 20 61 20 62 74 72 65 65 20 77 68 65  e of a btree whe
29dd0 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61  n the root.** pa
29de0 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63  ge contains no c
29df0 65 6c 6c 73 2e 20 20 54 68 69 73 20 69 73 20 61  ells.  This is a
29e00 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
29e10 20 6d 61 6b 65 20 74 68 65 20 74 72 65 65 0a 2a   make the tree.*
29e20 2a 20 73 68 61 6c 6c 6f 77 65 72 20 62 79 20 6f  * shallower by o
29e30 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ne level..*/.sta
29e40 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
29e50 73 68 61 6c 6c 6f 77 65 72 28 4d 65 6d 50 61 67  shallower(MemPag
29e60 65 20 2a 70 50 61 67 65 29 7b 0a 20 20 4d 65 6d  e *pPage){.  Mem
29e70 50 61 67 65 20 2a 70 43 68 69 6c 64 3b 20 20 20  Page *pChild;   
29e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
29e90 20 6f 6e 6c 79 20 63 68 69 6c 64 20 70 61 67 65   only child page
29ea0 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a 20 20 50   of pPage */.  P
29eb0 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64 3b 20 20  gno pgnoChild;  
29ec0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
29ed0 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70  age number for p
29ee0 43 68 69 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 72  Child */.  int r
29ef0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
29f00 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
29f10 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 70  n code from subp
29f20 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 42  rocedures */.  B
29f30 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20  tShared *pBt;   
29f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29f50 2a 20 54 68 65 20 6d 61 69 6e 20 42 54 72 65 65  * The main BTree
29f60 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
29f70 69 6e 74 20 6d 78 43 65 6c 6c 50 65 72 50 61 67  int mxCellPerPag
29f80 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
29f90 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f  Maximum number o
29fa0 66 20 63 65 6c 6c 73 20 70 65 72 20 70 61 67 65  f cells per page
29fb0 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
29fc0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
29fd0 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20     /* All cells 
29fe0 66 72 6f 6d 20 70 61 67 65 73 20 62 65 69 6e 67  from pages being
29ff0 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75   balanced */.  u
2a000 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20  16 *szCell;     
2a010 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
2a020 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c  ocal size of all
2a030 20 63 65 6c 6c 73 20 2a 2f 0a 0a 20 20 61 73 73   cells */..  ass
2a040 65 72 74 28 20 70 50 61 67 65 2d 3e 70 50 61 72  ert( pPage->pPar
2a050 65 6e 74 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  ent==0 );.  asse
2a060 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  rt( pPage->nCell
2a070 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
2a080 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2a090 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
2a0a0 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 42 74 20  mutex) );.  pBt 
2a0b0 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
2a0c0 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 20 3d 20  mxCellPerPage = 
2a0d0 4d 58 5f 43 45 4c 4c 28 70 42 74 29 3b 0a 20 20  MX_CELL(pBt);.  
2a0e0 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33  apCell = sqlite3
2a0f0 4d 61 6c 6c 6f 63 28 20 6d 78 43 65 6c 6c 50 65  Malloc( mxCellPe
2a100 72 50 61 67 65 2a 28 73 69 7a 65 6f 66 28 75 38  rPage*(sizeof(u8
2a110 2a 29 2b 73 69 7a 65 6f 66 28 75 31 36 29 29 20  *)+sizeof(u16)) 
2a120 29 3b 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d  );.  if( apCell=
2a130 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
2a140 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73 7a 43 65  TE_NOMEM;.  szCe
2a150 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70 43 65  ll = (u16*)&apCe
2a160 6c 6c 5b 6d 78 43 65 6c 6c 50 65 72 50 61 67 65  ll[mxCellPerPage
2a170 5d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  ];.  if( pPage->
2a180 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a 20 54  leaf ){.    /* T
2a190 68 65 20 74 61 62 6c 65 20 69 73 20 63 6f 6d 70  he table is comp
2a1a0 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 2a 2f 0a  letely empty */.
2a1b0 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41      TRACE(("BALA
2a1c0 4e 43 45 3a 20 65 6d 70 74 79 20 74 61 62 6c 65  NCE: empty table
2a1d0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70   %d\n", pPage->p
2a1e0 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  gno));.  }else{.
2a1f0 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20      /* The root 
2a200 70 61 67 65 20 69 73 20 65 6d 70 74 79 20 62 75  page is empty bu
2a210 74 20 68 61 73 20 6f 6e 65 20 63 68 69 6c 64 2e  t has one child.
2a220 20 20 54 72 61 6e 73 66 65 72 20 74 68 65 0a 20    Transfer the. 
2a230 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f     ** informatio
2a240 6e 20 66 72 6f 6d 20 74 68 61 74 20 6f 6e 65 20  n from that one 
2a250 63 68 69 6c 64 20 69 6e 74 6f 20 74 68 65 20 72  child into the r
2a260 6f 6f 74 20 70 61 67 65 20 69 66 20 69 74 20 0a  oot page if it .
2a270 20 20 20 20 2a 2a 20 77 69 6c 6c 20 66 69 74 2e      ** will fit.
2a280 20 20 54 68 69 73 20 72 65 64 75 63 65 73 20 74    This reduces t
2a290 68 65 20 64 65 70 74 68 20 6f 66 20 74 68 65 20  he depth of the 
2a2a0 74 72 65 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20  tree by one..   
2a2b0 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
2a2c0 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 70  e root page is p
2a2d0 61 67 65 20 31 2c 20 69 74 20 68 61 73 20 6c 65  age 1, it has le
2a2e0 73 73 20 73 70 61 63 65 20 61 76 61 69 6c 61 62  ss space availab
2a2f0 6c 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 69  le than.    ** i
2a300 74 73 20 63 68 69 6c 64 20 28 64 75 65 20 74 6f  ts child (due to
2a310 20 74 68 65 20 31 30 30 20 62 79 74 65 20 68 65   the 100 byte he
2a320 61 64 65 72 20 74 68 61 74 20 6f 63 63 75 72 73  ader that occurs
2a330 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
2a340 67 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  g.    ** of the 
2a350 64 61 74 61 62 61 73 65 20 66 6c 65 29 2c 20 73  database fle), s
2a360 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 62  o it might not b
2a370 65 20 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 61  e able to hold a
2a380 6c 6c 20 6f 66 20 74 68 65 20 0a 20 20 20 20 2a  ll of the .    *
2a390 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 75  * information cu
2a3a0 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 65  rrently containe
2a3b0 64 20 69 6e 20 74 68 65 20 63 68 69 6c 64 2e 20  d in the child. 
2a3c0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
2a3d0 0a 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68  .    ** case, th
2a3e0 65 6e 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 65  en do not do the
2a3f0 20 74 72 61 6e 73 66 65 72 2e 20 20 4c 65 61 76   transfer.  Leav
2a400 65 20 70 61 67 65 20 31 20 65 6d 70 74 79 20 65  e page 1 empty e
2a410 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72  xcept.    ** for
2a420 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74   the right-point
2a430 65 72 20 74 6f 20 74 68 65 20 63 68 69 6c 64 20  er to the child 
2a440 70 61 67 65 2e 20 20 54 68 65 20 63 68 69 6c 64  page.  The child
2a450 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a 20 20   page becomes.  
2a460 20 20 2a 2a 20 74 68 65 20 76 69 72 74 75 61 6c    ** the virtual
2a470 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 72 65   root of the tre
2a480 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67  e..    */.    pg
2a490 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62 79  noChild = get4by
2a4a0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
2a4b0 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
2a4c0 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73 65 72  t+8]);.    asser
2a4d0 74 28 20 70 67 6e 6f 43 68 69 6c 64 3e 30 20 29  t( pgnoChild>0 )
2a4e0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67  ;.    assert( pg
2a4f0 6e 6f 43 68 69 6c 64 3c 3d 70 61 67 65 72 50 61  noChild<=pagerPa
2a500 67 65 63 6f 75 6e 74 28 70 50 61 67 65 2d 3e 70  gecount(pPage->p
2a510 42 74 2d 3e 70 50 61 67 65 72 29 20 29 3b 0a 20  Bt->pPager) );. 
2a520 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2a530 74 72 65 65 47 65 74 50 61 67 65 28 70 50 61 67  treeGetPage(pPag
2a540 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c  e->pBt, pgnoChil
2a550 64 2c 20 26 70 43 68 69 6c 64 2c 20 30 29 3b 0a  d, &pChild, 0);.
2a560 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2a570 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61  o end_shallow_ba
2a580 6c 61 6e 63 65 3b 0a 20 20 20 20 69 66 28 20 70  lance;.    if( p
2a590 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b  Page->pgno==1 ){
2a5a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2a5b0 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
2a5c0 28 70 43 68 69 6c 64 2c 20 70 50 61 67 65 29 3b  (pChild, pPage);
2a5d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
2a5e0 67 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77  goto end_shallow
2a5f0 5f 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 20 20  _balance;.      
2a600 61 73 73 65 72 74 28 20 70 43 68 69 6c 64 2d 3e  assert( pChild->
2a610 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
2a620 20 20 20 20 20 20 69 66 28 20 70 43 68 69 6c 64        if( pChild
2a630 2d 3e 6e 46 72 65 65 3e 3d 31 30 30 20 29 7b 0a  ->nFree>=100 ){.
2a640 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63          /* The c
2a650 68 69 6c 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  hild information
2a660 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65   will fit on the
2a670 20 72 6f 6f 74 20 70 61 67 65 2c 20 73 6f 20 64   root page, so d
2a680 6f 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  o the.        **
2a690 20 63 6f 70 79 20 2a 2f 0a 20 20 20 20 20 20 20   copy */.       
2a6a0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
2a6b0 7a 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20  zeroPage(pPage, 
2a6c0 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 30 5d  pChild->aData[0]
2a6d0 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
2a6e0 3d 30 3b 20 69 3c 70 43 68 69 6c 64 2d 3e 6e 43  =0; i<pChild->nC
2a6f0 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ell; i++){.     
2a700 20 20 20 20 20 61 70 43 65 6c 6c 5b 69 5d 20 3d       apCell[i] =
2a710 20 66 69 6e 64 43 65 6c 6c 28 70 43 68 69 6c 64   findCell(pChild
2a720 2c 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ,i);.          s
2a730 7a 43 65 6c 6c 5b 69 5d 20 3d 20 63 65 6c 6c 53  zCell[i] = cellS
2a740 69 7a 65 50 74 72 28 70 43 68 69 6c 64 2c 20 61  izePtr(pChild, a
2a750 70 43 65 6c 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  pCell[i]);.     
2a760 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
2a770 65 6d 62 6c 65 50 61 67 65 28 70 50 61 67 65 2c  emblePage(pPage,
2a780 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 2c 20   pChild->nCell, 
2a790 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 29 3b  apCell, szCell);
2a7a0 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79  .        /* Copy
2a7b0 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74   the right-point
2a7c0 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  er of the child 
2a7d0 74 6f 20 74 68 65 20 70 61 72 65 6e 74 2e 20 2a  to the parent. *
2a7e0 2f 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  /.        put4by
2a7f0 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61  te(&pPage->aData
2a800 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
2a810 74 2b 38 5d 2c 20 0a 20 20 20 20 20 20 20 20 20  t+8], .         
2a820 20 20 20 67 65 74 34 62 79 74 65 28 26 70 43 68     get4byte(&pCh
2a830 69 6c 64 2d 3e 61 44 61 74 61 5b 70 43 68 69 6c  ild->aData[pChil
2a840 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  d->hdrOffset+8])
2a850 29 3b 0a 20 20 20 20 20 20 20 20 66 72 65 65 50  );.        freeP
2a860 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20  age(pChild);.   
2a870 20 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c       TRACE(("BAL
2a880 41 4e 43 45 3a 20 63 68 69 6c 64 20 25 64 20 74  ANCE: child %d t
2a890 72 61 6e 73 66 65 72 20 74 6f 20 70 61 67 65 20  ransfer to page 
2a8a0 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67  1\n", pChild->pg
2a8b0 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  no));.      }els
2a8c0 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e{.        /* Th
2a8d0 65 20 63 68 69 6c 64 20 68 61 73 20 6d 6f 72 65  e child has more
2a8e0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61   information tha
2a8f0 74 20 77 69 6c 6c 20 66 69 74 20 6f 6e 20 74 68  t will fit on th
2a900 65 20 72 6f 6f 74 2e 0a 20 20 20 20 20 20 20 20  e root..        
2a910 2a 2a 20 54 68 65 20 74 72 65 65 20 69 73 20 61  ** The tree is a
2a920 6c 72 65 61 64 79 20 62 61 6c 61 6e 63 65 64 2e  lready balanced.
2a930 20 20 44 6f 20 6e 6f 74 68 69 6e 67 2e 20 2a 2f    Do nothing. */
2a940 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
2a950 22 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c 64 20  "BALANCE: child 
2a960 25 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20  %d will not fit 
2a970 6f 6e 20 70 61 67 65 20 31 5c 6e 22 2c 20 70 43  on page 1\n", pC
2a980 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  hild->pgno));.  
2a990 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
2a9a0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50  .      memcpy(pP
2a9b0 61 67 65 2d 3e 61 44 61 74 61 2c 20 70 43 68 69  age->aData, pChi
2a9c0 6c 64 2d 3e 61 44 61 74 61 2c 20 70 50 61 67 65  ld->aData, pPage
2a9d0 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
2a9e0 65 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 2d  e);.      pPage-
2a9f0 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20  >isInit = 0;.   
2aa00 20 20 20 70 50 61 67 65 2d 3e 70 50 61 72 65 6e     pPage->pParen
2aa10 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20  t = 0;.      rc 
2aa20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
2aa30 69 74 50 61 67 65 28 70 50 61 67 65 2c 20 30 29  itPage(pPage, 0)
2aa40 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2aa50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc==SQLITE_OK );
2aa60 0a 20 20 20 20 20 20 66 72 65 65 50 61 67 65 28  .      freePage(
2aa70 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 54  pChild);.      T
2aa80 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
2aa90 74 72 61 6e 73 66 65 72 20 63 68 69 6c 64 20 25  transfer child %
2aaa0 64 20 69 6e 74 6f 20 72 6f 6f 74 20 25 64 5c 6e  d into root %d\n
2aab0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2aac0 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20 70   pChild->pgno, p
2aad0 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  Page->pgno));.  
2aae0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 72 65 70    }.    rc = rep
2aaf0 61 72 65 6e 74 43 68 69 6c 64 50 61 67 65 73 28  arentChildPages(
2ab00 70 50 61 67 65 29 3b 0a 20 20 20 20 61 73 73 65  pPage);.    asse
2ab10 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  rt( pPage->nOver
2ab20 66 6c 6f 77 3d 3d 30 20 29 3b 0a 23 69 66 6e 64  flow==0 );.#ifnd
2ab30 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
2ab40 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
2ab50 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
2ab60 6d 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  m ){.      int i
2ab70 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
2ab80 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   i<pPage->nCell;
2ab90 20 69 2b 2b 29 7b 20 0a 20 20 20 20 20 20 20 20   i++){ .        
2aba0 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76  rc = ptrmapPutOv
2abb0 66 6c 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20  fl(pPage, i);.  
2abc0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2abd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2abe0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 68       goto end_sh
2abf0 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a 20  allow_balance;. 
2ac00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2ac10 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
2ac20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
2ac30 68 69 6c 64 29 3b 0a 20 20 7d 0a 65 6e 64 5f 73  hild);.  }.end_s
2ac40 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3a 0a  hallow_balance:.
2ac50 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
2ac60 70 43 65 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e  pCell);.  return
2ac70 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
2ac80 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  he root page is 
2ac90 6f 76 65 72 66 75 6c 6c 0a 2a 2a 0a 2a 2a 20 57  overfull.**.** W
2aca0 68 65 6e 20 74 68 69 73 20 68 61 70 70 65 6e 73  hen this happens
2acb0 2c 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  , Create a new c
2acc0 68 69 6c 64 20 70 61 67 65 20 61 6e 64 20 63 6f  hild page and co
2acd0 70 79 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  py the.** conten
2ace0 74 73 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 69  ts of the root i
2acf0 6e 74 6f 20 74 68 65 20 63 68 69 6c 64 2e 20 20  nto the child.  
2ad00 54 68 65 6e 20 6d 61 6b 65 20 74 68 65 20 72 6f  Then make the ro
2ad10 6f 74 0a 2a 2a 20 70 61 67 65 20 61 6e 20 65 6d  ot.** page an em
2ad20 70 74 79 20 70 61 67 65 20 77 69 74 68 20 72 69  pty page with ri
2ad30 67 68 74 43 68 69 6c 64 20 70 6f 69 6e 74 69 6e  ghtChild pointin
2ad40 67 20 74 6f 20 74 68 65 20 6e 65 77 0a 2a 2a 20  g to the new.** 
2ad50 63 68 69 6c 64 2e 20 20 20 46 69 6e 61 6c 6c 79  child.   Finally
2ad60 2c 20 63 61 6c 6c 20 62 61 6c 61 6e 63 65 5f 69  , call balance_i
2ad70 6e 74 65 72 6e 61 6c 28 29 20 6f 6e 20 74 68 65  nternal() on the
2ad80 20 6e 65 77 20 63 68 69 6c 64 0a 2a 2a 20 74 6f   new child.** to
2ad90 20 63 61 75 73 65 20 69 74 20 74 6f 20 73 70 6c   cause it to spl
2ada0 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  it..*/.static in
2adb0 74 20 62 61 6c 61 6e 63 65 5f 64 65 65 70 65 72  t balance_deeper
2adc0 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29  (MemPage *pPage)
2add0 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  {.  int rc;     
2ade0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2adf0 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 75 62  n value from sub
2ae00 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20  procedures */.  
2ae10 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 3b  MemPage *pChild;
2ae20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
2ae30 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61  o a new child pa
2ae40 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ge */.  Pgno pgn
2ae50 6f 43 68 69 6c 64 3b 20 20 20 20 20 2f 2a 20 50  oChild;     /* P
2ae60 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
2ae70 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65  e new child page
2ae80 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a   */.  BtShared *
2ae90 70 42 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  pBt;         /* 
2aea0 54 68 65 20 42 54 72 65 65 20 2a 2f 0a 20 20 69  The BTree */.  i
2aeb0 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20  nt usableSize;  
2aec0 20 20 20 2f 2a 20 54 6f 74 61 6c 20 75 73 61 62     /* Total usab
2aed0 6c 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61 67  le size of a pag
2aee0 65 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  e */.  u8 *data;
2aef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
2af00 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 72  ntent of the par
2af10 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 75 38  ent page */.  u8
2af20 20 2a 63 64 61 74 61 3b 20 20 20 20 20 20 20 20   *cdata;        
2af30 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20    /* Content of 
2af40 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 2a  the child page *
2af50 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20  /.  int hdr;    
2af60 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
2af70 74 20 74 6f 20 70 61 67 65 20 68 65 61 64 65 72  t to page header
2af80 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 20 20   in parent */.  
2af90 69 6e 74 20 62 72 6b 3b 20 20 20 20 20 20 20 20  int brk;        
2afa0 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
2afb0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69 72 73   content of firs
2afc0 74 20 63 65 6c 6c 20 69 6e 20 70 61 72 65 6e 74  t cell in parent
2afd0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
2afe0 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d 30  Page->pParent==0
2aff0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2b000 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30  age->nOverflow>0
2b010 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67   );.  pBt = pPag
2b020 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  e->pBt;.  assert
2b030 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2b040 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
2b050 20 29 3b 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63   );.  rc = alloc
2b060 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
2b070 2c 20 26 70 43 68 69 6c 64 2c 20 26 70 67 6e 6f  , &pChild, &pgno
2b080 43 68 69 6c 64 2c 20 70 50 61 67 65 2d 3e 70 67  Child, pPage->pg
2b090 6e 6f 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  no, 0);.  if( rc
2b0a0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2b0b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
2b0c0 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2b0d0 70 43 68 69 6c 64 2d 3e 70 44 62 50 61 67 65 29  pChild->pDbPage)
2b0e0 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   );.  usableSize
2b0f0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
2b100 7a 65 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61  ze;.  data = pPa
2b110 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72  ge->aData;.  hdr
2b120 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
2b130 73 65 74 3b 0a 20 20 62 72 6b 20 3d 20 67 65 74  set;.  brk = get
2b140 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
2b150 35 5d 29 3b 0a 20 20 63 64 61 74 61 20 3d 20 70  5]);.  cdata = p
2b160 43 68 69 6c 64 2d 3e 61 44 61 74 61 3b 0a 20 20  Child->aData;.  
2b170 6d 65 6d 63 70 79 28 63 64 61 74 61 2c 20 26 64  memcpy(cdata, &d
2b180 61 74 61 5b 68 64 72 5d 2c 20 70 50 61 67 65 2d  ata[hdr], pPage-
2b190 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50  >cellOffset+2*pP
2b1a0 61 67 65 2d 3e 6e 43 65 6c 6c 2d 68 64 72 29 3b  age->nCell-hdr);
2b1b0 0a 20 20 6d 65 6d 63 70 79 28 26 63 64 61 74 61  .  memcpy(&cdata
2b1c0 5b 62 72 6b 5d 2c 20 26 64 61 74 61 5b 62 72 6b  [brk], &data[brk
2b1d0 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 2d 62 72  ], usableSize-br
2b1e0 6b 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  k);.  assert( pC
2b1f0 68 69 6c 64 2d 3e 69 73 49 6e 69 74 3d 3d 30 20  hild->isInit==0 
2b200 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
2b210 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70  3BtreeInitPage(p
2b220 43 68 69 6c 64 2c 20 70 50 61 67 65 29 3b 0a 20  Child, pPage);. 
2b230 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62   if( rc ) goto b
2b240 61 6c 61 6e 63 65 64 65 65 70 65 72 5f 6f 75 74  alancedeeper_out
2b250 3b 0a 20 20 6d 65 6d 63 70 79 28 70 43 68 69 6c  ;.  memcpy(pChil
2b260 64 2d 3e 61 4f 76 66 6c 2c 20 70 50 61 67 65 2d  d->aOvfl, pPage-
2b270 3e 61 4f 76 66 6c 2c 20 70 50 61 67 65 2d 3e 6e  >aOvfl, pPage->n
2b280 4f 76 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28  Overflow*sizeof(
2b290 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29  pPage->aOvfl[0])
2b2a0 29 3b 0a 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76  );.  pChild->nOv
2b2b0 65 72 66 6c 6f 77 20 3d 20 70 50 61 67 65 2d 3e  erflow = pPage->
2b2c0 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 69 66 28  nOverflow;.  if(
2b2d0 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c   pChild->nOverfl
2b2e0 6f 77 20 29 7b 0a 20 20 20 20 70 43 68 69 6c 64  ow ){.    pChild
2b2f0 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 7d  ->nFree = 0;.  }
2b300 0a 20 20 61 73 73 65 72 74 28 20 70 43 68 69 6c  .  assert( pChil
2b310 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 50 61 67 65 2d  d->nCell==pPage-
2b320 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 7a 65 72 6f  >nCell );.  zero
2b330 50 61 67 65 28 70 50 61 67 65 2c 20 70 43 68 69  Page(pPage, pChi
2b340 6c 64 2d 3e 61 44 61 74 61 5b 30 5d 20 26 20 7e  ld->aData[0] & ~
2b350 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 70 75 74  PTF_LEAF);.  put
2b360 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
2b370 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
2b380 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 43 68 69  fset+8], pgnoChi
2b390 6c 64 29 3b 0a 20 20 54 52 41 43 45 28 28 22 42  ld);.  TRACE(("B
2b3a0 41 4c 41 4e 43 45 3a 20 63 6f 70 79 20 72 6f 6f  ALANCE: copy roo
2b3b0 74 20 25 64 20 69 6e 74 6f 20 25 64 5c 6e 22 2c  t %d into %d\n",
2b3c0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 43   pPage->pgno, pC
2b3d0 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 23 69  hild->pgno));.#i
2b3e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2b3f0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 69  T_AUTOVACUUM.  i
2b400 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
2b410 75 6d 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  um ){.    int i;
2b420 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70  .    rc = ptrmap
2b430 50 75 74 28 70 42 74 2c 20 70 43 68 69 6c 64 2d  Put(pBt, pChild-
2b440 3e 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  >pgno, PTRMAP_BT
2b450 52 45 45 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  REE, pPage->pgno
2b460 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2b470 67 6f 74 6f 20 62 61 6c 61 6e 63 65 64 65 65 70  goto balancedeep
2b480 65 72 5f 6f 75 74 3b 0a 20 20 20 20 66 6f 72 28  er_out;.    for(
2b490 69 3d 30 3b 20 69 3c 70 43 68 69 6c 64 2d 3e 6e  i=0; i<pChild->n
2b4a0 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
2b4b0 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
2b4c0 4f 76 66 6c 28 70 43 68 69 6c 64 2c 20 69 29 3b  Ovfl(pChild, i);
2b4d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2b4e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2b4f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
2b500 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2b510 0a 23 65 6e 64 69 66 0a 20 20 72 63 20 3d 20 62  .#endif.  rc = b
2b520 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70  alance_nonroot(p
2b530 43 68 69 6c 64 29 3b 0a 0a 62 61 6c 61 6e 63 65  Child);..balance
2b540 64 65 65 70 65 72 5f 6f 75 74 3a 0a 20 20 72 65  deeper_out:.  re
2b550 6c 65 61 73 65 50 61 67 65 28 70 43 68 69 6c 64  leasePage(pChild
2b560 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
2b570 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 69 64 65 20  }../*.** Decide 
2b580 69 66 20 74 68 65 20 70 61 67 65 20 70 50 61 67  if the page pPag
2b590 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 62 61  e needs to be ba
2b5a0 6c 61 6e 63 65 64 2e 20 20 49 66 20 62 61 6c 61  lanced.  If bala
2b5b0 6e 63 69 6e 67 20 69 73 0a 2a 2a 20 72 65 71 75  ncing is.** requ
2b5c0 69 72 65 64 2c 20 63 61 6c 6c 20 74 68 65 20 61  ired, call the a
2b5d0 70 70 72 6f 70 72 69 61 74 65 20 62 61 6c 61 6e  ppropriate balan
2b5e0 63 69 6e 67 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f  cing routine..*/
2b5f0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
2b600 6e 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  nce(MemPage *pPa
2b610 67 65 2c 20 69 6e 74 20 69 6e 73 65 72 74 29 7b  ge, int insert){
2b620 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2b630 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
2b640 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2b650 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
2b660 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
2b670 70 50 61 67 65 2d 3e 70 50 61 72 65 6e 74 3d 3d  pPage->pParent==
2b680 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 ){.    rc = sq
2b690 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2b6a0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
2b6b0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2b6c0 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d  ITE_OK && pPage-
2b6d0 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 29 7b 0a  >nOverflow>0 ){.
2b6e0 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
2b6f0 63 65 5f 64 65 65 70 65 72 28 70 50 61 67 65 29  ce_deeper(pPage)
2b700 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2b710 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2b720 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30   pPage->nCell==0
2b730 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62   ){.      rc = b
2b740 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f 77 65 72  alance_shallower
2b750 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20  (pPage);.    }. 
2b760 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
2b770 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
2b780 3e 30 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 28  >0 || .        (
2b790 21 69 6e 73 65 72 74 20 26 26 20 70 50 61 67 65  !insert && pPage
2b7a0 2d 3e 6e 46 72 65 65 3e 70 50 61 67 65 2d 3e 70  ->nFree>pPage->p
2b7b0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32  Bt->usableSize*2
2b7c0 2f 33 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20  /3) ){.      rc 
2b7d0 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f  = balance_nonroo
2b7e0 74 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  t(pPage);.    }.
2b7f0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
2b800 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
2b810 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 61 6c  outine checks al
2b820 6c 20 63 75 72 73 6f 72 73 20 74 68 61 74 20 70  l cursors that p
2b830 6f 69 6e 74 20 74 6f 20 74 61 62 6c 65 20 70 67  oint to table pg
2b840 6e 6f 52 6f 6f 74 2e 0a 2a 2a 20 49 66 20 61 6e  noRoot..** If an
2b850 79 20 6f 66 20 74 68 6f 73 65 20 63 75 72 73 6f  y of those curso
2b860 72 73 20 77 65 72 65 20 6f 70 65 6e 65 64 20 77  rs were opened w
2b870 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 20 69 6e  ith wrFlag==0 in
2b880 20 61 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20   a different.** 
2b890 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2b8a0 69 6f 6e 20 28 61 20 64 61 74 61 62 61 73 65 20  ion (a database 
2b8b0 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 68 61 74 20  connection that 
2b8c0 73 68 61 72 65 73 20 74 68 65 20 70 61 67 65 72  shares the pager
2b8d0 0a 2a 2a 20 63 61 63 68 65 20 77 69 74 68 20 74  .** cache with t
2b8e0 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 6e 65  he current conne
2b8f0 63 74 69 6f 6e 29 20 61 6e 64 20 74 68 61 74 20  ction) and that 
2b900 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e  other connection
2b910 20 0a 2a 2a 20 69 73 20 6e 6f 74 20 69 6e 20 74   .** is not in t
2b920 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 6d 69 74  he ReadUncommmit
2b930 74 65 64 20 73 74 61 74 65 2c 20 74 68 65 6e 20  ted state, then 
2b940 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
2b950 75 72 6e 73 20 0a 2a 2a 20 53 51 4c 49 54 45 5f  urns .** SQLITE_
2b960 4c 4f 43 4b 45 44 2e 0a 2a 2a 0a 2a 2a 20 41 73  LOCKED..**.** As
2b970 20 77 65 6c 6c 20 61 73 20 63 75 72 73 6f 72 73   well as cursors
2b980 20 77 69 74 68 20 77 72 46 6c 61 67 3d 3d 30 2c   with wrFlag==0,
2b990 20 63 75 72 73 6f 72 73 20 77 69 74 68 20 77 72   cursors with wr
2b9a0 46 6c 61 67 3d 3d 31 20 61 6e 64 20 0a 2a 2a 20  Flag==1 and .** 
2b9b0 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
2b9c0 3d 3d 31 20 61 72 65 20 61 6c 73 6f 20 63 6f 6e  ==1 are also con
2b9d0 73 69 64 65 72 65 64 20 27 72 65 61 64 27 20 63  sidered 'read' c
2b9e0 75 72 73 6f 72 73 2e 20 49 6e 63 72 65 6d 65 6e  ursors. Incremen
2b9f0 74 61 6c 20 0a 2a 2a 20 62 6c 6f 62 20 63 75 72  tal .** blob cur
2ba00 73 6f 72 73 20 61 72 65 20 75 73 65 64 20 66 6f  sors are used fo
2ba10 72 20 62 6f 74 68 20 72 65 61 64 69 6e 67 20 61  r both reading a
2ba20 6e 64 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a  nd writing..**.*
2ba30 2a 20 57 68 65 6e 20 70 67 6e 6f 52 6f 6f 74 20  * When pgnoRoot 
2ba40 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  is the root page
2ba50 20 6f 66 20 61 6e 20 69 6e 74 6b 65 79 20 74 61   of an intkey ta
2ba60 62 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ble, this functi
2ba70 6f 6e 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 72 65  on is also.** re
2ba80 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 69 6e  sponsible for in
2ba90 76 61 6c 69 64 61 74 69 6e 67 20 69 6e 63 72 65  validating incre
2baa0 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73  mental blob curs
2bab0 6f 72 73 20 77 68 65 6e 20 74 68 65 20 74 61 62  ors when the tab
2bac0 6c 65 20 72 6f 77 0a 2a 2a 20 6f 6e 20 77 68 69  le row.** on whi
2bad0 63 68 20 74 68 65 79 20 61 72 65 20 6f 70 65 6e  ch they are open
2bae0 65 64 20 69 73 20 64 65 6c 65 74 65 64 20 6f 72  ed is deleted or
2baf0 20 6d 6f 64 69 66 69 65 64 2e 20 43 75 72 73 6f   modified. Curso
2bb00 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  rs are invalidat
2bb10 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20  ed.** according 
2bb20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  to the following
2bb30 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   rules:.**.**   
2bb40 31 29 20 57 68 65 6e 20 42 74 72 65 65 43 6c 65  1) When BtreeCle
2bb50 61 72 54 61 62 6c 65 28 29 20 69 73 20 63 61 6c  arTable() is cal
2bb60 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c  led to completel
2bb70 79 20 64 65 6c 65 74 65 20 74 68 65 20 63 6f 6e  y delete the con
2bb80 74 65 6e 74 73 0a 2a 2a 20 20 20 20 20 20 6f 66  tents.**      of
2bb90 20 61 20 42 2d 54 72 65 65 20 74 61 62 6c 65 2c   a B-Tree table,
2bba0 20 70 45 78 63 6c 75 64 65 20 69 73 20 73 65 74   pExclude is set
2bbb0 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 70 61 72   to zero and par
2bbc0 61 6d 65 74 65 72 20 69 52 6f 77 20 69 73 20 0a  ameter iRow is .
2bbd0 2a 2a 20 20 20 20 20 20 73 65 74 20 74 6f 20 6e  **      set to n
2bbe0 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73  on-zero. In this
2bbf0 20 63 61 73 65 20 61 6c 6c 20 69 6e 63 72 65 6d   case all increm
2bc00 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f  ental blob curso
2bc10 72 73 20 6f 70 65 6e 0a 2a 2a 20 20 20 20 20 20  rs open.**      
2bc20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f  on the table roo
2bc30 74 65 64 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20  ted at pgnoRoot 
2bc40 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e  are invalidated.
2bc50 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e  .**.**   2) When
2bc60 20 42 74 72 65 65 49 6e 73 65 72 74 28 29 2c 20   BtreeInsert(), 
2bc70 42 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72  BtreeDelete() or
2bc80 20 42 74 72 65 65 50 75 74 44 61 74 61 28 29 20   BtreePutData() 
2bc90 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 0a 2a 2a  is called to .**
2bca0 20 20 20 20 20 20 6d 6f 64 69 66 79 20 61 20 74        modify a t
2bcb0 61 62 6c 65 20 72 6f 77 20 76 69 61 20 61 6e 20  able row via an 
2bcc0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20 70  SQL statement, p
2bcd0 45 78 63 6c 75 64 65 20 69 73 20 73 65 74 20 74  Exclude is set t
2bce0 6f 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 77  o the .**      w
2bcf0 72 69 74 65 20 63 75 72 73 6f 72 20 75 73 65 64  rite cursor used
2bd00 20 74 6f 20 64 6f 20 74 68 65 20 6d 6f 64 69 66   to do the modif
2bd10 69 63 61 74 69 6f 6e 20 61 6e 64 20 70 61 72 61  ication and para
2bd20 6d 65 74 65 72 20 69 52 6f 77 20 69 73 20 73 65  meter iRow is se
2bd30 74 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65  t.**      to the
2bd40 20 69 6e 74 65 67 65 72 20 72 6f 77 20 69 64 20   integer row id 
2bd50 6f 66 20 74 68 65 20 42 2d 54 72 65 65 20 65 6e  of the B-Tree en
2bd60 74 72 79 20 62 65 69 6e 67 20 6d 6f 64 69 66 69  try being modifi
2bd70 65 64 2e 20 55 6e 6c 65 73 73 0a 2a 2a 20 20 20  ed. Unless.**   
2bd80 20 20 20 70 45 78 63 6c 75 64 65 20 69 73 20 69     pExclude is i
2bd90 74 73 65 6c 66 20 61 6e 20 69 6e 63 72 65 6d 65  tself an increme
2bda0 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72  ntal blob cursor
2bdb0 2c 20 74 68 65 6e 20 61 6c 6c 20 69 6e 63 72 65  , then all incre
2bdc0 6d 65 6e 74 61 6c 0a 2a 2a 20 20 20 20 20 20 62  mental.**      b
2bdd0 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e  lob cursors open
2bde0 20 6f 6e 20 72 6f 77 20 69 52 6f 77 20 6f 66 20   on row iRow of 
2bdf0 74 68 65 20 42 2d 54 72 65 65 20 61 72 65 20 69  the B-Tree are i
2be00 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2a 0a 2a  nvalidated..**.*
2be10 2a 20 20 20 33 29 20 49 66 20 62 6f 74 68 20 70  *   3) If both p
2be20 45 78 63 6c 75 64 65 20 61 6e 64 20 69 52 6f 77  Exclude and iRow
2be30 20 61 72 65 20 73 65 74 20 74 6f 20 7a 65 72 6f   are set to zero
2be40 2c 20 6e 6f 20 69 6e 63 72 65 6d 65 6e 74 61 6c  , no incremental
2be50 20 62 6c 6f 62 20 0a 2a 2a 20 20 20 20 20 20 63   blob .**      c
2be60 75 72 73 6f 72 73 20 61 72 65 20 69 6e 76 61 6c  ursors are inval
2be70 69 64 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  idated..*/.stati
2be80 63 20 69 6e 74 20 63 68 65 63 6b 52 65 61 64 4c  c int checkReadL
2be90 6f 63 6b 73 28 0a 20 20 42 74 72 65 65 20 2a 70  ocks(.  Btree *p
2bea0 42 74 72 65 65 2c 20 0a 20 20 50 67 6e 6f 20 70  Btree, .  Pgno p
2beb0 67 6e 6f 52 6f 6f 74 2c 20 0a 20 20 42 74 43 75  gnoRoot, .  BtCu
2bec0 72 73 6f 72 20 2a 70 45 78 63 6c 75 64 65 2c 0a  rsor *pExclude,.
2bed0 20 20 69 36 34 20 69 52 6f 77 0a 29 7b 0a 20 20    i64 iRow.){.  
2bee0 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 42  BtCursor *p;.  B
2bef0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2bf00 42 74 72 65 65 2d 3e 70 42 74 3b 0a 20 20 73 71  Btree->pBt;.  sq
2bf10 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 42 74 72  lite3 *db = pBtr
2bf20 65 65 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  ee->db;.  assert
2bf30 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
2bf40 6c 64 73 4d 75 74 65 78 28 70 42 74 72 65 65 29  ldsMutex(pBtree)
2bf50 20 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d   );.  for(p=pBt-
2bf60 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70  >pCursor; p; p=p
2bf70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 66  ->pNext){.    if
2bf80 28 20 70 3d 3d 70 45 78 63 6c 75 64 65 20 29 20  ( p==pExclude ) 
2bf90 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66  continue;.    if
2bfa0 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 21 3d 70  ( p->pgnoRoot!=p
2bfb0 67 6e 6f 52 6f 6f 74 20 29 20 63 6f 6e 74 69 6e  gnoRoot ) contin
2bfc0 75 65 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ue;.#ifndef SQLI
2bfd0 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
2bfe0 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 73 49 6e  .    if( p->isIn
2bff0 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26 20  crblobHandle && 
2c000 28 20 0a 20 20 20 20 20 20 20 20 20 28 21 70 45  ( .         (!pE
2c010 78 63 6c 75 64 65 20 26 26 20 69 52 6f 77 29 0a  xclude && iRow).
2c020 20 20 20 20 20 20 7c 7c 20 28 70 45 78 63 6c 75        || (pExclu
2c030 64 65 20 26 26 20 21 70 45 78 63 6c 75 64 65 2d  de && !pExclude-
2c040 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  >isIncrblobHandl
2c050 65 20 26 26 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65  e && p->info.nKe
2c060 79 3d 3d 69 52 6f 77 29 0a 20 20 20 20 29 29 7b  y==iRow).    )){
2c070 0a 20 20 20 20 20 20 70 2d 3e 65 53 74 61 74 65  .      p->eState
2c080 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49   = CURSOR_INVALI
2c090 44 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  D;.    }.#endif.
2c0a0 20 20 20 20 69 66 28 20 70 2d 3e 65 53 74 61 74      if( p->eStat
2c0b0 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e!=CURSOR_VALID 
2c0c0 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2c0d0 69 66 28 20 70 2d 3e 77 72 46 6c 61 67 3d 3d 30  if( p->wrFlag==0
2c0e0 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45   .#ifndef SQLITE
2c0f0 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20  _OMIT_INCRBLOB. 
2c100 20 20 20 20 7c 7c 20 70 2d 3e 69 73 49 6e 63 72      || p->isIncr
2c110 62 6c 6f 62 48 61 6e 64 6c 65 0a 23 65 6e 64 69  blobHandle.#endi
2c120 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 73  f.    ){.      s
2c130 71 6c 69 74 65 33 20 2a 64 62 4f 74 68 65 72 20  qlite3 *dbOther 
2c140 3d 20 70 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b  = p->pBtree->db;
2c150 0a 20 20 20 20 20 20 69 66 28 20 64 62 4f 74 68  .      if( dbOth
2c160 65 72 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 20  er==0 ||.       
2c170 20 20 28 64 62 4f 74 68 65 72 21 3d 64 62 20 26    (dbOther!=db &
2c180 26 20 28 64 62 4f 74 68 65 72 2d 3e 66 6c 61 67  & (dbOther->flag
2c190 73 20 26 20 53 51 4c 49 54 45 5f 52 65 61 64 55  s & SQLITE_ReadU
2c1a0 6e 63 6f 6d 6d 69 74 74 65 64 29 3d 3d 30 29 20  ncommitted)==0) 
2c1b0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
2c1c0 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b  n SQLITE_LOCKED;
2c1d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2c1e0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
2c1f0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2c200 49 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63  Insert a new rec
2c210 6f 72 64 20 69 6e 74 6f 20 74 68 65 20 42 54 72  ord into the BTr
2c220 65 65 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20  ee.  The key is 
2c230 67 69 76 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e  given by (pKey,n
2c240 4b 65 79 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20  Key).** and the 
2c250 64 61 74 61 20 69 73 20 67 69 76 65 6e 20 62 79  data is given by
2c260 20 28 70 44 61 74 61 2c 6e 44 61 74 61 29 2e 20   (pData,nData). 
2c270 20 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 75   The cursor is u
2c280 73 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64  sed only to.** d
2c290 65 66 69 6e 65 20 77 68 61 74 20 74 61 62 6c 65  efine what table
2c2a0 20 74 68 65 20 72 65 63 6f 72 64 20 73 68 6f 75   the record shou
2c2b0 6c 64 20 62 65 20 69 6e 73 65 72 74 65 64 20 69  ld be inserted i
2c2c0 6e 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72  nto.  The cursor
2c2d0 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  .** is left poin
2c2e0 74 69 6e 67 20 61 74 20 61 20 72 61 6e 64 6f 6d  ting at a random
2c2f0 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   location..**.**
2c300 20 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20 74   For an INTKEY t
2c310 61 62 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e  able, only the n
2c320 4b 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65  Key value of the
2c330 20 6b 65 79 20 69 73 20 75 73 65 64 2e 20 20 70   key is used.  p
2c340 4b 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65  Key is.** ignore
2c350 64 2e 20 20 46 6f 72 20 61 20 5a 45 52 4f 44 41  d.  For a ZERODA
2c360 54 41 20 74 61 62 6c 65 2c 20 74 68 65 20 70 44  TA table, the pD
2c370 61 74 61 20 61 6e 64 20 6e 44 61 74 61 20 61 72  ata and nData ar
2c380 65 20 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a  e both ignored..
2c390 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2c3a0 72 65 65 49 6e 73 65 72 74 28 0a 20 20 42 74 43  reeInsert(.  BtC
2c3b0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20  ursor *pCur,    
2c3c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2c3d0 6e 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20  nsert data into 
2c3e0 74 68 65 20 74 61 62 6c 65 20 6f 66 20 74 68 69  the table of thi
2c3f0 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f  s cursor */.  co
2c400 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20  nst void *pKey, 
2c410 69 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20  i64 nKey,    /* 
2c420 54 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 6e  The key of the n
2c430 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63  ew record */.  c
2c440 6f 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61  onst void *pData
2c450 2c 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a  , int nData,  /*
2c460 20 54 68 65 20 64 61 74 61 20 6f 66 20 74 68 65   The data of the
2c470 20 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20   new record */. 
2c480 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20   int nZero,     
2c490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c4a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74  /* Number of ext
2c4b0 72 61 20 30 20 62 79 74 65 73 20 74 6f 20 61 70  ra 0 bytes to ap
2c4c0 70 65 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a  pend to data */.
2c4d0 20 20 69 6e 74 20 61 70 70 65 6e 64 42 69 61 73    int appendBias
2c4e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c4f0 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73   /* True if this
2c500 20 69 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70   is likely an ap
2c510 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  pend */.){.  int
2c520 20 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 3b 0a   rc;.  int loc;.
2c530 20 20 69 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 4d    int szNew;.  M
2c540 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20  emPage *pPage;. 
2c550 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72   Btree *p = pCur
2c560 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68  ->pBtree;.  BtSh
2c570 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
2c580 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  Bt;.  unsigned c
2c590 68 61 72 20 2a 6f 6c 64 43 65 6c 6c 3b 0a 20 20  har *oldCell;.  
2c5a0 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6e  unsigned char *n
2c5b0 65 77 43 65 6c 6c 20 3d 20 30 3b 0a 0a 20 20 61  ewCell = 0;..  a
2c5c0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
2c5d0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
2c5e0 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
2c5f0 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53  ansaction!=TRANS
2c600 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a  _WRITE ){.    /*
2c610 20 4d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   Must start a tr
2c620 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65  ansaction before
2c630 20 64 6f 69 6e 67 20 61 6e 20 69 6e 73 65 72 74   doing an insert
2c640 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 42 74   */.    rc = pBt
2c650 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c  ->readOnly ? SQL
2c660 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53  ITE_READONLY : S
2c670 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
2c680 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
2c690 20 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e    assert( !pBt->
2c6a0 72 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66  readOnly );.  if
2c6b0 28 20 21 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  ( !pCur->wrFlag 
2c6c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
2c6d0 4c 49 54 45 5f 50 45 52 4d 3b 20 20 20 2f 2a 20  LITE_PERM;   /* 
2c6e0 43 75 72 73 6f 72 20 6e 6f 74 20 6f 70 65 6e 20  Cursor not open 
2c6f0 66 6f 72 20 77 72 69 74 69 6e 67 20 2a 2f 0a 20  for writing */. 
2c700 20 7d 0a 20 20 69 66 28 20 63 68 65 63 6b 52 65   }.  if( checkRe
2c710 61 64 4c 6f 63 6b 73 28 70 43 75 72 2d 3e 70 42  adLocks(pCur->pB
2c720 74 72 65 65 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  tree, pCur->pgno
2c730 52 6f 6f 74 2c 20 70 43 75 72 2c 20 6e 4b 65 79  Root, pCur, nKey
2c740 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
2c750 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f  SQLITE_LOCKED; /
2c760 2a 20 54 68 65 20 74 61 62 6c 65 20 70 43 75 72  * The table pCur
2c770 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73 20 61   points to has a
2c780 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20   read lock */.  
2c790 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  }.  if( pCur->eS
2c7a0 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
2c7b0 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  LT ){.    return
2c7c0 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d   pCur->skip;.  }
2c7d0 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20  ..  /* Save the 
2c7e0 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79  positions of any
2c7f0 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 6f   other cursors o
2c800 70 65 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c  pen on this tabl
2c810 65 20 2a 2f 0a 20 20 63 6c 65 61 72 43 75 72 73  e */.  clearCurs
2c820 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
2c830 3b 0a 20 20 69 66 28 20 0a 20 20 20 20 53 51 4c  ;.  if( .    SQL
2c840 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61  ITE_OK!=(rc = sa
2c850 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74  veAllCursors(pBt
2c860 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
2c870 2c 20 70 43 75 72 29 29 20 7c 7c 0a 20 20 20 20  , pCur)) ||.    
2c880 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
2c890 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
2c8a0 65 74 6f 28 70 43 75 72 2c 20 70 4b 65 79 2c 20  eto(pCur, pKey, 
2c8b0 30 2c 20 6e 4b 65 79 2c 20 61 70 70 65 6e 64 42  0, nKey, appendB
2c8c0 69 61 73 2c 20 26 6c 6f 63 29 29 0a 20 20 29 7b  ias, &loc)).  ){
2c8d0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2c8e0 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70    }..  pPage = p
2c8f0 43 75 72 2d 3e 70 50 61 67 65 3b 0a 20 20 61 73  Cur->pPage;.  as
2c900 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74  sert( pPage->int
2c910 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29  Key || nKey>=0 )
2c920 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
2c930 65 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61 67  e->leaf || !pPag
2c940 65 2d 3e 6c 65 61 66 44 61 74 61 20 29 3b 0a 20  e->leafData );. 
2c950 20 54 52 41 43 45 28 28 22 49 4e 53 45 52 54 3a   TRACE(("INSERT:
2c960 20 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25   table=%d nkey=%
2c970 6c 6c 64 20 6e 64 61 74 61 3d 25 64 20 70 61 67  lld ndata=%d pag
2c980 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20  e=%d %s\n",.    
2c990 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f        pCur->pgno
2c9a0 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74  Root, nKey, nDat
2c9b0 61 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a  a, pPage->pgno,.
2c9c0 20 20 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30            loc==0
2c9d0 20 3f 20 22 6f 76 65 72 77 72 69 74 65 22 20 3a   ? "overwrite" :
2c9e0 20 22 6e 65 77 20 65 6e 74 72 79 22 29 29 3b 0a   "new entry"));.
2c9f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2ca00 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 6c 6c  >isInit );.  all
2ca10 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70  ocateTempSpace(p
2ca20 42 74 29 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d  Bt);.  newCell =
2ca30 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b   pBt->pTmpSpace;
2ca40 0a 20 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d  .  if( newCell==
2ca50 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
2ca60 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20  E_NOMEM;.  rc = 
2ca70 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65  fillInCell(pPage
2ca80 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c  , newCell, pKey,
2ca90 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e 44   nKey, pData, nD
2caa0 61 74 61 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e  ata, nZero, &szN
2cab0 65 77 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ew);.  if( rc ) 
2cac0 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b  goto end_insert;
2cad0 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77  .  assert( szNew
2cae0 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  ==cellSizePtr(pP
2caf0 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b  age, newCell) );
2cb00 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77  .  assert( szNew
2cb10 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  <=MX_CELL_SIZE(p
2cb20 42 74 29 20 29 3b 0a 20 20 69 66 28 20 6c 6f 63  Bt) );.  if( loc
2cb30 3d 3d 30 20 26 26 20 43 55 52 53 4f 52 5f 56 41  ==0 && CURSOR_VA
2cb40 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
2cb50 65 20 29 7b 0a 20 20 20 20 75 31 36 20 73 7a 4f  e ){.    u16 szO
2cb60 6c 64 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ld;.    assert( 
2cb70 70 43 75 72 2d 3e 69 64 78 3e 3d 30 20 26 26 20  pCur->idx>=0 && 
2cb80 70 43 75 72 2d 3e 69 64 78 3c 70 50 61 67 65 2d  pCur->idx<pPage-
2cb90 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63  >nCell );.    rc
2cba0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2cbb0 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50  rite(pPage->pDbP
2cbc0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
2cbd0 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   ){.      goto e
2cbe0 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 7d  nd_insert;.    }
2cbf0 0a 20 20 20 20 6f 6c 64 43 65 6c 6c 20 3d 20 66  .    oldCell = f
2cc00 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
2cc10 43 75 72 2d 3e 69 64 78 29 3b 0a 20 20 20 20 69  Cur->idx);.    i
2cc20 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2cc30 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
2cc40 6e 65 77 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c 6c  newCell, oldCell
2cc50 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 4);.    }.    
2cc60 73 7a 4f 6c 64 20 3d 20 63 65 6c 6c 53 69 7a 65  szOld = cellSize
2cc70 50 74 72 28 70 50 61 67 65 2c 20 6f 6c 64 43 65  Ptr(pPage, oldCe
2cc80 6c 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 63 6c  ll);.    rc = cl
2cc90 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 6f  earCell(pPage, o
2cca0 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66 28  ldCell);.    if(
2ccb0 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 69   rc ) goto end_i
2ccc0 6e 73 65 72 74 3b 0a 20 20 20 20 64 72 6f 70 43  nsert;.    dropC
2ccd0 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d  ell(pPage, pCur-
2cce0 3e 69 64 78 2c 20 73 7a 4f 6c 64 29 3b 0a 20 20  >idx, szOld);.  
2ccf0 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 3c 30 20  }else if( loc<0 
2cd00 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  && pPage->nCell>
2cd10 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
2cd20 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a   pPage->leaf );.
2cd30 20 20 20 20 70 43 75 72 2d 3e 69 64 78 2b 2b 3b      pCur->idx++;
2cd40 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e  .    pCur->info.
2cd50 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70  nSize = 0;.    p
2cd60 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
2cd70 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
2cd80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2cd90 6c 65 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72 63  leaf );.  }.  rc
2cda0 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50   = insertCell(pP
2cdb0 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20  age, pCur->idx, 
2cdc0 6e 65 77 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c 20  newCell, szNew, 
2cdd0 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  0, 0);.  if( rc!
2cde0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
2cdf0 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20  o end_insert;.  
2ce00 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 50 61  rc = balance(pPa
2ce10 67 65 2c 20 31 29 3b 0a 20 20 2f 2a 20 73 71 6c  ge, 1);.  /* sql
2ce20 69 74 65 33 42 74 72 65 65 50 61 67 65 44 75 6d  ite3BtreePageDum
2ce30 70 28 70 43 75 72 2d 3e 70 42 74 2c 20 70 43 75  p(pCur->pBt, pCu
2ce40 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b  r->pgnoRoot, 1);
2ce50 20 2a 2f 0a 20 20 2f 2a 20 66 66 6c 75 73 68 28   */.  /* fflush(
2ce60 73 74 64 6f 75 74 29 3b 20 2a 2f 0a 20 20 69 66  stdout); */.  if
2ce70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2ce80 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f  ){.    moveToRoo
2ce90 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 65 6e 64  t(pCur);.  }.end
2cea0 5f 69 6e 73 65 72 74 3a 0a 20 20 72 65 74 75 72  _insert:.  retur
2ceb0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
2cec0 65 6c 65 74 65 20 74 68 65 20 65 6e 74 72 79 20  elete the entry 
2ced0 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20  that the cursor 
2cee0 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 20  is pointing to. 
2cef0 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69   The cursor.** i
2cf00 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20  s left pointing 
2cf10 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63 61  at a random loca
2cf20 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tion..*/.int sql
2cf30 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
2cf40 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
2cf50 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
2cf60 65 20 3d 20 70 43 75 72 2d 3e 70 50 61 67 65 3b  e = pCur->pPage;
2cf70 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
2cf80 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 72   *pCell;.  int r
2cf90 63 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68  c;.  Pgno pgnoCh
2cfa0 69 6c 64 20 3d 20 30 3b 0a 20 20 42 74 72 65 65  ild = 0;.  Btree
2cfb0 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72   *p = pCur->pBtr
2cfc0 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ee;.  BtShared *
2cfd0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
2cfe0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
2cff0 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
2d000 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
2d010 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
2d020 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73  if( pBt->inTrans
2d030 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52  action!=TRANS_WR
2d040 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75  ITE ){.    /* Mu
2d050 73 74 20 73 74 61 72 74 20 61 20 74 72 61 6e 73  st start a trans
2d060 61 63 74 69 6f 6e 20 62 65 66 6f 72 65 20 64 6f  action before do
2d070 69 6e 67 20 61 20 64 65 6c 65 74 65 20 2a 2f 0a  ing a delete */.
2d080 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65      rc = pBt->re
2d090 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f  adOnly ? SQLITE_
2d0a0 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54  READONLY : SQLIT
2d0b0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74  E_ERROR;.    ret
2d0c0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
2d0d0 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64  sert( !pBt->read
2d0e0 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28 20 70 43  Only );.  if( pC
2d0f0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
2d100 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20  OR_FAULT ){.    
2d110 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69  return pCur->ski
2d120 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75  p;.  }.  if( pCu
2d130 72 2d 3e 69 64 78 20 3e 3d 20 70 50 61 67 65 2d  r->idx >= pPage-
2d140 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 72 65  >nCell ){.    re
2d150 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
2d160 52 3b 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f  R;  /* The curso
2d170 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
2d180 67 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 2a 2f  g to anything */
2d190 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 43 75 72  .  }.  if( !pCur
2d1a0 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20  ->wrFlag ){.    
2d1b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45  return SQLITE_PE
2d1c0 52 4d 3b 20 20 20 2f 2a 20 44 69 64 20 6e 6f 74  RM;   /* Did not
2d1d0 20 6f 70 65 6e 20 74 68 69 73 20 63 75 72 73 6f   open this curso
2d1e0 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 2a 2f  r for writing */
2d1f0 0a 20 20 7d 0a 20 20 69 66 28 20 63 68 65 63 6b  .  }.  if( check
2d200 52 65 61 64 4c 6f 63 6b 73 28 70 43 75 72 2d 3e  ReadLocks(pCur->
2d210 70 42 74 72 65 65 2c 20 70 43 75 72 2d 3e 70 67  pBtree, pCur->pg
2d220 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2c 20 70 43  noRoot, pCur, pC
2d230 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 20 29  ur->info.nKey) )
2d240 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2d250 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54  ITE_LOCKED; /* T
2d260 68 65 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f  he table pCur po
2d270 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20 72 65  ints to has a re
2d280 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 0a  ad lock */.  }..
2d290 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65    /* Restore the
2d2a0 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
2d2b0 70 6f 73 69 74 69 6f 6e 20 28 61 20 6e 6f 2d 6f  position (a no-o
2d2c0 70 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  p if the cursor 
2d2d0 69 73 20 6e 6f 74 20 69 6e 20 0a 20 20 2a 2a 20  is not in .  ** 
2d2e0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
2d2f0 45 4b 20 73 74 61 74 65 29 20 61 6e 64 20 73 61  EK state) and sa
2d300 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
2d310 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75   of any other cu
2d320 72 73 6f 72 73 20 0a 20 20 2a 2a 20 6f 70 65 6e  rsors .  ** open
2d330 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62   on the same tab
2d340 6c 65 2e 20 54 68 65 6e 20 63 61 6c 6c 20 73 71  le. Then call sq
2d350 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2d360 29 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 20 20  ) on the page.  
2d370 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74 72  ** that the entr
2d380 79 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65  y will be delete
2d390 64 20 66 72 6f 6d 2e 0a 20 20 2a 2f 0a 20 20 69  d from..  */.  i
2d3a0 66 28 20 0a 20 20 20 20 28 72 63 20 3d 20 72 65  f( .    (rc = re
2d3b0 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73  storeOrClearCurs
2d3c0 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
2d3d0 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63 20  )!=0 ||.    (rc 
2d3e0 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
2d3f0 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  (pBt, pCur->pgno
2d400 52 6f 6f 74 2c 20 70 43 75 72 29 29 21 3d 30 20  Root, pCur))!=0 
2d410 7c 7c 0a 20 20 20 20 28 72 63 20 3d 20 73 71 6c  ||.    (rc = sql
2d420 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2d430 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21  Page->pDbPage))!
2d440 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  =0.  ){.    retu
2d450 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
2d460 20 4c 6f 63 61 74 65 20 74 68 65 20 63 65 6c 6c   Locate the cell
2d470 20 77 69 74 68 69 6e 20 69 74 73 20 70 61 67 65   within its page
2d480 20 61 6e 64 20 6c 65 61 76 65 20 70 43 65 6c 6c   and leave pCell
2d490 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
2d4a0 0a 20 20 2a 2a 20 64 61 74 61 2e 20 54 68 65 20  .  ** data. The 
2d4b0 63 6c 65 61 72 43 65 6c 6c 28 29 20 63 61 6c 6c  clearCell() call
2d4c0 20 66 72 65 65 73 20 61 6e 79 20 6f 76 65 72 66   frees any overf
2d4d0 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69  low pages associ
2d4e0 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  ated with the.  
2d4f0 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 65 6c  ** cell. The cel
2d500 6c 20 69 74 73 65 6c 66 20 69 73 20 73 74 69 6c  l itself is stil
2d510 6c 20 69 6e 74 61 63 74 2e 0a 20 20 2a 2f 0a 20  l intact..  */. 
2d520 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
2d530 6c 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 69  l(pPage, pCur->i
2d540 64 78 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67  dx);.  if( !pPag
2d550 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 70  e->leaf ){.    p
2d560 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34 62  gnoChild = get4b
2d570 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a  yte(pCell);.  }.
2d580 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c    rc = clearCell
2d590 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a  (pPage, pCell);.
2d5a0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2d5b0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
2d5c0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
2d5d0 61 66 20 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20  af ){.    /*.   
2d5e0 20 2a 2a 20 54 68 65 20 65 6e 74 72 79 20 77 65   ** The entry we
2d5f0 20 61 72 65 20 61 62 6f 75 74 20 74 6f 20 64 65   are about to de
2d600 6c 65 74 65 20 69 73 20 6e 6f 74 20 61 20 6c 65  lete is not a le
2d610 61 66 20 73 6f 20 69 66 20 77 65 20 64 6f 20 6e  af so if we do n
2d620 6f 74 0a 20 20 20 20 2a 2a 20 64 6f 20 73 6f 6d  ot.    ** do som
2d630 65 74 68 69 6e 67 20 77 65 20 77 69 6c 6c 20 6c  ething we will l
2d640 65 61 76 65 20 61 20 68 6f 6c 65 20 6f 6e 20 61  eave a hole on a
2d650 6e 20 69 6e 74 65 72 6e 61 6c 20 70 61 67 65 2e  n internal page.
2d660 0a 20 20 20 20 2a 2a 20 57 65 20 68 61 76 65 20  .    ** We have 
2d670 74 6f 20 66 69 6c 6c 20 74 68 65 20 68 6f 6c 65  to fill the hole
2d680 20 62 79 20 6d 6f 76 69 6e 67 20 69 6e 20 61 20   by moving in a 
2d690 63 65 6c 6c 20 66 72 6f 6d 20 61 20 6c 65 61 66  cell from a leaf
2d6a0 2e 20 20 54 68 65 0a 20 20 20 20 2a 2a 20 6e 65  .  The.    ** ne
2d6b0 78 74 20 43 65 6c 6c 20 61 66 74 65 72 20 74 68  xt Cell after th
2d6c0 65 20 6f 6e 65 20 74 6f 20 62 65 20 64 65 6c 65  e one to be dele
2d6d0 74 65 64 20 69 73 20 67 75 61 72 61 6e 74 65 65  ted is guarantee
2d6e0 64 20 74 6f 20 65 78 69 73 74 20 61 6e 64 0a 20  d to exist and. 
2d6f0 20 20 20 2a 2a 20 74 6f 20 62 65 20 61 20 6c 65     ** to be a le
2d700 61 66 20 73 6f 20 77 65 20 63 61 6e 20 75 73 65  af so we can use
2d710 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   it..    */.    
2d720 42 74 43 75 72 73 6f 72 20 6c 65 61 66 43 75 72  BtCursor leafCur
2d730 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ;.    unsigned c
2d740 68 61 72 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20  har *pNext;.    
2d750 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20  int notUsed;.   
2d760 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2d770 74 65 6d 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20  tempCell = 0;.  
2d780 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
2d790 2d 3e 6c 65 61 66 44 61 74 61 20 29 3b 0a 20 20  ->leafData );.  
2d7a0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65    sqlite3BtreeGe
2d7b0 74 54 65 6d 70 43 75 72 73 6f 72 28 70 43 75 72  tTempCursor(pCur
2d7c0 2c 20 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 20  , &leafCur);.   
2d7d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2d7e0 65 65 4e 65 78 74 28 26 6c 65 61 66 43 75 72 2c  eeNext(&leafCur,
2d7f0 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20   &notUsed);.    
2d800 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2d810 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
2d820 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2d830 65 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2d  e(leafCur.pPage-
2d840 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d  >pDbPage);.    }
2d850 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2d860 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2d870 75 31 36 20 73 7a 4e 65 78 74 3b 0a 20 20 20 20  u16 szNext;.    
2d880 20 20 54 52 41 43 45 28 28 22 44 45 4c 45 54 45    TRACE(("DELETE
2d890 3a 20 74 61 62 6c 65 3d 25 64 20 64 65 6c 65 74  : table=%d delet
2d8a0 65 20 69 6e 74 65 72 6e 61 6c 20 66 72 6f 6d 20  e internal from 
2d8b0 25 64 20 72 65 70 6c 61 63 65 20 66 72 6f 6d 20  %d replace from 
2d8c0 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20 20 20  leaf %d\n",.    
2d8d0 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52       pCur->pgnoR
2d8e0 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  oot, pPage->pgno
2d8f0 2c 20 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2d  , leafCur.pPage-
2d900 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 64  >pgno));.      d
2d910 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  ropCell(pPage, p
2d920 43 75 72 2d 3e 69 64 78 2c 20 63 65 6c 6c 53 69  Cur->idx, cellSi
2d930 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  zePtr(pPage, pCe
2d940 6c 6c 29 29 3b 0a 20 20 20 20 20 20 70 4e 65 78  ll));.      pNex
2d950 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28 6c 65 61  t = findCell(lea
2d960 66 43 75 72 2e 70 50 61 67 65 2c 20 6c 65 61 66  fCur.pPage, leaf
2d970 43 75 72 2e 69 64 78 29 3b 0a 20 20 20 20 20 20  Cur.idx);.      
2d980 73 7a 4e 65 78 74 20 3d 20 63 65 6c 6c 53 69 7a  szNext = cellSiz
2d990 65 50 74 72 28 6c 65 61 66 43 75 72 2e 70 50 61  ePtr(leafCur.pPa
2d9a0 67 65 2c 20 70 4e 65 78 74 29 3b 0a 20 20 20 20  ge, pNext);.    
2d9b0 20 20 61 73 73 65 72 74 28 20 4d 58 5f 43 45 4c    assert( MX_CEL
2d9c0 4c 5f 53 49 5a 45 28 70 42 74 29 3e 3d 73 7a 4e  L_SIZE(pBt)>=szN
2d9d0 65 78 74 2b 34 20 29 3b 0a 20 20 20 20 20 20 61  ext+4 );.      a
2d9e0 6c 6c 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65  llocateTempSpace
2d9f0 28 70 42 74 29 3b 0a 20 20 20 20 20 20 74 65 6d  (pBt);.      tem
2da00 70 43 65 6c 6c 20 3d 20 70 42 74 2d 3e 70 54 6d  pCell = pBt->pTm
2da10 70 53 70 61 63 65 3b 0a 20 20 20 20 20 20 69 66  pSpace;.      if
2da20 28 20 74 65 6d 70 43 65 6c 6c 3d 3d 30 20 29 7b  ( tempCell==0 ){
2da30 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
2da40 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2da50 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
2da60 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2da70 20 20 20 20 20 20 20 72 63 20 3d 20 69 6e 73 65         rc = inse
2da80 72 74 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43  rtCell(pPage, pC
2da90 75 72 2d 3e 69 64 78 2c 20 70 4e 65 78 74 2d 34  ur->idx, pNext-4
2daa0 2c 20 73 7a 4e 65 78 74 2b 34 2c 20 74 65 6d 70  , szNext+4, temp
2dab0 43 65 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  Cell, 0);.      
2dac0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
2dad0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2dae0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 66 69       put4byte(fi
2daf0 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
2db00 50 61 67 65 2c 20 70 43 75 72 2d 3e 69 64 78 29  Page, pCur->idx)
2db10 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b 0a 20 20  , pgnoChild);.  
2db20 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
2db30 63 65 28 70 50 61 67 65 2c 20 30 29 3b 0a 20 20  ce(pPage, 0);.  
2db40 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2db50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
2db60 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c  .        dropCel
2db70 6c 28 6c 65 61 66 43 75 72 2e 70 50 61 67 65 2c  l(leafCur.pPage,
2db80 20 6c 65 61 66 43 75 72 2e 69 64 78 2c 20 73 7a   leafCur.idx, sz
2db90 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 72  Next);.        r
2dba0 63 20 3d 20 62 61 6c 61 6e 63 65 28 6c 65 61 66  c = balance(leaf
2dbb0 43 75 72 2e 70 50 61 67 65 2c 20 30 29 3b 0a 20  Cur.pPage, 0);. 
2dbc0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2dbd0 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 65 6c   sqlite3BtreeRel
2dbe0 65 61 73 65 54 65 6d 70 43 75 72 73 6f 72 28 26  easeTempCursor(&
2dbf0 6c 65 61 66 43 75 72 29 3b 0a 20 20 7d 65 6c 73  leafCur);.  }els
2dc00 65 7b 0a 20 20 20 20 54 52 41 43 45 28 28 22 44  e{.    TRACE(("D
2dc10 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25 64 20  ELETE: table=%d 
2dc20 64 65 6c 65 74 65 20 66 72 6f 6d 20 6c 65 61 66  delete from leaf
2dc30 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 70   %d\n",.       p
2dc40 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
2dc50 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  Page->pgno));.  
2dc60 20 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65    dropCell(pPage
2dc70 2c 20 70 43 75 72 2d 3e 69 64 78 2c 20 63 65 6c  , pCur->idx, cel
2dc80 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
2dc90 70 43 65 6c 6c 29 29 3b 0a 20 20 20 20 72 63 20  pCell));.    rc 
2dca0 3d 20 62 61 6c 61 6e 63 65 28 70 50 61 67 65 2c  = balance(pPage,
2dcb0 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
2dcc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2dcd0 20 20 20 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70      moveToRoot(p
2dce0 43 75 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Cur);.  }.  retu
2dcf0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
2dd00 43 72 65 61 74 65 20 61 20 6e 65 77 20 42 54 72  Create a new BTr
2dd10 65 65 20 74 61 62 6c 65 2e 20 20 57 72 69 74 65  ee table.  Write
2dd20 20 69 6e 74 6f 20 2a 70 69 54 61 62 6c 65 20 74   into *piTable t
2dd30 68 65 20 70 61 67 65 0a 2a 2a 20 6e 75 6d 62 65  he page.** numbe
2dd40 72 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70  r for the root p
2dd50 61 67 65 20 6f 66 20 74 68 65 20 6e 65 77 20 74  age of the new t
2dd60 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  able..**.** The 
2dd70 74 79 70 65 20 6f 66 20 74 79 70 65 20 69 73 20  type of type is 
2dd80 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
2dd90 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
2dda0 72 2e 20 20 4f 6e 6c 79 20 74 68 65 0a 2a 2a 20  r.  Only the.** 
2ddb0 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 6c 75 65 73  following values
2ddc0 20 6f 66 20 66 6c 61 67 73 20 61 72 65 20 63 75   of flags are cu
2ddd0 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 2e 20  rrently in use. 
2dde0 20 4f 74 68 65 72 20 76 61 6c 75 65 73 20 66 6f   Other values fo
2ddf0 72 0a 2a 2a 20 66 6c 61 67 73 20 6d 69 67 68 74  r.** flags might
2de00 20 6e 6f 74 20 77 6f 72 6b 3a 0a 2a 2a 0a 2a 2a   not work:.**.**
2de10 20 20 20 20 20 42 54 52 45 45 5f 49 4e 54 4b 45       BTREE_INTKE
2de20 59 7c 42 54 52 45 45 5f 4c 45 41 46 44 41 54 41  Y|BTREE_LEAFDATA
2de30 20 20 20 20 20 55 73 65 64 20 66 6f 72 20 53 51       Used for SQ
2de40 4c 20 74 61 62 6c 65 73 20 77 69 74 68 20 72 6f  L tables with ro
2de50 77 69 64 20 6b 65 79 73 0a 2a 2a 20 20 20 20 20  wid keys.**     
2de60 42 54 52 45 45 5f 5a 45 52 4f 44 41 54 41 20 20  BTREE_ZERODATA  
2de70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2de80 55 73 65 64 20 66 6f 72 20 53 51 4c 20 69 6e 64  Used for SQL ind
2de90 69 63 65 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ices.*/.static i
2dea0 6e 74 20 62 74 72 65 65 43 72 65 61 74 65 54 61  nt btreeCreateTa
2deb0 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  ble(Btree *p, in
2dec0 74 20 2a 70 69 54 61 62 6c 65 2c 20 69 6e 74 20  t *piTable, int 
2ded0 66 6c 61 67 73 29 7b 0a 20 20 42 74 53 68 61 72  flags){.  BtShar
2dee0 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
2def0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 52 6f  ;.  MemPage *pRo
2df00 6f 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52  ot;.  Pgno pgnoR
2df10 6f 6f 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  oot;.  int rc;..
2df20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2df30 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78  3BtreeHoldsMutex
2df40 28 70 29 20 29 3b 0a 20 20 69 66 28 20 70 42 74  (p) );.  if( pBt
2df50 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 21  ->inTransaction!
2df60 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
2df70 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61 72      /* Must star
2df80 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  t a transaction 
2df90 66 69 72 73 74 20 2a 2f 0a 20 20 20 20 72 63 20  first */.    rc 
2dfa0 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20  = pBt->readOnly 
2dfb0 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  ? SQLITE_READONL
2dfc0 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  Y : SQLITE_ERROR
2dfd0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
2dfe0 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21  .  }.  assert( !
2dff0 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 3b  pBt->readOnly );
2e000 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2e010 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
2e020 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42    rc = allocateB
2e030 74 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70  treePage(pBt, &p
2e040 52 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c  Root, &pgnoRoot,
2e050 20 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63   1, 0);.  if( rc
2e060 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
2e070 63 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 69  c;.  }.#else.  i
2e080 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
2e090 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70  um ){.    Pgno p
2e0a0 67 6e 6f 4d 6f 76 65 3b 20 20 20 20 20 20 2f 2a  gnoMove;      /*
2e0b0 20 4d 6f 76 65 20 61 20 70 61 67 65 20 68 65 72   Move a page her
2e0c0 65 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66  e to make room f
2e0d0 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  or the root-page
2e0e0 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   */.    MemPage 
2e0f0 2a 70 50 61 67 65 4d 6f 76 65 3b 20 2f 2a 20 54  *pPageMove; /* T
2e100 68 65 20 70 61 67 65 20 74 6f 20 6d 6f 76 65 20  he page to move 
2e110 74 6f 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 43  to. */..    /* C
2e120 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 74 61  reating a new ta
2e130 62 6c 65 20 6d 61 79 20 70 72 6f 62 61 62 6c 79  ble may probably
2e140 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e 67 20   require moving 
2e150 61 6e 20 65 78 69 73 74 69 6e 67 20 64 61 74 61  an existing data
2e160 62 61 73 65 0a 20 20 20 20 2a 2a 20 74 6f 20 6d  base.    ** to m
2e170 61 6b 65 20 72 6f 6f 6d 20 66 6f 72 20 74 68 65  ake room for the
2e180 20 6e 65 77 20 74 61 62 6c 65 73 20 72 6f 6f 74   new tables root
2e190 20 70 61 67 65 2e 20 49 6e 20 63 61 73 65 20 74   page. In case t
2e1a0 68 69 73 20 70 61 67 65 20 74 75 72 6e 73 0a 20  his page turns. 
2e1b0 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20     ** out to be 
2e1c0 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
2e1d0 2c 20 64 65 6c 65 74 65 20 61 6c 6c 20 6f 76 65  , delete all ove
2e1e0 72 66 6c 6f 77 20 70 61 67 65 2d 6d 61 70 20 63  rflow page-map c
2e1f0 61 63 68 65 73 0a 20 20 20 20 2a 2a 20 68 65 6c  aches.    ** hel
2e200 64 20 62 79 20 6f 70 65 6e 20 63 75 72 73 6f 72  d by open cursor
2e210 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e  s..    */.    in
2e220 76 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66  validateAllOverf
2e230 6c 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 0a  lowCache(pBt);..
2e240 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20      /* Read the 
2e250 76 61 6c 75 65 20 6f 66 20 6d 65 74 61 5b 33 5d  value of meta[3]
2e260 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
2e270 73 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  se to determine 
2e280 77 68 65 72 65 20 74 68 65 0a 20 20 20 20 2a 2a  where the.    **
2e290 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
2e2a0 65 20 6e 65 77 20 74 61 62 6c 65 20 73 68 6f 75  e new table shou
2e2b0 6c 64 20 67 6f 2e 20 6d 65 74 61 5b 33 5d 20 69  ld go. meta[3] i
2e2c0 73 20 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f  s the largest ro
2e2d0 6f 74 2d 70 61 67 65 0a 20 20 20 20 2a 2a 20 63  ot-page.    ** c
2e2e0 72 65 61 74 65 64 20 73 6f 20 66 61 72 2c 20 73  reated so far, s
2e2f0 6f 20 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70  o the new root-p
2e300 61 67 65 20 69 73 20 28 6d 65 74 61 5b 33 5d 2b  age is (meta[3]+
2e310 31 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  1)..    */.    r
2e320 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2e330 47 65 74 4d 65 74 61 28 70 2c 20 34 2c 20 26 70  GetMeta(p, 4, &p
2e340 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69 66  gnoRoot);.    if
2e350 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2e360 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2e370 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 67  rc;.    }.    pg
2e380 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20 20 20 20 2f  noRoot++;..    /
2e390 2a 20 54 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70  * The new root-p
2e3a0 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 61  age may not be a
2e3b0 6c 6c 6f 63 61 74 65 64 20 6f 6e 20 61 20 70 6f  llocated on a po
2e3c0 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
2e3d0 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 50 45  or the.    ** PE
2e3e0 4e 44 49 4e 47 5f 42 59 54 45 20 70 61 67 65 2e  NDING_BYTE page.
2e3f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 77 68 69 6c  .    */.    whil
2e400 65 28 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50 54 52  e( pgnoRoot==PTR
2e410 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
2e420 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c 0a 20 20 20  pgnoRoot) ||.   
2e430 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 3d 3d 50       pgnoRoot==P
2e440 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
2e450 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 70  (pBt) ){.      p
2e460 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20 20 20 20 7d  gnoRoot++;.    }
2e470 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
2e480 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a 0a 20 20 20  oRoot>=3 );..   
2e490 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 70   /* Allocate a p
2e4a0 61 67 65 2e 20 54 68 65 20 70 61 67 65 20 74 68  age. The page th
2e4b0 61 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65 73  at currently res
2e4c0 69 64 65 73 20 61 74 20 70 67 6e 6f 52 6f 6f 74  ides at pgnoRoot
2e4d0 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
2e4e0 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 61 6c 6c  moved to the all
2e4f0 6f 63 61 74 65 64 20 70 61 67 65 20 28 75 6e 6c  ocated page (unl
2e500 65 73 73 20 74 68 65 20 61 6c 6c 6f 63 61 74 65  ess the allocate
2e510 64 20 70 61 67 65 20 68 61 70 70 65 6e 73 0a 20  d page happens. 
2e520 20 20 20 2a 2a 20 74 6f 20 72 65 73 69 64 65 20     ** to reside 
2e530 61 74 20 70 67 6e 6f 52 6f 6f 74 29 2e 0a 20 20  at pgnoRoot)..  
2e540 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 61 6c    */.    rc = al
2e550 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
2e560 70 42 74 2c 20 26 70 50 61 67 65 4d 6f 76 65 2c  pBt, &pPageMove,
2e570 20 26 70 67 6e 6f 4d 6f 76 65 2c 20 70 67 6e 6f   &pgnoMove, pgno
2e580 52 6f 6f 74 2c 20 31 29 3b 0a 20 20 20 20 69 66  Root, 1);.    if
2e590 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2e5a0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
2e5b0 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  rc;.    }..    i
2e5c0 66 28 20 70 67 6e 6f 4d 6f 76 65 21 3d 70 67 6e  f( pgnoMove!=pgn
2e5d0 6f 52 6f 6f 74 20 29 7b 0a 20 20 20 20 20 20 2f  oRoot ){.      /
2e5e0 2a 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20 74 68  * pgnoRoot is th
2e5f0 65 20 70 61 67 65 20 74 68 61 74 20 77 69 6c 6c  e page that will
2e600 20 62 65 20 75 73 65 64 20 66 6f 72 20 74 68 65   be used for the
2e610 20 72 6f 6f 74 2d 70 61 67 65 20 6f 66 0a 20 20   root-page of.  
2e620 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 77 20 74      ** the new t
2e630 61 62 6c 65 20 28 61 73 73 75 6d 69 6e 67 20 61  able (assuming a
2e640 6e 20 65 72 72 6f 72 20 64 69 64 20 6e 6f 74 20  n error did not 
2e650 6f 63 63 75 72 29 2e 20 42 75 74 20 77 65 20 77  occur). But we w
2e660 65 72 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c  ere.      ** all
2e670 6f 63 61 74 65 64 20 70 67 6e 6f 4d 6f 76 65 2e  ocated pgnoMove.
2e680 20 49 66 20 72 65 71 75 69 72 65 64 20 28 69 2e   If required (i.
2e690 65 2e 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74  e. if it was not
2e6a0 20 61 6c 6c 6f 63 61 74 65 64 0a 20 20 20 20 20   allocated.     
2e6b0 20 2a 2a 20 62 79 20 65 78 74 65 6e 64 69 6e 67   ** by extending
2e6c0 20 74 68 65 20 66 69 6c 65 29 2c 20 74 68 65 20   the file), the 
2e6d0 63 75 72 72 65 6e 74 20 70 61 67 65 20 61 74 20  current page at 
2e6e0 70 6f 73 69 74 69 6f 6e 20 70 67 6e 6f 4d 6f 76  position pgnoMov
2e6f0 65 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 61 6c  e.      ** is al
2e700 72 65 61 64 79 20 6a 6f 75 72 6e 61 6c 65 64 2e  ready journaled.
2e710 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
2e720 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20  u8 eType;.      
2e730 50 67 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a  Pgno iPtrPage;..
2e740 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
2e750 65 28 70 50 61 67 65 4d 6f 76 65 29 3b 0a 0a 20  e(pPageMove);.. 
2e760 20 20 20 20 20 2f 2a 20 4d 6f 76 65 20 74 68 65       /* Move the
2e770 20 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20   page currently 
2e780 61 74 20 70 67 6e 6f 52 6f 6f 74 20 74 6f 20 70  at pgnoRoot to p
2e790 67 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a 20 20 20 20  gnoMove. */.    
2e7a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2e7b0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
2e7c0 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74  pgnoRoot, &pRoot
2e7d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
2e7e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2e7f0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2e800 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
2e810 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
2e820 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  (pBt, pgnoRoot, 
2e830 26 65 54 79 70 65 2c 20 26 69 50 74 72 50 61 67  &eType, &iPtrPag
2e840 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
2e850 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 65  !=SQLITE_OK || e
2e860 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
2e870 54 50 41 47 45 20 7c 7c 20 65 54 79 70 65 3d 3d  TPAGE || eType==
2e880 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
2e890 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
2e8a0 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
2e8b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2e8c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2e8d0 61 73 73 65 72 74 28 20 65 54 79 70 65 21 3d 50  assert( eType!=P
2e8e0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
2e8f0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2e900 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 46 52  eType!=PTRMAP_FR
2e910 45 45 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20  EEPAGE );.      
2e920 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2e930 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44  rWrite(pRoot->pD
2e940 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
2e950 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2e960 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
2e970 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
2e980 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2e990 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2e9a0 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61 67  rc = relocatePag
2e9b0 65 28 70 42 74 2c 20 70 52 6f 6f 74 2c 20 65 54  e(pBt, pRoot, eT
2e9c0 79 70 65 2c 20 69 50 74 72 50 61 67 65 2c 20 70  ype, iPtrPage, p
2e9d0 67 6e 6f 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20  gnoMove);.      
2e9e0 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
2e9f0 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4f 62  t);..      /* Ob
2ea00 74 61 69 6e 20 74 68 65 20 70 61 67 65 20 61 74  tain the page at
2ea10 20 70 67 6e 6f 52 6f 6f 74 20 2a 2f 0a 20 20 20   pgnoRoot */.   
2ea20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2ea30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2ea40 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2ea50 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   }.      rc = sq
2ea60 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
2ea70 65 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c  e(pBt, pgnoRoot,
2ea80 20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20   &pRoot, 0);.   
2ea90 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2eaa0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2eab0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2eac0 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   }.      rc = sq
2ead0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2eae0 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b  pRoot->pDbPage);
2eaf0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2eb00 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2eb10 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2eb20 70 52 6f 6f 74 29 3b 0a 20 20 20 20 20 20 20 20  pRoot);.        
2eb30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
2eb40 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
2eb50 20 20 20 20 70 52 6f 6f 74 20 3d 20 70 50 61 67      pRoot = pPag
2eb60 65 4d 6f 76 65 3b 0a 20 20 20 20 7d 20 0a 0a 20  eMove;.    } .. 
2eb70 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
2eb80 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 61 6e 64   pointer-map and
2eb90 20 6d 65 74 61 2d 64 61 74 61 20 77 69 74 68 20   meta-data with 
2eba0 74 68 65 20 6e 65 77 20 72 6f 6f 74 2d 70 61 67  the new root-pag
2ebb0 65 20 6e 75 6d 62 65 72 2e 20 2a 2f 0a 20 20 20  e number. */.   
2ebc0 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
2ebd0 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 50  pBt, pgnoRoot, P
2ebe0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20  TRMAP_ROOTPAGE, 
2ebf0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
2ec00 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
2ec10 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20  age(pRoot);.    
2ec20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2ec30 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
2ec40 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
2ec50 74 61 28 70 2c 20 34 2c 20 70 67 6e 6f 52 6f 6f  ta(p, 4, pgnoRoo
2ec60 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  t);.    if( rc )
2ec70 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
2ec80 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20 20 20 20  age(pRoot);.    
2ec90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
2eca0 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   }..  }else{.   
2ecb0 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74   rc = allocateBt
2ecc0 72 65 65 50 61 67 65 28 70 42 74 2c 20 26 70 52  reePage(pBt, &pR
2ecd0 6f 6f 74 2c 20 26 70 67 6e 6f 52 6f 6f 74 2c 20  oot, &pgnoRoot, 
2ece0 31 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  1, 0);.    if( r
2ecf0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
2ed00 20 7d 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65   }.#endif.  asse
2ed10 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
2ed20 49 73 77 72 69 74 65 61 62 6c 65 28 70 52 6f 6f  Iswriteable(pRoo
2ed30 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  t->pDbPage) );. 
2ed40 20 7a 65 72 6f 50 61 67 65 28 70 52 6f 6f 74 2c   zeroPage(pRoot,
2ed50 20 66 6c 61 67 73 20 7c 20 50 54 46 5f 4c 45 41   flags | PTF_LEA
2ed60 46 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  F);.  sqlite3Pag
2ed70 65 72 55 6e 72 65 66 28 70 52 6f 6f 74 2d 3e 70  erUnref(pRoot->p
2ed80 44 62 50 61 67 65 29 3b 0a 20 20 2a 70 69 54 61  DbPage);.  *piTa
2ed90 62 6c 65 20 3d 20 28 69 6e 74 29 70 67 6e 6f 52  ble = (int)pgnoR
2eda0 6f 6f 74 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  oot;.  return SQ
2edb0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73  LITE_OK;.}.int s
2edc0 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
2edd0 65 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c  eTable(Btree *p,
2ede0 20 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c 20 69   int *piTable, i
2edf0 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 69 6e 74  nt flags){.  int
2ee00 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74   rc;.  sqlite3Bt
2ee10 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
2ee20 2d 3e 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64  ->pBt->db = p->d
2ee30 62 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43  b;.  rc = btreeC
2ee40 72 65 61 74 65 54 61 62 6c 65 28 70 2c 20 70 69  reateTable(p, pi
2ee50 54 61 62 6c 65 2c 20 66 6c 61 67 73 29 3b 0a 20  Table, flags);. 
2ee60 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
2ee70 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
2ee80 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61  rc;.}../*.** Era
2ee90 73 65 20 74 68 65 20 67 69 76 65 6e 20 64 61 74  se the given dat
2eea0 61 62 61 73 65 20 70 61 67 65 20 61 6e 64 20 61  abase page and a
2eeb0 6c 6c 20 69 74 73 20 63 68 69 6c 64 72 65 6e 2e  ll its children.
2eec0 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20    Return.** the 
2eed0 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65 65  page to the free
2eee0 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
2eef0 69 6e 74 20 63 6c 65 61 72 44 61 74 61 62 61 73  int clearDatabas
2ef00 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  ePage(.  BtShare
2ef10 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20 20  d *pBt,         
2ef20 20 20 2f 2a 20 54 68 65 20 42 54 72 65 65 20 74    /* The BTree t
2ef30 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  hat contains the
2ef40 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f   table */.  Pgno
2ef50 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
2ef60 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
2ef70 20 74 6f 20 63 6c 65 61 72 20 2a 2f 0a 20 20 4d   to clear */.  M
2ef80 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c  emPage *pParent,
2ef90 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70       /* Parent p
2efa0 61 67 65 2e 20 20 4e 55 4c 4c 20 66 6f 72 20 74  age.  NULL for t
2efb0 68 65 20 72 6f 6f 74 20 2a 2f 0a 20 20 69 6e 74  he root */.  int
2efc0 20 66 72 65 65 50 61 67 65 46 6c 61 67 20 20 20   freePageFlag   
2efd0 20 20 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65     /* Deallocate
2efe0 20 70 61 67 65 20 69 66 20 74 72 75 65 20 2a 2f   page if true */
2eff0 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  .){.  MemPage *p
2f000 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Page = 0;.  int 
2f010 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  rc;.  unsigned c
2f020 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e  har *pCell;.  in
2f030 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t i;..  assert( 
2f040 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2f050 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
2f060 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3e 70 61 67  ;.  if( pgno>pag
2f070 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d  erPagecount(pBt-
2f080 3e 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  >pPager) ){.    
2f090 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
2f0a0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
2f0b0 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e  .  rc = getAndIn
2f0c0 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f  itPage(pBt, pgno
2f0d0 2c 20 26 70 50 61 67 65 2c 20 70 50 61 72 65 6e  , &pPage, pParen
2f0e0 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  t);.  if( rc ) g
2f0f0 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73  oto cleardatabas
2f100 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 66 6f 72  epage_out;.  for
2f110 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  (i=0; i<pPage->n
2f120 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
2f130 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  pCell = findCell
2f140 28 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20  (pPage, i);.    
2f150 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
2f160 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 63   ){.      rc = c
2f170 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65  learDatabasePage
2f180 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 70  (pBt, get4byte(p
2f190 43 65 6c 6c 29 2c 20 70 50 61 67 65 2d 3e 70 50  Cell), pPage->pP
2f1a0 61 72 65 6e 74 2c 20 31 29 3b 0a 20 20 20 20 20  arent, 1);.     
2f1b0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63   if( rc ) goto c
2f1c0 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65  leardatabasepage
2f1d0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
2f1e0 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70  rc = clearCell(p
2f1f0 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20  Page, pCell);.  
2f200 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2f210 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67  cleardatabasepag
2f220 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28  e_out;.  }.  if(
2f230 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b   !pPage->leaf ){
2f240 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44  .    rc = clearD
2f250 61 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c  atabasePage(pBt,
2f260 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2f270 2d 3e 61 44 61 74 61 5b 38 5d 29 2c 20 70 50 61  ->aData[8]), pPa
2f280 67 65 2d 3e 70 50 61 72 65 6e 74 2c 20 31 29 3b  ge->pParent, 1);
2f290 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
2f2a0 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65  to cleardatabase
2f2b0 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  page_out;.  }.  
2f2c0 69 66 28 20 66 72 65 65 50 61 67 65 46 6c 61 67  if( freePageFlag
2f2d0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65   ){.    rc = fre
2f2e0 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
2f2f0 7d 65 6c 73 65 20 69 66 28 20 28 72 63 20 3d 20  }else if( (rc = 
2f300 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2f310 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2f320 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 65 72  ))==0 ){.    zer
2f330 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70 50 61  oPage(pPage, pPa
2f340 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 7c 20 50  ge->aData[0] | P
2f350 54 46 5f 4c 45 41 46 29 3b 0a 20 20 7d 0a 0a 63  TF_LEAF);.  }..c
2f360 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65  leardatabasepage
2f370 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73 65 50  _out:.  releaseP
2f380 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65  age(pPage);.  re
2f390 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2f3a0 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 66  * Delete all inf
2f3b0 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20  ormation from a 
2f3c0 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20  single table in 
2f3d0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 69  the database.  i
2f3e0 54 61 62 6c 65 20 69 73 0a 2a 2a 20 74 68 65 20  Table is.** the 
2f3f0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
2f400 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  he root of the t
2f410 61 62 6c 65 2e 20 20 41 66 74 65 72 20 74 68 69  able.  After thi
2f420 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
2f430 73 2c 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70  s,.** the root p
2f440 61 67 65 20 69 73 20 65 6d 70 74 79 2c 20 62 75  age is empty, bu
2f450 74 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0a  t still exists..
2f460 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
2f470 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74  ne will fail wit
2f480 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20  h SQLITE_LOCKED 
2f490 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
2f4a0 20 6f 70 65 6e 0a 2a 2a 20 72 65 61 64 20 63 75   open.** read cu
2f4b0 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61 62  rsors on the tab
2f4c0 6c 65 2e 20 20 4f 70 65 6e 20 77 72 69 74 65 20  le.  Open write 
2f4d0 63 75 72 73 6f 72 73 20 61 72 65 20 6d 6f 76 65  cursors are move
2f4e0 64 20 74 6f 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  d to the.** root
2f4f0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   of the table..*
2f500 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2f510 65 65 43 6c 65 61 72 54 61 62 6c 65 28 42 74 72  eeClearTable(Btr
2f520 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c  ee *p, int iTabl
2f530 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
2f540 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
2f550 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
2f560 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
2f570 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64    pBt->db = p->d
2f580 62 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  b;.  if( p->inTr
2f590 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans!=TRANS_WRITE
2f5a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 42 74   ){.    rc = pBt
2f5b0 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c  ->readOnly ? SQL
2f5c0 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53  ITE_READONLY : S
2f5d0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
2f5e0 65 6c 73 65 20 69 66 28 20 28 72 63 20 3d 20 63  else if( (rc = c
2f5f0 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 2c  heckReadLocks(p,
2f600 20 69 54 61 62 6c 65 2c 20 30 2c 20 31 29 29 21   iTable, 0, 1))!
2f610 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f620 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20    /* nothing to 
2f630 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66  do */.  }else if
2f640 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  ( SQLITE_OK!=(rc
2f650 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72   = saveAllCursor
2f660 73 28 70 42 74 2c 20 69 54 61 62 6c 65 2c 20 30  s(pBt, iTable, 0
2f670 29 29 20 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74  )) ){.    /* not
2f680 68 69 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20  hing to do */.  
2f690 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
2f6a0 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67  clearDatabasePag
2f6b0 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54 61  e(pBt, (Pgno)iTa
2f6c0 62 6c 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  ble, 0, 0);.  }.
2f6d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
2f6e0 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
2f6f0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72   rc;.}../*.** Er
2f700 61 73 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  ase all informat
2f710 69 6f 6e 20 69 6e 20 61 20 74 61 62 6c 65 20 61  ion in a table a
2f720 6e 64 20 61 64 64 20 74 68 65 20 72 6f 6f 74 20  nd add the root 
2f730 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 0a  of the table to.
2f740 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  ** the freelist.
2f750 20 20 45 78 63 65 70 74 2c 20 74 68 65 20 72 6f    Except, the ro
2f760 6f 74 20 6f 66 20 74 68 65 20 70 72 69 6e 63 69  ot of the princi
2f770 70 6c 65 20 74 61 62 6c 65 20 28 74 68 65 20 6f  ple table (the o
2f780 6e 65 20 6f 6e 0a 2a 2a 20 70 61 67 65 20 31 29  ne on.** page 1)
2f790 20 69 73 20 6e 65 76 65 72 20 61 64 64 65 64 20   is never added 
2f7a0 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
2f7b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2f7c0 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69  ine will fail wi
2f7d0 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  th SQLITE_LOCKED
2f7e0 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
2f7f0 79 20 6f 70 65 6e 0a 2a 2a 20 63 75 72 73 6f 72  y open.** cursor
2f800 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  s on the table..
2f810 2a 2a 0a 2a 2a 20 49 66 20 41 55 54 4f 56 41 43  **.** If AUTOVAC
2f820 55 55 4d 20 69 73 20 65 6e 61 62 6c 65 64 20 61  UUM is enabled a
2f830 6e 64 20 74 68 65 20 70 61 67 65 20 61 74 20 69  nd the page at i
2f840 54 61 62 6c 65 20 69 73 20 6e 6f 74 20 74 68 65  Table is not the
2f850 20 6c 61 73 74 0a 2a 2a 20 72 6f 6f 74 20 70 61   last.** root pa
2f860 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
2f870 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74 68  se file, then th
2f880 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65  e last root page
2f890 20 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74 61   .** in the data
2f8a0 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d 6f 76  base file is mov
2f8b0 65 64 20 69 6e 74 6f 20 74 68 65 20 73 6c 6f 74  ed into the slot
2f8c0 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70 69   formerly occupi
2f8d0 65 64 20 62 79 0a 2a 2a 20 69 54 61 62 6c 65 20  ed by.** iTable 
2f8e0 61 6e 64 20 74 68 61 74 20 6c 61 73 74 20 73 6c  and that last sl
2f8f0 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75  ot formerly occu
2f900 70 69 65 64 20 62 79 20 74 68 65 20 6c 61 73 74  pied by the last
2f910 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73   root page.** is
2f920 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
2f930 65 65 6c 69 73 74 20 69 6e 73 74 65 61 64 20 6f  eelist instead o
2f940 66 20 69 54 61 62 6c 65 2e 20 20 49 6e 20 74 68  f iTable.  In th
2f950 69 73 20 73 61 79 2c 20 61 6c 6c 0a 2a 2a 20 72  is say, all.** r
2f960 6f 6f 74 20 70 61 67 65 73 20 61 72 65 20 6b 65  oot pages are ke
2f970 70 74 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  pt at the beginn
2f980 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62  ing of the datab
2f990 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68 0a  ase file, which.
2f9a0 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79 20  ** is necessary 
2f9b0 66 6f 72 20 41 55 54 4f 56 41 43 55 55 4d 20 74  for AUTOVACUUM t
2f9c0 6f 20 77 6f 72 6b 20 72 69 67 68 74 2e 20 20 2a  o work right.  *
2f9d0 70 69 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74  piMoved is set t
2f9e0 6f 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6e  o the .** page n
2f9f0 75 6d 62 65 72 20 74 68 61 74 20 75 73 65 64 20  umber that used 
2fa00 74 6f 20 62 65 20 74 68 65 20 6c 61 73 74 20 72  to be the last r
2fa10 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  oot page in the 
2fa20 66 69 6c 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  file before.** t
2fa30 68 65 20 6d 6f 76 65 2e 20 20 49 66 20 6e 6f 20  he move.  If no 
2fa40 70 61 67 65 20 67 65 74 73 20 6d 6f 76 65 64 2c  page gets moved,
2fa50 20 2a 70 69 4d 6f 76 65 64 20 69 73 20 73 65 74   *piMoved is set
2fa60 20 74 6f 20 30 2e 0a 2a 2a 20 54 68 65 20 6c 61   to 0..** The la
2fa70 73 74 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20  st root page is 
2fa80 72 65 63 6f 72 64 65 64 20 69 6e 20 6d 65 74 61  recorded in meta
2fa90 5b 33 5d 20 61 6e 64 20 74 68 65 20 76 61 6c 75  [3] and the valu
2faa0 65 20 6f 66 0a 2a 2a 20 6d 65 74 61 5b 33 5d 20  e of.** meta[3] 
2fab0 69 73 20 75 70 64 61 74 65 64 20 62 79 20 74 68  is updated by th
2fac0 69 73 20 70 72 6f 63 65 64 75 72 65 2e 0a 2a 2f  is procedure..*/
2fad0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72 65  .static int btre
2fae0 65 44 72 6f 70 54 61 62 6c 65 28 42 74 72 65 65  eDropTable(Btree
2faf0 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c   *p, int iTable,
2fb00 20 69 6e 74 20 2a 70 69 4d 6f 76 65 64 29 7b 0a   int *piMoved){.
2fb10 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50    int rc;.  MemP
2fb20 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
2fb30 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
2fb40 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73  = p->pBt;..  ass
2fb50 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
2fb60 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
2fb70 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ;.  if( p->inTra
2fb80 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20  ns!=TRANS_WRITE 
2fb90 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42  ){.    return pB
2fba0 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51  t->readOnly ? SQ
2fbb0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20  LITE_READONLY : 
2fbc0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
2fbd0 7d 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 69 6c  }..  /* It is il
2fbe0 6c 65 67 61 6c 20 74 6f 20 64 72 6f 70 20 61 20  legal to drop a 
2fbf0 74 61 62 6c 65 20 69 66 20 61 6e 79 20 63 75 72  table if any cur
2fc00 73 6f 72 73 20 61 72 65 20 6f 70 65 6e 20 6f 6e  sors are open on
2fc10 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
2fc20 73 65 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  se. This is beca
2fc30 75 73 65 20 69 6e 20 61 75 74 6f 2d 76 61 63 75  use in auto-vacu
2fc40 75 6d 20 6d 6f 64 65 20 74 68 65 20 62 61 63 6b  um mode the back
2fc50 65 6e 64 20 6d 61 79 0a 20 20 2a 2a 20 6e 65 65  end may.  ** nee
2fc60 64 20 74 6f 20 6d 6f 76 65 20 61 6e 6f 74 68 65  d to move anothe
2fc70 72 20 72 6f 6f 74 2d 70 61 67 65 20 74 6f 20 66  r root-page to f
2fc80 69 6c 6c 20 61 20 67 61 70 20 6c 65 66 74 20 62  ill a gap left b
2fc90 79 20 74 68 65 20 64 65 6c 65 74 65 64 0a 20 20  y the deleted.  
2fca0 2a 2a 20 72 6f 6f 74 20 70 61 67 65 2e 20 49 66  ** root page. If
2fcb0 20 61 6e 20 6f 70 65 6e 20 63 75 72 73 6f 72 20   an open cursor 
2fcc0 77 61 73 20 75 73 69 6e 67 20 74 68 69 73 20 70  was using this p
2fcd0 61 67 65 20 61 20 70 72 6f 62 6c 65 6d 20 77 6f  age a problem wo
2fce0 75 6c 64 20 0a 20 20 2a 2a 20 6f 63 63 75 72 2e  uld .  ** occur.
2fcf0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d  .  */.  if( pBt-
2fd00 3e 70 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  >pCursor ){.    
2fd10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
2fd20 43 4b 45 44 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  CKED;.  }..  rc 
2fd30 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
2fd40 74 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f  tPage(pBt, (Pgno
2fd50 29 69 54 61 62 6c 65 2c 20 26 70 50 61 67 65 2c  )iTable, &pPage,
2fd60 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20   0);.  if( rc ) 
2fd70 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
2fd80 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c  = sqlite3BtreeCl
2fd90 65 61 72 54 61 62 6c 65 28 70 2c 20 69 54 61 62  earTable(p, iTab
2fda0 6c 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  le);.  if( rc ){
2fdb0 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
2fdc0 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74  (pPage);.    ret
2fdd0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2a  urn rc;.  }..  *
2fde0 70 69 4d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20  piMoved = 0;..  
2fdf0 69 66 28 20 69 54 61 62 6c 65 3e 31 20 29 7b 0a  if( iTable>1 ){.
2fe00 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
2fe10 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
2fe20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
2fe30 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65 6c 65  pPage);.    rele
2fe40 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
2fe50 23 65 6c 73 65 0a 20 20 20 20 69 66 28 20 70 42  #else.    if( pB
2fe60 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
2fe70 0a 20 20 20 20 20 20 50 67 6e 6f 20 6d 61 78 52  .      Pgno maxR
2fe80 6f 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20 72  ootPgno;.      r
2fe90 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2fea0 47 65 74 4d 65 74 61 28 70 2c 20 34 2c 20 26 6d  GetMeta(p, 4, &m
2feb0 61 78 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20  axRootPgno);.   
2fec0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2fed0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2fee0 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
2fef0 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  e);.        retu
2ff00 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
2ff10 20 20 20 20 20 20 69 66 28 20 69 54 61 62 6c 65        if( iTable
2ff20 3d 3d 6d 61 78 52 6f 6f 74 50 67 6e 6f 20 29 7b  ==maxRootPgno ){
2ff30 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
2ff40 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64  he table being d
2ff50 72 6f 70 70 65 64 20 69 73 20 74 68 65 20 74 61  ropped is the ta
2ff60 62 6c 65 20 77 69 74 68 20 74 68 65 20 6c 61 72  ble with the lar
2ff70 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20  gest root-page. 
2ff80 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
2ff90 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2ffa0 2c 20 70 75 74 20 74 68 65 20 72 6f 6f 74 20 70  , put the root p
2ffb0 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65 20  age on the free 
2ffc0 6c 69 73 74 2e 20 0a 20 20 20 20 20 20 20 20 2a  list. .        *
2ffd0 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  /.        rc = f
2ffe0 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  reePage(pPage);.
2fff0 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
30000 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
30010 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
30020 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
30030 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
30040 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
30050 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  lse{.        /* 
30060 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  The table being 
30070 64 72 6f 70 70 65 64 20 64 6f 65 73 20 6e 6f 74  dropped does not
30080 20 68 61 76 65 20 74 68 65 20 6c 61 72 67 65 73   have the larges
30090 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  t root-page.    
300a0 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e      ** number in
300b0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 53   the database. S
300c0 6f 20 6d 6f 76 65 20 74 68 65 20 70 61 67 65 20  o move the page 
300d0 74 68 61 74 20 64 6f 65 73 20 69 6e 74 6f 20 74  that does into t
300e0 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 67  he .        ** g
300f0 61 70 20 6c 65 66 74 20 62 79 20 74 68 65 20 64  ap left by the d
30100 65 6c 65 74 65 64 20 72 6f 6f 74 2d 70 61 67 65  eleted root-page
30110 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
30120 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4d       MemPage *pM
30130 6f 76 65 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ove;.        rel
30140 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
30150 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
30160 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
30170 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67  e(pBt, maxRootPg
30180 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a  no, &pMove, 0);.
30190 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
301a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
301b0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
301c0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
301d0 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74      rc = relocat
301e0 65 50 61 67 65 28 70 42 74 2c 20 70 4d 6f 76 65  ePage(pBt, pMove
301f0 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  , PTRMAP_ROOTPAG
30200 45 2c 20 30 2c 20 69 54 61 62 6c 65 29 3b 0a 20  E, 0, iTable);. 
30210 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
30220 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20  ge(pMove);.     
30230 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
30240 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
30250 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
30260 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
30270 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
30280 47 65 74 50 61 67 65 28 70 42 74 2c 20 6d 61 78  GetPage(pBt, max
30290 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65  RootPgno, &pMove
302a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
302b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
302c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
302d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
302e0 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  }.        rc = f
302f0 72 65 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a  reePage(pMove);.
30300 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
30310 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20  age(pMove);.    
30320 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
30330 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
30340 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
30350 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
30360 2a 70 69 4d 6f 76 65 64 20 3d 20 6d 61 78 52 6f  *piMoved = maxRo
30370 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  otPgno;.      }.
30380 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68  .      /* Set th
30390 65 20 6e 65 77 20 27 6d 61 78 2d 72 6f 6f 74 2d  e new 'max-root-
303a0 70 61 67 65 27 20 76 61 6c 75 65 20 69 6e 20 74  page' value in t
303b0 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64  he database head
303c0 65 72 2e 20 54 68 69 73 0a 20 20 20 20 20 20 2a  er. This.      *
303d0 2a 20 69 73 20 74 68 65 20 6f 6c 64 20 76 61 6c  * is the old val
303e0 75 65 20 6c 65 73 73 20 6f 6e 65 2c 20 6c 65 73  ue less one, les
303f0 73 20 6f 6e 65 20 6d 6f 72 65 20 69 66 20 74 68  s one more if th
30400 61 74 20 68 61 70 70 65 6e 73 20 74 6f 0a 20 20  at happens to.  
30410 20 20 20 20 2a 2a 20 62 65 20 61 20 72 6f 6f 74      ** be a root
30420 2d 70 61 67 65 20 6e 75 6d 62 65 72 2c 20 6c 65  -page number, le
30430 73 73 20 6f 6e 65 20 61 67 61 69 6e 20 69 66 20  ss one again if 
30440 74 68 61 74 20 69 73 20 74 68 65 0a 20 20 20 20  that is the.    
30450 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54    ** PENDING_BYT
30460 45 5f 50 41 47 45 2e 0a 20 20 20 20 20 20 2a 2f  E_PAGE..      */
30470 0a 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67  .      maxRootPg
30480 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20  no--;.      if( 
30490 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50 45 4e  maxRootPgno==PEN
304a0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
304b0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  Bt) ){.        m
304c0 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20  axRootPgno--;.  
304d0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
304e0 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50 54 52  maxRootPgno==PTR
304f0 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
30500 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 20 29 7b 0a  maxRootPgno) ){.
30510 20 20 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50          maxRootP
30520 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20  gno--;.      }. 
30530 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 61 78       assert( max
30540 52 6f 6f 74 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  RootPgno!=PENDIN
30550 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
30560 20 29 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20   );..      rc = 
30570 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
30580 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 6d 61 78  teMeta(p, 4, max
30590 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20 7d  RootPgno);.    }
305a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
305b0 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29   freePage(pPage)
305c0 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
305d0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
305e0 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  }.#endif.  }else
305f0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 73 71 6c 69  {.    /* If sqli
30600 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c  te3BtreeDropTabl
30610 65 20 77 61 73 20 63 61 6c 6c 65 64 20 6f 6e 20  e was called on 
30620 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20 20 20 7a  page 1. */.    z
30630 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 50  eroPage(pPage, P
30640 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
30650 41 46 20 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  AF );.    releas
30660 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
30670 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20  }.  return rc;  
30680 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
30690 72 65 65 44 72 6f 70 54 61 62 6c 65 28 42 74 72  reeDropTable(Btr
306a0 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c  ee *p, int iTabl
306b0 65 2c 20 69 6e 74 20 2a 70 69 4d 6f 76 65 64 29  e, int *piMoved)
306c0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
306d0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
306e0 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 64 62  p);.  p->pBt->db
306f0 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d   = p->db;.  rc =
30700 20 62 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28   btreeDropTable(
30710 70 2c 20 69 54 61 62 6c 65 2c 20 70 69 4d 6f 76  p, iTable, piMov
30720 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ed);.  sqlite3Bt
30730 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
30740 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
30750 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 6d 65 74  .** Read the met
30760 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75  a-information ou
30770 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  t of a database 
30780 66 69 6c 65 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a  file.  Meta[0].*
30790 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  * is the number 
307a0 6f 66 20 66 72 65 65 20 70 61 67 65 73 20 63 75  of free pages cu
307b0 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 64  rrently in the d
307c0 61 74 61 62 61 73 65 2e 20 20 4d 65 74 61 5b 31  atabase.  Meta[1
307d0 5d 0a 2a 2a 20 74 68 72 6f 75 67 68 20 6d 65 74  ].** through met
307e0 61 5b 31 35 5d 20 61 72 65 20 61 76 61 69 6c 61  a[15] are availa
307f0 62 6c 65 20 66 6f 72 20 75 73 65 20 62 79 20 68  ble for use by h
30800 69 67 68 65 72 20 6c 61 79 65 72 73 2e 20 20 4d  igher layers.  M
30810 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20 72 65 61  eta[0].** is rea
30820 64 2d 6f 6e 6c 79 2c 20 74 68 65 20 6f 74 68 65  d-only, the othe
30830 72 73 20 61 72 65 20 72 65 61 64 2f 77 72 69 74  rs are read/writ
30840 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 73 63  e..** .** The sc
30850 68 65 6d 61 20 6c 61 79 65 72 20 6e 75 6d 62 65  hema layer numbe
30860 72 73 20 6d 65 74 61 20 76 61 6c 75 65 73 20 64  rs meta values d
30870 69 66 66 65 72 65 6e 74 6c 79 2e 20 20 41 74 20  ifferently.  At 
30880 74 68 65 20 73 63 68 65 6d 61 0a 2a 2a 20 6c 61  the schema.** la
30890 79 65 72 20 28 61 6e 64 20 74 68 65 20 53 65 74  yer (and the Set
308a0 43 6f 6f 6b 69 65 20 61 6e 64 20 52 65 61 64 43  Cookie and ReadC
308b0 6f 6f 6b 69 65 20 6f 70 63 6f 64 65 73 29 20 74  ookie opcodes) t
308c0 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
308d0 66 72 65 65 20 70 61 67 65 73 20 69 73 20 6e 6f  free pages is no
308e0 74 20 76 69 73 69 62 6c 65 2e 20 20 53 6f 20 43  t visible.  So C
308f0 6f 6f 6b 69 65 5b 30 5d 20 69 73 20 74 68 65 20  ookie[0] is the 
30900 73 61 6d 65 20 61 73 20 4d 65 74 61 5b 31 5d 2e  same as Meta[1].
30910 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
30920 74 72 65 65 47 65 74 4d 65 74 61 28 42 74 72 65  treeGetMeta(Btre
30930 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 75  e *p, int idx, u
30940 33 32 20 2a 70 4d 65 74 61 29 7b 0a 20 20 44 62  32 *pMeta){.  Db
30950 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
30960 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67   int rc;.  unsig
30970 6e 65 64 20 63 68 61 72 20 2a 70 50 31 3b 0a 20  ned char *pP1;. 
30980 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
30990 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69   p->pBt;..  sqli
309a0 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
309b0 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d  ;.  pBt->db = p-
309c0 3e 64 62 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 69  >db;..  /* Readi
309d0 6e 67 20 61 20 6d 65 74 61 2d 64 61 74 61 20 76  ng a meta-data v
309e0 61 6c 75 65 20 72 65 71 75 69 72 65 73 20 61 20  alue requires a 
309f0 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67  read-lock on pag
30a00 65 20 31 20 28 61 6e 64 20 68 65 6e 63 65 0a 20  e 1 (and hence. 
30a10 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   ** the sqlite_m
30a20 61 73 74 65 72 20 74 61 62 6c 65 2e 20 57 65 20  aster table. We 
30a30 67 72 61 62 20 74 68 69 73 20 6c 6f 63 6b 20 72  grab this lock r
30a40 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
30a50 74 68 65 72 20 6f 72 0a 20 20 2a 2a 20 6e 6f 74  ther or.  ** not
30a60 20 74 68 65 20 53 51 4c 49 54 45 5f 52 65 61 64   the SQLITE_Read
30a70 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  Uncommitted flag
30a80 20 69 73 20 73 65 74 20 28 74 68 65 20 74 61 62   is set (the tab
30a90 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  le rooted at pag
30aa0 65 0a 20 20 2a 2a 20 31 20 69 73 20 74 72 65 61  e.  ** 1 is trea
30ab0 74 65 64 20 61 73 20 61 20 73 70 65 63 69 61 6c  ted as a special
30ac0 20 63 61 73 65 20 62 79 20 71 75 65 72 79 54 61   case by queryTa
30ad0 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 20 6c 6f  bleLock() and lo
30ae0 63 6b 54 61 62 6c 65 28 29 29 2e 0a 20 20 2a 2f  ckTable())..  */
30af0 0a 20 20 72 63 20 3d 20 71 75 65 72 79 54 61 62  .  rc = queryTab
30b00 6c 65 4c 6f 63 6b 28 70 2c 20 31 2c 20 52 45 41  leLock(p, 1, REA
30b10 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72  D_LOCK);.  if( r
30b20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
30b30 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
30b40 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
30b50 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
30b60 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26  assert( idx>=0 &
30b70 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20 20 72  & idx<=15 );.  r
30b80 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
30b90 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  Get(pBt->pPager,
30ba0 20 31 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20   1, &pDbPage);. 
30bb0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 73   if( rc ){.    s
30bc0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
30bd0 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (p);.    return 
30be0 72 63 3b 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20  rc;.  }.  pP1 = 
30bf0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
30c00 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
30c10 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20  Data(pDbPage);. 
30c20 20 2a 70 4d 65 74 61 20 3d 20 67 65 74 34 62 79   *pMeta = get4by
30c30 74 65 28 26 70 50 31 5b 33 36 20 2b 20 69 64 78  te(&pP1[36 + idx
30c40 2a 34 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 50  *4]);.  sqlite3P
30c50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
30c60 65 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 75 74  e);..  /* If aut
30c70 6f 76 61 63 75 75 6d 65 64 20 69 73 20 64 69 73  ovacuumed is dis
30c80 61 62 6c 65 64 20 69 6e 20 74 68 69 73 20 62 75  abled in this bu
30c90 69 6c 64 20 62 75 74 20 77 65 20 61 72 65 20 74  ild but we are t
30ca0 72 79 69 6e 67 20 74 6f 20 0a 20 20 2a 2a 20 61  rying to .  ** a
30cb0 63 63 65 73 73 20 61 6e 20 61 75 74 6f 76 61 63  ccess an autovac
30cc0 75 75 6d 65 64 20 64 61 74 61 62 61 73 65 2c 20  uumed database, 
30cd0 74 68 65 6e 20 6d 61 6b 65 20 74 68 65 20 64 61  then make the da
30ce0 74 61 62 61 73 65 20 72 65 61 64 6f 6e 6c 79 2e  tabase readonly.
30cf0 20 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51   .  */.#ifdef SQ
30d00 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
30d10 43 55 55 4d 0a 20 20 69 66 28 20 69 64 78 3d 3d  CUUM.  if( idx==
30d20 34 20 26 26 20 2a 70 4d 65 74 61 3e 30 20 29 20  4 && *pMeta>0 ) 
30d30 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  pBt->readOnly = 
30d40 31 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  1;.#endif..  /* 
30d50 47 72 61 62 20 74 68 65 20 72 65 61 64 2d 6c 6f  Grab the read-lo
30d60 63 6b 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f  ck on page 1. */
30d70 0a 20 20 72 63 20 3d 20 6c 6f 63 6b 54 61 62 6c  .  rc = lockTabl
30d80 65 28 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43  e(p, 1, READ_LOC
30d90 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  K);.  sqlite3Btr
30da0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
30db0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
30dc0 2a 20 57 72 69 74 65 20 6d 65 74 61 2d 69 6e 66  * Write meta-inf
30dd0 6f 72 6d 61 74 69 6f 6e 20 62 61 63 6b 20 69 6e  ormation back in
30de0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
30df0 20 20 4d 65 74 61 5b 30 5d 20 69 73 0a 2a 2a 20    Meta[0] is.** 
30e00 72 65 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 6d 61  read-only and ma
30e10 79 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e  y not be written
30e20 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
30e30 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28  BtreeUpdateMeta(
30e40 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 64  Btree *p, int id
30e50 78 2c 20 75 33 32 20 69 4d 65 74 61 29 7b 0a 20  x, u32 iMeta){. 
30e60 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
30e70 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67   p->pBt;.  unsig
30e80 6e 65 64 20 63 68 61 72 20 2a 70 50 31 3b 0a 20  ned char *pP1;. 
30e90 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
30ea0 74 28 20 69 64 78 3e 3d 31 20 26 26 20 69 64 78  t( idx>=1 && idx
30eb0 3c 3d 31 35 20 29 3b 0a 20 20 73 71 6c 69 74 65  <=15 );.  sqlite
30ec0 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
30ed0 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64    pBt->db = p->d
30ee0 62 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  b;.  if( p->inTr
30ef0 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans!=TRANS_WRITE
30f00 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 42 74   ){.    rc = pBt
30f10 2d 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c  ->readOnly ? SQL
30f20 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53  ITE_READONLY : S
30f30 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
30f40 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
30f50 28 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30  ( pBt->pPage1!=0
30f60 20 29 3b 0a 20 20 20 20 70 50 31 20 3d 20 70 42   );.    pP1 = pB
30f70 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61  t->pPage1->aData
30f80 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
30f90 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42 74  e3PagerWrite(pBt
30fa0 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  ->pPage1->pDbPag
30fb0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
30fc0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
30fd0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 31     put4byte(&pP1
30fe0 5b 33 36 20 2b 20 69 64 78 2a 34 5d 2c 20 69 4d  [36 + idx*4], iM
30ff0 65 74 61 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  eta);.#ifndef SQ
31000 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
31010 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 69  CUUM.      if( i
31020 64 78 3d 3d 37 20 29 7b 0a 20 20 20 20 20 20 20  dx==7 ){.       
31030 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
31040 74 6f 56 61 63 75 75 6d 20 7c 7c 20 69 4d 65 74  toVacuum || iMet
31050 61 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  a==0 );.        
31060 61 73 73 65 72 74 28 20 69 4d 65 74 61 3d 3d 30  assert( iMeta==0
31070 20 7c 7c 20 69 4d 65 74 61 3d 3d 31 20 29 3b 0a   || iMeta==1 );.
31080 20 20 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63          pBt->inc
31090 72 56 61 63 75 75 6d 20 3d 20 69 4d 65 74 61 3b  rVacuum = iMeta;
310a0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
310b0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
310c0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
310d0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
310e0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
310f0 68 65 20 66 6c 61 67 20 62 79 74 65 20 61 74 20  he flag byte at 
31100 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
31110 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 74   the page that t
31120 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 69 73 20  he cursor.** is 
31130 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
31140 6e 67 20 74 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ng to..*/.int sq
31150 6c 69 74 65 33 42 74 72 65 65 46 6c 61 67 73 28  lite3BtreeFlags(
31160 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
31170 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74  .  /* TODO: What
31180 20 61 62 6f 75 74 20 43 55 52 53 4f 52 5f 52 45   about CURSOR_RE
31190 51 55 49 52 45 53 45 45 4b 20 73 74 61 74 65 3f  QUIRESEEK state?
311a0 20 50 72 6f 62 61 62 6c 79 20 6e 65 65 64 20 74   Probably need t
311b0 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 72 65 73 74  o call.  ** rest
311c0 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72  oreOrClearCursor
311d0 50 6f 73 69 74 69 6f 6e 28 29 20 68 65 72 65 2e  Position() here.
311e0 0a 20 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  .  */.  MemPage 
311f0 2a 70 50 61 67 65 3b 0a 20 20 72 65 73 74 6f 72  *pPage;.  restor
31200 65 4f 72 43 6c 65 61 72 43 75 72 73 6f 72 50 6f  eOrClearCursorPo
31210 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
31220 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 70 50  pPage = pCur->pP
31230 61 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 63  age;.  assert( c
31240 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
31250 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
31260 74 28 20 70 50 61 67 65 2d 3e 70 42 74 3d 3d 70  t( pPage->pBt==p
31270 43 75 72 2d 3e 70 42 74 20 29 3b 0a 20 20 72 65  Cur->pBt );.  re
31280 74 75 72 6e 20 70 50 61 67 65 20 3f 20 70 50 61  turn pPage ? pPa
31290 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
312a0 3e 68 64 72 4f 66 66 73 65 74 5d 20 3a 20 30 3b  >hdrOffset] : 0;
312b0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  .}.../*.** Retur
312c0 6e 20 74 68 65 20 70 61 67 65 72 20 61 73 73 6f  n the pager asso
312d0 63 69 61 74 65 64 20 77 69 74 68 20 61 20 42 54  ciated with a BT
312e0 72 65 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ree.  This routi
312f0 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a  ne is used for.*
31300 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65  * testing and de
31310 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
31320 0a 50 61 67 65 72 20 2a 73 71 6c 69 74 65 33 42  .Pager *sqlite3B
31330 74 72 65 65 50 61 67 65 72 28 42 74 72 65 65 20  treePager(Btree 
31340 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d  *p){.  return p-
31350 3e 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 7d 0a  >pBt->pPager;.}.
31360 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
31370 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43  OMIT_INTEGRITY_C
31380 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  HECK./*.** Appen
31390 64 20 61 20 6d 65 73 73 61 67 65 20 74 6f 20 74  d a message to t
313a0 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
313b0 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74   string..*/.stat
313c0 69 63 20 76 6f 69 64 20 63 68 65 63 6b 41 70 70  ic void checkApp
313d0 65 6e 64 4d 73 67 28 0a 20 20 49 6e 74 65 67 72  endMsg(.  Integr
313e0 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 0a 20  ityCk *pCheck,. 
313f0 20 63 68 61 72 20 2a 7a 4d 73 67 31 2c 0a 20 20   char *zMsg1,.  
31400 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
31410 6d 61 74 2c 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20  mat,.  ....){.  
31420 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63 68  va_list ap;.  ch
31430 61 72 20 2a 7a 4d 73 67 32 3b 0a 20 20 69 66 28  ar *zMsg2;.  if(
31440 20 21 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20   !pCheck->mxErr 
31450 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 68 65  ) return;.  pChe
31460 63 6b 2d 3e 6d 78 45 72 72 2d 2d 3b 0a 20 20 70  ck->mxErr--;.  p
31470 43 68 65 63 6b 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  Check->nErr++;. 
31480 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
31490 6f 72 6d 61 74 29 3b 0a 20 20 7a 4d 73 67 32 20  ormat);.  zMsg2 
314a0 3d 20 73 71 6c 69 74 65 33 56 4d 50 72 69 6e 74  = sqlite3VMPrint
314b0 66 28 30 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  f(0, zFormat, ap
314c0 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b  );.  va_end(ap);
314d0 0a 20 20 69 66 28 20 7a 4d 73 67 31 3d 3d 30 20  .  if( zMsg1==0 
314e0 29 20 7a 4d 73 67 31 20 3d 20 22 22 3b 0a 20 20  ) zMsg1 = "";.  
314f0 69 66 28 20 70 43 68 65 63 6b 2d 3e 7a 45 72 72  if( pCheck->zErr
31500 4d 73 67 20 29 7b 0a 20 20 20 20 63 68 61 72 20  Msg ){.    char 
31510 2a 7a 4f 6c 64 20 3d 20 70 43 68 65 63 6b 2d 3e  *zOld = pCheck->
31520 7a 45 72 72 4d 73 67 3b 0a 20 20 20 20 70 43 68  zErrMsg;.    pCh
31530 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 20 3d 20 30  eck->zErrMsg = 0
31540 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 74  ;.    sqlite3Set
31550 53 74 72 69 6e 67 28 26 70 43 68 65 63 6b 2d 3e  String(&pCheck->
31560 7a 45 72 72 4d 73 67 2c 20 7a 4f 6c 64 2c 20 22  zErrMsg, zOld, "
31570 5c 6e 22 2c 20 7a 4d 73 67 31 2c 20 7a 4d 73 67  \n", zMsg1, zMsg
31580 32 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  2, (char*)0);.  
31590 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
315a0 4f 6c 64 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Old);.  }else{. 
315b0 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
315c0 69 6e 67 28 26 70 43 68 65 63 6b 2d 3e 7a 45 72  ing(&pCheck->zEr
315d0 72 4d 73 67 2c 20 7a 4d 73 67 31 2c 20 7a 4d 73  rMsg, zMsg1, zMs
315e0 67 32 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  g2, (char*)0);. 
315f0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
31600 65 28 7a 4d 73 67 32 29 3b 0a 7d 0a 23 65 6e 64  e(zMsg2);.}.#end
31610 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
31620 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
31630 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51  K */..#ifndef SQ
31640 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
31650 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20  ITY_CHECK./*.** 
31660 41 64 64 20 31 20 74 6f 20 74 68 65 20 72 65 66  Add 1 to the ref
31670 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
31680 20 70 61 67 65 20 69 50 61 67 65 2e 20 20 49 66   page iPage.  If
31690 20 74 68 69 73 20 69 73 20 74 68 65 20 73 65 63   this is the sec
316a0 6f 6e 64 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65  ond.** reference
316b0 20 74 6f 20 74 68 65 20 70 61 67 65 2c 20 61 64   to the page, ad
316c0 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  d an error messa
316d0 67 65 20 74 6f 20 70 43 68 65 63 6b 2d 3e 7a 45  ge to pCheck->zE
316e0 72 72 4d 73 67 2e 0a 2a 2a 20 52 65 74 75 72 6e  rrMsg..** Return
316f0 20 31 20 69 66 20 74 68 65 72 65 20 61 72 65 20   1 if there are 
31700 32 20 6f 72 65 20 6d 6f 72 65 20 72 65 66 65 72  2 ore more refer
31710 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
31720 65 20 61 6e 64 20 30 20 69 66 0a 2a 2a 20 69 66  e and 0 if.** if
31730 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
31740 73 74 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  st reference to 
31750 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
31760 41 6c 73 6f 20 63 68 65 63 6b 20 74 68 61 74 20  Also check that 
31770 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
31780 69 73 20 69 6e 20 62 6f 75 6e 64 73 2e 0a 2a 2f  is in bounds..*/
31790 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63  .static int chec
317a0 6b 52 65 66 28 49 6e 74 65 67 72 69 74 79 43 6b  kRef(IntegrityCk
317b0 20 2a 70 43 68 65 63 6b 2c 20 69 6e 74 20 69 50   *pCheck, int iP
317c0 61 67 65 2c 20 63 68 61 72 20 2a 7a 43 6f 6e 74  age, char *zCont
317d0 65 78 74 29 7b 0a 20 20 69 66 28 20 69 50 61 67  ext){.  if( iPag
317e0 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  e==0 ) return 1;
317f0 0a 20 20 69 66 28 20 69 50 61 67 65 3e 70 43 68  .  if( iPage>pCh
31800 65 63 6b 2d 3e 6e 50 61 67 65 20 7c 7c 20 69 50  eck->nPage || iP
31810 61 67 65 3c 30 20 29 7b 0a 20 20 20 20 63 68 65  age<0 ){.    che
31820 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
31830 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 69  ck, zContext, "i
31840 6e 76 61 6c 69 64 20 70 61 67 65 20 6e 75 6d 62  nvalid page numb
31850 65 72 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a  er %d", iPage);.
31860 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
31870 7d 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e  }.  if( pCheck->
31880 61 6e 52 65 66 5b 69 50 61 67 65 5d 3d 3d 31 20  anRef[iPage]==1 
31890 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65  ){.    checkAppe
318a0 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43  ndMsg(pCheck, zC
318b0 6f 6e 74 65 78 74 2c 20 22 32 6e 64 20 72 65 66  ontext, "2nd ref
318c0 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 25  erence to page %
318d0 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20  d", iPage);.    
318e0 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
318f0 72 65 74 75 72 6e 20 20 28 70 43 68 65 63 6b 2d  return  (pCheck-
31900 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d 2b 2b 29  >anRef[iPage]++)
31910 3e 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  >1;.}..#ifndef S
31920 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
31930 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ACUUM./*.** Chec
31940 6b 20 74 68 61 74 20 74 68 65 20 65 6e 74 72 79  k that the entry
31950 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   in the pointer-
31960 6d 61 70 20 66 6f 72 20 70 61 67 65 20 69 43 68  map for page iCh
31970 69 6c 64 20 6d 61 70 73 20 74 6f 20 0a 2a 2a 20  ild maps to .** 
31980 70 61 67 65 20 69 50 61 72 65 6e 74 2c 20 70 6f  page iParent, po
31990 69 6e 74 65 72 20 74 79 70 65 20 70 74 72 54 79  inter type ptrTy
319a0 70 65 2e 20 49 66 20 6e 6f 74 2c 20 61 70 70 65  pe. If not, appe
319b0 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  nd an error mess
319c0 61 67 65 0a 2a 2a 20 74 6f 20 70 43 68 65 63 6b  age.** to pCheck
319d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
319e0 20 63 68 65 63 6b 50 74 72 6d 61 70 28 0a 20 20   checkPtrmap(.  
319f0 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68  IntegrityCk *pCh
31a00 65 63 6b 2c 20 20 20 2f 2a 20 49 6e 74 65 67 72  eck,   /* Integr
31a10 69 74 79 20 63 68 65 63 6b 20 63 6f 6e 74 65 78  ity check contex
31a20 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69  t */.  Pgno iChi
31a30 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ld,           /*
31a40 20 43 68 69 6c 64 20 70 61 67 65 20 6e 75 6d 62   Child page numb
31a50 65 72 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65  er */.  u8 eType
31a60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
31a70 2a 20 45 78 70 65 63 74 65 64 20 70 6f 69 6e 74  * Expected point
31a80 65 72 20 6d 61 70 20 74 79 70 65 20 2a 2f 0a 20  er map type */. 
31a90 20 50 67 6e 6f 20 69 50 61 72 65 6e 74 2c 20 20   Pgno iParent,  
31aa0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 65 63          /* Expec
31ab0 74 65 64 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  ted pointer map 
31ac0 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
31ad0 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43  er */.  char *zC
31ae0 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20 20 2f  ontext         /
31af0 2a 20 43 6f 6e 74 65 78 74 20 64 65 73 63 72 69  * Context descri
31b00 70 74 69 6f 6e 20 28 75 73 65 64 20 66 6f 72 20  ption (used for 
31b10 65 72 72 6f 72 20 6d 73 67 29 20 2a 2f 0a 29 7b  error msg) */.){
31b20 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 38 20  .  int rc;.  u8 
31b30 65 50 74 72 6d 61 70 54 79 70 65 3b 0a 20 20 50  ePtrmapType;.  P
31b40 67 6e 6f 20 69 50 74 72 6d 61 70 50 61 72 65 6e  gno iPtrmapParen
31b50 74 3b 0a 0a 20 20 72 63 20 3d 20 70 74 72 6d 61  t;..  rc = ptrma
31b60 70 47 65 74 28 70 43 68 65 63 6b 2d 3e 70 42 74  pGet(pCheck->pBt
31b70 2c 20 69 43 68 69 6c 64 2c 20 26 65 50 74 72 6d  , iChild, &ePtrm
31b80 61 70 54 79 70 65 2c 20 26 69 50 74 72 6d 61 70  apType, &iPtrmap
31b90 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28 20 72  Parent);.  if( r
31ba0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
31bb0 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
31bc0 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
31bd0 65 78 74 2c 20 22 46 61 69 6c 65 64 20 74 6f 20  ext, "Failed to 
31be0 72 65 61 64 20 70 74 72 6d 61 70 20 6b 65 79 3d  read ptrmap key=
31bf0 25 64 22 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20  %d", iChild);.  
31c00 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
31c10 20 69 66 28 20 65 50 74 72 6d 61 70 54 79 70 65   if( ePtrmapType
31c20 21 3d 65 54 79 70 65 20 7c 7c 20 69 50 74 72 6d  !=eType || iPtrm
31c30 61 70 50 61 72 65 6e 74 21 3d 69 50 61 72 65 6e  apParent!=iParen
31c40 74 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70  t ){.    checkAp
31c50 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
31c60 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20  zContext, .     
31c70 20 22 42 61 64 20 70 74 72 20 6d 61 70 20 65 6e   "Bad ptr map en
31c80 74 72 79 20 6b 65 79 3d 25 64 20 65 78 70 65 63  try key=%d expec
31c90 74 65 64 3d 28 25 64 2c 25 64 29 20 67 6f 74 3d  ted=(%d,%d) got=
31ca0 28 25 64 2c 25 64 29 22 2c 20 0a 20 20 20 20 20  (%d,%d)", .     
31cb0 20 69 43 68 69 6c 64 2c 20 65 54 79 70 65 2c 20   iChild, eType, 
31cc0 69 50 61 72 65 6e 74 2c 20 65 50 74 72 6d 61 70  iParent, ePtrmap
31cd0 54 79 70 65 2c 20 69 50 74 72 6d 61 70 50 61 72  Type, iPtrmapPar
31ce0 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  ent);.  }.}.#end
31cf0 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  if../*.** Check 
31d00 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  the integrity of
31d10 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 6f 72   the freelist or
31d20 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   of an overflow 
31d30 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2a 20 56 65  page list..** Ve
31d40 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e 75  rify that the nu
31d50 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
31d60 20 74 68 65 20 6c 69 73 74 20 69 73 20 4e 2e 0a   the list is N..
31d70 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
31d80 68 65 63 6b 4c 69 73 74 28 0a 20 20 49 6e 74 65  heckList(.  Inte
31d90 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c  grityCk *pCheck,
31da0 20 20 2f 2a 20 49 6e 74 65 67 72 69 74 79 20 63    /* Integrity c
31db0 68 65 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  hecking context 
31dc0 2a 2f 0a 20 20 69 6e 74 20 69 73 46 72 65 65 4c  */.  int isFreeL
31dd0 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 72  ist,       /* Tr
31de0 75 65 20 66 6f 72 20 61 20 66 72 65 65 6c 69 73  ue for a freelis
31df0 74 2e 20 20 46 61 6c 73 65 20 66 6f 72 20 6f 76  t.  False for ov
31e00 65 72 66 6c 6f 77 20 70 61 67 65 20 6c 69 73 74  erflow page list
31e10 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67 65 2c   */.  int iPage,
31e20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
31e30 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 66  age number for f
31e40 69 72 73 74 20 70 61 67 65 20 69 6e 20 74 68 65  irst page in the
31e50 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 4e   list */.  int N
31e60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
31e70 20 2f 2a 20 45 78 70 65 63 74 65 64 20 6e 75 6d   /* Expected num
31e80 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
31e90 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 63 68  the list */.  ch
31ea0 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20 20  ar *zContext    
31eb0 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66      /* Context f
31ec0 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  or error message
31ed0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
31ee0 0a 20 20 69 6e 74 20 65 78 70 65 63 74 65 64 20  .  int expected 
31ef0 3d 20 4e 3b 0a 20 20 69 6e 74 20 69 46 69 72 73  = N;.  int iFirs
31f00 74 20 3d 20 69 50 61 67 65 3b 0a 20 20 77 68 69  t = iPage;.  whi
31f10 6c 65 28 20 4e 2d 2d 20 3e 20 30 20 26 26 20 70  le( N-- > 0 && p
31f20 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20 29 7b 0a  Check->mxErr ){.
31f30 20 20 20 20 44 62 50 61 67 65 20 2a 70 4f 76 66      DbPage *pOvf
31f40 6c 50 61 67 65 3b 0a 20 20 20 20 75 6e 73 69 67  lPage;.    unsig
31f50 6e 65 64 20 63 68 61 72 20 2a 70 4f 76 66 6c 44  ned char *pOvflD
31f60 61 74 61 3b 0a 20 20 20 20 69 66 28 20 69 50 61  ata;.    if( iPa
31f70 67 65 3c 31 20 29 7b 0a 20 20 20 20 20 20 63 68  ge<1 ){.      ch
31f80 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
31f90 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20  eck, zContext,. 
31fa0 20 20 20 20 20 20 20 20 22 25 64 20 6f 66 20 25          "%d of %
31fb0 64 20 70 61 67 65 73 20 6d 69 73 73 69 6e 67 20  d pages missing 
31fc0 66 72 6f 6d 20 6f 76 65 72 66 6c 6f 77 20 6c 69  from overflow li
31fd0 73 74 20 73 74 61 72 74 69 6e 67 20 61 74 20 25  st starting at %
31fe0 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 2b  d",.          N+
31ff0 31 2c 20 65 78 70 65 63 74 65 64 2c 20 69 46 69  1, expected, iFi
32000 72 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rst);.      brea
32010 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
32020 20 63 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b   checkRef(pCheck
32030 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78  , iPage, zContex
32040 74 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  t) ) break;.    
32050 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
32060 47 65 74 28 70 43 68 65 63 6b 2d 3e 70 50 61 67  Get(pCheck->pPag
32070 65 72 2c 20 28 50 67 6e 6f 29 69 50 61 67 65 2c  er, (Pgno)iPage,
32080 20 26 70 4f 76 66 6c 50 61 67 65 29 20 29 7b 0a   &pOvflPage) ){.
32090 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
320a0 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
320b0 6e 74 65 78 74 2c 20 22 66 61 69 6c 65 64 20 74  ntext, "failed t
320c0 6f 20 67 65 74 20 70 61 67 65 20 25 64 22 2c 20  o get page %d", 
320d0 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 62 72  iPage);.      br
320e0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  eak;.    }.    p
320f0 4f 76 66 6c 44 61 74 61 20 3d 20 28 75 6e 73 69  OvflData = (unsi
32100 67 6e 65 64 20 63 68 61 72 20 2a 29 73 71 6c 69  gned char *)sqli
32110 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
32120 70 4f 76 66 6c 50 61 67 65 29 3b 0a 20 20 20 20  pOvflPage);.    
32130 69 66 28 20 69 73 46 72 65 65 4c 69 73 74 20 29  if( isFreeList )
32140 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  {.      int n = 
32150 67 65 74 34 62 79 74 65 28 26 70 4f 76 66 6c 44  get4byte(&pOvflD
32160 61 74 61 5b 34 5d 29 3b 0a 23 69 66 6e 64 65 66  ata[4]);.#ifndef
32170 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
32180 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66  OVACUUM.      if
32190 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61  ( pCheck->pBt->a
321a0 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
321b0 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70       checkPtrmap
321c0 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20  (pCheck, iPage, 
321d0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c  PTRMAP_FREEPAGE,
321e0 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20   0, zContext);. 
321f0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
32200 20 20 20 20 69 66 28 20 6e 3e 70 43 68 65 63 6b      if( n>pCheck
32210 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
32220 65 2f 34 2d 32 20 29 7b 0a 20 20 20 20 20 20 20  e/4-2 ){.       
32230 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
32240 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
32250 2c 0a 20 20 20 20 20 20 20 20 20 20 20 22 66 72  ,.           "fr
32260 65 65 6c 69 73 74 20 6c 65 61 66 20 63 6f 75 6e  eelist leaf coun
32270 74 20 74 6f 6f 20 62 69 67 20 6f 6e 20 70 61 67  t too big on pag
32280 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20  e %d", iPage);. 
32290 20 20 20 20 20 20 20 4e 2d 2d 3b 0a 20 20 20 20         N--;.    
322a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
322b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
322c0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  ++){.          P
322d0 67 6e 6f 20 69 46 72 65 65 50 61 67 65 20 3d 20  gno iFreePage = 
322e0 67 65 74 34 62 79 74 65 28 26 70 4f 76 66 6c 44  get4byte(&pOvflD
322f0 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 23 69 66  ata[8+i*4]);.#if
32300 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
32310 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
32320 20 20 20 20 20 20 69 66 28 20 70 43 68 65 63 6b        if( pCheck
32330 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
32340 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  m ){.           
32350 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68   checkPtrmap(pCh
32360 65 63 6b 2c 20 69 46 72 65 65 50 61 67 65 2c 20  eck, iFreePage, 
32370 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c  PTRMAP_FREEPAGE,
32380 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20   0, zContext);. 
32390 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69           }.#endi
323a0 66 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63  f.          chec
323b0 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69 46 72  kRef(pCheck, iFr
323c0 65 65 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74  eePage, zContext
323d0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
323e0 20 20 20 20 20 4e 20 2d 3d 20 6e 3b 0a 20 20 20       N -= n;.   
323f0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64     }.    }.#ifnd
32400 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
32410 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 65 6c  UTOVACUUM.    el
32420 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  se{.      /* If 
32430 74 68 69 73 20 64 61 74 61 62 61 73 65 20 73 75  this database su
32440 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
32450 75 6d 20 61 6e 64 20 69 50 61 67 65 20 69 73 20  um and iPage is 
32460 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 20 20 20  not the last.   
32470 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
32480 69 73 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  is overflow list
32490 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  , check that the
324a0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
324b0 72 79 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20  ry for.      ** 
324c0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61  the following pa
324d0 67 65 20 6d 61 74 63 68 65 73 20 69 50 61 67 65  ge matches iPage
324e0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
324f0 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74   if( pCheck->pBt
32500 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
32510 4e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  N>0 ){.        i
32520 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f 76 66   = get4byte(pOvf
32530 6c 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  lData);.        
32540 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65  checkPtrmap(pChe
32550 63 6b 2c 20 69 2c 20 50 54 52 4d 41 50 5f 4f 56  ck, i, PTRMAP_OV
32560 45 52 46 4c 4f 57 32 2c 20 69 50 61 67 65 2c 20  ERFLOW2, iPage, 
32570 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  zContext);.     
32580 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
32590 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34      iPage = get4
325a0 62 79 74 65 28 70 4f 76 66 6c 44 61 74 61 29 3b  byte(pOvflData);
325b0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
325c0 72 55 6e 72 65 66 28 70 4f 76 66 6c 50 61 67 65  rUnref(pOvflPage
325d0 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
325e0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  /* SQLITE_OMIT_I
325f0 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a  NTEGRITY_CHECK *
32600 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
32610 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
32620 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 44 6f 20  _CHECK./*.** Do 
32630 76 61 72 69 6f 75 73 20 73 61 6e 69 74 79 20 63  various sanity c
32640 68 65 63 6b 73 20 6f 6e 20 61 20 73 69 6e 67 6c  hecks on a singl
32650 65 20 70 61 67 65 20 6f 66 20 61 20 74 72 65 65  e page of a tree
32660 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65  .  Return.** the
32670 20 74 72 65 65 20 64 65 70 74 68 2e 20 20 52 6f   tree depth.  Ro
32680 6f 74 20 70 61 67 65 73 20 72 65 74 75 72 6e 20  ot pages return 
32690 30 2e 20 20 50 61 72 65 6e 74 73 20 6f 66 20 72  0.  Parents of r
326a0 6f 6f 74 20 70 61 67 65 73 0a 2a 2a 20 72 65 74  oot pages.** ret
326b0 75 72 6e 20 31 2c 20 61 6e 64 20 73 6f 20 66 6f  urn 1, and so fo
326c0 72 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 73  rth..** .** Thes
326d0 65 20 63 68 65 63 6b 73 20 61 72 65 20 64 6f 6e  e checks are don
326e0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 31 2e  e:.**.**      1.
326f0 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 61 74    Make sure that
32700 20 63 65 6c 6c 73 20 61 6e 64 20 66 72 65 65 62   cells and freeb
32710 6c 6f 63 6b 73 20 64 6f 20 6e 6f 74 20 6f 76 65  locks do not ove
32720 72 6c 61 70 0a 2a 2a 20 20 20 20 20 20 20 20 20  rlap.**         
32730 20 62 75 74 20 63 6f 6d 62 69 6e 65 20 74 6f 20   but combine to 
32740 63 6f 6d 70 6c 65 74 65 6c 79 20 63 6f 76 65 72  completely cover
32750 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 20 4e   the page..**  N
32760 4f 20 20 32 2e 20 20 4d 61 6b 65 20 73 75 72 65  O  2.  Make sure
32770 20 63 65 6c 6c 20 6b 65 79 73 20 61 72 65 20 69   cell keys are i
32780 6e 20 6f 72 64 65 72 2e 0a 2a 2a 20 20 4e 4f 20  n order..**  NO 
32790 20 33 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 6e   3.  Make sure n
327a0 6f 20 6b 65 79 20 69 73 20 6c 65 73 73 20 74 68  o key is less th
327b0 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
327c0 4c 6f 77 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20  LowerBound..**  
327d0 4e 4f 20 20 34 2e 20 20 4d 61 6b 65 20 73 75 72  NO  4.  Make sur
327e0 65 20 6e 6f 20 6b 65 79 20 69 73 20 67 72 65 61  e no key is grea
327f0 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
32800 6c 20 74 6f 20 7a 55 70 70 65 72 42 6f 75 6e 64  l to zUpperBound
32810 2e 0a 2a 2a 20 20 20 20 20 20 35 2e 20 20 43 68  ..**      5.  Ch
32820 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74  eck the integrit
32830 79 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61  y of overflow pa
32840 67 65 73 2e 0a 2a 2a 20 20 20 20 20 20 36 2e 20  ges..**      6. 
32850 20 52 65 63 75 72 73 69 76 65 6c 79 20 63 61 6c   Recursively cal
32860 6c 20 63 68 65 63 6b 54 72 65 65 50 61 67 65 20  l checkTreePage 
32870 6f 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 2e  on all children.
32880 0a 2a 2a 20 20 20 20 20 20 37 2e 20 20 56 65 72  .**      7.  Ver
32890 69 66 79 20 74 68 61 74 20 74 68 65 20 64 65 70  ify that the dep
328a0 74 68 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 72  th of all childr
328b0 65 6e 20 69 73 20 74 68 65 20 73 61 6d 65 2e 0a  en is the same..
328c0 2a 2a 20 20 20 20 20 20 38 2e 20 20 4d 61 6b 65  **      8.  Make
328d0 20 73 75 72 65 20 74 68 69 73 20 70 61 67 65 20   sure this page 
328e0 69 73 20 61 74 20 6c 65 61 73 74 20 33 33 25 20  is at least 33% 
328f0 66 75 6c 6c 20 6f 72 20 65 6c 73 65 20 69 74 20  full or else it 
32900 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74  is.**          t
32910 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  he root of the t
32920 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ree..*/.static i
32930 6e 74 20 63 68 65 63 6b 54 72 65 65 50 61 67 65  nt checkTreePage
32940 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20  (.  IntegrityCk 
32950 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20 43 6f 6e  *pCheck,  /* Con
32960 74 65 78 74 20 66 6f 72 20 74 68 65 20 73 61 6e  text for the san
32970 69 74 79 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69  ity check */.  i
32980 6e 74 20 69 50 61 67 65 2c 20 20 20 20 20 20 20  nt iPage,       
32990 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
329a0 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
329b0 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 4d 65  to check */.  Me
329c0 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 2c 20  mPage *pParent, 
329d0 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 70 61      /* Parent pa
329e0 67 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50  ge */.  char *zP
329f0 61 72 65 6e 74 43 6f 6e 74 65 78 74 20 20 2f 2a  arentContext  /*
32a00 20 50 61 72 65 6e 74 20 63 6f 6e 74 65 78 74 20   Parent context 
32a10 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  */.){.  MemPage 
32a20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 69 2c  *pPage;.  int i,
32a30 20 72 63 2c 20 64 65 70 74 68 2c 20 64 32 2c 20   rc, depth, d2, 
32a40 70 67 6e 6f 2c 20 63 6e 74 3b 0a 20 20 69 6e 74  pgno, cnt;.  int
32a50 20 68 64 72 2c 20 63 65 6c 6c 53 74 61 72 74 3b   hdr, cellStart;
32a60 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20  .  int nCell;.  
32a70 75 38 20 2a 64 61 74 61 3b 0a 20 20 42 74 53 68  u8 *data;.  BtSh
32a80 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 69 6e 74  ared *pBt;.  int
32a90 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63   usableSize;.  c
32aa0 68 61 72 20 7a 43 6f 6e 74 65 78 74 5b 31 30 30  har zContext[100
32ab0 5d 3b 0a 20 20 63 68 61 72 20 2a 68 69 74 3b 0a  ];.  char *hit;.
32ac0 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
32ad0 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74  ntf(sizeof(zCont
32ae0 65 78 74 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  ext), zContext, 
32af0 22 50 61 67 65 20 25 64 3a 20 22 2c 20 69 50 61  "Page %d: ", iPa
32b00 67 65 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  ge);..  /* Check
32b10 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 65   that the page e
32b20 78 69 73 74 73 0a 20 20 2a 2f 0a 20 20 70 42 74  xists.  */.  pBt
32b30 20 3d 20 70 43 68 65 63 6b 2d 3e 70 42 74 3b 0a   = pCheck->pBt;.
32b40 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20 70    usableSize = p
32b50 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b 0a  Bt->usableSize;.
32b60 20 20 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29    if( iPage==0 )
32b70 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
32b80 20 63 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b   checkRef(pCheck
32b90 2c 20 69 50 61 67 65 2c 20 7a 50 61 72 65 6e 74  , iPage, zParent
32ba0 43 6f 6e 74 65 78 74 29 20 29 20 72 65 74 75 72  Context) ) retur
32bb0 6e 20 30 3b 0a 20 20 69 66 28 20 28 72 63 20 3d  n 0;.  if( (rc =
32bc0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
32bd0 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29  Page(pBt, (Pgno)
32be0 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c 20 30  iPage, &pPage, 0
32bf0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 63 68 65  ))!=0 ){.    che
32c00 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65  ckAppendMsg(pChe
32c10 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20  ck, zContext,.  
32c20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20       "unable to 
32c30 67 65 74 20 74 68 65 20 70 61 67 65 2e 20 65 72  get the page. er
32c40 72 6f 72 20 63 6f 64 65 3d 25 64 22 2c 20 72 63  ror code=%d", rc
32c50 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
32c60 0a 20 20 7d 0a 20 20 69 66 28 20 28 72 63 20 3d  .  }.  if( (rc =
32c70 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
32c80 74 50 61 67 65 28 70 50 61 67 65 2c 20 70 50 61  tPage(pPage, pPa
32c90 72 65 6e 74 29 29 21 3d 30 20 29 7b 0a 20 20 20  rent))!=0 ){.   
32ca0 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
32cb0 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
32cc0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
32cd0 20 20 20 20 20 20 22 73 71 6c 69 74 65 33 42 74        "sqlite3Bt
32ce0 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 72 65  reeInitPage() re
32cf0 74 75 72 6e 73 20 65 72 72 6f 72 20 63 6f 64 65  turns error code
32d00 20 25 64 22 2c 20 72 63 29 3b 0a 20 20 20 20 72   %d", rc);.    r
32d10 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
32d20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
32d30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
32d40 20 6f 75 74 20 61 6c 6c 20 74 68 65 20 63 65 6c   out all the cel
32d50 6c 73 2e 0a 20 20 2a 2f 0a 20 20 64 65 70 74 68  ls..  */.  depth
32d60 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
32d70 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20   i<pPage->nCell 
32d80 26 26 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72  && pCheck->mxErr
32d90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 38 20 2a  ; i++){.    u8 *
32da0 70 43 65 6c 6c 3b 0a 20 20 20 20 69 6e 74 20 73  pCell;.    int s
32db0 7a 3b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  z;.    CellInfo 
32dc0 69 6e 66 6f 3b 0a 0a 20 20 20 20 2f 2a 20 43 68  info;..    /* Ch
32dd0 65 63 6b 20 70 61 79 6c 6f 61 64 20 6f 76 65 72  eck payload over
32de0 66 6c 6f 77 20 70 61 67 65 73 0a 20 20 20 20 2a  flow pages.    *
32df0 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  /.    sqlite3_sn
32e00 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43  printf(sizeof(zC
32e10 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65 78  ontext), zContex
32e20 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
32e30 22 4f 6e 20 74 72 65 65 20 70 61 67 65 20 25 64  "On tree page %d
32e40 20 63 65 6c 6c 20 25 64 3a 20 22 2c 20 69 50 61   cell %d: ", iPa
32e50 67 65 2c 20 69 29 3b 0a 20 20 20 20 70 43 65 6c  ge, i);.    pCel
32e60 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
32e70 67 65 2c 69 29 3b 0a 20 20 20 20 73 71 6c 69 74  ge,i);.    sqlit
32e80 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
32e90 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c  Ptr(pPage, pCell
32ea0 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 73 7a  , &info);.    sz
32eb0 20 3d 20 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20   = info.nData;. 
32ec0 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 69     if( !pPage->i
32ed0 6e 74 4b 65 79 20 29 20 73 7a 20 2b 3d 20 69 6e  ntKey ) sz += in
32ee0 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 61 73 73  fo.nKey;.    ass
32ef0 65 72 74 28 20 73 7a 3d 3d 69 6e 66 6f 2e 6e 50  ert( sz==info.nP
32f00 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20 20 69 66  ayload );.    if
32f10 28 20 73 7a 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  ( sz>info.nLocal
32f20 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50   ){.      int nP
32f30 61 67 65 20 3d 20 28 73 7a 20 2d 20 69 6e 66 6f  age = (sz - info
32f40 2e 6e 4c 6f 63 61 6c 20 2b 20 75 73 61 62 6c 65  .nLocal + usable
32f50 53 69 7a 65 20 2d 20 35 29 2f 28 75 73 61 62 6c  Size - 5)/(usabl
32f60 65 53 69 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20  eSize - 4);.    
32f70 20 20 50 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20    Pgno pgnoOvfl 
32f80 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65 6c  = get4byte(&pCel
32f90 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  l[info.iOverflow
32fa0 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ]);.#ifndef SQLI
32fb0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
32fc0 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70 42 74  UM.      if( pBt
32fd0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
32fe0 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72          checkPtr
32ff0 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67 6e 6f  map(pCheck, pgno
33000 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  Ovfl, PTRMAP_OVE
33010 52 46 4c 4f 57 31 2c 20 69 50 61 67 65 2c 20 7a  RFLOW1, iPage, z
33020 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  Context);.      
33030 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 63  }.#endif.      c
33040 68 65 63 6b 4c 69 73 74 28 70 43 68 65 63 6b 2c  heckList(pCheck,
33050 20 30 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 6e 50   0, pgnoOvfl, nP
33060 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a  age, zContext);.
33070 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68      }..    /* Ch
33080 65 63 6b 20 73 61 6e 69 74 79 20 6f 66 20 6c 65  eck sanity of le
33090 66 74 20 63 68 69 6c 64 20 70 61 67 65 2e 0a 20  ft child page.. 
330a0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70     */.    if( !p
330b0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
330c0 20 20 20 20 70 67 6e 6f 20 3d 20 67 65 74 34 62      pgno = get4b
330d0 79 74 65 28 70 43 65 6c 6c 29 3b 0a 23 69 66 6e  yte(pCell);.#ifn
330e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
330f0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
33100 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
33110 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
33120 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65  checkPtrmap(pChe
33130 63 6b 2c 20 70 67 6e 6f 2c 20 50 54 52 4d 41 50  ck, pgno, PTRMAP
33140 5f 42 54 52 45 45 2c 20 69 50 61 67 65 2c 20 7a  _BTREE, iPage, z
33150 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  Context);.      
33160 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 64  }.#endif.      d
33170 32 20 3d 20 63 68 65 63 6b 54 72 65 65 50 61 67  2 = checkTreePag
33180 65 28 70 43 68 65 63 6b 2c 70 67 6e 6f 2c 70 50  e(pCheck,pgno,pP
33190 61 67 65 2c 7a 43 6f 6e 74 65 78 74 29 3b 0a 20  age,zContext);. 
331a0 20 20 20 20 20 69 66 28 20 69 3e 30 20 26 26 20       if( i>0 && 
331b0 64 32 21 3d 64 65 70 74 68 20 29 7b 0a 20 20 20  d2!=depth ){.   
331c0 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
331d0 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e  Msg(pCheck, zCon
331e0 74 65 78 74 2c 20 22 43 68 69 6c 64 20 70 61 67  text, "Child pag
331f0 65 20 64 65 70 74 68 20 64 69 66 66 65 72 73 22  e depth differs"
33200 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
33210 20 64 65 70 74 68 20 3d 20 64 32 3b 0a 20 20 20   depth = d2;.   
33220 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50   }.  }.  if( !pP
33230 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
33240 20 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65   pgno = get4byte
33250 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
33260 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
33270 38 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  8]);.    sqlite3
33280 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
33290 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a 43 6f 6e  (zContext), zCon
332a0 74 65 78 74 2c 20 0a 20 20 20 20 20 20 20 20 20  text, .         
332b0 20 20 20 20 20 20 20 20 20 20 20 20 22 4f 6e 20              "On 
332c0 70 61 67 65 20 25 64 20 61 74 20 72 69 67 68 74  page %d at right
332d0 20 63 68 69 6c 64 3a 20 22 2c 20 69 50 61 67 65   child: ", iPage
332e0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
332f0 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
33300 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61  M.    if( pBt->a
33310 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
33320 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70     checkPtrmap(p
33330 43 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 50 54 52  Check, pgno, PTR
33340 4d 41 50 5f 42 54 52 45 45 2c 20 69 50 61 67 65  MAP_BTREE, iPage
33350 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  , 0);.    }.#end
33360 69 66 0a 20 20 20 20 63 68 65 63 6b 54 72 65 65  if.    checkTree
33370 50 61 67 65 28 70 43 68 65 63 6b 2c 20 70 67 6e  Page(pCheck, pgn
33380 6f 2c 20 70 50 61 67 65 2c 20 7a 43 6f 6e 74 65  o, pPage, zConte
33390 78 74 29 3b 0a 20 20 7d 0a 20 0a 20 20 2f 2a 20  xt);.  }. .  /* 
333a0 43 68 65 63 6b 20 66 6f 72 20 63 6f 6d 70 6c 65  Check for comple
333b0 74 65 20 63 6f 76 65 72 61 67 65 20 6f 66 20 74  te coverage of t
333c0 68 65 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 64  he page.  */.  d
333d0 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
333e0 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  ta;.  hdr = pPag
333f0 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
33400 68 69 74 20 3d 20 73 71 6c 69 74 65 33 50 61 67  hit = sqlite3Pag
33410 65 4d 61 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61  eMalloc( pBt->pa
33420 67 65 53 69 7a 65 20 29 3b 0a 20 20 69 66 28 20  geSize );.  if( 
33430 68 69 74 20 29 7b 0a 20 20 20 20 6d 65 6d 73 65  hit ){.    memse
33440 74 28 68 69 74 2c 20 30 2c 20 75 73 61 62 6c 65  t(hit, 0, usable
33450 53 69 7a 65 20 29 3b 0a 20 20 20 20 6d 65 6d 73  Size );.    mems
33460 65 74 28 68 69 74 2c 20 31 2c 20 67 65 74 32 62  et(hit, 1, get2b
33470 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
33480 29 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d 20  ));.    nCell = 
33490 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
334a0 64 72 2b 33 5d 29 3b 0a 20 20 20 20 63 65 6c 6c  dr+3]);.    cell
334b0 53 74 61 72 74 20 3d 20 68 64 72 20 2b 20 31 32  Start = hdr + 12
334c0 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66   - 4*pPage->leaf
334d0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
334e0 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20  <nCell; i++){.  
334f0 20 20 20 20 69 6e 74 20 70 63 20 3d 20 67 65 74      int pc = get
33500 32 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c 6c  2byte(&data[cell
33510 53 74 61 72 74 2b 69 2a 32 5d 29 3b 0a 20 20 20  Start+i*2]);.   
33520 20 20 20 75 31 36 20 73 69 7a 65 20 3d 20 63 65     u16 size = ce
33530 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
33540 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20 20   &data[pc]);.   
33550 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
33560 69 66 28 20 28 70 63 2b 73 69 7a 65 2d 31 29 3e  if( (pc+size-1)>
33570 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 70  =usableSize || p
33580 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  c<0 ){.        c
33590 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
335a0 68 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20  heck, 0, .      
335b0 20 20 20 20 20 20 22 43 6f 72 72 75 70 74 69 6f        "Corruptio
335c0 6e 20 64 65 74 65 63 74 65 64 20 69 6e 20 63 65  n detected in ce
335d0 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65 20 25 64  ll %d on page %d
335e0 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b 0a 20 20  ",i,iPage,0);.  
335f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33600 20 20 20 66 6f 72 28 6a 3d 70 63 2b 73 69 7a 65     for(j=pc+size
33610 2d 31 3b 20 6a 3e 3d 70 63 3b 20 6a 2d 2d 29 20  -1; j>=pc; j--) 
33620 68 69 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20  hit[j]++;.      
33630 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  }.    }.    for(
33640 63 6e 74 3d 30 2c 20 69 3d 67 65 74 32 62 79 74  cnt=0, i=get2byt
33650 65 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b  e(&data[hdr+1]);
33660 20 69 3e 30 20 26 26 20 69 3c 75 73 61 62 6c 65   i>0 && i<usable
33670 53 69 7a 65 20 26 26 20 63 6e 74 3c 31 30 30 30  Size && cnt<1000
33680 30 3b 20 0a 20 20 20 20 20 20 20 20 20 20 20 63  0; .           c
33690 6e 74 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74  nt++){.      int
336a0 20 73 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65   size = get2byte
336b0 28 26 64 61 74 61 5b 69 2b 32 5d 29 3b 0a 20 20  (&data[i+2]);.  
336c0 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20      int j;.     
336d0 20 69 66 28 20 28 69 2b 73 69 7a 65 2d 31 29 3e   if( (i+size-1)>
336e0 3d 75 73 61 62 6c 65 53 69 7a 65 20 7c 7c 20 69  =usableSize || i
336f0 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  <0 ){.        ch
33700 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
33710 65 63 6b 2c 20 30 2c 20 20 0a 20 20 20 20 20 20  eck, 0,  .      
33720 20 20 20 20 20 20 22 43 6f 72 72 75 70 74 69 6f        "Corruptio
33730 6e 20 64 65 74 65 63 74 65 64 20 69 6e 20 63 65  n detected in ce
33740 6c 6c 20 25 64 20 6f 6e 20 70 61 67 65 20 25 64  ll %d on page %d
33750 22 2c 69 2c 69 50 61 67 65 2c 30 29 3b 0a 20 20  ",i,iPage,0);.  
33760 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33770 20 20 20 66 6f 72 28 6a 3d 69 2b 73 69 7a 65 2d     for(j=i+size-
33780 31 3b 20 6a 3e 3d 69 3b 20 6a 2d 2d 29 20 68 69  1; j>=i; j--) hi
33790 74 5b 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  t[j]++;.      }.
337a0 20 20 20 20 20 20 69 20 3d 20 67 65 74 32 62 79        i = get2by
337b0 74 65 28 26 64 61 74 61 5b 69 5d 29 3b 0a 20 20  te(&data[i]);.  
337c0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 63 6e    }.    for(i=cn
337d0 74 3d 30 3b 20 69 3c 75 73 61 62 6c 65 53 69 7a  t=0; i<usableSiz
337e0 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  e; i++){.      i
337f0 66 28 20 68 69 74 5b 69 5d 3d 3d 30 20 29 7b 0a  f( hit[i]==0 ){.
33800 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20          cnt++;. 
33810 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 68       }else if( h
33820 69 74 5b 69 5d 3e 31 20 29 7b 0a 20 20 20 20 20  it[i]>1 ){.     
33830 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
33840 67 28 70 43 68 65 63 6b 2c 20 30 2c 0a 20 20 20  g(pCheck, 0,.   
33850 20 20 20 20 20 20 20 22 4d 75 6c 74 69 70 6c 65         "Multiple
33860 20 75 73 65 73 20 66 6f 72 20 62 79 74 65 20 25   uses for byte %
33870 64 20 6f 66 20 70 61 67 65 20 25 64 22 2c 20 69  d of page %d", i
33880 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , iPage);.      
33890 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
338a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
338b0 6e 74 21 3d 64 61 74 61 5b 68 64 72 2b 37 5d 20  nt!=data[hdr+7] 
338c0 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70  ){.      checkAp
338d0 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
338e0 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 46  0, .          "F
338f0 72 61 67 6d 65 6e 74 65 64 20 73 70 61 63 65 20  ragmented space 
33900 69 73 20 25 64 20 62 79 74 65 20 72 65 70 6f 72  is %d byte repor
33910 74 65 64 20 61 73 20 25 64 20 6f 6e 20 70 61 67  ted as %d on pag
33920 65 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20  e %d",.         
33930 20 63 6e 74 2c 20 64 61 74 61 5b 68 64 72 2b 37   cnt, data[hdr+7
33940 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 7d  ], iPage);.    }
33950 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50 61  .  }.  sqlite3Pa
33960 67 65 46 72 65 65 28 68 69 74 29 3b 0a 0a 20 20  geFree(hit);..  
33970 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
33980 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 64 65 70  e);.  return dep
33990 74 68 2b 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  th+1;.}.#endif /
339a0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  * SQLITE_OMIT_IN
339b0 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a 2f  TEGRITY_CHECK */
339c0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
339d0 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f  _OMIT_INTEGRITY_
339e0 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73  CHECK./*.** This
339f0 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 61 20   routine does a 
33a00 63 6f 6d 70 6c 65 74 65 20 63 68 65 63 6b 20 6f  complete check o
33a10 66 20 74 68 65 20 67 69 76 65 6e 20 42 54 72 65  f the given BTre
33a20 65 20 66 69 6c 65 2e 20 20 61 52 6f 6f 74 5b 5d  e file.  aRoot[]
33a30 20 69 73 0a 2a 2a 20 61 6e 20 61 72 72 61 79 20   is.** an array 
33a40 6f 66 20 70 61 67 65 73 20 6e 75 6d 62 65 72 73  of pages numbers
33a50 20 77 65 72 65 20 65 61 63 68 20 70 61 67 65 20   were each page 
33a60 6e 75 6d 62 65 72 20 69 73 20 74 68 65 20 72 6f  number is the ro
33a70 6f 74 20 70 61 67 65 20 6f 66 0a 2a 2a 20 61 20  ot page of.** a 
33a80 74 61 62 6c 65 2e 20 20 6e 52 6f 6f 74 20 69 73  table.  nRoot is
33a90 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
33aa0 6e 74 72 69 65 73 20 69 6e 20 61 52 6f 6f 74 2e  ntries in aRoot.
33ab0 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74  .**.** If everyt
33ac0 68 69 6e 67 20 63 68 65 63 6b 73 20 6f 75 74 2c  hing checks out,
33ad0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
33ae0 74 75 72 6e 73 20 4e 55 4c 4c 2e 20 20 49 66 20  turns NULL.  If 
33af0 73 6f 6d 65 74 68 69 6e 67 20 69 73 0a 2a 2a 20  something is.** 
33b00 61 6d 69 73 73 2c 20 61 6e 20 65 72 72 6f 72 20  amiss, an error 
33b10 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74  message is writt
33b20 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f  en into memory o
33b30 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
33b40 6c 6f 63 28 29 0a 2a 2a 20 61 6e 64 20 61 20 70  loc().** and a p
33b50 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 20 65  ointer to that e
33b60 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
33b70 72 65 74 75 72 6e 65 64 2e 20 20 54 68 65 20 63  returned.  The c
33b80 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a  alling function.
33b90 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c  ** is responsibl
33ba0 65 20 66 6f 72 20 66 72 65 65 69 6e 67 20 74 68  e for freeing th
33bb0 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
33bc0 77 68 65 6e 20 69 74 20 69 73 20 64 6f 6e 65 2e  when it is done.
33bd0 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74 65  .*/.char *sqlite
33be0 33 42 74 72 65 65 49 6e 74 65 67 72 69 74 79 43  3BtreeIntegrityC
33bf0 68 65 63 6b 28 0a 20 20 42 74 72 65 65 20 2a 70  heck(.  Btree *p
33c00 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72  ,     /* The btr
33c10 65 65 20 74 6f 20 62 65 20 63 68 65 63 6b 65 64  ee to be checked
33c20 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 6f 6f 74   */.  int *aRoot
33c30 2c 20 20 20 2f 2a 20 41 6e 20 61 72 72 61 79 20  ,   /* An array 
33c40 6f 66 20 72 6f 6f 74 20 70 61 67 65 73 20 6e 75  of root pages nu
33c50 6d 62 65 72 73 20 66 6f 72 20 69 6e 64 69 76 69  mbers for indivi
33c60 64 75 61 6c 20 74 72 65 65 73 20 2a 2f 0a 20 20  dual trees */.  
33c70 69 6e 74 20 6e 52 6f 6f 74 2c 20 20 20 20 2f 2a  int nRoot,    /*
33c80 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
33c90 65 73 20 69 6e 20 61 52 6f 6f 74 5b 5d 20 2a 2f  es in aRoot[] */
33ca0 0a 20 20 69 6e 74 20 6d 78 45 72 72 2c 20 20 20  .  int mxErr,   
33cb0 20 2f 2a 20 53 74 6f 70 20 72 65 70 6f 72 74 69   /* Stop reporti
33cc0 6e 67 20 65 72 72 6f 72 73 20 61 66 74 65 72 20  ng errors after 
33cd0 74 68 69 73 20 6d 61 6e 79 20 2a 2f 0a 20 20 69  this many */.  i
33ce0 6e 74 20 2a 70 6e 45 72 72 20 20 20 20 2f 2a 20  nt *pnErr    /* 
33cf0 57 72 69 74 65 20 6e 75 6d 62 65 72 20 6f 66 20  Write number of 
33d00 65 72 72 6f 72 73 20 73 65 65 6e 20 74 6f 20 74  errors seen to t
33d10 68 69 73 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  his variable */.
33d20 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  ){.  int i;.  in
33d30 74 20 6e 52 65 66 3b 0a 20 20 49 6e 74 65 67 72  t nRef;.  Integr
33d40 69 74 79 43 6b 20 73 43 68 65 63 6b 3b 0a 20 20  ityCk sCheck;.  
33d50 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
33d60 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74  p->pBt;..  sqlit
33d70 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
33d80 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  .  pBt->db = p->
33d90 64 62 3b 0a 20 20 6e 52 65 66 20 3d 20 73 71 6c  db;.  nRef = sql
33da0 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
33db0 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a  t(pBt->pPager);.
33dc0 20 20 69 66 28 20 6c 6f 63 6b 42 74 72 65 65 57    if( lockBtreeW
33dd0 69 74 68 52 65 74 72 79 28 70 29 21 3d 53 51 4c  ithRetry(p)!=SQL
33de0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
33df0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
33e00 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 73  p);.    return s
33e10 71 6c 69 74 65 33 53 74 72 44 75 70 28 22 55 6e  qlite3StrDup("Un
33e20 61 62 6c 65 20 74 6f 20 61 63 71 75 69 72 65 20  able to acquire 
33e30 61 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  a read lock on t
33e40 68 65 20 64 61 74 61 62 61 73 65 22 29 3b 0a 20  he database");. 
33e50 20 7d 0a 20 20 73 43 68 65 63 6b 2e 70 42 74 20   }.  sCheck.pBt 
33e60 3d 20 70 42 74 3b 0a 20 20 73 43 68 65 63 6b 2e  = pBt;.  sCheck.
33e70 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
33e80 61 67 65 72 3b 0a 20 20 73 43 68 65 63 6b 2e 6e  ager;.  sCheck.n
33e90 50 61 67 65 20 3d 20 70 61 67 65 72 50 61 67 65  Page = pagerPage
33ea0 63 6f 75 6e 74 28 73 43 68 65 63 6b 2e 70 50 61  count(sCheck.pPa
33eb0 67 65 72 29 3b 0a 20 20 73 43 68 65 63 6b 2e 6d  ger);.  sCheck.m
33ec0 78 45 72 72 20 3d 20 6d 78 45 72 72 3b 0a 20 20  xErr = mxErr;.  
33ed0 73 43 68 65 63 6b 2e 6e 45 72 72 20 3d 20 30 3b  sCheck.nErr = 0;
33ee0 0a 20 20 2a 70 6e 45 72 72 20 3d 20 30 3b 0a 23  .  *pnErr = 0;.#
33ef0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
33f00 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
33f10 69 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 21  if( pBt->nTrunc!
33f20 3d 30 20 29 7b 0a 20 20 20 20 73 43 68 65 63 6b  =0 ){.    sCheck
33f30 2e 6e 50 61 67 65 20 3d 20 70 42 74 2d 3e 6e 54  .nPage = pBt->nT
33f40 72 75 6e 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  runc;.  }.#endif
33f50 0a 20 20 69 66 28 20 73 43 68 65 63 6b 2e 6e 50  .  if( sCheck.nP
33f60 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 75 6e  age==0 ){.    un
33f70 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
33f80 64 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  d(pBt);.    sqli
33f90 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
33fa0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
33fb0 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e 61 6e 52    }.  sCheck.anR
33fc0 65 66 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ef = sqlite3Mall
33fd0 6f 63 28 20 28 73 43 68 65 63 6b 2e 6e 50 61 67  oc( (sCheck.nPag
33fe0 65 2b 31 29 2a 73 69 7a 65 6f 66 28 73 43 68 65  e+1)*sizeof(sChe
33ff0 63 6b 2e 61 6e 52 65 66 5b 30 5d 29 20 29 3b 0a  ck.anRef[0]) );.
34000 20 20 69 66 28 20 21 73 43 68 65 63 6b 2e 61 6e    if( !sCheck.an
34010 52 65 66 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63  Ref ){.    unloc
34020 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
34030 42 74 29 3b 0a 20 20 20 20 2a 70 6e 45 72 72 20  Bt);.    *pnErr 
34040 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 1;.    sqlite3
34050 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
34060 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
34070 33 4d 50 72 69 6e 74 66 28 70 2d 3e 64 62 2c 20  3MPrintf(p->db, 
34080 22 55 6e 61 62 6c 65 20 74 6f 20 6d 61 6c 6c 6f  "Unable to mallo
34090 63 20 25 64 20 62 79 74 65 73 22 2c 20 0a 20 20  c %d bytes", .  
340a0 20 20 20 20 20 20 28 73 43 68 65 63 6b 2e 6e 50        (sCheck.nP
340b0 61 67 65 2b 31 29 2a 73 69 7a 65 6f 66 28 73 43  age+1)*sizeof(sC
340c0 68 65 63 6b 2e 61 6e 52 65 66 5b 30 5d 29 29 3b  heck.anRef[0]));
340d0 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20  .  }.  for(i=0; 
340e0 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 3b  i<=sCheck.nPage;
340f0 20 69 2b 2b 29 7b 20 73 43 68 65 63 6b 2e 61 6e   i++){ sCheck.an
34100 52 65 66 5b 69 5d 20 3d 20 30 3b 20 7d 0a 20 20  Ref[i] = 0; }.  
34110 69 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  i = PENDING_BYTE
34120 5f 50 41 47 45 28 70 42 74 29 3b 0a 20 20 69 66  _PAGE(pBt);.  if
34130 28 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50 61 67  ( i<=sCheck.nPag
34140 65 20 29 7b 0a 20 20 20 20 73 43 68 65 63 6b 2e  e ){.    sCheck.
34150 61 6e 52 65 66 5b 69 5d 20 3d 20 31 3b 0a 20 20  anRef[i] = 1;.  
34160 7d 0a 20 20 73 43 68 65 63 6b 2e 7a 45 72 72 4d  }.  sCheck.zErrM
34170 73 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 68  sg = 0;..  /* Ch
34180 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74  eck the integrit
34190 79 20 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73  y of the freelis
341a0 74 0a 20 20 2a 2f 0a 20 20 63 68 65 63 6b 4c 69  t.  */.  checkLi
341b0 73 74 28 26 73 43 68 65 63 6b 2c 20 31 2c 20 67  st(&sCheck, 1, g
341c0 65 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50  et4byte(&pBt->pP
341d0 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29  age1->aData[32])
341e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 65  ,.            ge
341f0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
34200 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 2c  ge1->aData[36]),
34210 20 22 4d 61 69 6e 20 66 72 65 65 6c 69 73 74 3a   "Main freelist:
34220 20 22 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b   ");..  /* Check
34230 20 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 73 2e   all the tables.
34240 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
34250 20 69 3c 6e 52 6f 6f 74 20 26 26 20 73 43 68 65   i<nRoot && sChe
34260 63 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a  ck.mxErr; i++){.
34270 20 20 20 20 69 66 28 20 61 52 6f 6f 74 5b 69 5d      if( aRoot[i]
34280 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
34290 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
342a0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
342b0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
342c0 56 61 63 75 75 6d 20 26 26 20 61 52 6f 6f 74 5b  Vacuum && aRoot[
342d0 69 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 63 68  i]>1 ){.      ch
342e0 65 63 6b 50 74 72 6d 61 70 28 26 73 43 68 65 63  eckPtrmap(&sChec
342f0 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 50 54 52  k, aRoot[i], PTR
34300 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20 30 2c  MAP_ROOTPAGE, 0,
34310 20 30 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69   0);.    }.#endi
34320 66 0a 20 20 20 20 63 68 65 63 6b 54 72 65 65 50  f.    checkTreeP
34330 61 67 65 28 26 73 43 68 65 63 6b 2c 20 61 52 6f  age(&sCheck, aRo
34340 6f 74 5b 69 5d 2c 20 30 2c 20 22 4c 69 73 74 20  ot[i], 0, "List 
34350 6f 66 20 74 72 65 65 20 72 6f 6f 74 73 3a 20 22  of tree roots: "
34360 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  );.  }..  /* Mak
34370 65 20 73 75 72 65 20 65 76 65 72 79 20 70 61 67  e sure every pag
34380 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73  e in the file is
34390 20 72 65 66 65 72 65 6e 63 65 64 0a 20 20 2a 2f   referenced.  */
343a0 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 73  .  for(i=1; i<=s
343b0 43 68 65 63 6b 2e 6e 50 61 67 65 20 26 26 20 73  Check.nPage && s
343c0 43 68 65 63 6b 2e 6d 78 45 72 72 3b 20 69 2b 2b  Check.mxErr; i++
343d0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
343e0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
343f0 0a 20 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e  .    if( sCheck.
34400 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 29 7b 0a 20  anRef[i]==0 ){. 
34410 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
34420 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20  Msg(&sCheck, 0, 
34430 22 50 61 67 65 20 25 64 20 69 73 20 6e 65 76 65  "Page %d is neve
34440 72 20 75 73 65 64 22 2c 20 69 29 3b 0a 20 20 20  r used", i);.   
34450 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 2f 2a 20   }.#else.    /* 
34460 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
34470 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61  supports auto-va
34480 63 75 75 6d 2c 20 6d 61 6b 65 20 73 75 72 65 20  cuum, make sure 
34490 6e 6f 20 74 61 62 6c 65 73 20 63 6f 6e 74 61 69  no tables contai
344a0 6e 0a 20 20 20 20 2a 2a 20 72 65 66 65 72 65 6e  n.    ** referen
344b0 63 65 73 20 74 6f 20 70 6f 69 6e 74 65 72 2d 6d  ces to pointer-m
344c0 61 70 20 70 61 67 65 73 2e 0a 20 20 20 20 2a 2f  ap pages..    */
344d0 0a 20 20 20 20 69 66 28 20 73 43 68 65 63 6b 2e  .    if( sCheck.
344e0 61 6e 52 65 66 5b 69 5d 3d 3d 30 20 26 26 20 0a  anRef[i]==0 && .
344f0 20 20 20 20 20 20 20 28 50 54 52 4d 41 50 5f 50         (PTRMAP_P
34500 41 47 45 4e 4f 28 70 42 74 2c 20 69 29 21 3d 69  AGENO(pBt, i)!=i
34510 20 7c 7c 20 21 70 42 74 2d 3e 61 75 74 6f 56 61   || !pBt->autoVa
34520 63 75 75 6d 29 20 29 7b 0a 20 20 20 20 20 20 63  cuum) ){.      c
34530 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73  heckAppendMsg(&s
34540 43 68 65 63 6b 2c 20 30 2c 20 22 50 61 67 65 20  Check, 0, "Page 
34550 25 64 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  %d is never used
34560 22 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ", i);.    }.   
34570 20 69 66 28 20 73 43 68 65 63 6b 2e 61 6e 52 65   if( sCheck.anRe
34580 66 5b 69 5d 21 3d 30 20 26 26 20 0a 20 20 20 20  f[i]!=0 && .    
34590 20 20 20 28 50 54 52 4d 41 50 5f 50 41 47 45 4e     (PTRMAP_PAGEN
345a0 4f 28 70 42 74 2c 20 69 29 3d 3d 69 20 26 26 20  O(pBt, i)==i && 
345b0 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29  pBt->autoVacuum)
345c0 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41   ){.      checkA
345d0 70 70 65 6e 64 4d 73 67 28 26 73 43 68 65 63 6b  ppendMsg(&sCheck
345e0 2c 20 30 2c 20 22 50 6f 69 6e 74 65 72 20 6d 61  , 0, "Pointer ma
345f0 70 20 70 61 67 65 20 25 64 20 69 73 20 72 65 66  p page %d is ref
34600 65 72 65 6e 63 65 64 22 2c 20 69 29 3b 0a 20 20  erenced", i);.  
34610 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
34620 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
34630 68 69 73 20 61 6e 61 6c 79 73 69 73 20 64 69 64  his analysis did
34640 20 6e 6f 74 20 6c 65 61 76 65 20 61 6e 79 20 75   not leave any u
34650 6e 72 65 66 28 29 20 70 61 67 65 73 0a 20 20 2a  nref() pages.  *
34660 2f 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  /.  unlockBtreeI
34670 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
34680 69 66 28 20 6e 52 65 66 20 21 3d 20 73 71 6c 69  if( nRef != sqli
34690 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
346a0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b  (pBt->pPager) ){
346b0 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64  .    checkAppend
346c0 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30 2c 20  Msg(&sCheck, 0, 
346d0 0a 20 20 20 20 20 20 22 4f 75 74 73 74 61 6e 64  .      "Outstand
346e0 69 6e 67 20 70 61 67 65 20 63 6f 75 6e 74 20 67  ing page count g
346f0 6f 65 73 20 66 72 6f 6d 20 25 64 20 74 6f 20 25  oes from %d to %
34700 64 20 64 75 72 69 6e 67 20 74 68 69 73 20 61 6e  d during this an
34710 61 6c 79 73 69 73 22 2c 0a 20 20 20 20 20 20 6e  alysis",.      n
34720 52 65 66 2c 20 73 71 6c 69 74 65 33 50 61 67 65  Ref, sqlite3Page
34730 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70  rRefcount(pBt->p
34740 50 61 67 65 72 29 0a 20 20 20 20 29 3b 0a 20 20  Pager).    );.  
34750 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 20 75  }..  /* Clean  u
34760 70 20 61 6e 64 20 72 65 70 6f 72 74 20 65 72 72  p and report err
34770 6f 72 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  ors..  */.  sqli
34780 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
34790 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
347a0 28 73 43 68 65 63 6b 2e 61 6e 52 65 66 29 3b 0a  (sCheck.anRef);.
347b0 20 20 2a 70 6e 45 72 72 20 3d 20 73 43 68 65 63    *pnErr = sChec
347c0 6b 2e 6e 45 72 72 3b 0a 20 20 72 65 74 75 72 6e  k.nErr;.  return
347d0 20 73 43 68 65 63 6b 2e 7a 45 72 72 4d 73 67 3b   sCheck.zErrMsg;
347e0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
347f0 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
34800 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 2f 2a 0a  TY_CHECK */../*.
34810 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75  ** Return the fu
34820 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74  ll pathname of t
34830 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64 61  he underlying da
34840 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
34850 2a 2a 20 54 68 65 20 70 61 67 65 72 20 66 69 6c  ** The pager fil
34860 65 6e 61 6d 65 20 69 73 20 69 6e 76 61 72 69 61  ename is invaria
34870 6e 74 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68  nt as long as th
34880 65 20 70 61 67 65 72 20 69 73 0a 2a 2a 20 6f 70  e pager is.** op
34890 65 6e 20 73 6f 20 69 74 20 69 73 20 73 61 66 65  en so it is safe
348a0 20 74 6f 20 61 63 63 65 73 73 20 77 69 74 68 6f   to access witho
348b0 75 74 20 74 68 65 20 42 74 53 68 61 72 65 64 20  ut the BtShared 
348c0 6d 75 74 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  mutex..*/.const 
348d0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72  char *sqlite3Btr
348e0 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 42 74  eeGetFilename(Bt
348f0 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  ree *p){.  asser
34900 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  t( p->pBt->pPage
34910 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e  r!=0 );.  return
34920 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
34930 65 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50  ename(p->pBt->pP
34940 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ager);.}../*.** 
34950 52 65 74 75 72 6e 20 74 68 65 20 70 61 74 68 6e  Return the pathn
34960 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65 63  ame of the direc
34970 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61 69  tory that contai
34980 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
34990 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  file..**.** The 
349a0 70 61 67 65 72 20 64 69 72 65 63 74 6f 72 79 20  pager directory 
349b0 6e 61 6d 65 20 69 73 20 69 6e 76 61 72 69 61 6e  name is invarian
349c0 74 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68 65  t as long as the
349d0 20 70 61 67 65 72 20 69 73 0a 2a 2a 20 6f 70 65   pager is.** ope
349e0 6e 20 73 6f 20 69 74 20 69 73 20 73 61 66 65 20  n so it is safe 
349f0 74 6f 20 61 63 63 65 73 73 20 77 69 74 68 6f 75  to access withou
34a00 74 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6d  t the BtShared m
34a10 75 74 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  utex..*/.const c
34a20 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65  har *sqlite3Btre
34a30 65 47 65 74 44 69 72 6e 61 6d 65 28 42 74 72 65  eGetDirname(Btre
34a40 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
34a50 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72 21   p->pBt->pPager!
34a60 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 73  =0 );.  return s
34a70 71 6c 69 74 65 33 50 61 67 65 72 44 69 72 6e 61  qlite3PagerDirna
34a80 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  me(p->pBt->pPage
34a90 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  r);.}../*.** Ret
34aa0 75 72 6e 20 74 68 65 20 70 61 74 68 6e 61 6d 65  urn the pathname
34ab0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
34ac0 66 69 6c 65 20 66 6f 72 20 74 68 69 73 20 64 61  file for this da
34ad0 74 61 62 61 73 65 2e 20 54 68 65 20 72 65 74 75  tabase. The retu
34ae0 72 6e 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74  rn.** value of t
34af0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74  his routine is t
34b00 68 65 20 73 61 6d 65 20 72 65 67 61 72 64 6c 65  he same regardle
34b10 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 74 68  ss of whether th
34b20 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  e journal file.*
34b30 2a 20 68 61 73 20 62 65 65 6e 20 63 72 65 61 74  * has been creat
34b40 65 64 20 6f 72 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a  ed or not..**.**
34b50 20 54 68 65 20 70 61 67 65 72 20 6a 6f 75 72 6e   The pager journ
34b60 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 69  al filename is i
34b70 6e 76 61 72 69 61 6e 74 20 61 73 20 6c 6f 6e 67  nvariant as long
34b80 20 61 73 20 74 68 65 20 70 61 67 65 72 20 69 73   as the pager is
34b90 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20 69 74 20 69  .** open so it i
34ba0 73 20 73 61 66 65 20 74 6f 20 61 63 63 65 73 73  s safe to access
34bb0 20 77 69 74 68 6f 75 74 20 74 68 65 20 42 74 53   without the BtS
34bc0 68 61 72 65 64 20 6d 75 74 65 78 2e 0a 2a 2f 0a  hared mutex..*/.
34bd0 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
34be0 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72 6e  te3BtreeGetJourn
34bf0 61 6c 6e 61 6d 65 28 42 74 72 65 65 20 2a 70 29  alname(Btree *p)
34c00 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70  {.  assert( p->p
34c10 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29 3b  Bt->pPager!=0 );
34c20 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
34c30 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d  3PagerJournalnam
34c40 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  e(p->pBt->pPager
34c50 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  );.}..#ifndef SQ
34c60 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
34c70 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65 20  ./*.** Copy the 
34c80 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e 74  complete content
34c90 20 6f 66 20 70 42 74 46 72 6f 6d 20 69 6e 74 6f   of pBtFrom into
34ca0 20 70 42 74 54 6f 2e 20 20 41 20 74 72 61 6e 73   pBtTo.  A trans
34cb0 61 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20 62  action.** must b
34cc0 65 20 61 63 74 69 76 65 20 66 6f 72 20 62 6f 74  e active for bot
34cd0 68 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  h files..**.** T
34ce0 68 65 20 73 69 7a 65 20 6f 66 20 66 69 6c 65 20  he size of file 
34cf0 70 54 6f 20 6d 61 79 20 62 65 20 72 65 64 75 63  pTo may be reduc
34d00 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61  ed by this opera
34d10 74 69 6f 6e 2e 0a 2a 2a 20 49 66 20 61 6e 79 74  tion..** If anyt
34d20 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2c  hing goes wrong,
34d30 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
34d40 20 6f 6e 20 70 54 6f 20 69 73 20 72 6f 6c 6c 65   on pTo is rolle
34d50 64 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20 49  d back. .**.** I
34d60 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 43 6f  f successful, Co
34d70 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 6d  mmitPhaseOne() m
34d80 61 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20  ay be called on 
34d90 70 54 6f 20 62 65 66 6f 72 65 20 72 65 74 75 72  pTo before retur
34da0 6e 69 6e 67 2e 20 0a 2a 2a 20 54 68 65 20 63 61  ning. .** The ca
34db0 6c 6c 65 72 20 73 68 6f 75 6c 64 20 66 69 6e 69  ller should fini
34dc0 73 68 20 63 6f 6d 6d 69 74 74 69 6e 67 20 74 68  sh committing th
34dd0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e  e transaction on
34de0 20 70 54 6f 20 62 79 20 63 61 6c 6c 69 6e 67 0a   pTo by calling.
34df0 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  ** sqlite3BtreeC
34e00 6f 6d 6d 69 74 28 29 2e 0a 2a 2f 0a 73 74 61 74  ommit()..*/.stat
34e10 69 63 20 69 6e 74 20 62 74 72 65 65 43 6f 70 79  ic int btreeCopy
34e20 46 69 6c 65 28 42 74 72 65 65 20 2a 70 54 6f 2c  File(Btree *pTo,
34e30 20 42 74 72 65 65 20 2a 70 46 72 6f 6d 29 7b 0a   Btree *pFrom){.
34e40 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
34e50 45 5f 4f 4b 3b 0a 20 20 50 67 6e 6f 20 69 3b 0a  E_OK;.  Pgno i;.
34e60 0a 20 20 50 67 6e 6f 20 6e 46 72 6f 6d 50 61 67  .  Pgno nFromPag
34e70 65 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  e;     /* Number
34e80 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70 46 72   of pages in pFr
34e90 6f 6d 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54 6f  om */.  Pgno nTo
34ea0 50 61 67 65 3b 20 20 20 20 20 20 20 2f 2a 20 4e  Page;       /* N
34eb0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
34ec0 6e 20 70 54 6f 20 2a 2f 0a 20 20 50 67 6e 6f 20  n pTo */.  Pgno 
34ed0 6e 4e 65 77 50 61 67 65 3b 20 20 20 20 20 20 2f  nNewPage;      /
34ee0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  * Number of page
34ef0 73 20 69 6e 20 70 54 6f 20 61 66 74 65 72 20 74  s in pTo after t
34f00 68 65 20 63 6f 70 79 20 2a 2f 0a 0a 20 20 50 67  he copy */..  Pg
34f10 6e 6f 20 69 53 6b 69 70 3b 20 20 20 20 20 20 20  no iSkip;       
34f20 20 20 2f 2a 20 50 65 6e 64 69 6e 67 20 62 79 74    /* Pending byt
34f30 65 20 70 61 67 65 20 69 6e 20 70 54 6f 20 2a 2f  e page in pTo */
34f40 0a 20 20 69 6e 74 20 6e 54 6f 50 61 67 65 53 69  .  int nToPageSi
34f50 7a 65 3b 20 20 20 20 2f 2a 20 50 61 67 65 20 73  ze;    /* Page s
34f60 69 7a 65 20 6f 66 20 70 54 6f 20 69 6e 20 62 79  ize of pTo in by
34f70 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72  tes */.  int nFr
34f80 6f 6d 50 61 67 65 53 69 7a 65 3b 20 20 2f 2a 20  omPageSize;  /* 
34f90 50 61 67 65 20 73 69 7a 65 20 6f 66 20 70 46 72  Page size of pFr
34fa0 6f 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 0a  om in bytes */..
34fb0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 54    BtShared *pBtT
34fc0 6f 20 3d 20 70 54 6f 2d 3e 70 42 74 3b 0a 20 20  o = pTo->pBt;.  
34fd0 42 74 53 68 61 72 65 64 20 2a 70 42 74 46 72 6f  BtShared *pBtFro
34fe0 6d 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b 0a  m = pFrom->pBt;.
34ff0 20 20 70 42 74 54 6f 2d 3e 64 62 20 3d 20 70 54    pBtTo->db = pT
35000 6f 2d 3e 64 62 3b 0a 20 20 70 42 74 46 72 6f 6d  o->db;.  pBtFrom
35010 2d 3e 64 62 20 3d 20 70 46 72 6f 6d 2d 3e 64 62  ->db = pFrom->db
35020 3b 0a 0a 20 20 6e 54 6f 50 61 67 65 53 69 7a 65  ;..  nToPageSize
35030 20 3d 20 70 42 74 54 6f 2d 3e 70 61 67 65 53 69   = pBtTo->pageSi
35040 7a 65 3b 0a 20 20 6e 46 72 6f 6d 50 61 67 65 53  ze;.  nFromPageS
35050 69 7a 65 20 3d 20 70 42 74 46 72 6f 6d 2d 3e 70  ize = pBtFrom->p
35060 61 67 65 53 69 7a 65 3b 0a 0a 20 20 69 66 28 20  ageSize;..  if( 
35070 70 54 6f 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  pTo->inTrans!=TR
35080 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 70 46 72  ANS_WRITE || pFr
35090 6f 6d 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41  om->inTrans!=TRA
350a0 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
350b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
350c0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ROR;.  }.  if( p
350d0 42 74 54 6f 2d 3e 70 43 75 72 73 6f 72 20 29 7b  BtTo->pCursor ){
350e0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
350f0 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20 20  TE_BUSY;.  }..  
35100 6e 54 6f 50 61 67 65 20 3d 20 70 61 67 65 72 50  nToPage = pagerP
35110 61 67 65 63 6f 75 6e 74 28 70 42 74 54 6f 2d 3e  agecount(pBtTo->
35120 70 50 61 67 65 72 29 3b 0a 20 20 6e 46 72 6f 6d  pPager);.  nFrom
35130 50 61 67 65 20 3d 20 70 61 67 65 72 50 61 67 65  Page = pagerPage
35140 63 6f 75 6e 74 28 70 42 74 46 72 6f 6d 2d 3e 70  count(pBtFrom->p
35150 50 61 67 65 72 29 3b 0a 20 20 69 53 6b 69 70 20  Pager);.  iSkip 
35160 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  = PENDING_BYTE_P
35170 41 47 45 28 70 42 74 54 6f 29 3b 0a 0a 20 20 2f  AGE(pBtTo);..  /
35180 2a 20 56 61 72 69 61 62 6c 65 20 6e 4e 65 77 50  * Variable nNewP
35190 61 67 65 20 69 73 20 74 68 65 20 6e 75 6d 62 65  age is the numbe
351a0 72 20 6f 66 20 70 61 67 65 73 20 72 65 71 75 69  r of pages requi
351b0 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68 65  red to store the
351c0 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  .  ** contents o
351d0 66 20 70 46 72 6f 6d 20 75 73 69 6e 67 20 74 68  f pFrom using th
351e0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2d 73  e current page-s
351f0 69 7a 65 20 6f 66 20 70 54 6f 2e 0a 20 20 2a 2f  ize of pTo..  */
35200 0a 20 20 6e 4e 65 77 50 61 67 65 20 3d 20 28 28  .  nNewPage = ((
35210 69 36 34 29 6e 46 72 6f 6d 50 61 67 65 20 2a 20  i64)nFromPage * 
35220 28 69 36 34 29 6e 46 72 6f 6d 50 61 67 65 53 69  (i64)nFromPageSi
35230 7a 65 20 2b 20 28 69 36 34 29 6e 54 6f 50 61 67  ze + (i64)nToPag
35240 65 53 69 7a 65 20 2d 20 31 29 20 2f 20 0a 20 20  eSize - 1) / .  
35250 20 20 20 20 28 69 36 34 29 6e 54 6f 50 61 67 65      (i64)nToPage
35260 53 69 7a 65 3b 0a 0a 20 20 66 6f 72 28 69 3d 31  Size;..  for(i=1
35270 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
35280 26 26 20 28 69 3c 3d 6e 54 6f 50 61 67 65 20 7c  && (i<=nToPage |
35290 7c 20 69 3c 3d 6e 4e 65 77 50 61 67 65 29 3b 20  | i<=nNewPage); 
352a0 69 2b 2b 29 7b 0a 0a 20 20 20 20 2f 2a 20 4a 6f  i++){..    /* Jo
352b0 75 72 6e 61 6c 20 74 68 65 20 6f 72 69 67 69 6e  urnal the origin
352c0 61 6c 20 70 61 67 65 2e 0a 20 20 20 20 2a 2a 0a  al page..    **.
352d0 20 20 20 20 2a 2a 20 69 53 6b 69 70 20 69 73 20      ** iSkip is 
352e0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
352f0 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70  of the locking p
35300 61 67 65 20 28 50 45 4e 44 49 4e 47 5f 42 59 54  age (PENDING_BYT
35310 45 5f 50 41 47 45 29 0a 20 20 20 20 2a 2a 20 69  E_PAGE).    ** i
35320 6e 20 64 61 74 61 62 61 73 65 20 2a 70 54 6f 20  n database *pTo 
35330 28 62 65 66 6f 72 65 20 74 68 65 20 63 6f 70 79  (before the copy
35340 29 2e 20 54 68 69 73 20 70 61 67 65 20 69 73 20  ). This page is 
35350 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 0a 20  never written . 
35360 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20 6a     ** into the j
35370 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 55 6e 6c  ournal file. Unl
35380 65 73 73 20 69 3d 3d 69 53 6b 69 70 20 6f 72 20  ess i==iSkip or 
35390 74 68 65 20 70 61 67 65 20 77 61 73 20 6e 6f 74  the page was not
353a0 0a 20 20 20 20 2a 2a 20 70 72 65 73 65 6e 74 20  .    ** present 
353b0 69 6e 20 70 54 6f 20 62 65 66 6f 72 65 20 74 68  in pTo before th
353c0 65 20 63 6f 70 79 20 6f 70 65 72 61 74 69 6f 6e  e copy operation
353d0 2c 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 69  , journal page i
353e0 20 66 72 6f 6d 20 70 54 6f 2e 0a 20 20 20 20 2a   from pTo..    *
353f0 2f 0a 20 20 20 20 69 66 28 20 69 21 3d 69 53 6b  /.    if( i!=iSk
35400 69 70 20 26 26 20 69 3c 3d 6e 54 6f 50 61 67 65  ip && i<=nToPage
35410 20 29 7b 0a 20 20 20 20 20 20 44 62 50 61 67 65   ){.      DbPage
35420 20 2a 70 44 62 50 61 67 65 20 3d 20 30 3b 0a 20   *pDbPage = 0;. 
35430 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
35440 33 50 61 67 65 72 47 65 74 28 70 42 74 54 6f 2d  3PagerGet(pBtTo-
35450 3e 70 50 61 67 65 72 2c 20 69 2c 20 26 70 44 62  >pPager, i, &pDb
35460 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
35470 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
35480 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
35490 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
354a0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  (pDbPage);.     
354b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
354c0 45 5f 4f 4b 20 26 26 20 69 3e 6e 46 72 6f 6d 50  E_OK && i>nFromP
354d0 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  age ){.         
354e0 20 2f 2a 20 59 65 61 68 2e 20 20 49 74 20 73 65   /* Yeah.  It se
354f0 65 6d 73 20 77 69 65 72 64 20 74 6f 20 63 61 6c  ems wierd to cal
35500 6c 20 44 6f 6e 74 57 72 69 74 65 28 29 20 72 69  l DontWrite() ri
35510 67 68 74 20 61 66 74 65 72 20 57 72 69 74 65 28  ght after Write(
35520 29 2e 20 42 75 74 0a 20 20 20 20 20 20 20 20 20  ). But.         
35530 20 2a 2a 20 74 68 61 74 20 69 73 20 62 65 63 61   ** that is beca
35540 75 73 65 20 74 68 65 20 6e 61 6d 65 73 20 6f 66  use the names of
35550 20 74 68 6f 73 65 20 70 72 6f 63 65 64 75 72 65   those procedure
35560 73 20 64 6f 20 6e 6f 74 20 65 78 61 63 74 6c 79  s do not exactly
35570 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72   .          ** r
35580 65 70 72 65 73 65 6e 74 20 77 68 61 74 20 74 68  epresent what th
35590 65 79 20 64 6f 2e 20 20 57 72 69 74 65 28 29 20  ey do.  Write() 
355a0 72 65 61 6c 6c 79 20 6d 65 61 6e 73 20 22 70 75  really means "pu
355b0 74 20 74 68 69 73 20 70 61 67 65 20 69 6e 20 74  t this page in t
355c0 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
355d0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
355e0 20 61 6e 64 20 6d 61 72 6b 20 69 74 20 61 73 20   and mark it as 
355f0 64 69 72 74 79 20 73 6f 20 74 68 61 74 20 69 74  dirty so that it
35600 20 77 69 6c 6c 20 62 65 20 77 72 69 74 74 65 6e   will be written
35610 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  .          ** to
35620 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
35630 6c 65 20 6c 61 74 65 72 2e 22 20 20 44 6f 6e 74  le later."  Dont
35640 57 72 69 74 65 28 29 20 75 6e 64 6f 65 73 20 74  Write() undoes t
35650 68 65 20 73 65 63 6f 6e 64 20 70 61 72 74 20 6f  he second part o
35660 66 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  f.          ** t
35670 68 61 74 20 61 6e 64 20 70 72 65 76 65 6e 74 73  hat and prevents
35680 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 62   the page from b
35690 65 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20  eing written to 
356a0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 54 68  the database. Th
356b0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70  e.          ** p
356c0 61 67 65 20 69 73 20 73 74 69 6c 6c 20 6f 6e 20  age is still on 
356d0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
356e0 72 6e 61 6c 2c 20 74 68 6f 75 67 68 2e 20 20 41  rnal, though.  A
356f0 6e 64 20 74 68 61 74 20 69 73 20 74 68 65 20 0a  nd that is the .
35700 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 68 6f            ** who
35710 6c 65 20 70 6f 69 6e 74 20 6f 66 20 74 68 69 73  le point of this
35720 20 62 6c 6f 63 6b 3a 20 74 6f 20 70 75 74 20 70   block: to put p
35730 61 67 65 73 20 6f 6e 20 74 68 65 20 72 6f 6c 6c  ages on the roll
35740 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20  back journal. . 
35750 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
35760 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
35770 65 72 44 6f 6e 74 57 72 69 74 65 28 70 44 62 50  erDontWrite(pDbP
35780 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  age);.        }.
35790 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
357a0 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
357b0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
357c0 7d 0a 0a 20 20 20 20 2f 2a 20 4f 76 65 72 77 72  }..    /* Overwr
357d0 69 74 65 20 74 68 65 20 64 61 74 61 20 69 6e 20  ite the data in 
357e0 70 61 67 65 20 69 20 6f 66 20 74 68 65 20 74 61  page i of the ta
357f0 72 67 65 74 20 64 61 74 61 62 61 73 65 20 2a 2f  rget database */
35800 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
35810 49 54 45 5f 4f 4b 20 26 26 20 69 21 3d 69 53 6b  ITE_OK && i!=iSk
35820 69 70 20 26 26 20 69 3c 3d 6e 4e 65 77 50 61 67  ip && i<=nNewPag
35830 65 20 29 7b 0a 0a 20 20 20 20 20 20 44 62 50 61  e ){..      DbPa
35840 67 65 20 2a 70 54 6f 50 61 67 65 20 3d 20 30 3b  ge *pToPage = 0;
35850 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
35860 6e 74 36 34 20 69 4f 66 66 3b 0a 0a 20 20 20 20  nt64 iOff;..    
35870 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
35880 67 65 72 47 65 74 28 70 42 74 54 6f 2d 3e 70 50  gerGet(pBtTo->pP
35890 61 67 65 72 2c 20 69 2c 20 26 70 54 6f 50 61 67  ager, i, &pToPag
358a0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
358b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
358c0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
358d0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
358e0 6f 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a  oPage);.      }.
358f0 0a 20 20 20 20 20 20 66 6f 72 28 0a 20 20 20 20  .      for(.    
35900 20 20 20 20 69 4f 66 66 3d 28 69 2d 31 29 2a 6e      iOff=(i-1)*n
35910 54 6f 50 61 67 65 53 69 7a 65 3b 20 0a 20 20 20  ToPageSize; .   
35920 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
35930 4f 4b 20 26 26 20 69 4f 66 66 3c 69 2a 6e 54 6f  OK && iOff<i*nTo
35940 50 61 67 65 53 69 7a 65 3b 20 0a 20 20 20 20 20  PageSize; .     
35950 20 20 20 69 4f 66 66 20 2b 3d 20 6e 46 72 6f 6d     iOff += nFrom
35960 50 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20 29  PageSize.      )
35970 7b 0a 20 20 20 20 20 20 20 20 44 62 50 61 67 65  {.        DbPage
35980 20 2a 70 46 72 6f 6d 50 61 67 65 20 3d 20 30 3b   *pFromPage = 0;
35990 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46  .        Pgno iF
359a0 72 6f 6d 20 3d 20 28 69 4f 66 66 2f 6e 46 72 6f  rom = (iOff/nFro
359b0 6d 50 61 67 65 53 69 7a 65 29 2b 31 3b 0a 0a 20  mPageSize)+1;.. 
359c0 20 20 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d         if( iFrom
359d0 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
359e0 41 47 45 28 70 42 74 46 72 6f 6d 29 20 29 7b 0a  AGE(pBtFrom) ){.
359f0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
35a00 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ue;.        }.. 
35a10 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
35a20 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 46  te3PagerGet(pBtF
35a30 72 6f 6d 2d 3e 70 50 61 67 65 72 2c 20 69 46 72  rom->pPager, iFr
35a40 6f 6d 2c 20 26 70 46 72 6f 6d 50 61 67 65 29 3b  om, &pFromPage);
35a50 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
35a60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
35a70 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54          char *zT
35a80 6f 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  o = sqlite3Pager
35a90 47 65 74 44 61 74 61 28 70 54 6f 50 61 67 65 29  GetData(pToPage)
35aa0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  ;.          char
35ab0 20 2a 7a 46 72 6f 6d 20 3d 20 73 71 6c 69 74 65   *zFrom = sqlite
35ac0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 46  3PagerGetData(pF
35ad0 72 6f 6d 50 61 67 65 29 3b 0a 20 20 20 20 20 20  romPage);.      
35ae0 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 3b 0a 0a      int nCopy;..
35af0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 46            if( nF
35b00 72 6f 6d 50 61 67 65 53 69 7a 65 3e 3d 6e 54 6f  romPageSize>=nTo
35b10 50 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  PageSize ){.    
35b20 20 20 20 20 20 20 20 20 7a 46 72 6f 6d 20 2b 3d          zFrom +=
35b30 20 28 28 69 2d 31 29 2a 6e 54 6f 50 61 67 65 53   ((i-1)*nToPageS
35b40 69 7a 65 20 2d 20 28 28 69 46 72 6f 6d 2d 31 29  ize - ((iFrom-1)
35b50 2a 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 29 29  *nFromPageSize))
35b60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 43  ;.            nC
35b70 6f 70 79 20 3d 20 6e 54 6f 50 61 67 65 53 69 7a  opy = nToPageSiz
35b80 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  e;.          }el
35b90 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
35ba0 7a 54 6f 20 2b 3d 20 28 28 28 69 46 72 6f 6d 2d  zTo += (((iFrom-
35bb0 31 29 2a 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65  1)*nFromPageSize
35bc0 29 20 2d 20 28 69 2d 31 29 2a 6e 54 6f 50 61 67  ) - (i-1)*nToPag
35bd0 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
35be0 20 20 20 20 6e 43 6f 70 79 20 3d 20 6e 46 72 6f      nCopy = nFro
35bf0 6d 50 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20  mPageSize;.     
35c00 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
35c10 20 20 6d 65 6d 63 70 79 28 7a 54 6f 2c 20 7a 46    memcpy(zTo, zF
35c20 72 6f 6d 2c 20 6e 43 6f 70 79 29 3b 0a 09 20 20  rom, nCopy);..  
35c30 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
35c40 66 28 70 46 72 6f 6d 50 61 67 65 29 3b 0a 20 20  f(pFromPage);.  
35c50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
35c60 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f 50 61  .      if( pToPa
35c70 67 65 20 29 20 73 71 6c 69 74 65 33 50 61 67 65  ge ) sqlite3Page
35c80 72 55 6e 72 65 66 28 70 54 6f 50 61 67 65 29 3b  rUnref(pToPage);
35c90 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
35ca0 20 49 66 20 74 68 69 6e 67 73 20 68 61 76 65 20   If things have 
35cb0 77 6f 72 6b 65 64 20 73 6f 20 66 61 72 2c 20 74  worked so far, t
35cc0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
35cd0 20 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20   may need to be 
35ce0 0a 20 20 2a 2a 20 74 72 75 6e 63 61 74 65 64 2e  .  ** truncated.
35cf0 20 54 68 65 20 63 6f 6d 70 6c 65 78 20 70 61 72   The complex par
35d00 74 20 69 73 20 74 68 61 74 20 69 74 20 6d 61 79  t is that it may
35d10 20 6e 65 65 64 20 74 6f 20 62 65 20 74 72 75 6e   need to be trun
35d20 63 61 74 65 64 20 74 6f 0a 20 20 2a 2a 20 61 20  cated to.  ** a 
35d30 73 69 7a 65 20 74 68 61 74 20 69 73 20 6e 6f 74  size that is not
35d40 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74   an integer mult
35d50 69 70 6c 65 20 6f 66 20 6e 54 6f 50 61 67 65 53  iple of nToPageS
35d60 69 7a 65 20 2d 20 74 68 65 20 63 75 72 72 65 6e  ize - the curren
35d70 74 0a 20 20 2a 2a 20 70 61 67 65 20 73 69 7a 65  t.  ** page size
35d80 20 75 73 65 64 20 62 79 20 74 68 65 20 70 61 67   used by the pag
35d90 65 72 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  er associated wi
35da0 74 68 20 42 2d 54 72 65 65 20 70 54 6f 2e 0a 20  th B-Tree pTo.. 
35db0 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 65 78 61   **.  ** For exa
35dc0 6d 70 6c 65 2c 20 73 61 79 20 74 68 65 20 70 61  mple, say the pa
35dd0 67 65 2d 73 69 7a 65 20 6f 66 20 70 54 6f 20 69  ge-size of pTo i
35de0 73 20 32 30 34 38 20 62 79 74 65 73 20 61 6e 64  s 2048 bytes and
35df0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 0a 20   the original . 
35e00 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70 61   ** number of pa
35e10 67 65 73 20 69 73 20 35 20 28 31 30 20 4b 42 20  ges is 5 (10 KB 
35e20 66 69 6c 65 29 2e 20 49 66 20 70 46 72 6f 6d 20  file). If pFrom 
35e30 68 61 73 20 61 20 70 61 67 65 20 73 69 7a 65 20  has a page size 
35e40 6f 66 20 31 30 32 34 20 0a 20 20 2a 2a 20 62 79  of 1024 .  ** by
35e50 74 65 73 20 61 6e 64 20 39 20 70 61 67 65 73 2c  tes and 9 pages,
35e60 20 74 68 65 6e 20 74 68 65 20 66 69 6c 65 20 6e   then the file n
35e70 65 65 64 73 20 74 6f 20 62 65 20 74 72 75 6e 63  eeds to be trunc
35e80 61 74 65 64 20 74 6f 20 39 4b 42 2e 0a 20 20 2a  ated to 9KB..  *
35e90 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
35ea0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
35eb0 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 21 3d   nFromPageSize!=
35ec0 6e 54 6f 50 61 67 65 53 69 7a 65 20 29 7b 0a 20  nToPageSize ){. 
35ed0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c       sqlite3_fil
35ee0 65 20 2a 70 46 69 6c 65 20 3d 20 73 71 6c 69 74  e *pFile = sqlit
35ef0 65 33 50 61 67 65 72 46 69 6c 65 28 70 42 74 54  e3PagerFile(pBtT
35f00 6f 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  o->pPager);.    
35f10 20 20 69 36 34 20 69 53 69 7a 65 20 3d 20 28 69    i64 iSize = (i
35f20 36 34 29 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65  64)nFromPageSize
35f30 20 2a 20 28 69 36 34 29 6e 46 72 6f 6d 50 61 67   * (i64)nFromPag
35f40 65 3b 0a 20 20 20 20 20 20 69 36 34 20 69 4e 6f  e;.      i64 iNo
35f50 77 20 3d 20 28 69 36 34 29 28 28 6e 54 6f 50 61  w = (i64)((nToPa
35f60 67 65 3e 6e 4e 65 77 50 61 67 65 29 3f 6e 54 6f  ge>nNewPage)?nTo
35f70 50 61 67 65 3a 6e 4e 65 77 50 61 67 65 29 20 2a  Page:nNewPage) *
35f80 20 28 69 36 34 29 6e 54 6f 50 61 67 65 53 69 7a   (i64)nToPageSiz
35f90 65 3b 20 0a 20 20 20 20 20 20 69 36 34 20 69 50  e; .      i64 iP
35fa0 65 6e 64 69 6e 67 20 3d 20 28 28 69 36 34 29 50  ending = ((i64)P
35fb0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
35fc0 28 70 42 74 54 6f 29 2d 31 29 20 2a 28 69 36 34  (pBtTo)-1) *(i64
35fd0 29 6e 54 6f 50 61 67 65 53 69 7a 65 3b 0a 20 20  )nToPageSize;.  
35fe0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
35ff0 53 69 7a 65 3c 3d 69 4e 6f 77 20 29 3b 0a 20 20  Size<=iNow );.  
36000 0a 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 69 74  .      /* Commit
36010 20 70 68 61 73 65 20 6f 6e 65 20 73 79 6e 63 73   phase one syncs
36020 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
36030 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
36040 68 20 70 54 6f 20 0a 20 20 20 20 20 20 2a 2a 20  h pTo .      ** 
36050 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6f  containing the o
36060 72 69 67 69 6e 61 6c 20 64 61 74 61 2e 20 49 74  riginal data. It
36070 20 64 6f 65 73 20 6e 6f 74 20 73 79 6e 63 20 74   does not sync t
36080 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
36090 0a 20 20 20 20 20 20 2a 2a 20 69 74 73 65 6c 66  .      ** itself
360a0 2e 20 41 66 74 65 72 20 64 6f 69 6e 67 20 74 68  . After doing th
360b0 69 73 20 69 74 20 69 73 20 73 61 66 65 20 74 6f  is it is safe to
360c0 20 75 73 65 20 4f 73 54 72 75 6e 63 61 74 65 28   use OsTruncate(
360d0 29 20 61 6e 64 20 6f 74 68 65 72 0a 20 20 20 20  ) and other.    
360e0 20 20 2a 2a 20 66 69 6c 65 20 41 50 49 73 20 6f    ** file APIs o
360f0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
36100 69 6c 65 20 64 69 72 65 63 74 6c 79 2e 0a 20 20  ile directly..  
36110 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 42 74      */.      pBt
36120 54 6f 2d 3e 64 62 20 3d 20 70 54 6f 2d 3e 64 62  To->db = pTo->db
36130 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
36140 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
36150 68 61 73 65 4f 6e 65 28 70 42 74 54 6f 2d 3e 70  haseOne(pBtTo->p
36160 50 61 67 65 72 2c 20 30 2c 20 30 2c 20 31 29 3b  Pager, 0, 0, 1);
36170 0a 20 20 20 20 20 20 69 66 28 20 69 53 69 7a 65  .      if( iSize
36180 3c 69 4e 6f 77 20 26 26 20 72 63 3d 3d 53 51 4c  <iNow && rc==SQL
36190 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
361a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
361b0 54 72 75 6e 63 61 74 65 28 70 46 69 6c 65 2c 20  Truncate(pFile, 
361c0 69 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  iSize);.      }.
361d0 20 20 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20    .      /* The 
361e0 6c 6f 6f 70 20 74 68 61 74 20 63 6f 70 69 65 64  loop that copied
361f0 20 64 61 74 61 20 66 72 6f 6d 20 64 61 74 61 62   data from datab
36200 61 73 65 20 70 46 72 6f 6d 20 74 6f 20 70 54 6f  ase pFrom to pTo
36210 20 64 69 64 20 6e 6f 74 0a 20 20 20 20 20 20 2a   did not.      *
36220 2a 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6c  * populate the l
36230 6f 63 6b 69 6e 67 20 70 61 67 65 20 6f 66 20 64  ocking page of d
36240 61 74 61 62 61 73 65 20 70 54 6f 2e 20 49 66 20  atabase pTo. If 
36250 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66  the page-size of
36260 0a 20 20 20 20 20 20 2a 2a 20 70 46 72 6f 6d 20  .      ** pFrom 
36270 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
36280 74 68 61 74 20 6f 66 20 70 54 6f 2c 20 74 68 69  that of pTo, thi
36290 73 20 6d 65 61 6e 73 20 73 6f 6d 65 20 64 61 74  s means some dat
362a0 61 20 77 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20  a will.      ** 
362b0 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 63 6f  not have been co
362c0 70 69 65 64 2e 20 0a 20 20 20 20 20 20 2a 2a 0a  pied. .      **.
362d0 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 62 6c        ** This bl
362e0 6f 63 6b 20 63 6f 70 69 65 73 20 74 68 65 20 6d  ock copies the m
362f0 69 73 73 69 6e 67 20 64 61 74 61 20 66 72 6f 6d  issing data from
36300 20 64 61 74 61 62 61 73 65 20 70 46 72 6f 6d 20   database pFrom 
36310 74 6f 20 70 54 6f 20 0a 20 20 20 20 20 20 2a 2a  to pTo .      **
36320 20 75 73 69 6e 67 20 66 69 6c 65 20 41 50 49 73   using file APIs
36330 2e 20 54 68 69 73 20 69 73 20 73 61 66 65 20 62  . This is safe b
36340 65 63 61 75 73 65 20 61 74 20 74 68 69 73 20 70  ecause at this p
36350 6f 69 6e 74 20 77 65 20 6b 6e 6f 77 20 74 68 61  oint we know tha
36360 74 0a 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 6f  t.      ** all o
36370 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  f the original d
36380 61 74 61 20 66 72 6f 6d 20 70 54 6f 20 68 61 73  ata from pTo has
36390 20 62 65 65 6e 20 73 79 6e 63 65 64 20 69 6e 74   been synced int
363a0 6f 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20  o the .      ** 
363b0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 74  journal file. At
363c0 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77   this point it w
363d0 6f 75 6c 64 20 62 65 20 73 61 66 65 20 74 6f 20  ould be safe to 
363e0 64 6f 20 61 6e 79 74 68 69 6e 67 20 61 74 0a 20  do anything at. 
363f0 20 20 20 20 20 2a 2a 20 61 6c 6c 20 74 6f 20 74       ** all to t
36400 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
36410 20 65 78 63 65 70 74 20 74 72 75 6e 63 61 74 65   except truncate
36420 20 69 74 20 74 6f 20 7a 65 72 6f 20 62 79 74 65   it to zero byte
36430 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  s..      */.    
36440 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
36450 5f 4f 4b 20 26 26 20 6e 46 72 6f 6d 50 61 67 65  _OK && nFromPage
36460 53 69 7a 65 3c 6e 54 6f 50 61 67 65 53 69 7a 65  Size<nToPageSize
36470 20 26 26 20 69 53 69 7a 65 3e 69 50 65 6e 64 69   && iSize>iPendi
36480 6e 67 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34  ng){.        i64
36490 20 69 4f 66 66 3b 0a 20 20 20 20 20 20 20 20 66   iOff;.        f
364a0 6f 72 28 0a 20 20 20 20 20 20 20 20 20 20 69 4f  or(.          iO
364b0 66 66 3d 69 50 65 6e 64 69 6e 67 3b 20 0a 20 20  ff=iPending; .  
364c0 20 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49          rc==SQLI
364d0 54 45 5f 4f 4b 20 26 26 20 69 4f 66 66 3c 28 69  TE_OK && iOff<(i
364e0 50 65 6e 64 69 6e 67 2b 6e 54 6f 50 61 67 65 53  Pending+nToPageS
364f0 69 7a 65 29 3b 20 0a 20 20 20 20 20 20 20 20 20  ize); .         
36500 20 69 4f 66 66 20 2b 3d 20 6e 46 72 6f 6d 50 61   iOff += nFromPa
36510 67 65 53 69 7a 65 0a 20 20 20 20 20 20 20 20 29  geSize.        )
36520 7b 0a 20 20 20 20 20 20 20 20 20 20 44 62 50 61  {.          DbPa
36530 67 65 20 2a 70 46 72 6f 6d 50 61 67 65 20 3d 20  ge *pFromPage = 
36540 30 3b 0a 20 20 20 20 20 20 20 20 20 20 50 67 6e  0;.          Pgn
36550 6f 20 69 46 72 6f 6d 20 3d 20 28 69 4f 66 66 2f  o iFrom = (iOff/
36560 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 29 2b 31  nFromPageSize)+1
36570 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 20 20 69  ;.  .          i
36580 66 28 20 69 46 72 6f 6d 3d 3d 50 45 4e 44 49 4e  f( iFrom==PENDIN
36590 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 46  G_BYTE_PAGE(pBtF
365a0 72 6f 6d 29 20 7c 7c 20 69 46 72 6f 6d 3e 6e 46  rom) || iFrom>nF
365b0 72 6f 6d 50 61 67 65 20 29 7b 0a 20 20 20 20 20  romPage ){.     
365c0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
365d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 0a  .          }.  .
365e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
365f0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
36600 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65 72 2c 20  BtFrom->pPager, 
36610 69 46 72 6f 6d 2c 20 26 70 46 72 6f 6d 50 61 67  iFrom, &pFromPag
36620 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
36630 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
36640 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
36650 68 61 72 20 2a 7a 46 72 6f 6d 20 3d 20 73 71 6c  har *zFrom = sql
36660 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
36670 28 70 46 72 6f 6d 50 61 67 65 29 3b 0a 20 20 09  (pFromPage);.  .
36680 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
36690 57 72 69 74 65 28 70 46 69 6c 65 2c 20 7a 46 72  Write(pFile, zFr
366a0 6f 6d 2c 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a  om, nFromPageSiz
366b0 65 2c 20 69 4f 66 66 29 3b 0a 20 20 20 20 20 20  e, iOff);.      
366c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
366d0 65 72 55 6e 72 65 66 28 70 46 72 6f 6d 50 61 67  erUnref(pFromPag
366e0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
366f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36700 7d 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 53 79  }.  .      /* Sy
36710 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
36720 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  file */.      if
36730 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
36740 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
36750 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63  sqlite3PagerSync
36760 28 70 42 74 54 6f 2d 3e 70 50 61 67 65 72 29 3b  (pBtTo->pPager);
36770 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
36780 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
36790 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
367a0 61 74 65 28 70 42 74 54 6f 2d 3e 70 50 61 67 65  ate(pBtTo->pPage
367b0 72 2c 20 6e 4e 65 77 50 61 67 65 29 3b 0a 20 20  r, nNewPage);.  
367c0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
367d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
367e0 20 20 20 70 42 74 54 6f 2d 3e 70 61 67 65 53 69     pBtTo->pageSi
367f0 7a 65 46 69 78 65 64 20 3d 20 30 3b 0a 20 20 20  zeFixed = 0;.   
36800 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63   }.  }..  if( rc
36810 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
36820 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 54 6f  treeRollback(pTo
36830 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
36840 20 72 63 3b 20 20 0a 7d 0a 69 6e 74 20 73 71 6c   rc;  .}.int sql
36850 69 74 65 33 42 74 72 65 65 43 6f 70 79 46 69 6c  ite3BtreeCopyFil
36860 65 28 42 74 72 65 65 20 2a 70 54 6f 2c 20 42 74  e(Btree *pTo, Bt
36870 72 65 65 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69  ree *pFrom){.  i
36880 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
36890 42 74 72 65 65 45 6e 74 65 72 28 70 54 6f 29 3b  BtreeEnter(pTo);
368a0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
368b0 6e 74 65 72 28 70 46 72 6f 6d 29 3b 0a 20 20 72  nter(pFrom);.  r
368c0 63 20 3d 20 62 74 72 65 65 43 6f 70 79 46 69 6c  c = btreeCopyFil
368d0 65 28 70 54 6f 2c 20 70 46 72 6f 6d 29 3b 0a 20  e(pTo, pFrom);. 
368e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
368f0 76 65 28 70 46 72 6f 6d 29 3b 0a 20 20 73 71 6c  ve(pFrom);.  sql
36900 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
36910 54 6f 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  To);.  return rc
36920 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53  ;.}..#endif /* S
36930 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55  QLITE_OMIT_VACUU
36940 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  M */../*.** Retu
36950 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61  rn non-zero if a
36960 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
36970 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73  active..*/.int s
36980 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54  qlite3BtreeIsInT
36990 72 61 6e 73 28 42 74 72 65 65 20 2a 70 29 7b 0a  rans(Btree *p){.
369a0 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30 20 7c    assert( p==0 |
369b0 7c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  | sqlite3_mutex_
369c0 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
369d0 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  x) );.  return (
369e0 70 20 26 26 20 28 70 2d 3e 69 6e 54 72 61 6e 73  p && (p->inTrans
369f0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 29 29 3b  ==TRANS_WRITE));
36a00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
36a10 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61 20 73   non-zero if a s
36a20 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
36a30 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
36a40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
36a50 72 65 65 49 73 49 6e 53 74 6d 74 28 42 74 72 65  reeIsInStmt(Btre
36a60 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74 28  e *p){.  assert(
36a70 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
36a80 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
36a90 72 65 74 75 72 6e 20 28 70 2d 3e 70 42 74 20 26  return (p->pBt &
36aa0 26 20 70 2d 3e 70 42 74 2d 3e 69 6e 53 74 6d 74  & p->pBt->inStmt
36ab0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
36ac0 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 61  rn non-zero if a
36ad0 20 72 65 61 64 20 28 6f 72 20 77 72 69 74 65 29   read (or write)
36ae0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
36af0 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73  active..*/.int s
36b00 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 52  qlite3BtreeIsInR
36b10 65 61 64 54 72 61 6e 73 28 42 74 72 65 65 20 2a  eadTrans(Btree *
36b20 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71  p){.  assert( sq
36b30 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
36b40 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29  (p->db->mutex) )
36b50 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 20 26 26  ;.  return (p &&
36b60 20 28 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52   (p->inTrans!=TR
36b70 41 4e 53 5f 4e 4f 4e 45 29 29 3b 0a 7d 0a 0a 2f  ANS_NONE));.}../
36b80 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
36b90 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  on returns a poi
36ba0 6e 74 65 72 20 74 6f 20 61 20 62 6c 6f 62 20 6f  nter to a blob o
36bb0 66 20 6d 65 6d 6f 72 79 20 61 73 73 6f 63 69 61  f memory associa
36bc0 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 73 69  ted with.** a si
36bd0 6e 67 6c 65 20 73 68 61 72 65 64 2d 62 74 72 65  ngle shared-btre
36be0 65 2e 20 54 68 65 20 6d 65 6d 6f 72 79 20 69 73  e. The memory is
36bf0 20 75 73 65 64 20 62 79 20 63 6c 69 65 6e 74 20   used by client 
36c00 63 6f 64 65 20 66 6f 72 20 69 74 73 20 6f 77 6e  code for its own
36c10 0a 2a 2a 20 70 75 72 70 6f 73 65 73 20 28 66 6f  .** purposes (fo
36c20 72 20 65 78 61 6d 70 6c 65 2c 20 74 6f 20 73 74  r example, to st
36c30 6f 72 65 20 61 20 68 69 67 68 2d 6c 65 76 65 6c  ore a high-level
36c40 20 73 63 68 65 6d 61 20 61 73 73 6f 63 69 61 74   schema associat
36c50 65 64 20 77 69 74 68 20 0a 2a 2a 20 74 68 65 20  ed with .** the 
36c60 73 68 61 72 65 64 2d 62 74 72 65 65 29 2e 20 54  shared-btree). T
36c70 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 6d  he btree layer m
36c80 61 6e 61 67 65 73 20 72 65 66 65 72 65 6e 63 65  anages reference
36c90 20 63 6f 75 6e 74 69 6e 67 20 69 73 73 75 65 73   counting issues
36ca0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
36cb0 74 20 74 69 6d 65 20 74 68 69 73 20 69 73 20 63  t time this is c
36cc0 61 6c 6c 65 64 20 6f 6e 20 61 20 73 68 61 72 65  alled on a share
36cd0 64 2d 62 74 72 65 65 2c 20 6e 42 79 74 65 73 20  d-btree, nBytes 
36ce0 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 0a  bytes of memory.
36cf0 2a 2a 20 61 72 65 20 61 6c 6c 6f 63 61 74 65 64  ** are allocated
36d00 2c 20 7a 65 72 6f 65 64 2c 20 61 6e 64 20 72 65  , zeroed, and re
36d10 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
36d20 6c 6c 65 72 2e 20 46 6f 72 20 65 61 63 68 20 73  ller. For each s
36d30 75 62 73 65 71 75 65 6e 74 20 0a 2a 2a 20 63 61  ubsequent .** ca
36d40 6c 6c 20 74 68 65 20 6e 42 79 74 65 73 20 70 61  ll the nBytes pa
36d50 72 61 6d 65 74 65 72 20 69 73 20 69 67 6e 6f 72  rameter is ignor
36d60 65 64 20 61 6e 64 20 61 20 70 6f 69 6e 74 65 72  ed and a pointer
36d70 20 74 6f 20 74 68 65 20 73 61 6d 65 20 62 6c 6f   to the same blo
36d80 62 0a 2a 2a 20 6f 66 20 6d 65 6d 6f 72 79 20 72  b.** of memory r
36d90 65 74 75 72 6e 65 64 2e 20 0a 2a 2a 0a 2a 2a 20  eturned. .**.** 
36da0 49 66 20 74 68 65 20 6e 42 79 74 65 73 20 70 61  If the nBytes pa
36db0 72 61 6d 65 74 65 72 20 69 73 20 30 20 61 6e 64  rameter is 0 and
36dc0 20 74 68 65 20 62 6c 6f 62 20 6f 66 20 6d 65 6d   the blob of mem
36dd0 6f 72 79 20 68 61 73 20 6e 6f 74 20 79 65 74 20  ory has not yet 
36de0 62 65 65 6e 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  been.** allocate
36df0 64 2c 20 61 20 6e 75 6c 6c 20 70 6f 69 6e 74 65  d, a null pointe
36e00 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  r is returned. I
36e10 66 20 74 68 65 20 62 6c 6f 62 20 68 61 73 20 61  f the blob has a
36e20 6c 72 65 61 64 79 20 62 65 65 6e 0a 2a 2a 20 61  lready been.** a
36e30 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 69 73 20  llocated, it is 
36e40 72 65 74 75 72 6e 65 64 20 61 73 20 6e 6f 72 6d  returned as norm
36e50 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4a 75 73 74 20 62  al..**.** Just b
36e60 65 66 6f 72 65 20 74 68 65 20 73 68 61 72 65 64  efore the shared
36e70 2d 62 74 72 65 65 20 69 73 20 63 6c 6f 73 65 64  -btree is closed
36e80 2c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 70  , the function p
36e90 61 73 73 65 64 20 61 73 20 74 68 65 20 0a 2a 2a  assed as the .**
36ea0 20 78 46 72 65 65 20 61 72 67 75 6d 65 6e 74 20   xFree argument 
36eb0 77 68 65 6e 20 74 68 65 20 6d 65 6d 6f 72 79 20  when the memory 
36ec0 61 6c 6c 6f 63 61 74 69 6f 6e 20 77 61 73 20 6d  allocation was m
36ed0 61 64 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f  ade is invoked o
36ee0 6e 20 74 68 65 20 0a 2a 2a 20 62 6c 6f 62 20 6f  n the .** blob o
36ef0 66 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f  f allocated memo
36f00 72 79 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  ry. This functio
36f10 6e 20 73 68 6f 75 6c 64 20 6e 6f 74 20 63 61 6c  n should not cal
36f20 6c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  l sqlite3_free()
36f30 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 65 6d 6f 72  .** on the memor
36f40 79 2c 20 74 68 65 20 62 74 72 65 65 20 6c 61 79  y, the btree lay
36f50 65 72 20 64 6f 65 73 20 74 68 61 74 2e 0a 2a 2f  er does that..*/
36f60 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 42 74  .void *sqlite3Bt
36f70 72 65 65 53 63 68 65 6d 61 28 42 74 72 65 65 20  reeSchema(Btree 
36f80 2a 70 2c 20 69 6e 74 20 6e 42 79 74 65 73 2c 20  *p, int nBytes, 
36f90 76 6f 69 64 28 2a 78 46 72 65 65 29 28 76 6f 69  void(*xFree)(voi
36fa0 64 20 2a 29 29 7b 0a 20 20 42 74 53 68 61 72 65  d *)){.  BtShare
36fb0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
36fc0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
36fd0 6e 74 65 72 28 70 29 3b 0a 20 20 69 66 28 20 21  nter(p);.  if( !
36fe0 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 26 26 20  pBt->pSchema && 
36ff0 6e 42 79 74 65 73 20 29 7b 0a 20 20 20 20 70 42  nBytes ){.    pB
37000 74 2d 3e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c  t->pSchema = sql
37010 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 6e  ite3MallocZero(n
37020 42 79 74 65 73 29 3b 0a 20 20 20 20 70 42 74 2d  Bytes);.    pBt-
37030 3e 78 46 72 65 65 53 63 68 65 6d 61 20 3d 20 78  >xFreeSchema = x
37040 46 72 65 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Free;.  }.  sqli
37050 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
37060 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e  ;.  return pBt->
37070 70 53 63 68 65 6d 61 3b 0a 7d 0a 0a 2f 2a 0a 2a  pSchema;.}../*.*
37080 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
37090 20 61 6e 6f 74 68 65 72 20 75 73 65 72 20 6f 66   another user of
370a0 20 74 68 65 20 73 61 6d 65 20 73 68 61 72 65 64   the same shared
370b0 20 62 74 72 65 65 20 61 73 20 74 68 65 20 61 72   btree as the ar
370c0 67 75 6d 65 6e 74 0a 2a 2a 20 68 61 6e 64 6c 65  gument.** handle
370d0 20 68 6f 6c 64 73 20 61 6e 20 65 78 63 6c 75 73   holds an exclus
370e0 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ive lock on the 
370f0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61  sqlite_master ta
37100 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ble..*/.int sqli
37110 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 4c 6f  te3BtreeSchemaLo
37120 63 6b 65 64 28 42 74 72 65 65 20 2a 70 29 7b 0a  cked(Btree *p){.
37130 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
37140 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
37150 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
37160 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
37170 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
37180 20 20 72 63 20 3d 20 28 71 75 65 72 79 54 61 62    rc = (queryTab
37190 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41 53 54 45 52  leLock(p, MASTER
371a0 5f 52 4f 4f 54 2c 20 52 45 41 44 5f 4c 4f 43 4b  _ROOT, READ_LOCK
371b0 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20  )!=SQLITE_OK);. 
371c0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
371d0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
371e0 72 63 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20  rc;.}...#ifndef 
371f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
37200 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 4f  ED_CACHE./*.** O
37210 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20  btain a lock on 
37220 74 68 65 20 74 61 62 6c 65 20 77 68 6f 73 65 20  the table whose 
37230 72 6f 6f 74 20 70 61 67 65 20 69 73 20 69 54 61  root page is iTa
37240 62 2e 20 20 54 68 65 0a 2a 2a 20 6c 6f 63 6b 20  b.  The.** lock 
37250 69 73 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 20  is a write lock 
37260 69 66 20 69 73 57 72 69 74 65 6c 6f 63 6b 20 69  if isWritelock i
37270 73 20 74 72 75 65 20 6f 72 20 61 20 72 65 61 64  s true or a read
37280 20 6c 6f 63 6b 0a 2a 2a 20 69 66 20 69 74 20 69   lock.** if it i
37290 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a 69 6e 74 20  s false..*/.int 
372a0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 6f 63 6b  sqlite3BtreeLock
372b0 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20  Table(Btree *p, 
372c0 69 6e 74 20 69 54 61 62 2c 20 75 38 20 69 73 57  int iTab, u8 isW
372d0 72 69 74 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74  riteLock){.  int
372e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
372f0 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62  .  if( p->sharab
37300 6c 65 20 29 7b 0a 20 20 20 20 75 38 20 6c 6f 63  le ){.    u8 loc
37310 6b 54 79 70 65 20 3d 20 52 45 41 44 5f 4c 4f 43  kType = READ_LOC
37320 4b 20 2b 20 69 73 57 72 69 74 65 4c 6f 63 6b 3b  K + isWriteLock;
37330 0a 20 20 20 20 61 73 73 65 72 74 28 20 52 45 41  .    assert( REA
37340 44 5f 4c 4f 43 4b 2b 31 3d 3d 57 52 49 54 45 5f  D_LOCK+1==WRITE_
37350 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  LOCK );.    asse
37360 72 74 28 20 69 73 57 72 69 74 65 4c 6f 63 6b 3d  rt( isWriteLock=
37370 3d 30 20 7c 7c 20 69 73 57 72 69 74 65 4c 6f 63  =0 || isWriteLoc
37380 6b 3d 3d 31 20 29 3b 0a 20 20 20 20 73 71 6c 69  k==1 );.    sqli
37390 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
373a0 3b 0a 20 20 20 20 72 63 20 3d 20 71 75 65 72 79  ;.    rc = query
373b0 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 69 54 61  TableLock(p, iTa
373c0 62 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a 20 20  b, lockType);.  
373d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
373e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
373f0 3d 20 6c 6f 63 6b 54 61 62 6c 65 28 70 2c 20 69  = lockTable(p, i
37400 54 61 62 2c 20 6c 6f 63 6b 54 79 70 65 29 3b 0a  Tab, lockType);.
37410 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
37420 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
37430 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
37440 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  .}.#endif..#ifnd
37450 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
37460 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20 41 72  NCRBLOB./*.** Ar
37470 67 75 6d 65 6e 74 20 70 43 73 72 20 6d 75 73 74  gument pCsr must
37480 20 62 65 20 61 20 63 75 72 73 6f 72 20 6f 70 65   be a cursor ope
37490 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 20  ned for writing 
374a0 6f 6e 20 61 6e 20 0a 2a 2a 20 49 4e 54 4b 45 59  on an .** INTKEY
374b0 20 74 61 62 6c 65 20 63 75 72 72 65 6e 74 6c 79   table currently
374c0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 76   pointing at a v
374d0 61 6c 69 64 20 74 61 62 6c 65 20 65 6e 74 72 79  alid table entry
374e0 2e 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  . .** This funct
374f0 69 6f 6e 20 6d 6f 64 69 66 69 65 73 20 74 68 65  ion modifies the
37500 20 64 61 74 61 20 73 74 6f 72 65 64 20 61 73 20   data stored as 
37510 70 61 72 74 20 6f 66 20 74 68 61 74 20 65 6e 74  part of that ent
37520 72 79 2e 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20  ry..** Only the 
37530 64 61 74 61 20 63 6f 6e 74 65 6e 74 20 6d 61 79  data content may
37540 20 6f 6e 6c 79 20 62 65 20 6d 6f 64 69 66 69 65   only be modifie
37550 64 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  d, it is not pos
37560 73 69 62 6c 65 0a 2a 2a 20 74 6f 20 63 68 61 6e  sible.** to chan
37570 67 65 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  ge the length of
37580 20 74 68 65 20 64 61 74 61 20 73 74 6f 72 65 64   the data stored
37590 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
375a0 42 74 72 65 65 50 75 74 44 61 74 61 28 42 74 43  BtreePutData(BtC
375b0 75 72 73 6f 72 20 2a 70 43 73 72 2c 20 75 33 32  ursor *pCsr, u32
375c0 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
375d0 2c 20 76 6f 69 64 20 2a 7a 29 7b 0a 20 20 61 73  , void *z){.  as
375e0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
375f0 73 4d 75 74 65 78 28 70 43 73 72 29 20 29 3b 0a  sMutex(pCsr) );.
37600 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
37610 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 73  3_mutex_held(pCs
37620 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
37630 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
37640 74 28 70 43 73 72 2d 3e 69 73 49 6e 63 72 62 6c  t(pCsr->isIncrbl
37650 6f 62 48 61 6e 64 6c 65 29 3b 0a 0a 20 20 72 65  obHandle);..  re
37660 73 74 6f 72 65 4f 72 43 6c 65 61 72 43 75 72 73  storeOrClearCurs
37670 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 73 72 29  orPosition(pCsr)
37680 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 73 72  ;.  assert( pCsr
37690 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52  ->eState!=CURSOR
376a0 5f 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a  _REQUIRESEEK );.
376b0 20 20 69 66 28 20 70 43 73 72 2d 3e 65 53 74 61    if( pCsr->eSta
376c0 74 65 21 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te!=CURSOR_VALID
376d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
376e0 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d  QLITE_ABORT;.  }
376f0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 73 6f 6d  ..  /* Check som
37700 65 20 70 72 65 63 6f 6e 64 69 74 69 6f 6e 73 3a  e preconditions:
37710 20 0a 20 20 2a 2a 20 20 20 28 61 29 20 74 68 65   .  **   (a) the
37720 20 63 75 72 73 6f 72 20 69 73 20 6f 70 65 6e 20   cursor is open 
37730 66 6f 72 20 77 72 69 74 69 6e 67 2c 0a 20 20 2a  for writing,.  *
37740 2a 20 20 20 28 62 29 20 74 68 65 72 65 20 69 73  *   (b) there is
37750 20 6e 6f 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e   no read-lock on
37760 20 74 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67   the table being
37770 20 6d 6f 64 69 66 69 65 64 20 61 6e 64 0a 20 20   modified and.  
37780 2a 2a 20 20 20 28 63 29 20 74 68 65 20 63 75 72  **   (c) the cur
37790 73 6f 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20  sor points at a 
377a0 76 61 6c 69 64 20 72 6f 77 20 6f 66 20 61 6e 20  valid row of an 
377b0 69 6e 74 4b 65 79 20 74 61 62 6c 65 2e 0a 20 20  intKey table..  
377c0 2a 2f 0a 20 20 69 66 28 20 21 70 43 73 72 2d 3e  */.  if( !pCsr->
377d0 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 65  wrFlag ){.    re
377e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44  turn SQLITE_READ
377f0 4f 4e 4c 59 3b 0a 20 20 7d 0a 20 20 61 73 73 65  ONLY;.  }.  asse
37800 72 74 28 20 21 70 43 73 72 2d 3e 70 42 74 2d 3e  rt( !pCsr->pBt->
37810 72 65 61 64 4f 6e 6c 79 20 0a 20 20 20 20 20 20  readOnly .      
37820 20 20 20 20 26 26 20 70 43 73 72 2d 3e 70 42 74      && pCsr->pBt
37830 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
37840 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
37850 20 20 69 66 28 20 63 68 65 63 6b 52 65 61 64 4c    if( checkReadL
37860 6f 63 6b 73 28 70 43 73 72 2d 3e 70 42 74 72 65  ocks(pCsr->pBtre
37870 65 2c 20 70 43 73 72 2d 3e 70 67 6e 6f 52 6f 6f  e, pCsr->pgnoRoo
37880 74 2c 20 70 43 73 72 2c 20 30 29 20 29 7b 0a 20  t, pCsr, 0) ){. 
37890 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
378a0 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20  _LOCKED; /* The 
378b0 74 61 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74  table pCur point
378c0 73 20 74 6f 20 68 61 73 20 61 20 72 65 61 64 20  s to has a read 
378d0 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  lock */.  }.  if
378e0 28 20 70 43 73 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCsr->eState==
378f0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c  CURSOR_INVALID |
37900 7c 20 21 70 43 73 72 2d 3e 70 50 61 67 65 2d 3e  | !pCsr->pPage->
37910 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 72 65  intKey ){.    re
37920 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
37930 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  R;.  }..  return
37940 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70   accessPayload(p
37950 43 73 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74  Csr, offset, amt
37960 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  , (unsigned char
37970 20 2a 29 7a 2c 20 30 2c 20 31 29 3b 0a 7d 0a 0a   *)z, 0, 1);.}..
37980 2f 2a 20 0a 2a 2a 20 53 65 74 20 61 20 66 6c 61  /* .** Set a fla
37990 67 20 6f 6e 20 74 68 69 73 20 63 75 72 73 6f 72  g on this cursor
379a0 20 74 6f 20 63 61 63 68 65 20 74 68 65 20 6c 6f   to cache the lo
379b0 63 61 74 69 6f 6e 73 20 6f 66 20 70 61 67 65 73  cations of pages
379c0 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 6f 76   from the .** ov
379d0 65 72 66 6c 6f 77 20 6c 69 73 74 20 66 6f 72 20  erflow list for 
379e0 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 2e  the current row.
379f0 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79   This is used by
37a00 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a   cursors opened.
37a10 2a 2a 20 66 6f 72 20 69 6e 63 72 65 6d 65 6e 74  ** for increment
37a20 61 6c 20 62 6c 6f 62 20 49 4f 20 6f 6e 6c 79 2e  al blob IO only.
37a30 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
37a40 74 69 6f 6e 20 73 65 74 73 20 61 20 66 6c 61 67  tion sets a flag
37a50 20 6f 6e 6c 79 2e 20 54 68 65 20 61 63 74 75 61   only. The actua
37a60 6c 20 70 61 67 65 20 6c 6f 63 61 74 69 6f 6e 20  l page location 
37a70 63 61 63 68 65 0a 2a 2a 20 28 73 74 6f 72 65 64  cache.** (stored
37a80 20 69 6e 20 42 74 43 75 72 73 6f 72 2e 61 4f 76   in BtCursor.aOv
37a90 65 72 66 6c 6f 77 5b 5d 29 20 69 73 20 61 6c 6c  erflow[]) is all
37aa0 6f 63 61 74 65 64 20 61 6e 64 20 75 73 65 64 20  ocated and used 
37ab0 62 79 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61  by function.** a
37ac0 63 63 65 73 73 50 61 79 6c 6f 61 64 28 29 20 28  ccessPayload() (
37ad0 74 68 65 20 77 6f 72 6b 65 72 20 66 75 6e 63 74  the worker funct
37ae0 69 6f 6e 20 66 6f 72 20 73 71 6c 69 74 65 33 42  ion for sqlite3B
37af0 74 72 65 65 44 61 74 61 28 29 20 61 6e 64 0a 2a  treeData() and.*
37b00 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 75  * sqlite3BtreePu
37b10 74 44 61 74 61 28 29 29 2e 0a 2a 2f 0a 76 6f 69  tData())..*/.voi
37b20 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 61  d sqlite3BtreeCa
37b30 63 68 65 4f 76 65 72 66 6c 6f 77 28 42 74 43 75  cheOverflow(BtCu
37b40 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
37b50 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
37b60 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
37b70 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
37b80 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43  e3_mutex_held(pC
37b90 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e  ur->pBtree->db->
37ba0 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
37bb0 72 74 28 21 70 43 75 72 2d 3e 69 73 49 6e 63 72  rt(!pCur->isIncr
37bc0 62 6c 6f 62 48 61 6e 64 6c 65 29 3b 0a 20 20 61  blobHandle);.  a
37bd0 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61 4f 76  ssert(!pCur->aOv
37be0 65 72 66 6c 6f 77 29 3b 0a 20 20 70 43 75 72 2d  erflow);.  pCur-
37bf0 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  >isIncrblobHandl
37c00 65 20 3d 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  e = 1;.}.#endif.