/ Hex Artifact Content
Login

Artifact 7d1c7e15ef8f5b139a9267c3f053d10f8885759b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 34 20 41 70 72 69 6c  /*.** 2004 April
0010: 20 36 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74   6.**.** The aut
0020: 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f  hor disclaims co
0030: 70 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20  pyright to this 
0040: 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e  source code.  In
0050: 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c   place of.** a l
0060: 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72  egal notice, her
0070: 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a  e is a blessing:
0080: 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f  .**.**    May yo
0090: 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f  u do good and no
00a0: 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61  t evil..**    Ma
00b0: 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69  y you find forgi
00c0: 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73  veness for yours
00d0: 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20  elf and forgive 
00e0: 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61  others..**    Ma
00f0: 79 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65  y you share free
0100: 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67  ly, never taking
0110: 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67   more than you g
0120: 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  ive..**.********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 0a 2a 2a 20 24 49 64 3a 20 62 74 72 65 65 2e  *.** $Id: btree.
0180: 63 2c 76 20 31 2e 35 37 33 20 32 30 30 39 2f 30  c,v 1.573 2009/0
0190: 33 2f 31 36 20 31 33 3a 31 39 3a 33 36 20 64 61  3/16 13:19:36 da
01a0: 6e 69 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a  nielk1977 Exp $.
01b0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20  **.** This file 
01c0: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 65 78 74  implements a ext
01d0: 65 72 6e 61 6c 20 28 64 69 73 6b 2d 62 61 73 65  ernal (disk-base
01e0: 64 29 20 64 61 74 61 62 61 73 65 20 75 73 69 6e  d) database usin
01f0: 67 20 42 54 72 65 65 73 2e 0a 2a 2a 20 53 65 65  g BTrees..** See
0200: 20 74 68 65 20 68 65 61 64 65 72 20 63 6f 6d 6d   the header comm
0210: 65 6e 74 20 6f 6e 20 22 62 74 72 65 65 49 6e 74  ent on "btreeInt
0220: 2e 68 22 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  .h" for addition
0230: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
0240: 2a 2a 20 49 6e 63 6c 75 64 69 6e 67 20 61 20 64  ** Including a d
0250: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 66 69  escription of fi
0260: 6c 65 20 66 6f 72 6d 61 74 20 61 6e 64 20 61 6e  le format and an
0270: 20 6f 76 65 72 76 69 65 77 20 6f 66 20 6f 70 65   overview of ope
0280: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 6e 63 6c  ration..*/.#incl
0290: 75 64 65 20 22 62 74 72 65 65 49 6e 74 2e 68 22  ude "btreeInt.h"
02a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 68 65 61 64  ../*.** The head
02b0: 65 72 20 73 74 72 69 6e 67 20 74 68 61 74 20 61  er string that a
02c0: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 62 65  ppears at the be
02d0: 67 69 6e 6e 69 6e 67 20 6f 66 20 65 76 65 72 79  ginning of every
02e0: 0a 2a 2a 20 53 51 4c 69 74 65 20 64 61 74 61 62  .** SQLite datab
02f0: 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ase..*/.static c
0300: 6f 6e 73 74 20 63 68 61 72 20 7a 4d 61 67 69 63  onst char zMagic
0310: 48 65 61 64 65 72 5b 5d 20 3d 20 53 51 4c 49 54  Header[] = SQLIT
0320: 45 5f 46 49 4c 45 5f 48 45 41 44 45 52 3b 0a 0a  E_FILE_HEADER;..
0330: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 69 73 20 67  /*.** Set this g
0340: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
0350: 6f 20 31 20 74 6f 20 65 6e 61 62 6c 65 20 74 72  o 1 to enable tr
0360: 61 63 69 6e 67 20 75 73 69 6e 67 20 74 68 65 20  acing using the 
0370: 54 52 41 43 45 0a 2a 2a 20 6d 61 63 72 6f 2e 0a  TRACE.** macro..
0380: 2a 2f 0a 23 69 66 20 30 0a 69 6e 74 20 73 71 6c  */.#if 0.int sql
0390: 69 74 65 33 42 74 72 65 65 54 72 61 63 65 3d 30  ite3BtreeTrace=0
03a0: 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 65 6e  ;  /* True to en
03b0: 61 62 6c 65 20 74 72 61 63 69 6e 67 20 2a 2f 0a  able tracing */.
03c0: 23 20 64 65 66 69 6e 65 20 54 52 41 43 45 28 58  # define TRACE(X
03d0: 29 20 20 69 66 28 73 71 6c 69 74 65 33 42 74 72  )  if(sqlite3Btr
03e0: 65 65 54 72 61 63 65 29 7b 70 72 69 6e 74 66 20  eeTrace){printf 
03f0: 58 3b 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  X;fflush(stdout)
0400: 3b 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  ;}.#else.# defin
0410: 65 20 54 52 41 43 45 28 58 29 0a 23 65 6e 64 69  e TRACE(X).#endi
0420: 66 0a 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  f....#ifndef SQL
0430: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
0440: 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 20 6c 69  CACHE./*.** A li
0450: 73 74 20 6f 66 20 42 74 53 68 61 72 65 64 20 6f  st of BtShared o
0460: 62 6a 65 63 74 73 20 74 68 61 74 20 61 72 65 20  bjects that are 
0470: 65 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 72  eligible for par
0480: 74 69 63 69 70 61 74 69 6f 6e 0a 2a 2a 20 69 6e  ticipation.** in
0490: 20 73 68 61 72 65 64 20 63 61 63 68 65 2e 20 20   shared cache.  
04a0: 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 68 61  This variable ha
04b0: 73 20 66 69 6c 65 20 73 63 6f 70 65 20 64 75 72  s file scope dur
04c0: 69 6e 67 20 6e 6f 72 6d 61 6c 20 62 75 69 6c 64  ing normal build
04d0: 73 2c 0a 2a 2a 20 62 75 74 20 74 68 65 20 74 65  s,.** but the te
04e0: 73 74 20 68 61 72 6e 65 73 73 20 6e 65 65 64 73  st harness needs
04f0: 20 74 6f 20 61 63 63 65 73 73 20 69 74 20 73 6f   to access it so
0500: 20 77 65 20 6d 61 6b 65 20 69 74 20 67 6c 6f 62   we make it glob
0510: 61 6c 20 66 6f 72 20 0a 2a 2a 20 74 65 73 74 20  al for .** test 
0520: 62 75 69 6c 64 73 2e 0a 2a 2f 0a 23 69 66 64 65  builds..*/.#ifde
0530: 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 42 74  f SQLITE_TEST.Bt
0540: 53 68 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57  Shared *SQLITE_W
0550: 53 44 20 73 71 6c 69 74 65 33 53 68 61 72 65 64  SD sqlite3Shared
0560: 43 61 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23  CacheList = 0;.#
0570: 65 6c 73 65 0a 73 74 61 74 69 63 20 42 74 53 68  else.static BtSh
0580: 61 72 65 64 20 2a 53 51 4c 49 54 45 5f 57 53 44  ared *SQLITE_WSD
0590: 20 73 71 6c 69 74 65 33 53 68 61 72 65 64 43 61   sqlite3SharedCa
05a0: 63 68 65 4c 69 73 74 20 3d 20 30 3b 0a 23 65 6e  cheList = 0;.#en
05b0: 64 69 66 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  dif.#endif /* SQ
05c0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
05d0: 5f 43 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64  _CACHE */..#ifnd
05e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
05f0: 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a  HARED_CACHE./*.*
0600: 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61  * Enable or disa
0610: 62 6c 65 20 74 68 65 20 73 68 61 72 65 64 20 70  ble the shared p
0620: 61 67 65 72 20 61 6e 64 20 73 63 68 65 6d 61 20  ager and schema 
0630: 66 65 61 74 75 72 65 73 2e 0a 2a 2a 0a 2a 2a 20  features..**.** 
0640: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 68 61 73  This routine has
0650: 20 6e 6f 20 65 66 66 65 63 74 20 6f 6e 20 65 78   no effect on ex
0660: 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  isting database 
0670: 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 0a 2a 2a 20  connections..** 
0680: 54 68 65 20 73 68 61 72 65 64 20 63 61 63 68 65  The shared cache
0690: 20 73 65 74 74 69 6e 67 20 65 66 66 65 63 74 73   setting effects
06a0: 20 6f 6e 6c 79 20 66 75 74 75 72 65 20 63 61 6c   only future cal
06b0: 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33  ls to.** sqlite3
06c0: 5f 6f 70 65 6e 28 29 2c 20 73 71 6c 69 74 65 33  _open(), sqlite3
06d0: 5f 6f 70 65 6e 31 36 28 29 2c 20 6f 72 20 73 71  _open16(), or sq
06e0: 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2e  lite3_open_v2().
06f0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
0700: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
0710: 63 68 65 28 69 6e 74 20 65 6e 61 62 6c 65 29 7b  che(int enable){
0720: 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  .  sqlite3Global
0730: 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63  Config.sharedCac
0740: 68 65 45 6e 61 62 6c 65 64 20 3d 20 65 6e 61 62  heEnabled = enab
0750: 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  le;.  return SQL
0760: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
0770: 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64  .../*.** Forward
0780: 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a   declaration.*/.
0790: 73 74 61 74 69 63 20 69 6e 74 20 63 68 65 63 6b  static int check
07a0: 46 6f 72 52 65 61 64 43 6f 6e 66 6c 69 63 74 73  ForReadConflicts
07b0: 28 42 74 72 65 65 2a 2c 20 50 67 6e 6f 2c 20 42  (Btree*, Pgno, B
07c0: 74 43 75 72 73 6f 72 2a 2c 20 69 36 34 29 3b 0a  tCursor*, i64);.
07d0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
07e0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
07f0: 45 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20  E.  /*.  ** The 
0800: 66 75 6e 63 74 69 6f 6e 73 20 71 75 65 72 79 53  functions queryS
0810: 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
0820: 6f 63 6b 28 29 2c 20 73 65 74 53 68 61 72 65 64  ock(), setShared
0830: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
0840: 2c 0a 20 20 2a 2a 20 61 6e 64 20 63 6c 65 61 72  ,.  ** and clear
0850: 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
0860: 62 6c 65 4c 6f 63 6b 73 28 29 0a 20 20 2a 2a 20  bleLocks().  ** 
0870: 6d 61 6e 69 70 75 6c 61 74 65 20 65 6e 74 72 69  manipulate entri
0880: 65 73 20 69 6e 20 74 68 65 20 42 74 53 68 61 72  es in the BtShar
0890: 65 64 2e 70 4c 6f 63 6b 20 6c 69 6e 6b 65 64 20  ed.pLock linked 
08a0: 6c 69 73 74 20 75 73 65 64 20 74 6f 20 73 74 6f  list used to sto
08b0: 72 65 0a 20 20 2a 2a 20 73 68 61 72 65 64 2d 63  re.  ** shared-c
08c0: 61 63 68 65 20 74 61 62 6c 65 20 6c 65 76 65 6c  ache table level
08d0: 20 6c 6f 63 6b 73 2e 20 49 66 20 74 68 65 20 6c   locks. If the l
08e0: 69 62 72 61 72 79 20 69 73 20 63 6f 6d 70 69 6c  ibrary is compil
08f0: 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a  ed with the.  **
0900: 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 66 65   shared-cache fe
0910: 61 74 75 72 65 20 64 69 73 61 62 6c 65 64 2c 20  ature disabled, 
0920: 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6f 6e  then there is on
0930: 6c 79 20 65 76 65 72 20 6f 6e 65 20 75 73 65 72  ly ever one user
0940: 0a 20 20 2a 2a 20 6f 66 20 65 61 63 68 20 42 74  .  ** of each Bt
0950: 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72 65  Shared structure
0960: 20 61 6e 64 20 73 6f 20 74 68 69 73 20 6c 6f 63   and so this loc
0970: 6b 69 6e 67 20 69 73 20 6e 6f 74 20 6e 65 63 65  king is not nece
0980: 73 73 61 72 79 2e 20 0a 20 20 2a 2a 20 53 6f 20  ssary. .  ** So 
0990: 64 65 66 69 6e 65 20 74 68 65 20 6c 6f 63 6b 20  define the lock 
09a0: 72 65 6c 61 74 65 64 20 66 75 6e 63 74 69 6f 6e  related function
09b0: 73 20 61 73 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a  s as no-ops..  *
09c0: 2f 0a 20 20 23 64 65 66 69 6e 65 20 71 75 65 72  /.  #define quer
09d0: 79 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c  ySharedCacheTabl
09e0: 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51 4c  eLock(a,b,c) SQL
09f0: 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65  ITE_OK.  #define
0a00: 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54   setSharedCacheT
0a10: 61 62 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20  ableLock(a,b,c) 
0a20: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66  SQLITE_OK.  #def
0a30: 69 6e 65 20 63 6c 65 61 72 41 6c 6c 53 68 61 72  ine clearAllShar
0a40: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
0a50: 73 28 61 29 0a 23 65 6e 64 69 66 0a 0a 23 69 66  s(a).#endif..#if
0a60: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
0a70: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a  _SHARED_CACHE./*
0a80: 0a 2a 2a 20 51 75 65 72 79 20 74 6f 20 73 65 65  .** Query to see
0a90: 20 69 66 20 62 74 72 65 65 20 68 61 6e 64 6c 65   if btree handle
0aa0: 20 70 20 6d 61 79 20 6f 62 74 61 69 6e 20 61 20   p may obtain a 
0ab0: 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 65 4c 6f  lock of type eLo
0ac0: 63 6b 20 0a 2a 2a 20 28 52 45 41 44 5f 4c 4f 43  ck .** (READ_LOC
0ad0: 4b 20 6f 72 20 57 52 49 54 45 5f 4c 4f 43 4b 29  K or WRITE_LOCK)
0ae0: 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69   on the table wi
0af0: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61  th root-page iTa
0b00: 62 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 53 51 4c  b. Return.** SQL
0b10: 49 54 45 5f 4f 4b 20 69 66 20 74 68 65 20 6c 6f  ITE_OK if the lo
0b20: 63 6b 20 6d 61 79 20 62 65 20 6f 62 74 61 69 6e  ck may be obtain
0b30: 65 64 20 28 62 79 20 63 61 6c 6c 69 6e 67 0a 2a  ed (by calling.*
0b40: 2a 20 73 65 74 53 68 61 72 65 64 43 61 63 68 65  * setSharedCache
0b50: 54 61 62 6c 65 4c 6f 63 6b 28 29 29 2c 20 6f 72  TableLock()), or
0b60: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69   SQLITE_LOCKED i
0b70: 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  f not..*/.static
0b80: 20 69 6e 74 20 71 75 65 72 79 53 68 61 72 65 64   int queryShared
0b90: 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 42  CacheTableLock(B
0ba0: 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54  tree *p, Pgno iT
0bb0: 61 62 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20  ab, u8 eLock){. 
0bc0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
0bd0: 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63   p->pBt;.  BtLoc
0be0: 6b 20 2a 70 49 74 65 72 3b 0a 0a 20 20 61 73 73  k *pIter;..  ass
0bf0: 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
0c00: 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
0c10: 3b 0a 20 20 61 73 73 65 72 74 28 20 65 4c 6f 63  ;.  assert( eLoc
0c20: 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20  k==READ_LOCK || 
0c30: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
0c40: 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  K );.  assert( p
0c50: 2d 3e 64 62 21 3d 30 20 29 3b 0a 20 20 0a 20 20  ->db!=0 );.  .  
0c60: 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  /* This is a no-
0c70: 6f 70 20 69 66 20 74 68 65 20 73 68 61 72 65 64  op if the shared
0c80: 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20 65 6e  -cache is not en
0c90: 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28 20 21  abled */.  if( !
0ca0: 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20  p->sharable ){. 
0cb0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
0cc0: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  _OK;.  }..  /* I
0cd0: 66 20 73 6f 6d 65 20 6f 74 68 65 72 20 63 6f 6e  f some other con
0ce0: 6e 65 63 74 69 6f 6e 20 69 73 20 68 6f 6c 64 69  nection is holdi
0cf0: 6e 67 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  ng an exclusive 
0d00: 6c 6f 63 6b 2c 20 74 68 65 0a 20 20 2a 2a 20 72  lock, the.  ** r
0d10: 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 6d 61  equested lock ma
0d20: 79 20 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e 65  y not be obtaine
0d30: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42  d..  */.  if( pB
0d40: 74 2d 3e 70 57 72 69 74 65 72 21 3d 70 20 26 26  t->pWriter!=p &&
0d50: 20 70 42 74 2d 3e 69 73 45 78 63 6c 75 73 69 76   pBt->isExclusiv
0d60: 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
0d70: 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
0d80: 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 57  d(p->db, pBt->pW
0d90: 72 69 74 65 72 2d 3e 64 62 29 3b 0a 20 20 20 20  riter->db);.    
0da0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
0db0: 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
0dc0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73  ;.  }..  /* This
0dd0: 20 28 61 6c 6f 6e 67 20 77 69 74 68 20 73 65 74   (along with set
0de0: 53 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65  SharedCacheTable
0df0: 4c 6f 63 6b 28 29 29 20 69 73 20 77 68 65 72 65  Lock()) is where
0e00: 0a 20 20 2a 2a 20 74 68 65 20 52 65 61 64 55 6e  .  ** the ReadUn
0e10: 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69  committed flag i
0e20: 73 20 64 65 61 6c 74 20 77 69 74 68 2e 0a 20 20  s dealt with..  
0e30: 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72  ** If the caller
0e40: 20 69 73 20 71 75 65 72 79 69 6e 67 20 66 6f 72   is querying for
0e50: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20   a read-lock on 
0e60: 61 6e 79 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f  any table.  ** o
0e70: 74 68 65 72 20 74 68 61 6e 20 74 68 65 20 73 71  ther than the sq
0e80: 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
0e90: 65 20 28 74 61 62 6c 65 20 31 29 20 61 6e 64 20  e (table 1) and 
0ea0: 69 66 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d  if the ReadUncom
0eb0: 6d 69 74 74 65 64 0a 20 20 2a 2a 20 66 6c 61 67  mitted.  ** flag
0ec0: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
0ed0: 65 20 6c 6f 63 6b 20 67 72 61 6e 74 65 64 20 65  e lock granted e
0ee0: 76 65 6e 20 69 66 20 74 68 65 72 65 20 61 72 65  ven if there are
0ef0: 20 77 72 69 74 65 2d 6c 6f 63 6b 73 0a 20 20 2a   write-locks.  *
0f00: 2a 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  * on the table. 
0f10: 49 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  If a write-lock 
0f20: 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
0f30: 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  e ReadUncommitte
0f40: 64 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 6e  d flag.  ** is n
0f50: 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 20  ot considered.. 
0f60: 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 66 75 6e 63   **.  ** In func
0f70: 74 69 6f 6e 20 73 65 74 53 68 61 72 65 64 43 61  tion setSharedCa
0f80: 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29 2c 20  cheTableLock(), 
0f90: 69 66 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  if a read-lock i
0fa0: 73 20 64 65 6d 61 6e 64 65 64 20 61 6e 64 20 74  s demanded and t
0fb0: 68 65 20 0a 20 20 2a 2a 20 52 65 61 64 55 6e 63  he .  ** ReadUnc
0fc0: 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73  ommitted flag is
0fd0: 20 73 65 74 2c 20 6e 6f 20 65 6e 74 72 79 20 69   set, no entry i
0fe0: 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c  s added to the l
0ff0: 6f 63 6b 73 20 6c 69 73 74 20 0a 20 20 2a 2a 20  ocks list .  ** 
1000: 28 42 74 53 68 61 72 65 64 2e 70 4c 6f 63 6b 29  (BtShared.pLock)
1010: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f 20 73  ..  **.  ** To s
1020: 75 6d 6d 61 72 69 7a 65 3a 20 49 66 20 74 68 65  ummarize: If the
1030: 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64   ReadUncommitted
1040: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
1050: 65 6e 20 72 65 61 64 20 63 75 72 73 6f 72 73 0a  en read cursors.
1060: 20 20 2a 2a 20 6f 6e 20 6e 6f 6e 2d 73 63 68 65    ** on non-sche
1070: 6d 61 20 74 61 62 6c 65 73 20 64 6f 20 6e 6f 74  ma tables do not
1080: 20 63 72 65 61 74 65 20 6f 72 20 72 65 73 70 65   create or respe
1090: 63 74 20 74 61 62 6c 65 20 6c 6f 63 6b 73 2e 20  ct table locks. 
10a0: 54 68 65 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a  The locking.  **
10b0: 20 70 72 6f 63 65 64 75 72 65 20 66 6f 72 20 61   procedure for a
10c0: 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20 64 6f   write-cursor do
10d0: 65 73 20 6e 6f 74 20 63 68 61 6e 67 65 2e 0a 20  es not change.. 
10e0: 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20 30   */.  if( .    0
10f0: 3d 3d 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26  ==(p->db->flags&
1100: 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
1110: 6d 69 74 74 65 64 29 20 7c 7c 20 0a 20 20 20 20  mitted) || .    
1120: 65 4c 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43  eLock==WRITE_LOC
1130: 4b 20 7c 7c 0a 20 20 20 20 69 54 61 62 3d 3d 4d  K ||.    iTab==M
1140: 41 53 54 45 52 5f 52 4f 4f 54 0a 20 20 29 7b 0a  ASTER_ROOT.  ){.
1150: 20 20 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42      for(pIter=pB
1160: 74 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b  t->pLock; pIter;
1170: 20 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e   pIter=pIter->pN
1180: 65 78 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ext){.      if( 
1190: 70 49 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70  pIter->pBtree!=p
11a0: 20 26 26 20 70 49 74 65 72 2d 3e 69 54 61 62 6c   && pIter->iTabl
11b0: 65 3d 3d 69 54 61 62 20 26 26 20 0a 20 20 20 20  e==iTab && .    
11c0: 20 20 20 20 20 20 28 70 49 74 65 72 2d 3e 65 4c        (pIter->eL
11d0: 6f 63 6b 21 3d 65 4c 6f 63 6b 20 7c 7c 20 65 4c  ock!=eLock || eL
11e0: 6f 63 6b 21 3d 52 45 41 44 5f 4c 4f 43 4b 29 20  ock!=READ_LOCK) 
11f0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1200: 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63  e3ConnectionBloc
1210: 6b 65 64 28 70 2d 3e 64 62 2c 20 70 49 74 65 72  ked(p->db, pIter
1220: 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29 3b 0a 20  ->pBtree->db);. 
1230: 20 20 20 20 20 20 20 69 66 28 20 65 4c 6f 63 6b         if( eLock
1240: 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 7b 0a  ==WRITE_LOCK ){.
1250: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1260: 28 20 70 3d 3d 70 42 74 2d 3e 70 57 72 69 74 65  ( p==pBt->pWrite
1270: 72 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  r );.          p
1280: 42 74 2d 3e 69 73 50 65 6e 64 69 6e 67 20 3d 20  Bt->isPending = 
1290: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
12a0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
12b0: 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
12c0: 43 41 43 48 45 3b 0a 20 20 20 20 20 20 7d 0a 20  CACHE;.      }. 
12d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
12e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
12f0: 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49 54 45  endif /* !SQLITE
1300: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
1310: 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  HE */..#ifndef S
1320: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
1330: 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20 41 64  D_CACHE./*.** Ad
1340: 64 20 61 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  d a lock on the 
1350: 74 61 62 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d  table with root-
1360: 70 61 67 65 20 69 54 61 62 6c 65 20 74 6f 20 74  page iTable to t
1370: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  he shared-btree 
1380: 75 73 65 64 0a 2a 2a 20 62 79 20 42 74 72 65 65  used.** by Btree
1390: 20 68 61 6e 64 6c 65 20 70 2e 20 50 61 72 61 6d   handle p. Param
13a0: 65 74 65 72 20 65 4c 6f 63 6b 20 6d 75 73 74 20  eter eLock must 
13b0: 62 65 20 65 69 74 68 65 72 20 52 45 41 44 5f 4c  be either READ_L
13c0: 4f 43 4b 20 6f 72 20 0a 2a 2a 20 57 52 49 54 45  OCK or .** WRITE
13d0: 5f 4c 4f 43 4b 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  _LOCK..**.** SQL
13e0: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
13f0: 65 64 20 69 66 20 74 68 65 20 6c 6f 63 6b 20 69  ed if the lock i
1400: 73 20 61 64 64 65 64 20 73 75 63 63 65 73 73 66  s added successf
1410: 75 6c 6c 79 2e 20 53 51 4c 49 54 45 5f 42 55 53  ully. SQLITE_BUS
1420: 59 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f  Y and.** SQLITE_
1430: 4e 4f 4d 45 4d 20 6d 61 79 20 61 6c 73 6f 20 62  NOMEM may also b
1440: 65 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  e returned..*/.s
1450: 74 61 74 69 63 20 69 6e 74 20 73 65 74 53 68 61  tatic int setSha
1460: 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
1470: 6b 28 42 74 72 65 65 20 2a 70 2c 20 50 67 6e 6f  k(Btree *p, Pgno
1480: 20 69 54 61 62 6c 65 2c 20 75 38 20 65 4c 6f 63   iTable, u8 eLoc
1490: 6b 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  k){.  BtShared *
14a0: 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
14b0: 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63 6b 20 3d 20  BtLock *pLock = 
14c0: 30 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70 49 74  0;.  BtLock *pIt
14d0: 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  er;..  assert( s
14e0: 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
14f0: 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
1500: 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52 45 41  sert( eLock==REA
1510: 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63 6b 3d  D_LOCK || eLock=
1520: 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20  =WRITE_LOCK );. 
1530: 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62 21 3d   assert( p->db!=
1540: 30 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  0 );..  /* This 
1550: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
1560: 65 20 73 68 61 72 65 64 2d 63 61 63 68 65 20 69  e shared-cache i
1570: 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 2a 2f  s not enabled */
1580: 0a 20 20 69 66 28 20 21 70 2d 3e 73 68 61 72 61  .  if( !p->shara
1590: 62 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ble ){.    retur
15a0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
15b0: 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ..  assert( SQLI
15c0: 54 45 5f 4f 4b 3d 3d 71 75 65 72 79 53 68 61 72  TE_OK==queryShar
15d0: 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
15e0: 28 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63  (p, iTable, eLoc
15f0: 6b 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  k) );..  /* If t
1600: 68 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74  he read-uncommit
1610: 74 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20  ted flag is set 
1620: 61 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  and a read-lock 
1630: 69 73 20 72 65 71 75 65 73 74 65 64 20 6f 6e 0a  is requested on.
1640: 20 20 2a 2a 20 61 20 6e 6f 6e 2d 73 63 68 65 6d    ** a non-schem
1650: 61 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68  a table, then th
1660: 65 20 6c 6f 63 6b 20 69 73 20 61 6c 77 61 79 73  e lock is always
1670: 20 67 72 61 6e 74 65 64 2e 20 20 52 65 74 75 72   granted.  Retur
1680: 6e 20 65 61 72 6c 79 0a 20 20 2a 2a 20 77 69 74  n early.  ** wit
1690: 68 6f 75 74 20 61 64 64 69 6e 67 20 61 6e 20 65  hout adding an e
16a0: 6e 74 72 79 20 74 6f 20 74 68 65 20 42 74 53 68  ntry to the BtSh
16b0: 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 73 74 2e  ared.pLock list.
16c0: 20 53 65 65 0a 20 20 2a 2a 20 63 6f 6d 6d 65 6e   See.  ** commen
16d0: 74 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 71 75  t in function qu
16e0: 65 72 79 53 68 61 72 65 64 43 61 63 68 65 54 61  erySharedCacheTa
16f0: 62 6c 65 4c 6f 63 6b 28 29 20 66 6f 72 20 6d 6f  bleLock() for mo
1700: 72 65 20 69 6e 66 6f 0a 20 20 2a 2a 20 6f 6e 20  re info.  ** on 
1710: 68 61 6e 64 6c 69 6e 67 20 74 68 65 20 52 65 61  handling the Rea
1720: 64 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61  dUncommitted fla
1730: 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 0a 20  g..  */.  if( . 
1740: 20 20 20 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73     (p->db->flags
1750: 26 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f  &SQLITE_ReadUnco
1760: 6d 6d 69 74 74 65 64 29 20 26 26 20 0a 20 20 20  mmitted) && .   
1770: 20 28 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f   (eLock==READ_LO
1780: 43 4b 29 20 26 26 0a 20 20 20 20 69 54 61 62 6c  CK) &&.    iTabl
1790: 65 21 3d 4d 41 53 54 45 52 5f 52 4f 4f 54 0a 20  e!=MASTER_ROOT. 
17a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
17b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
17c0: 20 2f 2a 20 46 69 72 73 74 20 73 65 61 72 63 68   /* First search
17d0: 20 74 68 65 20 6c 69 73 74 20 66 6f 72 20 61 6e   the list for an
17e0: 20 65 78 69 73 74 69 6e 67 20 6c 6f 63 6b 20 6f   existing lock o
17f0: 6e 20 74 68 69 73 20 74 61 62 6c 65 2e 20 2a 2f  n this table. */
1800: 0a 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74  .  for(pIter=pBt
1810: 2d 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20  ->pLock; pIter; 
1820: 70 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65  pIter=pIter->pNe
1830: 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74  xt){.    if( pIt
1840: 65 72 2d 3e 69 54 61 62 6c 65 3d 3d 69 54 61 62  er->iTable==iTab
1850: 6c 65 20 26 26 20 70 49 74 65 72 2d 3e 70 42 74  le && pIter->pBt
1860: 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree==p ){.      
1870: 70 4c 6f 63 6b 20 3d 20 70 49 74 65 72 3b 0a 20  pLock = pIter;. 
1880: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1890: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
18a0: 68 65 20 61 62 6f 76 65 20 73 65 61 72 63 68 20  he above search 
18b0: 64 69 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 42  did not find a B
18c0: 74 4c 6f 63 6b 20 73 74 72 75 63 74 20 61 73 73  tLock struct ass
18d0: 6f 63 69 61 74 69 6e 67 20 42 74 72 65 65 20 70  ociating Btree p
18e0: 0a 20 20 2a 2a 20 77 69 74 68 20 74 61 62 6c 65  .  ** with table
18f0: 20 69 54 61 62 6c 65 2c 20 61 6c 6c 6f 63 61 74   iTable, allocat
1900: 65 20 6f 6e 65 20 61 6e 64 20 6c 69 6e 6b 20 69  e one and link i
1910: 74 20 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e  t into the list.
1920: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70 4c 6f  .  */.  if( !pLo
1930: 63 6b 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 20  ck ){.    pLock 
1940: 3d 20 28 42 74 4c 6f 63 6b 20 2a 29 73 71 6c 69  = (BtLock *)sqli
1950: 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69  te3MallocZero(si
1960: 7a 65 6f 66 28 42 74 4c 6f 63 6b 29 29 3b 0a 20  zeof(BtLock));. 
1970: 20 20 20 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b     if( !pLock ){
1980: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1990: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
19a0: 7d 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 69 54 61  }.    pLock->iTa
19b0: 62 6c 65 20 3d 20 69 54 61 62 6c 65 3b 0a 20 20  ble = iTable;.  
19c0: 20 20 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20    pLock->pBtree 
19d0: 3d 20 70 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e  = p;.    pLock->
19e0: 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4c 6f  pNext = pBt->pLo
19f0: 63 6b 3b 0a 20 20 20 20 70 42 74 2d 3e 70 4c 6f  ck;.    pBt->pLo
1a00: 63 6b 20 3d 20 70 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = pLock;.  }.
1a10: 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 42 74  .  /* Set the Bt
1a20: 4c 6f 63 6b 2e 65 4c 6f 63 6b 20 76 61 72 69 61  Lock.eLock varia
1a30: 62 6c 65 20 74 6f 20 74 68 65 20 6d 61 78 69 6d  ble to the maxim
1a40: 75 6d 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  um of the curren
1a50: 74 20 6c 6f 63 6b 0a 20 20 2a 2a 20 61 6e 64 20  t lock.  ** and 
1a60: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 6c 6f  the requested lo
1a70: 63 6b 2e 20 54 68 69 73 20 6d 65 61 6e 73 20 69  ck. This means i
1a80: 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 77  f a write-lock w
1a90: 61 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 0a  as already held.
1aa0: 20 20 2a 2a 20 61 6e 64 20 61 20 72 65 61 64 2d    ** and a read-
1ab0: 6c 6f 63 6b 20 72 65 71 75 65 73 74 65 64 2c 20  lock requested, 
1ac0: 77 65 20 64 6f 6e 27 74 20 69 6e 63 6f 72 72 65  we don't incorre
1ad0: 63 74 6c 79 20 64 6f 77 6e 67 72 61 64 65 20 74  ctly downgrade t
1ae0: 68 65 20 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20  he lock..  */.  
1af0: 61 73 73 65 72 74 28 20 57 52 49 54 45 5f 4c 4f  assert( WRITE_LO
1b00: 43 4b 3e 52 45 41 44 5f 4c 4f 43 4b 20 29 3b 0a  CK>READ_LOCK );.
1b10: 20 20 69 66 28 20 65 4c 6f 63 6b 3e 70 4c 6f 63    if( eLock>pLoc
1b20: 6b 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  k->eLock ){.    
1b30: 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b 20 3d 20 65  pLock->eLock = e
1b40: 4c 6f 63 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  Lock;.  }..  ret
1b50: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1b60: 0a 23 65 6e 64 69 66 20 2f 2a 20 21 53 51 4c 49  .#endif /* !SQLI
1b70: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
1b80: 41 43 48 45 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  ACHE */..#ifndef
1b90: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41   SQLITE_OMIT_SHA
1ba0: 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a 2a 2a 20  RED_CACHE./*.** 
1bb0: 52 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 20  Release all the 
1bc0: 74 61 62 6c 65 20 6c 6f 63 6b 73 20 28 6c 6f 63  table locks (loc
1bd0: 6b 73 20 6f 62 74 61 69 6e 65 64 20 76 69 61 20  ks obtained via 
1be0: 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 74 68 65 20  calls to.** the 
1bf0: 73 65 74 53 68 61 72 65 64 43 61 63 68 65 54 61  setSharedCacheTa
1c00: 62 6c 65 4c 6f 63 6b 28 29 20 70 72 6f 63 65 64  bleLock() proced
1c10: 75 72 65 29 20 68 65 6c 64 20 62 79 20 42 74 72  ure) held by Btr
1c20: 65 65 20 68 61 6e 64 6c 65 20 70 2e 0a 2a 2f 0a  ee handle p..*/.
1c30: 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61  static void clea
1c40: 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  rAllSharedCacheT
1c50: 61 62 6c 65 4c 6f 63 6b 73 28 42 74 72 65 65 20  ableLocks(Btree 
1c60: 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  *p){.  BtShared 
1c70: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
1c80: 20 42 74 4c 6f 63 6b 20 2a 2a 70 70 49 74 65 72   BtLock **ppIter
1c90: 20 3d 20 26 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a   = &pBt->pLock;.
1ca0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
1cb0: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
1cc0: 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
1cd0: 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c 7c  ( p->sharable ||
1ce0: 20 30 3d 3d 2a 70 70 49 74 65 72 20 29 3b 0a 0a   0==*ppIter );..
1cf0: 20 20 77 68 69 6c 65 28 20 2a 70 70 49 74 65 72    while( *ppIter
1d00: 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a   ){.    BtLock *
1d10: 70 4c 6f 63 6b 20 3d 20 2a 70 70 49 74 65 72 3b  pLock = *ppIter;
1d20: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
1d30: 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 3d 3d 30  ->isExclusive==0
1d40: 20 7c 7c 20 70 42 74 2d 3e 70 57 72 69 74 65 72   || pBt->pWriter
1d50: 3d 3d 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20  ==pLock->pBtree 
1d60: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b  );.    if( pLock
1d70: 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20  ->pBtree==p ){. 
1d80: 20 20 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70       *ppIter = p
1d90: 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  Lock->pNext;.   
1da0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1db0: 70 4c 6f 63 6b 29 3b 0a 20 20 20 20 7d 65 6c 73  pLock);.    }els
1dc0: 65 7b 0a 20 20 20 20 20 20 70 70 49 74 65 72 20  e{.      ppIter 
1dd0: 3d 20 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b  = &pLock->pNext;
1de0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73  .    }.  }..  as
1df0: 73 65 72 74 28 20 70 42 74 2d 3e 69 73 50 65 6e  sert( pBt->isPen
1e00: 64 69 6e 67 3d 3d 30 20 7c 7c 20 70 42 74 2d 3e  ding==0 || pBt->
1e10: 70 57 72 69 74 65 72 20 29 3b 0a 20 20 69 66 28  pWriter );.  if(
1e20: 20 70 42 74 2d 3e 70 57 72 69 74 65 72 3d 3d 70   pBt->pWriter==p
1e30: 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70 57 72   ){.    pBt->pWr
1e40: 69 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 70 42  iter = 0;.    pB
1e50: 74 2d 3e 69 73 45 78 63 6c 75 73 69 76 65 20 3d  t->isExclusive =
1e60: 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 69 73 50   0;.    pBt->isP
1e70: 65 6e 64 69 6e 67 20 3d 20 30 3b 0a 20 20 7d 65  ending = 0;.  }e
1e80: 6c 73 65 20 69 66 28 20 70 42 74 2d 3e 6e 54 72  lse if( pBt->nTr
1e90: 61 6e 73 61 63 74 69 6f 6e 3d 3d 32 20 29 7b 0a  ansaction==2 ){.
1ea0: 20 20 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63      /* This func
1eb0: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
1ec0: 68 65 6e 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70  hen connection p
1ed0: 20 69 73 20 63 6f 6e 63 6c 75 64 69 6e 67 20 69   is concluding i
1ee0: 74 73 20 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  ts .    ** trans
1ef0: 61 63 74 69 6f 6e 2e 20 49 66 20 74 68 65 72 65  action. If there
1f00: 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69 73 74   currently exist
1f10: 73 20 61 20 77 72 69 74 65 72 2c 20 61 6e 64 20  s a writer, and 
1f20: 70 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a 20  p is not.    ** 
1f30: 74 68 61 74 20 77 72 69 74 65 72 2c 20 74 68 65  that writer, the
1f40: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1f50: 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 20 63 6f  locks held by co
1f60: 6e 6e 65 63 74 69 6f 6e 73 20 6f 74 68 65 72 0a  nnections other.
1f70: 20 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 20      ** than the 
1f80: 77 72 69 74 65 72 20 6d 75 73 74 20 62 65 20 61  writer must be a
1f90: 62 6f 75 74 20 74 6f 20 64 72 6f 70 20 74 6f 20  bout to drop to 
1fa0: 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61  zero. In this ca
1fb0: 73 65 0a 20 20 20 20 2a 2a 20 73 65 74 20 74 68  se.    ** set th
1fc0: 65 20 69 73 50 65 6e 64 69 6e 67 20 66 6c 61 67  e isPending flag
1fd0: 20 74 6f 20 30 2e 0a 20 20 20 20 2a 2a 0a 20 20   to 0..    **.  
1fe0: 20 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73    ** If there is
1ff0: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 61   not currently a
2000: 20 77 72 69 74 65 72 2c 20 74 68 65 6e 20 42 74   writer, then Bt
2010: 53 68 61 72 65 64 2e 69 73 50 65 6e 64 69 6e 67  Shared.isPending
2020: 20 6d 75 73 74 0a 20 20 20 20 2a 2a 20 62 65 20   must.    ** be 
2030: 7a 65 72 6f 20 61 6c 72 65 61 64 79 2e 20 53 6f  zero already. So
2040: 20 74 68 69 73 20 6e 65 78 74 20 6c 69 6e 65 20   this next line 
2050: 69 73 20 68 61 72 6d 6c 65 73 73 20 69 6e 20 74  is harmless in t
2060: 68 61 74 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f  hat case..    */
2070: 0a 20 20 20 20 70 42 74 2d 3e 69 73 50 65 6e 64  .    pBt->isPend
2080: 69 6e 67 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 23  ing = 0;.  }.}.#
2090: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
20a0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
20b0: 45 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69  E */..static voi
20c0: 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d 65  d releasePage(Me
20d0: 6d 50 61 67 65 20 2a 70 50 61 67 65 29 3b 20 20  mPage *pPage);  
20e0: 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
20f0: 65 6e 63 65 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 56  ence */../*.** V
2100: 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 63  erify that the c
2110: 75 72 73 6f 72 20 68 6f 6c 64 73 20 61 20 6d 75  ursor holds a mu
2120: 74 65 78 20 6f 6e 20 74 68 65 20 42 74 53 68 61  tex on the BtSha
2130: 72 65 64 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  red.*/.#ifndef N
2140: 44 45 42 55 47 0a 73 74 61 74 69 63 20 69 6e 74  DEBUG.static int
2150: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
2160: 78 28 42 74 43 75 72 73 6f 72 20 2a 70 29 7b 0a  x(BtCursor *p){.
2170: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
2180: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 70  _mutex_held(p->p
2190: 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65  Bt->mutex);.}.#e
21a0: 6e 64 69 66 0a 0a 0a 23 69 66 6e 64 65 66 20 53  ndif...#ifndef S
21b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
21c0: 4c 4f 42 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69  LOB./*.** Invali
21d0: 64 61 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f  date the overflo
21e0: 77 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68  w page-list cach
21f0: 65 20 66 6f 72 20 63 75 72 73 6f 72 20 70 43 75  e for cursor pCu
2200: 72 2c 20 69 66 20 61 6e 79 2e 0a 2a 2f 0a 73 74  r, if any..*/.st
2210: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
2220: 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61 63 68  dateOverflowCach
2230: 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
2240: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
2250: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
2260: 75 72 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ur) );.  sqlite3
2270: 5f 66 72 65 65 28 70 43 75 72 2d 3e 61 4f 76 65  _free(pCur->aOve
2280: 72 66 6c 6f 77 29 3b 0a 20 20 70 43 75 72 2d 3e  rflow);.  pCur->
2290: 61 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 7d  aOverflow = 0;.}
22a0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61  ../*.** Invalida
22b0: 74 65 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20  te the overflow 
22c0: 70 61 67 65 2d 6c 69 73 74 20 63 61 63 68 65 20  page-list cache 
22d0: 66 6f 72 20 61 6c 6c 20 63 75 72 73 6f 72 73 20  for all cursors 
22e0: 6f 70 65 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65  opened.** on the
22f0: 20 73 68 61 72 65 64 20 62 74 72 65 65 20 73 74   shared btree st
2300: 72 75 63 74 75 72 65 20 70 42 74 2e 0a 2a 2f 0a  ructure pBt..*/.
2310: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61  static void inva
2320: 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
2330: 77 43 61 63 68 65 28 42 74 53 68 61 72 65 64 20  wCache(BtShared 
2340: 2a 70 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f  *pBt){.  BtCurso
2350: 72 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  r *p;.  assert( 
2360: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2370: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
2380: 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70  ;.  for(p=pBt->p
2390: 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
23a0: 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 76 61  pNext){.    inva
23b0: 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43 61  lidateOverflowCa
23c0: 63 68 65 28 70 29 3b 0a 20 20 7d 0a 7d 0a 23 65  che(p);.  }.}.#e
23d0: 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 69 6e  lse.  #define in
23e0: 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77  validateOverflow
23f0: 43 61 63 68 65 28 78 29 0a 20 20 23 64 65 66 69  Cache(x).  #defi
2400: 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c  ne invalidateAll
2410: 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 78 29  OverflowCache(x)
2420: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53  .#endif../*.** S
2430: 65 74 20 62 69 74 20 70 67 6e 6f 20 6f 66 20 74  et bit pgno of t
2440: 68 65 20 42 74 53 68 61 72 65 64 2e 70 48 61 73  he BtShared.pHas
2450: 43 6f 6e 74 65 6e 74 20 62 69 74 76 65 63 2e 20  Content bitvec. 
2460: 54 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 0a  This is called .
2470: 2a 2a 20 77 68 65 6e 20 61 20 70 61 67 65 20 74  ** when a page t
2480: 68 61 74 20 70 72 65 76 69 6f 75 73 6c 79 20 63  hat previously c
2490: 6f 6e 74 61 69 6e 65 64 20 64 61 74 61 20 62 65  ontained data be
24a0: 63 6f 6d 65 73 20 61 20 66 72 65 65 2d 6c 69 73  comes a free-lis
24b0: 74 20 6c 65 61 66 20 0a 2a 2a 20 70 61 67 65 2e  t leaf .** page.
24c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 42 74 53 68 61  .**.** The BtSha
24d0: 72 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20  red.pHasContent 
24e0: 62 69 74 76 65 63 20 65 78 69 73 74 73 20 74 6f  bitvec exists to
24f0: 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20 61 6e 20   work around an 
2500: 6f 62 73 63 75 72 65 0a 2a 2a 20 62 75 67 20 63  obscure.** bug c
2510: 61 75 73 65 64 20 62 79 20 74 68 65 20 69 6e 74  aused by the int
2520: 65 72 61 63 74 69 6f 6e 20 6f 66 20 74 77 6f 20  eraction of two 
2530: 75 73 65 66 75 6c 20 49 4f 20 6f 70 74 69 6d 69  useful IO optimi
2540: 7a 61 74 69 6f 6e 73 20 73 75 72 72 6f 75 6e 64  zations surround
2550: 69 6e 67 0a 2a 2a 20 66 72 65 65 2d 6c 69 73 74  ing.** free-list
2560: 20 6c 65 61 66 20 70 61 67 65 73 3a 0a 2a 2a 0a   leaf pages:.**.
2570: 2a 2a 20 20 20 31 29 20 57 68 65 6e 20 61 6c 6c  **   1) When all
2580: 20 64 61 74 61 20 69 73 20 64 65 6c 65 74 65 64   data is deleted
2590: 20 66 72 6f 6d 20 61 20 70 61 67 65 20 61 6e 64   from a page and
25a0: 20 74 68 65 20 70 61 67 65 20 62 65 63 6f 6d 65   the page become
25b0: 73 0a 2a 2a 20 20 20 20 20 20 61 20 66 72 65 65  s.**      a free
25c0: 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 2c  -list leaf page,
25d0: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
25e0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
25f0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
2600: 20 28 61 73 20 66 72 65 65 2d 6c 69 73 74 20 6c   (as free-list l
2610: 65 61 66 20 70 61 67 65 73 20 63 6f 6e 74 61 69  eaf pages contai
2620: 6e 20 6e 6f 20 6d 65 61 6e 69 6e 67 66 75 6c 20  n no meaningful 
2630: 64 61 74 61 29 2e 20 53 6f 6d 65 74 69 6d 65 73  data). Sometimes
2640: 0a 2a 2a 20 20 20 20 20 20 73 75 63 68 20 61 20  .**      such a 
2650: 70 61 67 65 20 69 73 20 6e 6f 74 20 65 76 65 6e  page is not even
2660: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 28 61 73 20   journalled (as 
2670: 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 6d  it will not be m
2680: 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 20 20 20 20  odified,.**     
2690: 20 77 68 79 20 62 6f 74 68 65 72 20 6a 6f 75 72   why bother jour
26a0: 6e 61 6c 6c 69 6e 67 20 69 74 3f 29 2e 0a 2a 2a  nalling it?)..**
26b0: 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 61 20  .**   2) When a 
26c0: 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70  free-list leaf p
26d0: 61 67 65 20 69 73 20 72 65 75 73 65 64 2c 20 69  age is reused, i
26e0: 74 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e 6f  ts content is no
26f0: 74 20 72 65 61 64 0a 2a 2a 20 20 20 20 20 20 66  t read.**      f
2700: 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
2710: 20 6f 72 20 77 72 69 74 74 65 6e 20 74 6f 20 74   or written to t
2720: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2730: 28 77 68 79 20 73 68 6f 75 6c 64 20 69 74 0a 2a  (why should it.*
2740: 2a 20 20 20 20 20 20 62 65 2c 20 69 66 20 69 74  *      be, if it
2750: 20 69 73 20 6e 6f 74 20 61 74 20 61 6c 6c 20 6d   is not at all m
2760: 65 61 6e 69 6e 67 66 75 6c 3f 29 2e 0a 2a 2a 0a  eaningful?)..**.
2770: 2a 2a 20 42 79 20 74 68 65 6d 73 65 6c 76 65 73  ** By themselves
2780: 2c 20 74 68 65 73 65 20 6f 70 74 69 6d 69 7a 61  , these optimiza
2790: 74 69 6f 6e 73 20 77 6f 72 6b 20 66 69 6e 65 20  tions work fine 
27a0: 61 6e 64 20 70 72 6f 76 69 64 65 20 61 20 68 61  and provide a ha
27b0: 6e 64 79 0a 2a 2a 20 70 65 72 66 6f 72 6d 61 6e  ndy.** performan
27c0: 63 65 20 62 6f 6f 73 74 20 74 6f 20 62 75 6c 6b  ce boost to bulk
27d0: 20 64 65 6c 65 74 65 20 6f 72 20 69 6e 73 65 72   delete or inser
27e0: 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 48 6f  t operations. Ho
27f0: 77 65 76 65 72 2c 20 69 66 0a 2a 2a 20 61 20 70  wever, if.** a p
2800: 61 67 65 20 69 73 20 6d 6f 76 65 64 20 74 6f 20  age is moved to 
2810: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
2820: 64 20 74 68 65 6e 20 72 65 75 73 65 64 20 77 69  d then reused wi
2830: 74 68 69 6e 20 74 68 65 20 73 61 6d 65 0a 2a 2a  thin the same.**
2840: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 20   transaction, a 
2850: 70 72 6f 62 6c 65 6d 20 63 6f 6d 65 73 20 75 70  problem comes up
2860: 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  . If the page is
2870: 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c 65 64 20   not journalled 
2880: 77 68 65 6e 0a 2a 2a 20 69 74 20 69 73 20 6d 6f  when.** it is mo
2890: 76 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 2d  ved to the free-
28a0: 6c 69 73 74 20 61 6e 64 20 69 74 20 69 73 20 61  list and it is a
28b0: 6c 73 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 6c  lso not journall
28c0: 65 64 20 77 68 65 6e 20 69 74 0a 2a 2a 20 69 73  ed when it.** is
28d0: 20 65 78 74 72 61 63 74 65 64 20 66 72 6f 6d 20   extracted from 
28e0: 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20 61 6e  the free-list an
28f0: 64 20 72 65 75 73 65 64 2c 20 74 68 65 6e 20 74  d reused, then t
2900: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
2910: 0a 2a 2a 20 6d 61 79 20 62 65 20 6c 6f 73 74 2e  .** may be lost.
2920: 20 49 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66   In the event of
2930: 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 69 74 20   a rollback, it 
2940: 6d 61 79 20 6e 6f 74 20 62 65 20 70 6f 73 73 69  may not be possi
2950: 62 6c 65 0a 2a 2a 20 74 6f 20 72 65 73 74 6f 72  ble.** to restor
2960: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  e the database t
2970: 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63  o its original c
2980: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 2e 0a 2a 2a  onfiguration..**
2990: 0a 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e  .** The solution
29a0: 20 69 73 20 74 68 65 20 42 74 53 68 61 72 65 64   is the BtShared
29b0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
29c0: 76 65 63 2e 20 57 68 65 6e 65 76 65 72 20 61 20  vec. Whenever a 
29d0: 70 61 67 65 20 69 73 20 0a 2a 2a 20 6d 6f 76 65  page is .** move
29e0: 64 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 66 72  d to become a fr
29f0: 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67  ee-list leaf pag
2a00: 65 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  e, the correspon
2a10: 64 69 6e 67 20 62 69 74 20 69 73 0a 2a 2a 20 73  ding bit is.** s
2a20: 65 74 20 69 6e 20 74 68 65 20 62 69 74 76 65 63  et in the bitvec
2a30: 2e 20 57 68 65 6e 65 76 65 72 20 61 20 6c 65 61  . Whenever a lea
2a40: 66 20 70 61 67 65 20 69 73 20 65 78 74 72 61 63  f page is extrac
2a50: 74 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ted from the fre
2a60: 65 2d 6c 69 73 74 2c 0a 2a 2a 20 6f 70 74 69 6d  e-list,.** optim
2a70: 69 7a 61 74 69 6f 6e 20 32 20 61 62 6f 76 65 20  ization 2 above 
2a80: 69 73 20 6f 6d 6d 69 74 74 65 64 20 69 66 20 74  is ommitted if t
2a90: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
2aa0: 20 62 69 74 20 69 73 20 61 6c 72 65 61 64 79 0a   bit is already.
2ab0: 2a 2a 20 73 65 74 20 69 6e 20 42 74 53 68 61 72  ** set in BtShar
2ac0: 65 64 2e 70 48 61 73 43 6f 6e 74 65 6e 74 2e 20  ed.pHasContent. 
2ad0: 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  The contents of 
2ae0: 74 68 65 20 62 69 74 76 65 63 20 61 72 65 20 63  the bitvec are c
2af0: 6c 65 61 72 65 64 0a 2a 2a 20 61 74 20 74 68 65  leared.** at the
2b00: 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 74 72   end of every tr
2b10: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ansaction..*/.st
2b20: 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 53 65  atic int btreeSe
2b30: 74 48 61 73 43 6f 6e 74 65 6e 74 28 42 74 53 68  tHasContent(BtSh
2b40: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
2b50: 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 20  pgno){.  int rc 
2b60: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
2b70: 66 28 20 21 70 42 74 2d 3e 70 48 61 73 43 6f 6e  f( !pBt->pHasCon
2b80: 74 65 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  tent ){.    int 
2b90: 6e 50 61 67 65 3b 0a 20 20 20 20 72 63 20 3d 20  nPage;.    rc = 
2ba0: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
2bb0: 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  count(pBt->pPage
2bc0: 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20 20 20  r, &nPage);.    
2bd0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2be0: 4b 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  K ){.      pBt->
2bf0: 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 73 71  pHasContent = sq
2c00: 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
2c10: 65 28 28 75 33 32 29 6e 50 61 67 65 29 3b 0a 20  e((u32)nPage);. 
2c20: 20 20 20 20 20 69 66 28 20 21 70 42 74 2d 3e 70       if( !pBt->p
2c30: 48 61 73 43 6f 6e 74 65 6e 74 20 29 7b 0a 20 20  HasContent ){.  
2c40: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
2c50: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
2c60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
2c70: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2c80: 26 20 70 67 6e 6f 3c 3d 73 71 6c 69 74 65 33 42  & pgno<=sqlite3B
2c90: 69 74 76 65 63 53 69 7a 65 28 70 42 74 2d 3e 70  itvecSize(pBt->p
2ca0: 48 61 73 43 6f 6e 74 65 6e 74 29 20 29 7b 0a 20  HasContent) ){. 
2cb0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
2cc0: 69 74 76 65 63 53 65 74 28 70 42 74 2d 3e 70 48  itvecSet(pBt->pH
2cd0: 61 73 43 6f 6e 74 65 6e 74 2c 20 70 67 6e 6f 29  asContent, pgno)
2ce0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2cf0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 51 75 65 72  c;.}../*.** Quer
2d00: 79 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  y the BtShared.p
2d10: 48 61 73 43 6f 6e 74 65 6e 74 20 76 65 63 74 6f  HasContent vecto
2d20: 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  r..**.** This fu
2d30: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2d40: 20 77 68 65 6e 20 61 20 66 72 65 65 2d 6c 69 73   when a free-lis
2d50: 74 20 6c 65 61 66 20 70 61 67 65 20 69 73 20 72  t leaf page is r
2d60: 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 0a  emoved from the.
2d70: 2a 2a 20 66 72 65 65 2d 6c 69 73 74 20 66 6f 72  ** free-list for
2d80: 20 72 65 75 73 65 2e 20 49 74 20 72 65 74 75 72   reuse. It retur
2d90: 6e 73 20 66 61 6c 73 65 20 69 66 20 69 74 20 69  ns false if it i
2da0: 73 20 73 61 66 65 20 74 6f 20 72 65 74 72 69 65  s safe to retrie
2db0: 76 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 66  ve the.** page f
2dc0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
2dd0: 79 65 72 20 77 69 74 68 20 74 68 65 20 27 6e 6f  yer with the 'no
2de0: 2d 63 6f 6e 74 65 6e 74 27 20 66 6c 61 67 20 73  -content' flag s
2df0: 65 74 2e 20 54 72 75 65 20 6f 74 68 65 72 77 69  et. True otherwi
2e00: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  se..*/.static in
2e10: 74 20 62 74 72 65 65 47 65 74 48 61 73 43 6f 6e  t btreeGetHasCon
2e20: 74 65 6e 74 28 42 74 53 68 61 72 65 64 20 2a 70  tent(BtShared *p
2e30: 42 74 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  Bt, Pgno pgno){.
2e40: 20 20 42 69 74 76 65 63 20 2a 70 20 3d 20 70 42    Bitvec *p = pB
2e50: 74 2d 3e 70 48 61 73 43 6f 6e 74 65 6e 74 3b 0a  t->pHasContent;.
2e60: 20 20 72 65 74 75 72 6e 20 28 70 20 26 26 20 28    return (p && (
2e70: 70 67 6e 6f 3e 73 71 6c 69 74 65 33 42 69 74 76  pgno>sqlite3Bitv
2e80: 65 63 53 69 7a 65 28 70 29 20 7c 7c 20 73 71 6c  ecSize(p) || sql
2e90: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
2ea0: 2c 20 70 67 6e 6f 29 29 29 3b 0a 7d 0a 0a 2f 2a  , pgno)));.}../*
2eb0: 0a 2a 2a 20 43 6c 65 61 72 20 28 64 65 73 74 72  .** Clear (destr
2ec0: 6f 79 29 20 74 68 65 20 42 74 53 68 61 72 65 64  oy) the BtShared
2ed0: 2e 70 48 61 73 43 6f 6e 74 65 6e 74 20 62 69 74  .pHasContent bit
2ee0: 76 65 63 2e 20 54 68 69 73 20 73 68 6f 75 6c 64  vec. This should
2ef0: 20 62 65 0a 2a 2a 20 69 6e 76 6f 6b 65 64 20 61   be.** invoked a
2f00: 74 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e  t the conclusion
2f10: 20 6f 66 20 65 61 63 68 20 77 72 69 74 65 2d 74   of each write-t
2f20: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  ransaction..*/.s
2f30: 74 61 74 69 63 20 76 6f 69 64 20 62 74 72 65 65  tatic void btree
2f40: 43 6c 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28  ClearHasContent(
2f50: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
2f60: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
2f70: 65 73 74 72 6f 79 28 70 42 74 2d 3e 70 48 61 73  estroy(pBt->pHas
2f80: 43 6f 6e 74 65 6e 74 29 3b 0a 20 20 70 42 74 2d  Content);.  pBt-
2f90: 3e 70 48 61 73 43 6f 6e 74 65 6e 74 20 3d 20 30  >pHasContent = 0
2fa0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65 20  ;.}../*.** Save 
2fb0: 74 68 65 20 63 75 72 72 65 6e 74 20 63 75 72 73  the current curs
2fc0: 6f 72 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 74  or position in t
2fd0: 68 65 20 76 61 72 69 61 62 6c 65 73 20 42 74 43  he variables BtC
2fe0: 75 72 73 6f 72 2e 6e 4b 65 79 20 0a 2a 2a 20 61  ursor.nKey .** a
2ff0: 6e 64 20 42 74 43 75 72 73 6f 72 2e 70 4b 65 79  nd BtCursor.pKey
3000: 2e 20 54 68 65 20 63 75 72 73 6f 72 27 73 20 73  . The cursor's s
3010: 74 61 74 65 20 69 73 20 73 65 74 20 74 6f 20 43  tate is set to C
3020: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
3030: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
3040: 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74   saveCursorPosit
3050: 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ion(BtCursor *pC
3060: 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ur){.  int rc;..
3070: 20 20 61 73 73 65 72 74 28 20 43 55 52 53 4f 52    assert( CURSOR
3080: 5f 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53  _VALID==pCur->eS
3090: 74 61 74 65 20 29 3b 0a 20 20 61 73 73 65 72 74  tate );.  assert
30a0: 28 20 30 3d 3d 70 43 75 72 2d 3e 70 4b 65 79 20  ( 0==pCur->pKey 
30b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  );.  assert( cur
30c0: 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
30d0: 75 72 29 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73  ur) );..  rc = s
30e0: 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79 53 69  qlite3BtreeKeySi
30f0: 7a 65 28 70 43 75 72 2c 20 26 70 43 75 72 2d 3e  ze(pCur, &pCur->
3100: 6e 4b 65 79 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  nKey);..  /* If 
3110: 74 68 69 73 20 69 73 20 61 6e 20 69 6e 74 4b 65  this is an intKe
3120: 79 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 74 68  y table, then th
3130: 65 20 61 62 6f 76 65 20 63 61 6c 6c 20 74 6f 20  e above call to 
3140: 42 74 72 65 65 4b 65 79 53 69 7a 65 28 29 0a 20  BtreeKeySize(). 
3150: 20 2a 2a 20 73 74 6f 72 65 73 20 74 68 65 20 69   ** stores the i
3160: 6e 74 65 67 65 72 20 6b 65 79 20 69 6e 20 70 43  nteger key in pC
3170: 75 72 2d 3e 6e 4b 65 79 2e 20 49 6e 20 74 68 69  ur->nKey. In thi
3180: 73 20 63 61 73 65 20 74 68 69 73 20 76 61 6c 75  s case this valu
3190: 65 20 69 73 0a 20 20 2a 2a 20 61 6c 6c 20 74 68  e is.  ** all th
31a0: 61 74 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  at is required. 
31b0: 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 70 43  Otherwise, if pC
31c0: 75 72 20 69 73 20 6e 6f 74 20 6f 70 65 6e 20 6f  ur is not open o
31d0: 6e 20 61 6e 20 69 6e 74 4b 65 79 0a 20 20 2a 2a  n an intKey.  **
31e0: 20 74 61 62 6c 65 2c 20 74 68 65 6e 20 6d 61 6c   table, then mal
31f0: 6c 6f 63 20 73 70 61 63 65 20 66 6f 72 20 61 6e  loc space for an
3200: 64 20 73 74 6f 72 65 20 74 68 65 20 70 43 75 72  d store the pCur
3210: 2d 3e 6e 4b 65 79 20 62 79 74 65 73 20 6f 66 20  ->nKey bytes of 
3220: 6b 65 79 20 0a 20 20 2a 2a 20 64 61 74 61 2e 0a  key .  ** data..
3230: 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
3240: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 70  QLITE_OK && 0==p
3250: 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
3260: 69 6e 74 4b 65 79 29 7b 0a 20 20 20 20 76 6f 69  intKey){.    voi
3270: 64 20 2a 70 4b 65 79 20 3d 20 73 71 6c 69 74 65  d *pKey = sqlite
3280: 33 4d 61 6c 6c 6f 63 28 20 28 69 6e 74 29 70 43  3Malloc( (int)pC
3290: 75 72 2d 3e 6e 4b 65 79 20 29 3b 0a 20 20 20 20  ur->nKey );.    
32a0: 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20  if( pKey ){.    
32b0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
32c0: 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20  reeKey(pCur, 0, 
32d0: 28 69 6e 74 29 70 43 75 72 2d 3e 6e 4b 65 79 2c  (int)pCur->nKey,
32e0: 20 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66   pKey);.      if
32f0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
3300: 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
3310: 3e 70 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20  >pKey = pKey;.  
3320: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
3330: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3340: 70 4b 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pKey);.      }. 
3350: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
3360: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
3370: 4d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  M;.    }.  }.  a
3380: 73 73 65 72 74 28 20 21 70 43 75 72 2d 3e 61 70  ssert( !pCur->ap
3390: 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20  Page[0]->intKey 
33a0: 7c 7c 20 21 70 43 75 72 2d 3e 70 4b 65 79 20 29  || !pCur->pKey )
33b0: 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
33c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
33d0: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
33e0: 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65  ; i<=pCur->iPage
33f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65  ; i++){.      re
3400: 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
3410: 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20  apPage[i]);.    
3420: 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69    pCur->apPage[i
3430: 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  ] = 0;.    }.   
3440: 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d   pCur->iPage = -
3450: 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74  1;.    pCur->eSt
3460: 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51  ate = CURSOR_REQ
3470: 55 49 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20  UIRESEEK;.  }.. 
3480: 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66   invalidateOverf
3490: 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a  lowCache(pCur);.
34a0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
34b0: 2f 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70  /*.** Save the p
34c0: 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20  ositions of all 
34d0: 63 75 72 73 6f 72 73 20 65 78 63 65 70 74 20 70  cursors except p
34e0: 45 78 63 65 70 74 20 6f 70 65 6e 20 6f 6e 20 74  Except open on t
34f0: 68 65 20 74 61 62 6c 65 20 0a 2a 2a 20 77 69 74  he table .** wit
3500: 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f  h root-page iRoo
3510: 74 2e 20 55 73 75 61 6c 6c 79 2c 20 74 68 69 73  t. Usually, this
3520: 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20   is called just 
3530: 62 65 66 6f 72 65 20 63 75 72 73 6f 72 0a 2a 2a  before cursor.**
3540: 20 70 45 78 63 65 70 74 20 69 73 20 75 73 65 64   pExcept is used
3550: 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 74   to modify the t
3560: 61 62 6c 65 20 28 42 74 72 65 65 44 65 6c 65 74  able (BtreeDelet
3570: 65 28 29 20 6f 72 20 42 74 72 65 65 49 6e 73 65  e() or BtreeInse
3580: 72 74 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  rt())..*/.static
3590: 20 69 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73   int saveAllCurs
35a0: 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70 42  ors(BtShared *pB
35b0: 74 2c 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42  t, Pgno iRoot, B
35c0: 74 43 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74  tCursor *pExcept
35d0: 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70  ){.  BtCursor *p
35e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
35f0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
3600: 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
3610: 61 73 73 65 72 74 28 20 70 45 78 63 65 70 74 3d  assert( pExcept=
3620: 3d 30 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70  =0 || pExcept->p
3630: 42 74 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72  Bt==pBt );.  for
3640: 28 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b  (p=pBt->pCursor;
3650: 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b   p; p=p->pNext){
3660: 0a 20 20 20 20 69 66 28 20 70 21 3d 70 45 78 63  .    if( p!=pExc
3670: 65 70 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74  ept && (0==iRoot
3680: 20 7c 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d   || p->pgnoRoot=
3690: 3d 69 52 6f 6f 74 29 20 26 26 20 0a 20 20 20 20  =iRoot) && .    
36a0: 20 20 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43      p->eState==C
36b0: 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20  URSOR_VALID ){. 
36c0: 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61       int rc = sa
36d0: 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
36e0: 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53  (p);.      if( S
36f0: 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a  QLITE_OK!=rc ){.
3700: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
3710: 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
3720: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
3730: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
3740: 2a 20 43 6c 65 61 72 20 74 68 65 20 63 75 72 72  * Clear the curr
3750: 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74  ent cursor posit
3760: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
3770: 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
3780: 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
3790: 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
37a0: 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
37b0: 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c 69  (pCur) );.  sqli
37c0: 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e 70  te3_free(pCur->p
37d0: 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70 4b  Key);.  pCur->pK
37e0: 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ey = 0;.  pCur->
37f0: 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
3800: 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a 2a  INVALID;.}../*.*
3810: 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 63 75  * Restore the cu
3820: 72 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73 69  rsor to the posi
3830: 74 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20 28  tion it was in (
3840: 6f 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20 61  or as close to a
3850: 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20 77  s possible).** w
3860: 68 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50 6f  hen saveCursorPo
3870: 73 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61 6c  sition() was cal
3880: 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20 74  led. Note that t
3890: 68 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65 73  his call deletes
38a0: 20 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20 70   the .** saved p
38b0: 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74 6f  osition info sto
38c0: 72 65 64 20 62 79 20 73 61 76 65 43 75 72 73 6f  red by saveCurso
38d0: 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f 20  rPosition(), so 
38e0: 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a 20  there can be.** 
38f0: 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66 65  at most one effe
3900: 63 74 69 76 65 20 72 65 73 74 6f 72 65 43 75 72  ctive restoreCur
3910: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63 61  sorPosition() ca
3920: 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a 2a  ll after each .*
3930: 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69  * saveCursorPosi
3940: 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  tion()..*/.int s
3950: 71 6c 69 74 65 33 42 74 72 65 65 52 65 73 74 6f  qlite3BtreeResto
3960: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
3970: 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
3980: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73  {.  int rc;.  as
3990: 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
39a0: 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
39b0: 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
39c0: 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f 52  eState>=CURSOR_R
39d0: 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
39e0: 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  if( pCur->eState
39f0: 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  ==CURSOR_FAULT )
3a00: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43 75  {.    return pCu
3a10: 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 20 20 70  r->skip;.  }.  p
3a20: 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55  Cur->eState = CU
3a30: 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20  RSOR_INVALID;.  
3a40: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
3a50: 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 43  eMoveto(pCur, pC
3a60: 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d 3e  ur->pKey, pCur->
3a70: 6e 4b 65 79 2c 20 30 2c 20 26 70 43 75 72 2d 3e  nKey, 0, &pCur->
3a80: 73 6b 69 70 29 3b 0a 20 20 69 66 28 20 72 63 3d  skip);.  if( rc=
3a90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
3aa0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
3ab0: 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20 20  Cur->pKey);.    
3ac0: 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b 0a  pCur->pKey = 0;.
3ad0: 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
3ae0: 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
3af0: 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e  _VALID || pCur->
3b00: 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
3b10: 4e 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20 20  NVALID );.  }.  
3b20: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 64  return rc;.}..#d
3b30: 65 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75 72  efine restoreCur
3b40: 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20 5c  sorPosition(p) \
3b50: 0a 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d 43  .  (p->eState>=C
3b60: 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
3b70: 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20 73  K ? \.         s
3b80: 71 6c 69 74 65 33 42 74 72 65 65 52 65 73 74 6f  qlite3BtreeResto
3b90: 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
3ba0: 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20 20  (p) : \.        
3bb0: 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a 0a   SQLITE_OK)../*.
3bc0: 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65  ** Determine whe
3bd0: 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63 75  ther or not a cu
3be0: 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20 66  rsor has moved f
3bf0: 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f 6e  rom the position
3c00: 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74 20   it.** was last 
3c10: 70 6c 61 63 65 64 20 61 74 2e 20 20 43 75 72 73  placed at.  Curs
3c20: 6f 72 73 20 63 61 6e 20 6d 6f 76 65 20 77 68 65  ors can move whe
3c30: 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61  n the row they a
3c40: 72 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61  re pointing.** a
3c50: 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74  t is deleted out
3c60: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d   from under them
3c70: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
3c80: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61 6e 20  tine returns an 
3c90: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 73 6f  error code if so
3ca0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
3cb0: 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 74 65  ng.  The.** inte
3cc0: 67 65 72 20 2a 70 48 61 73 4d 6f 76 65 64 20 69  ger *pHasMoved i
3cd0: 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 69 66 20  s set to one if 
3ce0: 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6d  the cursor has m
3cf0: 6f 76 65 64 20 61 6e 64 20 30 20 69 66 20 6e 6f  oved and 0 if no
3d00: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
3d10: 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
3d20: 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70  oved(BtCursor *p
3d30: 43 75 72 2c 20 69 6e 74 20 2a 70 48 61 73 4d 6f  Cur, int *pHasMo
3d40: 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ved){.  int rc;.
3d50: 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
3d60: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
3d70: 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
3d80: 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20  .    *pHasMoved 
3d90: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
3da0: 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  rc;.  }.  if( pC
3db0: 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
3dc0: 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
3dd0: 2d 3e 73 6b 69 70 21 3d 30 20 29 7b 0a 20 20 20  ->skip!=0 ){.   
3de0: 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b   *pHasMoved = 1;
3df0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
3e00: 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20  HasMoved = 0;.  
3e10: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
3e20: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
3e30: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
3e40: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69  OVACUUM./*.** Gi
3e50: 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ven a page numbe
3e60: 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64  r of a regular d
3e70: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65  atabase page, re
3e80: 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  turn the page.**
3e90: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
3ea0: 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
3eb0: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
3ec0: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
3ed0: 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e  .** input page n
3ee0: 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  umber..*/.static
3ef0: 20 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65   Pgno ptrmapPage
3f00: 6e 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  no(BtShared *pBt
3f10: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
3f20: 69 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70  int nPagesPerMap
3f30: 50 61 67 65 3b 0a 20 20 50 67 6e 6f 20 69 50 74  Page;.  Pgno iPt
3f40: 72 4d 61 70 2c 20 72 65 74 3b 0a 20 20 61 73 73  rMap, ret;.  ass
3f50: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
3f60: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
3f70: 65 78 29 20 29 3b 0a 20 20 6e 50 61 67 65 73 50  ex) );.  nPagesP
3f80: 65 72 4d 61 70 50 61 67 65 20 3d 20 28 70 42 74  erMapPage = (pBt
3f90: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 35 29 2b  ->usableSize/5)+
3fa0: 31 3b 0a 20 20 69 50 74 72 4d 61 70 20 3d 20 28  1;.  iPtrMap = (
3fb0: 70 67 6e 6f 2d 32 29 2f 6e 50 61 67 65 73 50 65  pgno-2)/nPagesPe
3fc0: 72 4d 61 70 50 61 67 65 3b 0a 20 20 72 65 74 20  rMapPage;.  ret 
3fd0: 3d 20 28 69 50 74 72 4d 61 70 2a 6e 50 61 67 65  = (iPtrMap*nPage
3fe0: 73 50 65 72 4d 61 70 50 61 67 65 29 20 2b 20 32  sPerMapPage) + 2
3ff0: 3b 20 0a 20 20 69 66 28 20 72 65 74 3d 3d 50 45  ; .  if( ret==PE
4000: 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
4010: 70 42 74 29 20 29 7b 0a 20 20 20 20 72 65 74 2b  pBt) ){.    ret+
4020: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
4030: 72 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  ret;.}../*.** Wr
4040: 69 74 65 20 61 6e 20 65 6e 74 72 79 20 69 6e 74  ite an entry int
4050: 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  o the pointer ma
4060: 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  p..**.** This ro
4070: 75 74 69 6e 65 20 75 70 64 61 74 65 73 20 74 68  utine updates th
4080: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
4090: 74 72 79 20 66 6f 72 20 70 61 67 65 20 6e 75 6d  try for page num
40a0: 62 65 72 20 27 6b 65 79 27 0a 2a 2a 20 73 6f 20  ber 'key'.** so 
40b0: 74 68 61 74 20 69 74 20 6d 61 70 73 20 74 6f 20  that it maps to 
40c0: 74 79 70 65 20 27 65 54 79 70 65 27 20 61 6e 64  type 'eType' and
40d0: 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d   parent page num
40e0: 62 65 72 20 27 70 67 6e 6f 27 2e 0a 2a 2a 20 41  ber 'pgno'..** A
40f0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
4100: 72 65 74 75 72 6e 65 64 20 69 66 20 73 6f 6d 65  returned if some
4110: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
4120: 2c 20 6f 74 68 65 72 77 69 73 65 20 53 51 4c 49  , otherwise SQLI
4130: 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63  TE_OK..*/.static
4140: 20 69 6e 74 20 70 74 72 6d 61 70 50 75 74 28 42   int ptrmapPut(B
4150: 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
4160: 6e 6f 20 6b 65 79 2c 20 75 38 20 65 54 79 70 65  no key, u8 eType
4170: 2c 20 50 67 6e 6f 20 70 61 72 65 6e 74 29 7b 0a  , Pgno parent){.
4180: 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61 67    DbPage *pDbPag
4190: 65 3b 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74  e;  /* The point
41a0: 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20  er map page */. 
41b0: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
41c0: 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
41d0: 72 20 6d 61 70 20 64 61 74 61 20 2a 2f 0a 20 20  r map data */.  
41e0: 50 67 6e 6f 20 69 50 74 72 6d 61 70 3b 20 20 20  Pgno iPtrmap;   
41f0: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
4200: 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65 72   map page number
4210: 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 66 73 65 74   */.  int offset
4220: 3b 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65  ;       /* Offse
4230: 74 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70  t in pointer map
4240: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 72   page */.  int r
4250: 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  c;..  assert( sq
4260: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
4270: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
4280: 20 20 2f 2a 20 54 68 65 20 6d 61 73 74 65 72 2d    /* The master-
4290: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 6e 75 6d  journal page num
42a0: 62 65 72 20 6d 75 73 74 20 6e 65 76 65 72 20 62  ber must never b
42b0: 65 20 75 73 65 64 20 61 73 20 61 20 70 6f 69 6e  e used as a poin
42c0: 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a  ter map page */.
42d0: 20 20 61 73 73 65 72 74 28 20 30 3d 3d 50 54 52    assert( 0==PTR
42e0: 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
42f0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
4300: 45 28 70 42 74 29 29 20 29 3b 0a 0a 20 20 61 73  E(pBt)) );..  as
4310: 73 65 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56  sert( pBt->autoV
4320: 61 63 75 75 6d 20 29 3b 0a 20 20 69 66 28 20 6b  acuum );.  if( k
4330: 65 79 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ey==0 ){.    ret
4340: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
4350: 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  PT_BKPT;.  }.  i
4360: 50 74 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f  Ptrmap = PTRMAP_
4370: 50 41 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29  PAGENO(pBt, key)
4380: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
4390: 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50  PagerGet(pBt->pP
43a0: 61 67 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26  ager, iPtrmap, &
43b0: 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20  pDbPage);.  if( 
43c0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
43d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
43e0: 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 50    }.  offset = P
43f0: 54 52 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28  TRMAP_PTROFFSET(
4400: 69 50 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20  iPtrmap, key);. 
4410: 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38 20 2a   pPtrmap = (u8 *
4420: 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74  )sqlite3PagerGet
4430: 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 0a  Data(pDbPage);..
4440: 20 20 69 66 28 20 65 54 79 70 65 21 3d 70 50 74    if( eType!=pPt
4450: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 7c 7c 20  rmap[offset] || 
4460: 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d 61  get4byte(&pPtrma
4470: 70 5b 6f 66 66 73 65 74 2b 31 5d 29 21 3d 70 61  p[offset+1])!=pa
4480: 72 65 6e 74 20 29 7b 0a 20 20 20 20 54 52 41 43  rent ){.    TRAC
4490: 45 28 28 22 50 54 52 4d 41 50 5f 55 50 44 41 54  E(("PTRMAP_UPDAT
44a0: 45 3a 20 25 64 2d 3e 28 25 64 2c 25 64 29 5c 6e  E: %d->(%d,%d)\n
44b0: 22 2c 20 6b 65 79 2c 20 65 54 79 70 65 2c 20 70  ", key, eType, p
44c0: 61 72 65 6e 74 29 29 3b 0a 20 20 20 20 72 63 20  arent));.    rc 
44d0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
44e0: 69 74 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ite(pDbPage);.  
44f0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
4500: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 74  _OK ){.      pPt
4510: 72 6d 61 70 5b 6f 66 66 73 65 74 5d 20 3d 20 65  rmap[offset] = e
4520: 54 79 70 65 3b 0a 20 20 20 20 20 20 70 75 74 34  Type;.      put4
4530: 62 79 74 65 28 26 70 50 74 72 6d 61 70 5b 6f 66  byte(&pPtrmap[of
4540: 66 73 65 74 2b 31 5d 2c 20 70 61 72 65 6e 74 29  fset+1], parent)
4550: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73  ;.    }.  }..  s
4560: 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
4570: 28 70 44 62 50 61 67 65 29 3b 0a 20 20 72 65 74  (pDbPage);.  ret
4580: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
4590: 20 52 65 61 64 20 61 6e 20 65 6e 74 72 79 20 66   Read an entry f
45a0: 72 6f 6d 20 74 68 65 20 70 6f 69 6e 74 65 72 20  rom the pointer 
45b0: 6d 61 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  map..**.** This 
45c0: 72 6f 75 74 69 6e 65 20 72 65 74 72 69 65 76 65  routine retrieve
45d0: 73 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  s the pointer ma
45e0: 70 20 65 6e 74 72 79 20 66 6f 72 20 70 61 67 65  p entry for page
45f0: 20 27 6b 65 79 27 2c 20 77 72 69 74 69 6e 67 0a   'key', writing.
4600: 2a 2a 20 74 68 65 20 74 79 70 65 20 61 6e 64 20  ** the type and 
4610: 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75 6d 62  parent page numb
4620: 65 72 20 74 6f 20 2a 70 45 54 79 70 65 20 61 6e  er to *pEType an
4630: 64 20 2a 70 50 67 6e 6f 20 72 65 73 70 65 63 74  d *pPgno respect
4640: 69 76 65 6c 79 2e 0a 2a 2a 20 41 6e 20 65 72 72  ively..** An err
4650: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
4660: 6e 65 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67  ned if something
4670: 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68   goes wrong, oth
4680: 65 72 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b  erwise SQLITE_OK
4690: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
46a0: 70 74 72 6d 61 70 47 65 74 28 42 74 53 68 61 72  ptrmapGet(BtShar
46b0: 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65  ed *pBt, Pgno ke
46c0: 79 2c 20 75 38 20 2a 70 45 54 79 70 65 2c 20 50  y, u8 *pEType, P
46d0: 67 6e 6f 20 2a 70 50 67 6e 6f 29 7b 0a 20 20 44  gno *pPgno){.  D
46e0: 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 20  bPage *pDbPage; 
46f0: 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
4700: 20 6d 61 70 20 70 61 67 65 20 2a 2f 0a 20 20 69   map page */.  i
4710: 6e 74 20 69 50 74 72 6d 61 70 3b 20 20 20 20 20  nt iPtrmap;     
4720: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70    /* Pointer map
4730: 20 70 61 67 65 20 69 6e 64 65 78 20 2a 2f 0a 20   page index */. 
4740: 20 75 38 20 2a 70 50 74 72 6d 61 70 3b 20 20 20   u8 *pPtrmap;   
4750: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 6d      /* Pointer m
4760: 61 70 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a  ap page data */.
4770: 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 20 20 20    int offset;   
4780: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f       /* Offset o
4790: 66 20 65 6e 74 72 79 20 69 6e 20 70 6f 69 6e 74  f entry in point
47a0: 65 72 20 6d 61 70 20 2a 2f 0a 20 20 69 6e 74 20  er map */.  int 
47b0: 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
47c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
47d0: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
47e0: 0a 0a 20 20 69 50 74 72 6d 61 70 20 3d 20 50 54  ..  iPtrmap = PT
47f0: 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c  RMAP_PAGENO(pBt,
4800: 20 6b 65 79 29 3b 0a 20 20 72 63 20 3d 20 73 71   key);.  rc = sq
4810: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
4820: 74 2d 3e 70 50 61 67 65 72 2c 20 69 50 74 72 6d  t->pPager, iPtrm
4830: 61 70 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20  ap, &pDbPage);. 
4840: 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
4850: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
4860: 0a 20 20 70 50 74 72 6d 61 70 20 3d 20 28 75 38  .  pPtrmap = (u8
4870: 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47   *)sqlite3PagerG
4880: 65 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b  etData(pDbPage);
4890: 0a 0a 20 20 6f 66 66 73 65 74 20 3d 20 50 54 52  ..  offset = PTR
48a0: 4d 41 50 5f 50 54 52 4f 46 46 53 45 54 28 69 50  MAP_PTROFFSET(iP
48b0: 74 72 6d 61 70 2c 20 6b 65 79 29 3b 0a 20 20 61  trmap, key);.  a
48c0: 73 73 65 72 74 28 20 70 45 54 79 70 65 21 3d 30  ssert( pEType!=0
48d0: 20 29 3b 0a 20 20 2a 70 45 54 79 70 65 20 3d 20   );.  *pEType = 
48e0: 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 5d 3b  pPtrmap[offset];
48f0: 0a 20 20 69 66 28 20 70 50 67 6e 6f 20 29 20 2a  .  if( pPgno ) *
4900: 70 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  pPgno = get4byte
4910: 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65 74  (&pPtrmap[offset
4920: 2b 31 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  +1]);..  sqlite3
4930: 50 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61  PagerUnref(pDbPa
4940: 67 65 29 3b 0a 20 20 69 66 28 20 2a 70 45 54 79  ge);.  if( *pETy
4950: 70 65 3c 31 20 7c 7c 20 2a 70 45 54 79 70 65 3e  pe<1 || *pEType>
4960: 35 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  5 ) return SQLIT
4970: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
4980: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4990: 4f 4b 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a 20  OK;.}..#else /* 
49a0: 69 66 20 64 65 66 69 6e 65 64 20 53 51 4c 49 54  if defined SQLIT
49b0: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
49c0: 4d 20 2a 2f 0a 20 20 23 64 65 66 69 6e 65 20 70  M */.  #define p
49d0: 74 72 6d 61 70 50 75 74 28 77 2c 78 2c 79 2c 7a  trmapPut(w,x,y,z
49e0: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64  ) SQLITE_OK.  #d
49f0: 65 66 69 6e 65 20 70 74 72 6d 61 70 47 65 74 28  efine ptrmapGet(
4a00: 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54 45 5f  w,x,y,z) SQLITE_
4a10: 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 70 74 72  OK.  #define ptr
4a20: 6d 61 70 50 75 74 4f 76 66 6c 28 79 2c 7a 29 20  mapPutOvfl(y,z) 
4a30: 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66  SQLITE_OK.#endif
4a40: 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
4a50: 62 74 72 65 65 20 70 61 67 65 20 61 6e 64 20 61  btree page and a
4a60: 20 63 65 6c 6c 20 69 6e 64 65 78 20 28 30 20 6d   cell index (0 m
4a70: 65 61 6e 73 20 74 68 65 20 66 69 72 73 74 20 63  eans the first c
4a80: 65 6c 6c 20 6f 6e 0a 2a 2a 20 74 68 65 20 70 61  ell on.** the pa
4a90: 67 65 2c 20 31 20 6d 65 61 6e 73 20 74 68 65 20  ge, 1 means the 
4aa0: 73 65 63 6f 6e 64 20 63 65 6c 6c 2c 20 61 6e 64  second cell, and
4ab0: 20 73 6f 20 66 6f 72 74 68 29 20 72 65 74 75 72   so forth) retur
4ac0: 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  n a pointer.** t
4ad0: 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
4ae0: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  nt..**.** This r
4af0: 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6f 6e 6c  outine works onl
4b00: 79 20 66 6f 72 20 70 61 67 65 73 20 74 68 61 74  y for pages that
4b10: 20 64 6f 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20   do not contain 
4b20: 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 0a  overflow cells..
4b30: 2a 2f 0a 23 64 65 66 69 6e 65 20 66 69 6e 64 43  */.#define findC
4b40: 65 6c 6c 28 50 2c 49 29 20 5c 0a 20 20 28 28 50  ell(P,I) \.  ((P
4b50: 29 2d 3e 61 44 61 74 61 20 2b 20 28 28 50 29 2d  )->aData + ((P)-
4b60: 3e 6d 61 73 6b 50 61 67 65 20 26 20 67 65 74 32  >maskPage & get2
4b70: 62 79 74 65 28 26 28 50 29 2d 3e 61 44 61 74 61  byte(&(P)->aData
4b80: 5b 28 50 29 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  [(P)->cellOffset
4b90: 2b 32 2a 28 49 29 5d 29 29 29 0a 0a 2f 2a 0a 2a  +2*(I)])))../*.*
4ba0: 2a 20 54 68 69 73 20 61 20 6d 6f 72 65 20 63 6f  * This a more co
4bb0: 6d 70 6c 65 78 20 76 65 72 73 69 6f 6e 20 6f 66  mplex version of
4bc0: 20 66 69 6e 64 43 65 6c 6c 28 29 20 74 68 61 74   findCell() that
4bd0: 20 77 6f 72 6b 73 20 66 6f 72 0a 2a 2a 20 70 61   works for.** pa
4be0: 67 65 73 20 74 68 61 74 20 64 6f 20 63 6f 6e 74  ges that do cont
4bf0: 61 69 6e 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c  ain overflow cel
4c00: 6c 73 2e 20 20 53 65 65 20 69 6e 73 65 72 74 0a  ls.  See insert.
4c10: 2a 2f 0a 73 74 61 74 69 63 20 75 38 20 2a 66 69  */.static u8 *fi
4c20: 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 4d  ndOverflowCell(M
4c30: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
4c40: 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 69 6e 74  nt iCell){.  int
4c50: 20 69 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   i;.  assert( sq
4c60: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
4c70: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
4c80: 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 70  ex) );.  for(i=p
4c90: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2d  Page->nOverflow-
4ca0: 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20  1; i>=0; i--){. 
4cb0: 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 73 74     int k;.    st
4cc0: 72 75 63 74 20 5f 4f 76 66 6c 43 65 6c 6c 20 2a  ruct _OvflCell *
4cd0: 70 4f 76 66 6c 3b 0a 20 20 20 20 70 4f 76 66 6c  pOvfl;.    pOvfl
4ce0: 20 3d 20 26 70 50 61 67 65 2d 3e 61 4f 76 66 6c   = &pPage->aOvfl
4cf0: 5b 69 5d 3b 0a 20 20 20 20 6b 20 3d 20 70 4f 76  [i];.    k = pOv
4d00: 66 6c 2d 3e 69 64 78 3b 0a 20 20 20 20 69 66 28  fl->idx;.    if(
4d10: 20 6b 3c 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20   k<=iCell ){.   
4d20: 20 20 20 69 66 28 20 6b 3d 3d 69 43 65 6c 6c 20     if( k==iCell 
4d30: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
4d40: 6e 20 70 4f 76 66 6c 2d 3e 70 43 65 6c 6c 3b 0a  n pOvfl->pCell;.
4d50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 43        }.      iC
4d60: 65 6c 6c 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  ell--;.    }.  }
4d70: 0a 20 20 72 65 74 75 72 6e 20 66 69 6e 64 43 65  .  return findCe
4d80: 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 29  ll(pPage, iCell)
4d90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65  ;.}../*.** Parse
4da0: 20 61 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20   a cell content 
4db0: 62 6c 6f 63 6b 20 61 6e 64 20 66 69 6c 6c 20 69  block and fill i
4dc0: 6e 20 74 68 65 20 43 65 6c 6c 49 6e 66 6f 20 73  n the CellInfo s
4dd0: 74 72 75 63 74 75 72 65 2e 20 20 54 68 65 72 65  tructure.  There
4de0: 0a 2a 2a 20 61 72 65 20 74 77 6f 20 76 65 72 73  .** are two vers
4df0: 69 6f 6e 73 20 6f 66 20 74 68 69 73 20 66 75 6e  ions of this fun
4e00: 63 74 69 6f 6e 2e 20 20 73 71 6c 69 74 65 33 42  ction.  sqlite3B
4e10: 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20  treeParseCell() 
4e20: 74 61 6b 65 73 20 61 20 0a 2a 2a 20 63 65 6c 6c  takes a .** cell
4e30: 20 69 6e 64 65 78 20 61 73 20 74 68 65 20 73 65   index as the se
4e40: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 61 6e  cond argument an
4e50: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  d sqlite3BtreePa
4e60: 72 73 65 43 65 6c 6c 50 74 72 28 29 20 0a 2a 2a  rseCellPtr() .**
4e70: 20 74 61 6b 65 73 20 61 20 70 6f 69 6e 74 65 72   takes a pointer
4e80: 20 74 6f 20 74 68 65 20 62 6f 64 79 20 6f 66 20   to the body of 
4e90: 74 68 65 20 63 65 6c 6c 20 61 73 20 69 74 73 20  the cell as its 
4ea0: 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e  second argument.
4eb0: 0a 2a 2a 0a 2a 2a 20 57 69 74 68 69 6e 20 74 68  .**.** Within th
4ec0: 69 73 20 66 69 6c 65 2c 20 74 68 65 20 70 61 72  is file, the par
4ed0: 73 65 43 65 6c 6c 28 29 20 6d 61 63 72 6f 20 63  seCell() macro c
4ee0: 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 69 6e 73  an be called ins
4ef0: 74 65 61 64 20 6f 66 0a 2a 2a 20 73 71 6c 69 74  tead of.** sqlit
4f00: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
4f10: 50 74 72 28 29 2e 20 55 73 69 6e 67 20 73 6f 6d  Ptr(). Using som
4f20: 65 20 63 6f 6d 70 69 6c 65 72 73 2c 20 74 68 69  e compilers, thi
4f30: 73 20 77 69 6c 6c 20 62 65 20 66 61 73 74 65 72  s will be faster
4f40: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4f50: 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
4f60: 74 72 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  tr(.  MemPage *p
4f70: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Page,         /*
4f80: 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e 67   Page containing
4f90: 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75   the cell */.  u
4fa0: 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  8 *pCell,       
4fb0: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
4fc0: 72 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 74 65  r to the cell te
4fd0: 78 74 2e 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e 66  xt. */.  CellInf
4fe0: 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20 20  o *pInfo        
4ff0: 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69 73   /* Fill in this
5000: 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29 7b   structure */.){
5010: 0a 20 20 75 31 36 20 6e 3b 20 20 20 20 20 20 20  .  u16 n;       
5020: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
5030: 6d 62 65 72 20 62 79 74 65 73 20 69 6e 20 63 65  mber bytes in ce
5040: 6c 6c 20 63 6f 6e 74 65 6e 74 20 68 65 61 64 65  ll content heade
5050: 72 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 79 6c  r */.  u32 nPayl
5060: 6f 61 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f  oad;           /
5070: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
5080: 73 20 6f 66 20 63 65 6c 6c 20 70 61 79 6c 6f 61  s of cell payloa
5090: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
50a0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
50b0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
50c0: 75 74 65 78 29 20 29 3b 0a 0a 20 20 70 49 6e 66  utex) );..  pInf
50d0: 6f 2d 3e 70 43 65 6c 6c 20 3d 20 70 43 65 6c 6c  o->pCell = pCell
50e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
50f0: 65 2d 3e 6c 65 61 66 3d 3d 30 20 7c 7c 20 70 50  e->leaf==0 || pP
5100: 61 67 65 2d 3e 6c 65 61 66 3d 3d 31 20 29 3b 0a  age->leaf==1 );.
5110: 20 20 6e 20 3d 20 70 50 61 67 65 2d 3e 63 68 69    n = pPage->chi
5120: 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 61 73 73  ldPtrSize;.  ass
5130: 65 72 74 28 20 6e 3d 3d 34 2d 34 2a 70 50 61 67  ert( n==4-4*pPag
5140: 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 69 66 28  e->leaf );.  if(
5150: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29   pPage->intKey )
5160: 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  {.    if( pPage-
5170: 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20  >hasData ){.    
5180: 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74    n += getVarint
5190: 33 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50  32(&pCell[n], nP
51a0: 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 7d 65 6c  ayload);.    }el
51b0: 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 79 6c 6f  se{.      nPaylo
51c0: 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ad = 0;.    }.  
51d0: 20 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74    n += getVarint
51e0: 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 28 75 36 34  (&pCell[n], (u64
51f0: 2a 29 26 70 49 6e 66 6f 2d 3e 6e 4b 65 79 29 3b  *)&pInfo->nKey);
5200: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74  .    pInfo->nDat
5210: 61 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20  a = nPayload;.  
5220: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 6e 66 6f  }else{.    pInfo
5230: 2d 3e 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20  ->nData = 0;.   
5240: 20 6e 20 2b 3d 20 67 65 74 56 61 72 69 6e 74 33   n += getVarint3
5250: 32 28 26 70 43 65 6c 6c 5b 6e 5d 2c 20 6e 50 61  2(&pCell[n], nPa
5260: 79 6c 6f 61 64 29 3b 0a 20 20 20 20 70 49 6e 66  yload);.    pInf
5270: 6f 2d 3e 6e 4b 65 79 20 3d 20 6e 50 61 79 6c 6f  o->nKey = nPaylo
5280: 61 64 3b 0a 20 20 7d 0a 20 20 70 49 6e 66 6f 2d  ad;.  }.  pInfo-
5290: 3e 6e 50 61 79 6c 6f 61 64 20 3d 20 6e 50 61 79  >nPayload = nPay
52a0: 6c 6f 61 64 3b 0a 20 20 70 49 6e 66 6f 2d 3e 6e  load;.  pInfo->n
52b0: 48 65 61 64 65 72 20 3d 20 6e 3b 0a 20 20 69 66  Header = n;.  if
52c0: 28 20 6c 69 6b 65 6c 79 28 6e 50 61 79 6c 6f 61  ( likely(nPayloa
52d0: 64 3c 3d 70 50 61 67 65 2d 3e 6d 61 78 4c 6f 63  d<=pPage->maxLoc
52e0: 61 6c 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  al) ){.    /* Th
52f0: 69 73 20 69 73 20 74 68 65 20 28 65 61 73 79 29  is is the (easy)
5300: 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65   common case whe
5310: 72 65 20 74 68 65 20 65 6e 74 69 72 65 20 70 61  re the entire pa
5320: 79 6c 6f 61 64 20 66 69 74 73 0a 20 20 20 20 2a  yload fits.    *
5330: 2a 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70  * on the local p
5340: 61 67 65 2e 20 20 4e 6f 20 6f 76 65 72 66 6c 6f  age.  No overflo
5350: 77 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 20  w is required.. 
5360: 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53     */.    int nS
5370: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ize;          /*
5380: 20 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 63   Total size of c
5390: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 62  ell content in b
53a0: 79 74 65 73 20 2a 2f 0a 20 20 20 20 6e 53 69 7a  ytes */.    nSiz
53b0: 65 20 3d 20 6e 50 61 79 6c 6f 61 64 20 2b 20 6e  e = nPayload + n
53c0: 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c 6f  ;.    pInfo->nLo
53d0: 63 61 6c 20 3d 20 28 75 31 36 29 6e 50 61 79 6c  cal = (u16)nPayl
53e0: 6f 61 64 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e  oad;.    pInfo->
53f0: 69 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  iOverflow = 0;. 
5400: 20 20 20 69 66 28 20 28 6e 53 69 7a 65 20 26 20     if( (nSize & 
5410: 7e 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ~3)==0 ){.      
5420: 6e 53 69 7a 65 20 3d 20 34 3b 20 20 20 20 20 20  nSize = 4;      
5430: 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c    /* Minimum cel
5440: 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 20  l size is 4 */. 
5450: 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e     }.    pInfo->
5460: 6e 53 69 7a 65 20 3d 20 28 75 31 36 29 6e 53 69  nSize = (u16)nSi
5470: 7a 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ze;.  }else{.   
5480: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c 6f   /* If the paylo
5490: 61 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20  ad will not fit 
54a0: 63 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68  completely on th
54b0: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77 65  e local page, we
54c0: 20 68 61 76 65 0a 20 20 20 20 2a 2a 20 74 6f 20   have.    ** to 
54d0: 64 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20  decide how much 
54e0: 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79  to store locally
54f0: 20 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f   and how much to
5500: 20 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20   spill onto.    
5510: 2a 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ** overflow page
5520: 73 2e 20 20 54 68 65 20 73 74 72 61 74 65 67 79  s.  The strategy
5530: 20 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20   is to minimize 
5540: 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e  the amount of un
5550: 75 73 65 64 0a 20 20 20 20 2a 2a 20 73 70 61 63  used.    ** spac
5560: 65 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e on overflow pa
5570: 67 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e  ges while keepin
5580: 67 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  g the amount of 
5590: 6c 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20  local storage.  
55a0: 20 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20    ** in between 
55b0: 6d 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78  minLocal and max
55c0: 4c 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20  Local..    **.  
55d0: 20 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63    ** Warning:  c
55e0: 68 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79 20  hanging the way 
55f0: 6f 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64  overflow payload
5600: 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20   is distributed 
5610: 69 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 77 61  in any.    ** wa
5620: 79 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e  y will result in
5630: 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65   an incompatible
5640: 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20   file format..  
5650: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 69 6e    */.    int min
5660: 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d  Local;  /* Minim
5670: 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
5680: 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c  load held locall
5690: 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78  y */.    int max
56a0: 4c 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d  Local;  /* Maxim
56b0: 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
56c0: 6c 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c  load held locall
56d0: 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 75 72  y */.    int sur
56e0: 70 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66  plus;   /* Overf
56f0: 6c 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69  low payload avai
5700: 6c 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20  lable for local 
5710: 73 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 20 20  storage */..    
5720: 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  minLocal = pPage
5730: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->minLocal;.    
5740: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65  maxLocal = pPage
5750: 2d 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20  ->maxLocal;.    
5760: 73 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63  surplus = minLoc
5770: 61 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d  al + (nPayload -
5780: 20 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67   minLocal)%(pPag
5790: 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  e->pBt->usableSi
57a0: 7a 65 20 2d 20 34 29 3b 0a 20 20 20 20 69 66 28  ze - 4);.    if(
57b0: 20 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c   surplus <= maxL
57c0: 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 70 49  ocal ){.      pI
57d0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75  nfo->nLocal = (u
57e0: 31 36 29 73 75 72 70 6c 75 73 3b 0a 20 20 20 20  16)surplus;.    
57f0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 49 6e  }else{.      pIn
5800: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 28 75 31  fo->nLocal = (u1
5810: 36 29 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20  6)minLocal;.    
5820: 7d 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 69 4f 76  }.    pInfo->iOv
5830: 65 72 66 6c 6f 77 20 3d 20 28 75 31 36 29 28 70  erflow = (u16)(p
5840: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e  Info->nLocal + n
5850: 29 3b 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53  );.    pInfo->nS
5860: 69 7a 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76  ize = pInfo->iOv
5870: 65 72 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a  erflow + 4;.  }.
5880: 7d 0a 23 64 65 66 69 6e 65 20 70 61 72 73 65 43  }.#define parseC
5890: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
58a0: 2c 20 70 49 6e 66 6f 29 20 5c 0a 20 20 73 71 6c  , pInfo) \.  sql
58b0: 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
58c0: 6c 6c 50 74 72 28 28 70 50 61 67 65 29 2c 20 66  llPtr((pPage), f
58d0: 69 6e 64 43 65 6c 6c 28 28 70 50 61 67 65 29 2c  indCell((pPage),
58e0: 20 28 69 43 65 6c 6c 29 29 2c 20 28 70 49 6e 66   (iCell)), (pInf
58f0: 6f 29 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  o)).void sqlite3
5900: 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a  BtreeParseCell(.
5910: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
5920: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67  ,         /* Pag
5930: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  e containing the
5940: 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69   cell */.  int i
5950: 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20  Cell,           
5960: 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69     /* The cell i
5970: 6e 64 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c  ndex.  First cel
5980: 6c 20 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c  l is 0 */.  Cell
5990: 49 6e 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20  Info *pInfo     
59a0: 20 20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74      /* Fill in t
59b0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f  his structure */
59c0: 0a 29 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c 28  .){.  parseCell(
59d0: 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49  pPage, iCell, pI
59e0: 6e 66 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  nfo);.}../*.** C
59f0: 6f 6d 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c  ompute the total
5a00: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
5a10: 20 74 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65   that a Cell nee
5a20: 64 73 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a  ds in the cell.*
5a30: 2a 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 74  * data area of t
5a40: 68 65 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20  he btree-page.  
5a50: 54 68 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65  The return numbe
5a60: 72 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63  r includes the c
5a70: 65 6c 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64  ell.** data head
5a80: 65 72 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c  er and the local
5a90: 20 70 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f   payload, but no
5aa0: 74 20 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70  t any overflow p
5ab0: 61 67 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70  age or.** the sp
5ac0: 61 63 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ace used by the 
5ad0: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f  cell pointer..*/
5ae0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
5af0: 73 74 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53  static u16 cellS
5b00: 69 7a 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ize(MemPage *pPa
5b10: 67 65 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a  ge, int iCell){.
5b20: 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
5b30: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
5b40: 61 72 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20  arseCell(pPage, 
5b50: 69 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  iCell, &info);. 
5b60: 20 72 65 74 75 72 6e 20 69 6e 66 6f 2e 6e 53 69   return info.nSi
5b70: 7a 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a 73 74 61  ze;.}.#endif.sta
5b80: 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65  tic u16 cellSize
5b90: 50 74 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  Ptr(MemPage *pPa
5ba0: 67 65 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a  ge, u8 *pCell){.
5bb0: 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
5bc0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
5bd0: 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
5be0: 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
5bf0: 3b 0a 20 20 72 65 74 75 72 6e 20 69 6e 66 6f 2e  ;.  return info.
5c00: 6e 53 69 7a 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65  nSize;.}..#ifnde
5c10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
5c20: 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49  TOVACUUM./*.** I
5c30: 66 20 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c  f the cell pCell
5c40: 2c 20 70 61 72 74 20 6f 66 20 70 61 67 65 20 70  , part of page p
5c50: 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20  Page contains a 
5c60: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e  pointer.** to an
5c70: 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20   overflow page, 
5c80: 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20  insert an entry 
5c90: 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
5ca0: 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20  -map.** for the 
5cb0: 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a  overflow page..*
5cc0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74 72  /.static int ptr
5cd0: 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65  mapPutOvflPtr(Me
5ce0: 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38  mPage *pPage, u8
5cf0: 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c   *pCell){.  Cell
5d00: 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 61 73 73  Info info;.  ass
5d10: 65 72 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b  ert( pCell!=0 );
5d20: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
5d30: 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
5d40: 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
5d50: 3b 0a 20 20 61 73 73 65 72 74 28 20 28 69 6e 66  ;.  assert( (inf
5d60: 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e  o.nData+(pPage->
5d70: 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b  intKey?0:info.nK
5d80: 65 79 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c  ey))==info.nPayl
5d90: 6f 61 64 20 29 3b 0a 20 20 69 66 28 20 28 69 6e  oad );.  if( (in
5da0: 66 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d  fo.nData+(pPage-
5db0: 3e 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e  >intKey?0:info.n
5dc0: 4b 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  Key))>info.nLoca
5dd0: 6c 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76  l ){.    Pgno ov
5de0: 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  fl = get4byte(&p
5df0: 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
5e00: 6c 6f 77 5d 29 3b 0a 20 20 20 20 72 65 74 75 72  low]);.    retur
5e10: 6e 20 70 74 72 6d 61 70 50 75 74 28 70 50 61 67  n ptrmapPut(pPag
5e20: 65 2d 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54  e->pBt, ovfl, PT
5e30: 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20  RMAP_OVERFLOW1, 
5e40: 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20  pPage->pgno);.  
5e50: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
5e60: 45 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 49 66  E_OK;.}./*.** If
5e70: 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 20 69   the cell with i
5e80: 6e 64 65 78 20 69 43 65 6c 6c 20 6f 6e 20 70 61  ndex iCell on pa
5e90: 67 65 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e  ge pPage contain
5ea0: 73 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74  s a pointer.** t
5eb0: 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
5ec0: 67 65 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e  ge, insert an en
5ed0: 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69  try into the poi
5ee0: 6e 74 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20  nter-map.** for 
5ef0: 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  the overflow pag
5f00: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
5f10: 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 4d   ptrmapPutOvfl(M
5f20: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
5f30: 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20 75 38 20  nt iCell){.  u8 
5f40: 2a 70 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74  *pCell;.  assert
5f50: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
5f60: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
5f70: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 43 65  >mutex) );.  pCe
5f80: 6c 6c 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f  ll = findOverflo
5f90: 77 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65  wCell(pPage, iCe
5fa0: 6c 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 74  ll);.  return pt
5fb0: 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70  rmapPutOvflPtr(p
5fc0: 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 7d 0a  Page, pCell);.}.
5fd0: 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44  #endif.../*.** D
5fe0: 65 66 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61  efragment the pa
5ff0: 67 65 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43  ge given.  All C
6000: 65 6c 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74  ells are moved t
6010: 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20  o the.** end of 
6020: 74 68 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c  the page and all
6030: 20 66 72 65 65 20 73 70 61 63 65 20 69 73 20 63   free space is c
6040: 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e  ollected into on
6050: 65 0a 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b  e.** big FreeBlk
6060: 20 74 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20   that occurs in 
6070: 62 65 74 77 65 65 6e 20 74 68 65 20 68 65 61 64  between the head
6080: 65 72 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70  er and cell.** p
6090: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64  ointer array and
60a0: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
60b0: 74 20 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69  t area..*/.stati
60c0: 63 20 69 6e 74 20 64 65 66 72 61 67 6d 65 6e 74  c int defragment
60d0: 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50  Page(MemPage *pP
60e0: 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  age){.  int i;  
60f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6100: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
6110: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20  er */.  int pc; 
6120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6130: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
6140: 20 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a   a i-th cell */.
6150: 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20    int addr;     
6160: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6170: 4f 66 66 73 65 74 20 6f 66 20 66 69 72 73 74 20  Offset of first 
6180: 62 79 74 65 20 61 66 74 65 72 20 63 65 6c 6c 20  byte after cell 
6190: 70 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f  pointer array */
61a0: 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
61b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
61c0: 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 70   Offset to the p
61d0: 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  age header */.  
61e0: 69 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20  int size;       
61f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
6200: 7a 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a  ze of a cell */.
6210: 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65    int usableSize
6220: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
6230: 4e 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65  Number of usable
6240: 20 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65   bytes on a page
6250: 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66   */.  int cellOf
6260: 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20  fset;           
6270: 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68   /* Offset to th
6280: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
6290: 72 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62  rray */.  int cb
62a0: 72 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rk;             
62b0: 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
62c0: 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65  o the cell conte
62d0: 6e 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74  nt area */.  int
62e0: 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20   nCell;         
62f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
6300: 72 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68  r of cells on th
6310: 65 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69  e page */.  unsi
6320: 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b  gned char *data;
6330: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
6340: 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73  ge data */.  uns
6350: 69 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70  igned char *temp
6360: 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20  ;       /* Temp 
6370: 61 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f  area for cell co
6380: 6e 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65  ntent */..  asse
6390: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
63a0: 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
63b0: 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  e->pDbPage) );. 
63c0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
63d0: 70 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  pBt!=0 );.  asse
63e0: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  rt( pPage->pBt->
63f0: 75 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51  usableSize <= SQ
6400: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
6410: 5a 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ZE );.  assert( 
6420: 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
6430: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
6440: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
6450: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
6460: 6d 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70  mutex) );.  temp
6470: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
6480: 65 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e  empSpace(pPage->
6490: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
64a0: 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44  data = pPage->aD
64b0: 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61  ata;.  hdr = pPa
64c0: 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20  ge->hdrOffset;. 
64d0: 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50   cellOffset = pP
64e0: 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b  age->cellOffset;
64f0: 0a 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65  .  nCell = pPage
6500: 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72  ->nCell;.  asser
6510: 74 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79  t( nCell==get2by
6520: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29  te(&data[hdr+3])
6530: 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   );.  usableSize
6540: 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75   = pPage->pBt->u
6550: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72  sableSize;.  cbr
6560: 6b 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  k = get2byte(&da
6570: 74 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65  ta[hdr+5]);.  me
6580: 6d 63 70 79 28 26 74 65 6d 70 5b 63 62 72 6b 5d  mcpy(&temp[cbrk]
6590: 2c 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75  , &data[cbrk], u
65a0: 73 61 62 6c 65 53 69 7a 65 20 2d 20 63 62 72 6b  sableSize - cbrk
65b0: 29 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62  );.  cbrk = usab
65c0: 6c 65 53 69 7a 65 3b 0a 20 20 66 6f 72 28 69 3d  leSize;.  for(i=
65d0: 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
65e0: 7b 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b  {.    u8 *pAddr;
65f0: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68       /* The i-th
6600: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
6610: 0a 20 20 20 20 70 41 64 64 72 20 3d 20 26 64 61  .    pAddr = &da
6620: 74 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20  ta[cellOffset + 
6630: 69 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67  i*2];.    pc = g
6640: 65 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a  et2byte(pAddr);.
6650: 20 20 20 20 69 66 28 20 70 63 3e 3d 75 73 61 62      if( pc>=usab
6660: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
6670: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
6680: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
6690: 7d 0a 20 20 20 20 73 69 7a 65 20 3d 20 63 65 6c  }.    size = cel
66a0: 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
66b0: 26 74 65 6d 70 5b 70 63 5d 29 3b 0a 20 20 20 20  &temp[pc]);.    
66c0: 63 62 72 6b 20 2d 3d 20 73 69 7a 65 3b 0a 20 20  cbrk -= size;.  
66d0: 20 20 69 66 28 20 63 62 72 6b 3c 63 65 6c 6c 4f    if( cbrk<cellO
66e0: 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 20 7c 7c  ffset+2*nCell ||
66f0: 20 70 63 2b 73 69 7a 65 3e 75 73 61 62 6c 65 53   pc+size>usableS
6700: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ize ){.      ret
6710: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
6720: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
6730: 20 20 20 61 73 73 65 72 74 28 20 63 62 72 6b 2b     assert( cbrk+
6740: 73 69 7a 65 3c 3d 75 73 61 62 6c 65 53 69 7a 65  size<=usableSize
6750: 20 26 26 20 63 62 72 6b 3e 3d 30 20 29 3b 0a 20   && cbrk>=0 );. 
6760: 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b     memcpy(&data[
6770: 63 62 72 6b 5d 2c 20 26 74 65 6d 70 5b 70 63 5d  cbrk], &temp[pc]
6780: 2c 20 73 69 7a 65 29 3b 0a 20 20 20 20 70 75 74  , size);.    put
6790: 32 62 79 74 65 28 70 41 64 64 72 2c 20 63 62 72  2byte(pAddr, cbr
67a0: 6b 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  k);.  }.  assert
67b0: 28 20 63 62 72 6b 3e 3d 63 65 6c 6c 4f 66 66 73  ( cbrk>=cellOffs
67c0: 65 74 2b 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20 20  et+2*nCell );.  
67d0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
67e0: 64 72 2b 35 5d 2c 20 63 62 72 6b 29 3b 0a 20 20  dr+5], cbrk);.  
67f0: 64 61 74 61 5b 68 64 72 2b 31 5d 20 3d 20 30 3b  data[hdr+1] = 0;
6800: 0a 20 20 64 61 74 61 5b 68 64 72 2b 32 5d 20 3d  .  data[hdr+2] =
6810: 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 37   0;.  data[hdr+7
6820: 5d 20 3d 20 30 3b 0a 20 20 61 64 64 72 20 3d 20  ] = 0;.  addr = 
6830: 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65  cellOffset+2*nCe
6840: 6c 6c 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 61  ll;.  memset(&da
6850: 74 61 5b 61 64 64 72 5d 2c 20 30 2c 20 63 62 72  ta[addr], 0, cbr
6860: 6b 2d 61 64 64 72 29 3b 0a 20 20 61 73 73 65 72  k-addr);.  asser
6870: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
6880: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
6890: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
68a0: 69 66 28 20 63 62 72 6b 2d 61 64 64 72 21 3d 70  if( cbrk-addr!=p
68b0: 50 61 67 65 2d 3e 6e 46 72 65 65 20 29 7b 0a 20  Page->nFree ){. 
68c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
68d0: 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
68e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
68f0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
6900: 41 6c 6c 6f 63 61 74 65 20 6e 42 79 74 65 20 62  Allocate nByte b
6910: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 6f 6e  ytes of space on
6920: 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 52   a page..**.** R
6930: 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20  eturn the index 
6940: 69 6e 74 6f 20 70 50 61 67 65 2d 3e 61 44 61 74  into pPage->aDat
6950: 61 5b 5d 20 6f 66 20 74 68 65 20 66 69 72 73 74  a[] of the first
6960: 20 62 79 74 65 20 6f 66 0a 2a 2a 20 74 68 65 20   byte of.** the 
6970: 6e 65 77 20 61 6c 6c 6f 63 61 74 69 6f 6e 2e 20  new allocation. 
6980: 20 54 68 65 20 63 61 6c 6c 65 72 20 67 75 61 72   The caller guar
6990: 61 6e 74 65 65 73 20 74 68 61 74 20 74 68 65 72  antees that ther
69a0: 65 20 69 73 20 65 6e 6f 75 67 68 0a 2a 2a 20 73  e is enough.** s
69b0: 70 61 63 65 2e 20 20 54 68 69 73 20 72 6f 75 74  pace.  This rout
69c0: 69 6e 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 66  ine will never f
69d0: 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ail..**.** If th
69e0: 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20  e page contains 
69f0: 6e 42 79 74 65 73 20 6f 66 20 66 72 65 65 20 73  nBytes of free s
6a00: 70 61 63 65 20 62 75 74 20 64 6f 65 73 20 6e 6f  pace but does no
6a10: 74 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6e 42 79  t contain.** nBy
6a20: 74 65 73 20 6f 66 20 63 6f 6e 74 69 67 75 6f 75  tes of contiguou
6a30: 73 20 66 72 65 65 20 73 70 61 63 65 2c 20 74 68  s free space, th
6a40: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
6a50: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a  automatically.**
6a60: 20 63 61 6c 6c 73 20 64 65 66 72 61 67 65 6d 65   calls defrageme
6a70: 6e 74 50 61 67 65 28 29 20 74 6f 20 63 6f 6e 73  ntPage() to cons
6a80: 6f 6c 69 64 61 74 65 20 61 6c 6c 20 66 72 65 65  olidate all free
6a90: 20 73 70 61 63 65 20 62 65 66 6f 72 65 20 0a 2a   space before .*
6aa0: 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20 74 68 65  * allocating the
6ab0: 20 6e 65 77 20 63 68 75 6e 6b 2e 0a 2a 2f 0a 73   new chunk..*/.s
6ac0: 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61  tatic int alloca
6ad0: 74 65 53 70 61 63 65 28 4d 65 6d 50 61 67 65 20  teSpace(MemPage 
6ae0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 6e 42 79 74  *pPage, int nByt
6af0: 65 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20  e){.  int addr, 
6b00: 70 63 2c 20 68 64 72 3b 0a 20 20 69 6e 74 20 73  pc, hdr;.  int s
6b10: 69 7a 65 3b 0a 20 20 69 6e 74 20 6e 46 72 61 67  ize;.  int nFrag
6b20: 3b 0a 20 20 69 6e 74 20 74 6f 70 3b 0a 20 20 69  ;.  int top;.  i
6b30: 6e 74 20 6e 43 65 6c 6c 3b 0a 20 20 69 6e 74 20  nt nCell;.  int 
6b40: 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 75 6e  cellOffset;.  un
6b50: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
6b60: 61 3b 0a 20 20 0a 20 20 64 61 74 61 20 3d 20 70  a;.  .  data = p
6b70: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 61  Page->aData;.  a
6b80: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
6b90: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
6ba0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
6bb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
6bc0: 65 2d 3e 70 42 74 20 29 3b 0a 20 20 61 73 73 65  e->pBt );.  asse
6bd0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
6be0: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
6bf0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
6c00: 73 73 65 72 74 28 20 6e 42 79 74 65 3e 3d 30 20  ssert( nByte>=0 
6c10: 29 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63  );  /* Minimum c
6c20: 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20 2a 2f  ell size is 4 */
6c30: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
6c40: 2d 3e 6e 46 72 65 65 3e 3d 6e 42 79 74 65 20 29  ->nFree>=nByte )
6c50: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
6c60: 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
6c70: 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
6c80: 65 20 2d 3d 20 28 75 31 36 29 6e 42 79 74 65 3b  e -= (u16)nByte;
6c90: 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e  .  hdr = pPage->
6ca0: 68 64 72 4f 66 66 73 65 74 3b 0a 0a 20 20 6e 46  hdrOffset;..  nF
6cb0: 72 61 67 20 3d 20 64 61 74 61 5b 68 64 72 2b 37  rag = data[hdr+7
6cc0: 5d 3b 0a 20 20 69 66 28 20 6e 46 72 61 67 3c 36  ];.  if( nFrag<6
6cd0: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72  0 ){.    /* Sear
6ce0: 63 68 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  ch the freelist 
6cf0: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 73 6c  looking for a sl
6d00: 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  ot big enough to
6d10: 20 73 61 74 69 73 66 79 20 74 68 65 0a 20 20 20   satisfy the.   
6d20: 20 2a 2a 20 73 70 61 63 65 20 72 65 71 75 65 73   ** space reques
6d30: 74 2e 20 2a 2f 0a 20 20 20 20 61 64 64 72 20 3d  t. */.    addr =
6d40: 20 68 64 72 2b 31 3b 0a 20 20 20 20 77 68 69 6c   hdr+1;.    whil
6d50: 65 28 20 28 70 63 20 3d 20 67 65 74 32 62 79 74  e( (pc = get2byt
6d60: 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29 3e  e(&data[addr]))>
6d70: 30 20 29 7b 0a 20 20 20 20 20 20 73 69 7a 65 20  0 ){.      size 
6d80: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
6d90: 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  [pc+2]);.      i
6da0: 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65 20 29  f( size>=nByte )
6db0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 78 20  {.        int x 
6dc0: 3d 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a  = size - nByte;.
6dd0: 20 20 20 20 20 20 20 20 69 66 28 20 73 69 7a 65          if( size
6de0: 3c 6e 42 79 74 65 2b 34 20 29 7b 0a 20 20 20 20  <nByte+4 ){.    
6df0: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61        memcpy(&da
6e00: 74 61 5b 61 64 64 72 5d 2c 20 26 64 61 74 61 5b  ta[addr], &data[
6e10: 70 63 5d 2c 20 32 29 3b 0a 20 20 20 20 20 20 20  pc], 2);.       
6e20: 20 20 20 64 61 74 61 5b 68 64 72 2b 37 5d 20 3d     data[hdr+7] =
6e30: 20 28 75 38 29 28 6e 46 72 61 67 20 2b 20 78 29   (u8)(nFrag + x)
6e40: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
6e50: 72 6e 20 70 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn pc;.        }
6e60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
6e70: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
6e80: 63 2b 32 5d 2c 20 78 29 3b 0a 20 20 20 20 20 20  c+2], x);.      
6e90: 20 20 20 20 72 65 74 75 72 6e 20 70 63 20 2b 20      return pc + 
6ea0: 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  x;.        }.   
6eb0: 20 20 20 7d 0a 20 20 20 20 20 20 61 64 64 72 20     }.      addr 
6ec0: 3d 20 70 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = pc;.    }.  }.
6ed0: 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d  .  /* Allocate m
6ee0: 65 6d 6f 72 79 20 66 72 6f 6d 20 74 68 65 20 67  emory from the g
6ef0: 61 70 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68  ap in between th
6f00: 65 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61  e cell pointer a
6f10: 72 72 61 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68  rray.  ** and th
6f20: 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61  e cell content a
6f30: 72 65 61 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20  rea..  */.  top 
6f40: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
6f50: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6e 43 65 6c  [hdr+5]);.  nCel
6f60: 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  l = get2byte(&da
6f70: 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 63 65  ta[hdr+3]);.  ce
6f80: 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  llOffset = pPage
6f90: 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20  ->cellOffset;.  
6fa0: 69 66 28 20 6e 46 72 61 67 3e 3d 36 30 20 7c 7c  if( nFrag>=60 ||
6fb0: 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a   cellOffset + 2*
6fc0: 6e 43 65 6c 6c 20 3e 20 74 6f 70 20 2d 20 6e 42  nCell > top - nB
6fd0: 79 74 65 20 29 7b 0a 20 20 20 20 64 65 66 72 61  yte ){.    defra
6fe0: 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29  gmentPage(pPage)
6ff0: 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32  ;.    top = get2
7000: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
7010: 5d 29 3b 0a 20 20 7d 0a 20 20 74 6f 70 20 2d 3d  ]);.  }.  top -=
7020: 20 6e 42 79 74 65 3b 0a 20 20 61 73 73 65 72 74   nByte;.  assert
7030: 28 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32  ( cellOffset + 2
7040: 2a 6e 43 65 6c 6c 20 3c 3d 20 74 6f 70 20 29 3b  *nCell <= top );
7050: 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74  .  put2byte(&dat
7060: 61 5b 68 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a  a[hdr+5], top);.
7070: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
7080: 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
7090: 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
70a0: 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 74 6f  ) );.  return to
70b0: 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  p;.}../*.** Retu
70c0: 72 6e 20 61 20 73 65 63 74 69 6f 6e 20 6f 66 20  rn a section of 
70d0: 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61  the pPage->aData
70e0: 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
70f0: 2e 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62  ..** The first b
7100: 79 74 65 20 6f 66 20 74 68 65 20 6e 65 77 20 66  yte of the new f
7110: 72 65 65 20 62 6c 6f 63 6b 20 69 73 20 70 50 61  ree block is pPa
7120: 67 65 2d 3e 61 44 69 73 6b 5b 73 74 61 72 74 5d  ge->aDisk[start]
7130: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 73 69 7a 65  .** and the size
7140: 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 20 69 73   of the block is
7150: 20 22 73 69 7a 65 22 20 62 79 74 65 73 2e 0a 2a   "size" bytes..*
7160: 2a 0a 2a 2a 20 4d 6f 73 74 20 6f 66 20 74 68 65  *.** Most of the
7170: 20 65 66 66 6f 72 74 20 68 65 72 65 20 69 73 20   effort here is 
7180: 69 6e 76 6f 6c 76 65 64 20 69 6e 20 63 6f 61 6c  involved in coal
7190: 65 73 69 6e 67 20 61 64 6a 61 63 65 6e 74 0a 2a  esing adjacent.*
71a0: 2a 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 69 6e  * free blocks in
71b0: 74 6f 20 61 20 73 69 6e 67 6c 65 20 62 69 67 20  to a single big 
71c0: 66 72 65 65 20 62 6c 6f 63 6b 2e 0a 2a 2f 0a 73  free block..*/.s
71d0: 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 53 70  tatic int freeSp
71e0: 61 63 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ace(MemPage *pPa
71f0: 67 65 2c 20 69 6e 74 20 73 74 61 72 74 2c 20 69  ge, int start, i
7200: 6e 74 20 73 69 7a 65 29 7b 0a 20 20 69 6e 74 20  nt size){.  int 
7210: 61 64 64 72 2c 20 70 62 65 67 69 6e 2c 20 68 64  addr, pbegin, hd
7220: 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  r;.  unsigned ch
7230: 61 72 20 2a 64 61 74 61 20 3d 20 70 50 61 67 65  ar *data = pPage
7240: 2d 3e 61 44 61 74 61 3b 0a 0a 20 20 61 73 73 65  ->aData;..  asse
7250: 72 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d  rt( pPage->pBt!=
7260: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
7270: 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
7280: 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44  teable(pPage->pD
7290: 62 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65  bPage) );.  asse
72a0: 72 74 28 20 73 74 61 72 74 3e 3d 70 50 61 67 65  rt( start>=pPage
72b0: 2d 3e 68 64 72 4f 66 66 73 65 74 2b 36 2b 28 70  ->hdrOffset+6+(p
72c0: 50 61 67 65 2d 3e 6c 65 61 66 3f 30 3a 34 29 20  Page->leaf?0:4) 
72d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 73 74  );.  assert( (st
72e0: 61 72 74 20 2b 20 73 69 7a 65 29 3c 3d 70 50 61  art + size)<=pPa
72f0: 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ge->pBt->usableS
7300: 69 7a 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ize );.  assert(
7310: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
7320: 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
7330: 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65  mutex) );.  asse
7340: 72 74 28 20 73 69 7a 65 3e 3d 30 20 29 3b 20 20  rt( size>=0 );  
7350: 20 2f 2a 20 4d 69 6e 69 6d 75 6d 20 63 65 6c 6c   /* Minimum cell
7360: 20 73 69 7a 65 20 69 73 20 34 20 2a 2f 0a 0a 23   size is 4 */..#
7370: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43  ifdef SQLITE_SEC
7380: 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20  URE_DELETE.  /* 
7390: 4f 76 65 72 77 72 69 74 65 20 64 65 6c 65 74 65  Overwrite delete
73a0: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69  d information wi
73b0: 74 68 20 7a 65 72 6f 73 20 77 68 65 6e 20 74 68  th zeros when th
73c0: 65 20 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  e SECURE_DELETE 
73d0: 0a 20 20 2a 2a 20 6f 70 74 69 6f 6e 20 69 73 20  .  ** option is 
73e0: 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
73f0: 6c 65 2d 74 69 6d 65 20 2a 2f 0a 20 20 6d 65 6d  le-time */.  mem
7400: 73 65 74 28 26 64 61 74 61 5b 73 74 61 72 74 5d  set(&data[start]
7410: 2c 20 30 2c 20 73 69 7a 65 29 3b 0a 23 65 6e 64  , 0, size);.#end
7420: 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65  if..  /* Add the
7430: 20 73 70 61 63 65 20 62 61 63 6b 20 69 6e 74 6f   space back into
7440: 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
7450: 20 6f 66 20 66 72 65 65 62 6c 6f 63 6b 73 20 2a   of freeblocks *
7460: 2f 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65 2d  /.  hdr = pPage-
7470: 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20 61 64  >hdrOffset;.  ad
7480: 64 72 20 3d 20 68 64 72 20 2b 20 31 3b 0a 20 20  dr = hdr + 1;.  
7490: 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d  while( (pbegin =
74a0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
74b0: 61 64 64 72 5d 29 29 3c 73 74 61 72 74 20 26 26  addr]))<start &&
74c0: 20 70 62 65 67 69 6e 3e 30 20 29 7b 0a 20 20 20   pbegin>0 ){.   
74d0: 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e 3c   assert( pbegin<
74e0: 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61  =pPage->pBt->usa
74f0: 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20 20  bleSize-4 );.   
7500: 20 69 66 28 20 70 62 65 67 69 6e 3c 3d 61 64 64   if( pbegin<=add
7510: 72 20 29 20 7b 0a 20 20 20 20 20 20 72 65 74 75  r ) {.      retu
7520: 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
7530: 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
7540: 20 20 61 64 64 72 20 3d 20 70 62 65 67 69 6e 3b    addr = pbegin;
7550: 0a 20 20 7d 0a 20 20 69 66 20 28 20 70 62 65 67  .  }.  if ( pbeg
7560: 69 6e 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  in>pPage->pBt->u
7570: 73 61 62 6c 65 53 69 7a 65 2d 34 20 29 20 7b 0a  sableSize-4 ) {.
7580: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7590: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
75a0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 62    }.  assert( pb
75b0: 65 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70 62 65  egin>addr || pbe
75c0: 67 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75 74 32  gin==0 );.  put2
75d0: 62 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d  byte(&data[addr]
75e0: 2c 20 73 74 61 72 74 29 3b 0a 20 20 70 75 74 32  , start);.  put2
75f0: 62 79 74 65 28 26 64 61 74 61 5b 73 74 61 72 74  byte(&data[start
7600: 5d 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20 70 75  ], pbegin);.  pu
7610: 74 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61  t2byte(&data[sta
7620: 72 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a 20 20  rt+2], size);.  
7630: 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b 3d 20  pPage->nFree += 
7640: 28 75 31 36 29 73 69 7a 65 3b 0a 0a 20 20 2f 2a  (u16)size;..  /*
7650: 20 43 6f 61 6c 65 73 63 65 20 61 64 6a 61 63 65   Coalesce adjace
7660: 6e 74 20 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a  nt free blocks *
7670: 2f 0a 20 20 61 64 64 72 20 3d 20 70 50 61 67 65  /.  addr = pPage
7680: 2d 3e 68 64 72 4f 66 66 73 65 74 20 2b 20 31 3b  ->hdrOffset + 1;
7690: 0a 20 20 77 68 69 6c 65 28 20 28 70 62 65 67 69  .  while( (pbegi
76a0: 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  n = get2byte(&da
76b0: 74 61 5b 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a  ta[addr]))>0 ){.
76c0: 20 20 20 20 69 6e 74 20 70 6e 65 78 74 2c 20 70      int pnext, p
76d0: 73 69 7a 65 2c 20 78 3b 0a 20 20 20 20 61 73 73  size, x;.    ass
76e0: 65 72 74 28 20 70 62 65 67 69 6e 3e 61 64 64 72  ert( pbegin>addr
76f0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
7700: 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d 3e 70  pbegin<=pPage->p
7710: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 34  Bt->usableSize-4
7720: 20 29 3b 0a 20 20 20 20 70 6e 65 78 74 20 3d 20   );.    pnext = 
7730: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
7740: 62 65 67 69 6e 5d 29 3b 0a 20 20 20 20 70 73 69  begin]);.    psi
7750: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ze = get2byte(&d
7760: 61 74 61 5b 70 62 65 67 69 6e 2b 32 5d 29 3b 0a  ata[pbegin+2]);.
7770: 20 20 20 20 69 66 28 20 70 62 65 67 69 6e 20 2b      if( pbegin +
7780: 20 70 73 69 7a 65 20 2b 20 33 20 3e 3d 20 70 6e   psize + 3 >= pn
7790: 65 78 74 20 26 26 20 70 6e 65 78 74 3e 30 20 29  ext && pnext>0 )
77a0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 72 61 67  {.      int frag
77b0: 20 3d 20 70 6e 65 78 74 20 2d 20 28 70 62 65 67   = pnext - (pbeg
77c0: 69 6e 2b 70 73 69 7a 65 29 3b 0a 20 20 20 20 20  in+psize);.     
77d0: 20 69 66 28 20 28 66 72 61 67 3c 30 29 20 7c 7c   if( (frag<0) ||
77e0: 20 28 66 72 61 67 3e 28 69 6e 74 29 64 61 74 61   (frag>(int)data
77f0: 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
7800: 74 2b 37 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  t+7]) ){.       
7810: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
7820: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
7830: 20 20 20 7d 0a 20 20 20 20 20 20 64 61 74 61 5b     }.      data[
7840: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
7850: 2b 37 5d 20 2d 3d 20 28 75 38 29 66 72 61 67 3b  +7] -= (u8)frag;
7860: 0a 20 20 20 20 20 20 78 20 3d 20 67 65 74 32 62  .      x = get2b
7870: 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 5d  yte(&data[pnext]
7880: 29 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79 74  );.      put2byt
7890: 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d 2c  e(&data[pbegin],
78a0: 20 78 29 3b 0a 20 20 20 20 20 20 78 20 3d 20 70   x);.      x = p
78b0: 6e 65 78 74 20 2b 20 67 65 74 32 62 79 74 65 28  next + get2byte(
78c0: 26 64 61 74 61 5b 70 6e 65 78 74 2b 32 5d 29 20  &data[pnext+2]) 
78d0: 2d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20 20 20  - pbegin;.      
78e0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
78f0: 62 65 67 69 6e 2b 32 5d 2c 20 78 29 3b 0a 20 20  begin+2], x);.  
7900: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
7910: 64 64 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20  ddr = pbegin;.  
7920: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
7930: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
7940: 74 20 61 72 65 61 20 62 65 67 69 6e 73 20 77 69  t area begins wi
7950: 74 68 20 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20  th a freeblock, 
7960: 72 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20  remove it. */.  
7970: 69 66 28 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d  if( data[hdr+1]=
7980: 3d 64 61 74 61 5b 68 64 72 2b 35 5d 20 26 26 20  =data[hdr+5] && 
7990: 64 61 74 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74  data[hdr+2]==dat
79a0: 61 5b 68 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20  a[hdr+6] ){.    
79b0: 69 6e 74 20 74 6f 70 3b 0a 20 20 20 20 70 62 65  int top;.    pbe
79c0: 67 69 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26  gin = get2byte(&
79d0: 64 61 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20  data[hdr+1]);.  
79e0: 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 68    memcpy(&data[h
79f0: 64 72 2b 31 5d 2c 20 26 64 61 74 61 5b 70 62 65  dr+1], &data[pbe
7a00: 67 69 6e 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f  gin], 2);.    to
7a10: 70 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  p = get2byte(&da
7a20: 74 61 5b 68 64 72 2b 35 5d 29 20 2b 20 67 65 74  ta[hdr+5]) + get
7a30: 32 62 79 74 65 28 26 64 61 74 61 5b 70 62 65 67  2byte(&data[pbeg
7a40: 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 70 75 74 32  in+2]);.    put2
7a50: 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
7a60: 5d 2c 20 74 6f 70 29 3b 0a 20 20 7d 0a 20 20 61  ], top);.  }.  a
7a70: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
7a80: 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
7a90: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
7aa0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
7ab0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
7ac0: 65 63 6f 64 65 20 74 68 65 20 66 6c 61 67 73 20  ecode the flags 
7ad0: 62 79 74 65 20 28 74 68 65 20 66 69 72 73 74 20  byte (the first 
7ae0: 62 79 74 65 20 6f 66 20 74 68 65 20 68 65 61 64  byte of the head
7af0: 65 72 29 20 66 6f 72 20 61 20 70 61 67 65 0a 2a  er) for a page.*
7b00: 2a 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  * and initialize
7b10: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 4d   fields of the M
7b20: 65 6d 50 61 67 65 20 73 74 72 75 63 74 75 72 65  emPage structure
7b30: 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 0a 2a 2a   accordingly..**
7b40: 0a 2a 2a 20 4f 6e 6c 79 20 74 68 65 20 66 6f 6c  .** Only the fol
7b50: 6c 6f 77 69 6e 67 20 63 6f 6d 62 69 6e 61 74 69  lowing combinati
7b60: 6f 6e 73 20 61 72 65 20 73 75 70 70 6f 72 74 65  ons are supporte
7b70: 64 2e 20 20 41 6e 79 74 68 69 6e 67 20 64 69 66  d.  Anything dif
7b80: 66 65 72 65 6e 74 0a 2a 2a 20 69 6e 64 69 63 61  ferent.** indica
7b90: 74 65 73 20 61 20 63 6f 72 72 75 70 74 20 64 61  tes a corrupt da
7ba0: 74 61 62 61 73 65 20 66 69 6c 65 73 3a 0a 2a 2a  tabase files:.**
7bb0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
7bc0: 5a 45 52 4f 44 41 54 41 0a 2a 2a 20 20 20 20 20  ZERODATA.**     
7bd0: 20 20 20 20 50 54 46 5f 5a 45 52 4f 44 41 54 41      PTF_ZERODATA
7be0: 20 7c 20 50 54 46 5f 4c 45 41 46 0a 2a 2a 20 20   | PTF_LEAF.**  
7bf0: 20 20 20 20 20 20 20 50 54 46 5f 4c 45 41 46 44         PTF_LEAFD
7c00: 41 54 41 20 7c 20 50 54 46 5f 49 4e 54 4b 45 59  ATA | PTF_INTKEY
7c10: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
7c20: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
7c30: 4e 54 4b 45 59 20 7c 20 50 54 46 5f 4c 45 41 46  NTKEY | PTF_LEAF
7c40: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
7c50: 65 63 6f 64 65 46 6c 61 67 73 28 4d 65 6d 50 61  ecodeFlags(MemPa
7c60: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
7c70: 6c 61 67 42 79 74 65 29 7b 0a 20 20 42 74 53 68  lagByte){.  BtSh
7c80: 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20 2f  ared *pBt;     /
7c90: 2a 20 41 20 63 6f 70 79 20 6f 66 20 70 50 61 67  * A copy of pPag
7ca0: 65 2d 3e 70 42 74 20 2a 2f 0a 0a 20 20 61 73 73  e->pBt */..  ass
7cb0: 65 72 74 28 20 70 50 61 67 65 2d 3e 68 64 72 4f  ert( pPage->hdrO
7cc0: 66 66 73 65 74 3d 3d 28 70 50 61 67 65 2d 3e 70  ffset==(pPage->p
7cd0: 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20 3a 20 30  gno==1 ? 100 : 0
7ce0: 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  ) );.  assert( s
7cf0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
7d00: 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
7d10: 74 65 78 29 20 29 3b 0a 20 20 70 50 61 67 65 2d  tex) );.  pPage-
7d20: 3e 6c 65 61 66 20 3d 20 28 75 38 29 28 66 6c 61  >leaf = (u8)(fla
7d30: 67 42 79 74 65 3e 3e 33 29 3b 20 20 61 73 73 65  gByte>>3);  asse
7d40: 72 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20  rt( PTF_LEAF == 
7d50: 31 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79  1<<3 );.  flagBy
7d60: 74 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b  te &= ~PTF_LEAF;
7d70: 0a 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50  .  pPage->childP
7d80: 74 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61  trSize = 4-4*pPa
7d90: 67 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 42 74 20  ge->leaf;.  pBt 
7da0: 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20  = pPage->pBt;.  
7db0: 69 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50  if( flagByte==(P
7dc0: 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54  TF_LEAFDATA | PT
7dd0: 46 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20  F_INTKEY) ){.   
7de0: 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d   pPage->intKey =
7df0: 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68   1;.    pPage->h
7e00: 61 73 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e  asData = pPage->
7e10: 6c 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d  leaf;.    pPage-
7e20: 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d  >maxLocal = pBt-
7e30: 3e 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50  >maxLeaf;.    pP
7e40: 61 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  age->minLocal = 
7e50: 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20  pBt->minLeaf;.  
7e60: 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79  }else if( flagBy
7e70: 74 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41  te==PTF_ZERODATA
7e80: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69   ){.    pPage->i
7e90: 6e 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70  ntKey = 0;.    p
7ea0: 50 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20  Page->hasData = 
7eb0: 30 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61  0;.    pPage->ma
7ec0: 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61  xLocal = pBt->ma
7ed0: 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67  xLocal;.    pPag
7ee0: 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42  e->minLocal = pB
7ef0: 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d  t->minLocal;.  }
7f00: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
7f10: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
7f20: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75  BKPT;.  }.  retu
7f30: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
7f40: 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
7f50: 65 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20  e the auxiliary 
7f60: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
7f70: 61 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a  a disk block..**
7f80: 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
7f90: 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e  E_OK on success.
7fa0: 20 20 49 66 20 77 65 20 73 65 65 20 74 68 61 74    If we see that
7fb0: 20 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a   the page does.*
7fc0: 2a 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20  * not contain a 
7fd0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61  well-formed data
7fe0: 62 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20  base page, then 
7ff0: 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54  return .** SQLIT
8000: 45 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65  E_CORRUPT.  Note
8010: 20 74 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f   that a return o
8020: 66 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73  f SQLITE_OK does
8030: 20 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65   not.** guarante
8040: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
8050: 69 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20  is well-formed. 
8060: 20 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74   It only shows t
8070: 68 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64  hat.** we failed
8080: 20 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63   to detect any c
8090: 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e  orruption..*/.in
80a0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  t sqlite3BtreeIn
80b0: 69 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a  itPage(MemPage *
80c0: 70 50 61 67 65 29 7b 0a 0a 20 20 61 73 73 65 72  pPage){..  asser
80d0: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30  t( pPage->pBt!=0
80e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
80f0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
8100: 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
8110: 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ex) );.  assert(
8120: 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71   pPage->pgno==sq
8130: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75  lite3PagerPagenu
8140: 6d 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50  mber(pPage->pDbP
8150: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
8160: 28 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74  ( pPage == sqlit
8170: 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28  e3PagerGetExtra(
8180: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
8190: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
81a0: 67 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c  ge->aData == sql
81b0: 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61  ite3PagerGetData
81c0: 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
81d0: 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67   );..  if( !pPag
81e0: 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20  e->isInit ){.   
81f0: 20 75 31 36 20 70 63 3b 20 20 20 20 20 20 20 20   u16 pc;        
8200: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
8210: 66 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69  f a freeblock wi
8220: 74 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74  thin pPage->aDat
8230: 61 5b 5d 20 2a 2f 0a 20 20 20 20 75 38 20 68 64  a[] */.    u8 hd
8240: 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r;            /*
8250: 20 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e   Offset to begin
8260: 6e 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61  ning of page hea
8270: 64 65 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a 64  der */.    u8 *d
8280: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ata;          /*
8290: 20 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d   Equal to pPage-
82a0: 3e 61 44 61 74 61 20 2a 2f 0a 20 20 20 20 42 74  >aData */.    Bt
82b0: 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20  Shared *pBt;    
82c0: 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
82d0: 62 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20  btree structure 
82e0: 2a 2f 0a 20 20 20 20 75 31 36 20 75 73 61 62 6c  */.    u16 usabl
82f0: 65 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f  eSize;    /* Amo
8300: 75 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70  unt of usable sp
8310: 61 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65  ace on each page
8320: 20 2a 2f 0a 20 20 20 20 75 31 36 20 63 65 6c 6c   */.    u16 cell
8330: 4f 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66  Offset;    /* Of
8340: 66 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20  fset from start 
8350: 6f 66 20 70 61 67 65 20 74 6f 20 66 69 72 73 74  of page to first
8360: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
8370: 0a 20 20 20 20 75 31 36 20 6e 46 72 65 65 3b 20  .    u16 nFree; 
8380: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
8390: 72 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65  r of unused byte
83a0: 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f  s on the page */
83b0: 0a 20 20 20 20 75 31 36 20 74 6f 70 3b 20 20 20  .    u16 top;   
83c0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
83d0: 20 62 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c   byte of the cel
83e0: 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a  l content area *
83f0: 2f 0a 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61  /..    pBt = pPa
8400: 67 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64  ge->pBt;..    hd
8410: 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66  r = pPage->hdrOf
8420: 66 73 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d  fset;.    data =
8430: 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20   pPage->aData;. 
8440: 20 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61     if( decodeFla
8450: 67 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68  gs(pPage, data[h
8460: 64 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51  dr]) ) return SQ
8470: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
8480: 54 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  T;.    assert( p
8490: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31  Bt->pageSize>=51
84a0: 32 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69  2 && pBt->pageSi
84b0: 7a 65 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20 20  ze<=32768 );.   
84c0: 20 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65   pPage->maskPage
84d0: 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65   = pBt->pageSize
84e0: 20 2d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d   - 1;.    pPage-
84f0: 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a  >nOverflow = 0;.
8500: 20 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d      usableSize =
8510: 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
8520: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c  ;.    pPage->cel
8530: 6c 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66  lOffset = cellOf
8540: 66 73 65 74 20 3d 20 68 64 72 20 2b 20 31 32 20  fset = hdr + 12 
8550: 2d 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b  - 4*pPage->leaf;
8560: 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62  .    top = get2b
8570: 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
8580: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43  );.    pPage->nC
8590: 65 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26  ell = get2byte(&
85a0: 64 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20  data[hdr+3]);.  
85b0: 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65    if( pPage->nCe
85c0: 6c 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20  ll>MX_CELL(pBt) 
85d0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d  ){.      /* To m
85e0: 61 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20  any cells for a 
85f0: 73 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68  single page.  Th
8600: 65 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63  e page must be c
8610: 6f 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 20 20  orrupt */.      
8620: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
8630: 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
8640: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6f 6d 70  }.  .    /* Comp
8650: 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72  ute the total fr
8660: 65 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20  ee space on the 
8670: 70 61 67 65 20 2a 2f 0a 20 20 20 20 70 63 20 3d  page */.    pc =
8680: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
8690: 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72  hdr+1]);.    nFr
86a0: 65 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d  ee = data[hdr+7]
86b0: 20 2b 20 74 6f 70 20 2d 20 28 63 65 6c 6c 4f 66   + top - (cellOf
86c0: 66 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e  fset + 2*pPage->
86d0: 6e 43 65 6c 6c 29 3b 0a 20 20 20 20 77 68 69 6c  nCell);.    whil
86e0: 65 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 20  e( pc>0 ){.     
86f0: 20 75 31 36 20 6e 65 78 74 2c 20 73 69 7a 65 3b   u16 next, size;
8700: 0a 20 20 20 20 20 20 69 66 28 20 70 63 3e 75 73  .      if( pc>us
8710: 61 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20  ableSize-4 ){.  
8720: 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c        /* Free bl
8730: 6f 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20 70  ock is off the p
8740: 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  age */.        r
8750: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
8760: 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20  RUPT_BKPT; .    
8770: 20 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d    }.      next =
8780: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
8790: 70 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65  pc]);.      size
87a0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
87b0: 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20  a[pc+2]);.      
87c0: 69 66 28 20 6e 65 78 74 3e 30 20 26 26 20 6e 65  if( next>0 && ne
87d0: 78 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29 7b  xt<=pc+size+3 ){
87e0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65  .        /* Free
87f0: 20 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20   blocks must be 
8800: 69 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64  in accending ord
8810: 65 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  er */.        re
8820: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
8830: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20  UPT_BKPT; .     
8840: 20 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20 2b   }.      nFree +
8850: 3d 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 63  = size;.      pc
8860: 20 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20   = next;.    }. 
8870: 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
8880: 3d 20 28 75 31 36 29 6e 46 72 65 65 3b 0a 20 20  = (u16)nFree;.  
8890: 20 20 69 66 28 20 6e 46 72 65 65 3e 3d 75 73 61    if( nFree>=usa
88a0: 62 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  bleSize ){.     
88b0: 20 2f 2a 20 46 72 65 65 20 73 70 61 63 65 20 63   /* Free space c
88c0: 61 6e 6e 6f 74 20 65 78 63 65 65 64 20 74 6f 74  annot exceed tot
88d0: 61 6c 20 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a  al page size */.
88e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
88f0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
8900: 3b 20 0a 20 20 20 20 7d 0a 0a 23 69 66 20 30 0a  ; .    }..#if 0.
8910: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
8920: 61 6c 6c 20 74 68 65 20 6f 66 66 73 65 74 73 20  all the offsets 
8930: 69 6e 20 74 68 65 20 63 65 6c 6c 20 6f 66 66 73  in the cell offs
8940: 65 74 20 61 72 72 61 79 20 61 72 65 20 77 69 74  et array are wit
8950: 68 69 6e 20 72 61 6e 67 65 2e 20 0a 20 20 2a 2a  hin range. .  **
8960: 20 0a 20 20 2a 2a 20 4f 6d 69 74 74 69 6e 67 20   .  ** Omitting 
8970: 74 68 69 73 20 63 6f 6e 73 69 73 74 65 6e 63 79  this consistency
8980: 20 63 68 65 63 6b 20 61 6e 64 20 75 73 69 6e 67   check and using
8990: 20 74 68 65 20 70 50 61 67 65 2d 3e 6d 61 73 6b   the pPage->mask
89a0: 50 61 67 65 20 6d 61 73 6b 0a 20 20 2a 2a 20 74  Page mask.  ** t
89b0: 6f 20 70 72 65 76 65 6e 74 20 6f 76 65 72 72 75  o prevent overru
89c0: 6e 6e 69 6e 67 20 74 68 65 20 70 61 67 65 20 62  nning the page b
89d0: 75 66 66 65 72 20 69 6e 20 66 69 6e 64 43 65 6c  uffer in findCel
89e0: 6c 28 29 20 72 65 73 75 6c 74 73 20 69 6e 20 61  l() results in a
89f0: 0a 20 20 2a 2a 20 32 2e 35 25 20 70 65 72 66 6f  .  ** 2.5% perfo
8a00: 72 6d 61 6e 63 65 20 67 61 69 6e 2e 0a 20 20 2a  rmance gain..  *
8a10: 2f 0a 20 20 7b 0a 20 20 20 20 75 38 20 2a 70 4f  /.  {.    u8 *pO
8a20: 66 66 3b 20 20 20 20 20 20 20 20 2f 2a 20 49 74  ff;        /* It
8a30: 65 72 61 74 6f 72 20 75 73 65 64 20 74 6f 20 63  erator used to c
8a40: 68 65 63 6b 20 61 6c 6c 20 63 65 6c 6c 20 6f 66  heck all cell of
8a50: 66 73 65 74 73 20 61 72 65 20 69 6e 20 72 61 6e  fsets are in ran
8a60: 67 65 20 2a 2f 0a 20 20 20 20 75 38 20 2a 70 45  ge */.    u8 *pE
8a70: 6e 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 50 6f  nd;        /* Po
8a80: 69 6e 74 65 72 20 74 6f 20 65 6e 64 20 6f 66 20  inter to end of 
8a90: 63 65 6c 6c 20 6f 66 66 73 65 74 20 61 72 72 61  cell offset arra
8aa0: 79 20 2a 2f 0a 20 20 20 20 75 38 20 6d 61 73 6b  y */.    u8 mask
8ab0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 73  ;         /* Mas
8ac0: 6b 20 6f 66 20 62 69 74 73 20 74 68 61 74 20 6d  k of bits that m
8ad0: 75 73 74 20 62 65 20 7a 65 72 6f 20 69 6e 20 4d  ust be zero in M
8ae0: 53 42 20 6f 66 20 63 65 6c 6c 20 6f 66 66 73 65  SB of cell offse
8af0: 74 73 20 2a 2f 0a 20 20 20 20 6d 61 73 6b 20 3d  ts */.    mask =
8b00: 20 7e 28 28 28 75 38 29 28 70 42 74 2d 3e 70 61   ~(((u8)(pBt->pa
8b10: 67 65 53 69 7a 65 3e 3e 38 29 29 2d 31 29 3b 0a  geSize>>8))-1);.
8b20: 20 20 20 20 70 45 6e 64 20 3d 20 26 64 61 74 61      pEnd = &data
8b30: 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 70 50  [cellOffset + pP
8b40: 61 67 65 2d 3e 6e 43 65 6c 6c 2a 32 5d 3b 0a 20  age->nCell*2];. 
8b50: 20 20 20 66 6f 72 28 70 4f 66 66 3d 26 64 61 74     for(pOff=&dat
8b60: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 5d 3b 20 70  a[cellOffset]; p
8b70: 4f 66 66 21 3d 70 45 6e 64 20 26 26 20 21 28 28  Off!=pEnd && !((
8b80: 2a 70 4f 66 66 29 26 6d 61 73 6b 29 3b 20 70 4f  *pOff)&mask); pO
8b90: 66 66 2b 3d 32 29 3b 0a 20 20 20 20 69 66 28 20  ff+=2);.    if( 
8ba0: 70 4f 66 66 21 3d 70 45 6e 64 20 29 7b 0a 20 20  pOff!=pEnd ){.  
8bb0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
8bc0: 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
8bd0: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
8be0: 0a 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49  ..    pPage->isI
8bf0: 6e 69 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72  nit = 1;.  }.  r
8c00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8c10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75 70  .}../*.** Set up
8c20: 20 61 20 72 61 77 20 70 61 67 65 20 73 6f 20 74   a raw page so t
8c30: 68 61 74 20 69 74 20 6c 6f 6f 6b 73 20 6c 69 6b  hat it looks lik
8c40: 65 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  e a database pag
8c50: 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 6e 6f 20  e holding.** no 
8c60: 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a 73 74 61 74  entries..*/.stat
8c70: 69 63 20 76 6f 69 64 20 7a 65 72 6f 50 61 67 65  ic void zeroPage
8c80: 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c  (MemPage *pPage,
8c90: 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 75   int flags){.  u
8ca0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61  nsigned char *da
8cb0: 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  ta = pPage->aDat
8cc0: 61 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  a;.  BtShared *p
8cd0: 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
8ce0: 0a 20 20 75 38 20 68 64 72 20 3d 20 70 50 61 67  .  u8 hdr = pPag
8cf0: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
8d00: 75 31 36 20 66 69 72 73 74 3b 0a 0a 20 20 61 73  u16 first;..  as
8d10: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
8d20: 65 72 50 61 67 65 6e 75 6d 62 65 72 28 70 50 61  erPagenumber(pPa
8d30: 67 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50  ge->pDbPage)==pP
8d40: 61 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 61  age->pgno );.  a
8d50: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
8d60: 67 65 72 47 65 74 45 78 74 72 61 28 70 50 61 67  gerGetExtra(pPag
8d70: 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20 28  e->pDbPage) == (
8d80: 76 6f 69 64 2a 29 70 50 61 67 65 20 29 3b 0a 20  void*)pPage );. 
8d90: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8da0: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
8db0: 67 65 2d 3e 70 44 62 50 61 67 65 29 20 3d 3d 20  ge->pDbPage) == 
8dc0: 64 61 74 61 20 29 3b 0a 20 20 61 73 73 65 72 74  data );.  assert
8dd0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
8de0: 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
8df0: 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 61  >pDbPage) );.  a
8e00: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
8e10: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
8e20: 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 6d 65 6d  utex) );.  /*mem
8e30: 73 65 74 28 26 64 61 74 61 5b 68 64 72 5d 2c 20  set(&data[hdr], 
8e40: 30 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  0, pBt->usableSi
8e50: 7a 65 20 2d 20 68 64 72 29 3b 2a 2f 0a 20 20 64  ze - hdr);*/.  d
8e60: 61 74 61 5b 68 64 72 5d 20 3d 20 28 63 68 61 72  ata[hdr] = (char
8e70: 29 66 6c 61 67 73 3b 0a 20 20 66 69 72 73 74 20  )flags;.  first 
8e80: 3d 20 68 64 72 20 2b 20 38 20 2b 20 34 2a 28 28  = hdr + 8 + 4*((
8e90: 66 6c 61 67 73 26 50 54 46 5f 4c 45 41 46 29 3d  flags&PTF_LEAF)=
8ea0: 3d 30 20 3f 31 3a 30 29 3b 0a 20 20 6d 65 6d 73  =0 ?1:0);.  mems
8eb0: 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  et(&data[hdr+1],
8ec0: 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68   0, 4);.  data[h
8ed0: 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74  dr+7] = 0;.  put
8ee0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
8ef0: 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  5], pBt->usableS
8f00: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
8f10: 46 72 65 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Free = pBt->usab
8f20: 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74 3b 0a  leSize - first;.
8f30: 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50    decodeFlags(pP
8f40: 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  age, flags);.  p
8f50: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
8f60: 3d 20 68 64 72 3b 0a 20 20 70 50 61 67 65 2d 3e  = hdr;.  pPage->
8f70: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72  cellOffset = fir
8f80: 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76  st;.  pPage->nOv
8f90: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73  erflow = 0;.  as
8fa0: 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53  sert( pBt->pageS
8fb0: 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d  ize>=512 && pBt-
8fc0: 3e 70 61 67 65 53 69 7a 65 3c 3d 33 32 37 36 38  >pageSize<=32768
8fd0: 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73   );.  pPage->mas
8fe0: 6b 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 61 67  kPage = pBt->pag
8ff0: 65 53 69 7a 65 20 2d 20 31 3b 0a 20 20 70 50 61  eSize - 1;.  pPa
9000: 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20  ge->nCell = 0;. 
9010: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
9020: 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f   1;.}.../*.** Co
9030: 6e 76 65 72 74 20 61 20 44 62 50 61 67 65 20 6f  nvert a DbPage o
9040: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65  btained from the
9050: 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65   pager into a Me
9060: 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a  mPage used by.**
9070: 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
9080: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50  ..*/.static MemP
9090: 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 46 72  age *btreePageFr
90a0: 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67 65 20  omDbPage(DbPage 
90b0: 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70  *pDbPage, Pgno p
90c0: 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70  gno, BtShared *p
90d0: 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
90e0: 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
90f0: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
9100: 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b  tExtra(pDbPage);
9110: 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  .  pPage->aData 
9120: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
9130: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
9140: 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65    pPage->pDbPage
9150: 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70 50   = pDbPage;.  pP
9160: 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  age->pBt = pBt;.
9170: 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20    pPage->pgno = 
9180: 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68  pgno;.  pPage->h
9190: 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  drOffset = pPage
91a0: 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20  ->pgno==1 ? 100 
91b0: 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  : 0;.  return pP
91c0: 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  age; .}../*.** G
91d0: 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
91e0: 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69  he pager.  Initi
91f0: 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67  alize the MemPag
9200: 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d  e.pBt and.** Mem
9210: 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65  Page.aData eleme
9220: 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a  nts if needed..*
9230: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f  *.** If the noCo
9240: 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73 65  ntent flag is se
9250: 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
9260: 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
9270: 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e  about.** the con
9280: 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
9290: 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20   at this time.  
92a0: 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20  So do not go to 
92b0: 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66  the disk.** to f
92c0: 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  etch the content
92d0: 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20  .  Just fill in 
92e0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68  the content with
92f0: 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a   zeros for now..
9300: 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75 74  ** If in the fut
9310: 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69  ure we call sqli
9320: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
9330: 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74 68  on this page, th
9340: 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68  at.** means we h
9350: 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20 62  ave started to b
9360: 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75  e concerned abou
9370: 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68  t content and th
9380: 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73  e disk.** read s
9390: 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74  hould occur at t
93a0: 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e  hat point..*/.in
93b0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
93c0: 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
93d0: 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a  d *pBt,       /*
93e0: 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
93f0: 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
9400: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
9410: 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65  f the page to fe
9420: 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  tch */.  MemPage
9430: 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
9440: 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
9450: 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74   in this paramet
9460: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f  er */.  int noCo
9470: 6e 74 65 6e 74 20 20 20 20 20 20 20 20 2f 2a 20  ntent        /* 
9480: 44 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67 65  Do not load page
9490: 20 63 6f 6e 74 65 6e 74 20 69 66 20 74 72 75 65   content if true
94a0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
94b0: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
94c0: 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ge;..  assert( s
94d0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
94e0: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
94f0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
9500: 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74 2d  agerAcquire(pBt-
9510: 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28  >pPager, pgno, (
9520: 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67  DbPage**)&pDbPag
9530: 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20  e, noContent);. 
9540: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
9550: 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d   rc;.  *ppPage =
9560: 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62   btreePageFromDb
9570: 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67  Page(pDbPage, pg
9580: 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75  no, pBt);.  retu
9590: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
95a0: 0a 2f 2a 0a 2a 2a 20 52 65 74 72 69 65 76 65 20  ./*.** Retrieve 
95b0: 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
95c0: 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 66 20  pager cache. If 
95d0: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  the requested pa
95e0: 67 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 61 6c 72  ge is not.** alr
95f0: 65 61 64 79 20 69 6e 20 74 68 65 20 70 61 67 65  eady in the page
9600: 72 20 63 61 63 68 65 20 72 65 74 75 72 6e 20 4e  r cache return N
9610: 55 4c 4c 2e 20 49 6e 69 74 69 61 6c 69 7a 65 20  ULL. Initialize 
9620: 74 68 65 20 4d 65 6d 50 61 67 65 2e 70 42 74 20  the MemPage.pBt 
9630: 61 6e 64 0a 2a 2a 20 4d 65 6d 50 61 67 65 2e 61  and.** MemPage.a
9640: 44 61 74 61 20 65 6c 65 6d 65 6e 74 73 20 69 66  Data elements if
9650: 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
9660: 69 63 20 4d 65 6d 50 61 67 65 20 2a 62 74 72 65  ic MemPage *btre
9670: 65 50 61 67 65 4c 6f 6f 6b 75 70 28 42 74 53 68  ePageLookup(BtSh
9680: 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f 20  ared *pBt, Pgno 
9690: 70 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20  pgno){.  DbPage 
96a0: 2a 70 44 62 50 61 67 65 3b 0a 20 20 61 73 73 65  *pDbPage;.  asse
96b0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
96c0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
96d0: 78 29 20 29 3b 0a 20 20 70 44 62 50 61 67 65 20  x) );.  pDbPage 
96e0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
96f0: 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72  okup(pBt->pPager
9700: 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
9710: 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65  DbPage ){.    re
9720: 74 75 72 6e 20 62 74 72 65 65 50 61 67 65 46 72  turn btreePageFr
9730: 6f 6d 44 62 50 61 67 65 28 70 44 62 50 61 67 65  omDbPage(pDbPage
9740: 2c 20 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20  , pgno, pBt);.  
9750: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
9760: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
9770: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
9780: 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70  tabase file in p
9790: 61 67 65 73 2e 20 49 66 20 74 68 65 72 65 20 69  ages. If there i
97a0: 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 0a 2a 2a  s any kind of.**
97b0: 20 65 72 72 6f 72 2c 20 72 65 74 75 72 6e 20 28   error, return (
97c0: 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 2d 31  (unsigned int)-1
97d0: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 6e  )..*/.static Pgn
97e0: 6f 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  o pagerPagecount
97f0: 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b  (BtShared *pBt){
9800: 0a 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 2d  .  int nPage = -
9810: 31 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  1;.  int rc;.  a
9820: 73 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67  ssert( pBt->pPag
9830: 65 31 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  e1 );.  rc = sql
9840: 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
9850: 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
9860: 26 6e 50 61 67 65 29 3b 0a 20 20 61 73 73 65 72  &nPage);.  asser
9870: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
9880: 20 7c 7c 20 6e 50 61 67 65 3d 3d 2d 31 20 29 3b   || nPage==-1 );
9890: 0a 20 20 72 65 74 75 72 6e 20 28 50 67 6e 6f 29  .  return (Pgno)
98a0: 6e 50 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nPage;.}../*.** 
98b0: 47 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20  Get a page from 
98c0: 74 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 6e  the pager and in
98d0: 69 74 69 61 6c 69 7a 65 20 69 74 2e 20 20 54 68  itialize it.  Th
98e0: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73  is routine.** is
98f0: 20 6a 75 73 74 20 61 20 63 6f 6e 76 65 6e 69 65   just a convenie
9900: 6e 63 65 20 77 72 61 70 70 65 72 20 61 72 6f 75  nce wrapper arou
9910: 6e 64 20 73 65 70 61 72 61 74 65 20 63 61 6c 6c  nd separate call
9920: 73 20 74 6f 0a 2a 2a 20 73 71 6c 69 74 65 33 42  s to.** sqlite3B
9930: 74 72 65 65 47 65 74 50 61 67 65 28 29 20 61 6e  treeGetPage() an
9940: 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  d sqlite3BtreeIn
9950: 69 74 50 61 67 65 28 29 2e 0a 2a 2f 0a 73 74 61  itPage()..*/.sta
9960: 74 69 63 20 69 6e 74 20 67 65 74 41 6e 64 49 6e  tic int getAndIn
9970: 69 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  itPage(.  BtShar
9980: 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 20  ed *pBt,        
9990: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
99a0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f  e file */.  Pgno
99b0: 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20   pgno,          
99c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 68   /* Number of th
99d0: 65 20 70 61 67 65 20 74 6f 20 67 65 74 20 2a 2f  e page to get */
99e0: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50  .  MemPage **ppP
99f0: 61 67 65 20 20 20 20 20 2f 2a 20 57 72 69 74 65  age     /* Write
9a00: 20 74 68 65 20 70 61 67 65 20 70 6f 69 6e 74 65   the page pointe
9a10: 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  r here */.){.  i
9a20: 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
9a30: 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65   *pPage;..  asse
9a40: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
9a50: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
9a60: 78 29 20 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f  x) );.  if( pgno
9a70: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
9a80: 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
9a90: 5f 42 4b 50 54 3b 20 0a 20 20 7d 0a 0a 20 20 2f  _BKPT; .  }..  /
9aa0: 2a 20 49 74 20 69 73 20 6f 66 74 65 6e 20 74 68  * It is often th
9ab0: 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65 20  e case that the 
9ac0: 70 61 67 65 20 77 65 20 77 61 6e 74 20 69 73 20  page we want is 
9ad0: 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65  already in cache
9ae0: 2e 0a 20 20 2a 2a 20 49 66 20 73 6f 2c 20 67 65  ..  ** If so, ge
9af0: 74 20 69 74 20 64 69 72 65 63 74 6c 79 2e 20 20  t it directly.  
9b00: 54 68 69 73 20 73 61 76 65 73 20 75 73 20 66 72  This saves us fr
9b10: 6f 6d 20 68 61 76 69 6e 67 20 74 6f 20 63 61 6c  om having to cal
9b20: 6c 0a 20 20 2a 2a 20 70 61 67 65 72 50 61 67 65  l.  ** pagerPage
9b30: 63 6f 75 6e 74 28 29 20 74 6f 20 6d 61 6b 65 20  count() to make 
9b40: 73 75 72 65 20 70 67 6e 6f 20 69 73 20 77 69 74  sure pgno is wit
9b50: 68 69 6e 20 6c 69 6d 69 74 73 2c 20 77 68 69 63  hin limits, whic
9b60: 68 20 72 65 73 75 6c 74 73 0a 20 20 2a 2a 20 69  h results.  ** i
9b70: 6e 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65 20  n a measureable 
9b80: 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72  performance impr
9b90: 6f 76 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20  ovements..  */. 
9ba0: 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65   *ppPage = pPage
9bb0: 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f 6b   = btreePageLook
9bc0: 75 70 28 70 42 74 2c 20 70 67 6e 6f 29 3b 0a 20  up(pBt, pgno);. 
9bd0: 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20 20   if( pPage ){.  
9be0: 20 20 2f 2a 20 50 61 67 65 20 69 73 20 61 6c 72    /* Page is alr
9bf0: 65 61 64 79 20 69 6e 20 63 61 63 68 65 20 2a 2f  eady in cache */
9c00: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
9c10: 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
9c20: 20 20 2f 2a 20 50 61 67 65 20 6e 6f 74 20 69 6e    /* Page not in
9c30: 20 63 61 63 68 65 2e 20 20 41 63 71 75 69 72 65   cache.  Acquire
9c40: 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   it. */.    if( 
9c50: 70 67 6e 6f 3e 70 61 67 65 72 50 61 67 65 63 6f  pgno>pagerPageco
9c60: 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
9c70: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9c80: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
9c90: 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
9ca0: 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
9cb0: 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20 70 70 50  e(pBt, pgno, ppP
9cc0: 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  age, 0);.    if(
9cd0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
9ce0: 0a 20 20 20 20 70 50 61 67 65 20 3d 20 2a 70 70  .    pPage = *pp
9cf0: 50 61 67 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Page;.  }.  if( 
9d00: 21 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29  !pPage->isInit )
9d10: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
9d20: 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
9d30: 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 69 66  pPage);.  }.  if
9d40: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
9d50: 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  ){.    releasePa
9d60: 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 2a  ge(pPage);.    *
9d70: 70 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 7d 0a  ppPage = 0;.  }.
9d80: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
9d90: 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20  /*.** Release a 
9da0: 4d 65 6d 50 61 67 65 2e 20 20 54 68 69 73 20 73  MemPage.  This s
9db0: 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20  hould be called 
9dc0: 6f 6e 63 65 20 66 6f 72 20 65 61 63 68 20 70 72  once for each pr
9dd0: 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 73  ior.** call to s
9de0: 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
9df0: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
9e00: 69 64 20 72 65 6c 65 61 73 65 50 61 67 65 28 4d  id releasePage(M
9e10: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
9e20: 20 20 69 66 28 20 70 50 61 67 65 20 29 7b 0a 20    if( pPage ){. 
9e30: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
9e40: 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c  ->nOverflow==0 |
9e50: 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  | sqlite3PagerPa
9e60: 67 65 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  geRefcount(pPage
9e70: 2d 3e 70 44 62 50 61 67 65 29 3e 31 20 29 3b 0a  ->pDbPage)>1 );.
9e80: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
9e90: 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20  e->aData );.    
9ea0: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
9eb0: 42 74 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Bt );.    assert
9ec0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
9ed0: 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44  tExtra(pPage->pD
9ee0: 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a  bPage) == (void*
9ef0: 29 70 50 61 67 65 20 29 3b 0a 20 20 20 20 61 73  )pPage );.    as
9f00: 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
9f10: 65 72 47 65 74 44 61 74 61 28 70 50 61 67 65 2d  erGetData(pPage-
9f20: 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65  >pDbPage)==pPage
9f30: 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20 20 61  ->aData );.    a
9f40: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
9f50: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
9f60: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
9f70: 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
9f80: 55 6e 72 65 66 28 70 50 61 67 65 2d 3e 70 44 62  Unref(pPage->pDb
9f90: 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Page);.  }.}../*
9fa0: 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72 6f 6c  .** During a rol
9fb0: 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68 65 20  lback, when the 
9fc0: 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20 69 6e  pager reloads in
9fd0: 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f 20 74  formation into t
9fe0: 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f 20 74  he cache.** so t
9ff0: 68 61 74 20 74 68 65 20 63 61 63 68 65 20 69 73  hat the cache is
a000: 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
a010: 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
a020: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a  at the start of.
a030: 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
a040: 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70 61 67  on, for each pag
a050: 65 20 72 65 73 74 6f 72 65 64 20 74 68 69 73 20  e restored this 
a060: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
a070: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  d..**.** This ro
a080: 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f 20 72  utine needs to r
a090: 65 73 65 74 20 74 68 65 20 65 78 74 72 61 20 64  eset the extra d
a0a0: 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74 20 74  ata section at t
a0b0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a  he end of the.**
a0c0: 20 70 61 67 65 20 74 6f 20 61 67 72 65 65 20 77   page to agree w
a0d0: 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64  ith the restored
a0e0: 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   data..*/.static
a0f0: 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e 69 74   void pageReinit
a100: 28 44 62 50 61 67 65 20 2a 70 44 61 74 61 29 7b  (DbPage *pData){
a110: 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
a120: 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28 4d 65  e;.  pPage = (Me
a130: 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65 33 50  mPage *)sqlite3P
a140: 61 67 65 72 47 65 74 45 78 74 72 61 28 70 44 61  agerGetExtra(pDa
a150: 74 61 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ta);.  if( pPage
a160: 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20  ->isInit ){.    
a170: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
a180: 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
a190: 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
a1a0: 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e  .    pPage->isIn
a1b0: 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  it = 0;.    if( 
a1c0: 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
a1d0: 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61 29 3e  Refcount(pData)>
a1e0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
a1f0: 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
a200: 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
a210: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  }.}../*.** Invok
a220: 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
a230: 65 72 20 66 6f 72 20 61 20 62 74 72 65 65 2e 0a  er for a btree..
a240: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
a250: 72 65 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e  reeInvokeBusyHan
a260: 64 6c 65 72 28 76 6f 69 64 20 2a 70 41 72 67 29  dler(void *pArg)
a270: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
a280: 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70  t = (BtShared*)p
a290: 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Arg;.  assert( p
a2a0: 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65  Bt->db );.  asse
a2b0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
a2c0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e  x_held(pBt->db->
a2d0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75  mutex) );.  retu
a2e0: 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  rn sqlite3Invoke
a2f0: 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74  BusyHandler(&pBt
a300: 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65  ->db->busyHandle
a310: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  r);.}../*.** Ope
a320: 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
a330: 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e  e..** .** zFilen
a340: 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
a350: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
a360: 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e  file.  If zFilen
a370: 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 61  ame is NULL.** a
a380: 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 77 69   new database wi
a390: 74 68 20 61 20 72 61 6e 64 6f 6d 20 6e 61 6d 65  th a random name
a3a0: 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68   is created.  Th
a3b0: 69 73 20 72 61 6e 64 6f 6d 6c 79 20 6e 61 6d 65  is randomly name
a3c0: 64 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  d.** database fi
a3d0: 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74  le will be delet
a3e0: 65 64 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42  ed when sqlite3B
a3f0: 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63  treeClose() is c
a400: 61 6c 6c 65 64 2e 0a 2a 2a 20 49 66 20 7a 46 69  alled..** If zFi
a410: 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
a420: 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d  ry:" then an in-
a430: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
a440: 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68  is created.** th
a450: 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61  at is automatica
a460: 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77 68  lly destroyed wh
a470: 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
a480: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
a490: 74 72 65 65 4f 70 65 6e 28 0a 20 20 63 6f 6e 73  treeOpen(.  cons
a4a0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
a4b0: 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e,  /* Name of t
a4c0: 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69  he file containi
a4d0: 6e 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74  ng the BTree dat
a4e0: 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  abase */.  sqlit
a4f0: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
a500: 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64     /* Associated
a510: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
a520: 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70   */.  Btree **pp
a530: 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a  Btree,        /*
a540: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
a550: 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69  Btree object wri
a560: 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69  tten here */.  i
a570: 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
a580: 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e         /* Option
a590: 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  s */.  int vfsFl
a5a0: 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
a5b0: 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
a5c0: 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65  hrough to sqlite
a5d0: 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
a5e0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  .){.  sqlite3_vf
a5f0: 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 2f 2a  s *pVfs;      /*
a600: 20 54 68 65 20 56 46 53 20 74 6f 20 75 73 65 20   The VFS to use 
a610: 66 6f 72 20 74 68 69 73 20 62 74 72 65 65 20 2a  for this btree *
a620: 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
a630: 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53  t = 0;      /* S
a640: 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74  hared part of bt
a650: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
a660: 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20  .  Btree *p;    
a670: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
a680: 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  ndle to return *
a690: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
a6a0: 49 54 45 5f 4f 4b 3b 0a 20 20 75 38 20 6e 52 65  ITE_OK;.  u8 nRe
a6b0: 73 65 72 76 65 3b 0a 20 20 75 6e 73 69 67 6e 65  serve;.  unsigne
a6c0: 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65 72  d char zDbHeader
a6d0: 5b 31 30 30 5d 3b 0a 0a 20 20 2f 2a 20 53 65 74  [100];..  /* Set
a6e0: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69 73   the variable is
a6f0: 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66 6f  Memdb to true fo
a700: 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  r an in-memory d
a710: 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20 2a  atabase, or .  *
a720: 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66 69  * false for a fi
a730: 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61 73  le-based databas
a740: 65 2e 20 54 68 69 73 20 73 79 6d 62 6f 6c 20 69  e. This symbol i
a750: 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64 20  s only required 
a760: 69 66 0a 20 20 2a 2a 20 65 69 74 68 65 72 20 6f  if.  ** either o
a770: 66 20 74 68 65 20 73 68 61 72 65 64 2d 64 61 74  f the shared-dat
a780: 61 20 6f 72 20 61 75 74 6f 76 61 63 75 75 6d 20  a or autovacuum 
a790: 66 65 61 74 75 72 65 73 20 61 72 65 20 63 6f 6d  features are com
a7a0: 70 69 6c 65 64 20 0a 20 20 2a 2a 20 69 6e 74 6f  piled .  ** into
a7b0: 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 20 20   the library..  
a7c0: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
a7d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
a7e0: 45 44 5f 43 41 43 48 45 29 20 7c 7c 20 21 64 65  ED_CACHE) || !de
a7f0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
a800: 54 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a 20 20  T_AUTOVACUUM).  
a810: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
a820: 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20  IT_MEMORYDB.    
a830: 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d 64  const int isMemd
a840: 62 20 3d 20 30 3b 0a 20 20 23 65 6c 73 65 0a 20  b = 0;.  #else. 
a850: 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d     const int isM
a860: 65 6d 64 62 20 3d 20 7a 46 69 6c 65 6e 61 6d 65  emdb = zFilename
a870: 20 26 26 20 21 73 74 72 63 6d 70 28 7a 46 69 6c   && !strcmp(zFil
a880: 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79 3a  ename, ":memory:
a890: 22 29 3b 0a 20 20 23 65 6e 64 69 66 0a 23 65 6e  ");.  #endif.#en
a8a0: 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 64  dif..  assert( d
a8b0: 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  b!=0 );.  assert
a8c0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
a8d0: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
a8e0: 29 3b 0a 0a 20 20 70 56 66 73 20 3d 20 64 62 2d  );..  pVfs = db-
a8f0: 3e 70 56 66 73 3b 0a 20 20 70 20 3d 20 73 71 6c  >pVfs;.  p = sql
a900: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73  ite3MallocZero(s
a910: 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a 20  izeof(Btree));. 
a920: 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72   if( !p ){.    r
a930: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
a940: 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e 54  EM;.  }.  p->inT
a950: 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e  rans = TRANS_NON
a960: 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62 3b  E;.  p->db = db;
a970: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
a980: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
a990: 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65 66  D_CACHE) && !def
a9a0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
a9b0: 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20 20  _DISKIO).  /*.  
a9c0: 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72 65 65  ** If this Btree
a9d0: 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   is a candidate 
a9e0: 66 6f 72 20 73 68 61 72 65 64 20 63 61 63 68 65  for shared cache
a9f0: 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61 6e  , try to find an
aa00: 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20 42  .  ** existing B
aa10: 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74  tShared object t
aa20: 68 61 74 20 77 65 20 63 61 6e 20 73 68 61 72 65  hat we can share
aa30: 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66 28   with.  */.  if(
aa40: 20 69 73 4d 65 6d 64 62 3d 3d 30 0a 20 20 20 26   isMemdb==0.   &
aa50: 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 53  & (db->flags & S
aa60: 51 4c 49 54 45 5f 56 74 61 62 29 3d 3d 30 0a 20  QLITE_Vtab)==0. 
aa70: 20 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 20 26    && zFilename &
aa80: 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 0a 20  & zFilename[0]. 
aa90: 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
aaa0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
aab0: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
aac0: 65 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ed ){.      int 
aad0: 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  nFullPathname = 
aae0: 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
aaf0: 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +1;.      char *
ab00: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
ab10: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e 46  sqlite3Malloc(nF
ab20: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
ab30: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
ab40: 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b 0a  x *mutexShared;.
ab50: 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62 6c        p->sharabl
ab60: 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 64 62 2d  e = 1;.      db-
ab70: 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45  >flags |= SQLITE
ab80: 5f 53 68 61 72 65 64 43 61 63 68 65 3b 0a 20 20  _SharedCache;.  
ab90: 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61      if( !zFullPa
aba0: 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
abb0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
abc0: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
abd0: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
abe0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
abf0: 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
ac00: 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
ac10: 61 6d 65 2c 20 6e 46 75 6c 6c 50 61 74 68 6e 61  ame, nFullPathna
ac20: 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  me, zFullPathnam
ac30: 65 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 53  e);.      mutexS
ac40: 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33 4d  hared = sqlite3M
ac50: 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
ac60: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 41  _MUTEX_STATIC_MA
ac70: 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71 6c  STER);.      sql
ac80: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
ac90: 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20  (mutexShared);. 
aca0: 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c 4f       for(pBt=GLO
acb0: 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
acc0: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
acd0: 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74 3d  List); pBt; pBt=
ace0: 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  pBt->pNext){.   
acf0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
ad00: 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20 20  ->nRef>0 );.    
ad10: 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63 6d      if( 0==strcm
ad20: 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c  p(zFullPathname,
ad30: 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c   sqlite3PagerFil
ad40: 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67 65  ename(pBt->pPage
ad50: 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  r)).            
ad60: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 50       && sqlite3P
ad70: 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50 61  agerVfs(pBt->pPa
ad80: 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20 20  ger)==pVfs ){.  
ad90: 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20 3d          p->pBt =
ada0: 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20 20   pBt;.          
adb0: 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  pBt->nRef++;.   
adc0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
add0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
ade0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
adf0: 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53  tex_leave(mutexS
ae00: 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73 71  hared);.      sq
ae10: 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c 6c  lite3_free(zFull
ae20: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d  Pathname);.    }
ae30: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
ae40: 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20  EBUG.    else{. 
ae50: 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75 67       /* In debug
ae60: 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20 61   mode, we mark a
ae70: 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64 61  ll persistent da
ae80: 74 61 62 61 73 65 73 20 61 73 20 73 68 61 72 61  tabases as shara
ae90: 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76 65  ble.      ** eve
aea0: 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20  n when they are 
aeb0: 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72 63  not.  This exerc
aec0: 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e 67  ises the locking
aed0: 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20 20   code and.      
aee0: 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f 70  ** gives more op
aef0: 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61 73  portunity for as
af00: 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d 75  serts(sqlite3_mu
af10: 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20 20  tex_held()).    
af20: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20    ** statements 
af30: 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67 20  to find locking 
af40: 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20 20  problems..      
af50: 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72  */.      p->shar
af60: 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  able = 1;.    }.
af70: 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64 69  #endif.  }.#endi
af80: 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20 29  f.  if( pBt==0 )
af90: 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
afa0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  The following as
afb0: 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65 20  serts make sure 
afc0: 74 68 61 74 20 73 74 72 75 63 74 75 72 65 73 20  that structures 
afd0: 75 73 65 64 20 62 79 20 74 68 65 20 62 74 72 65  used by the btre
afe0: 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68 65  e are.    ** the
aff0: 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54 68   right size.  Th
b000: 69 73 20 69 73 20 74 6f 20 67 75 61 72 64 20 61  is is to guard a
b010: 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61 6e  gainst size chan
b020: 67 65 73 20 74 68 61 74 20 72 65 73 75 6c 74 0a  ges that result.
b030: 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d 70      ** when comp
b040: 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66 65  iling on a diffe
b050: 72 65 6e 74 20 61 72 63 68 69 74 65 63 74 75 72  rent architectur
b060: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  e..    */.    as
b070: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36 34  sert( sizeof(i64
b080: 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 69  )==8 || sizeof(i
b090: 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73  64)==4 );.    as
b0a0: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36 34  sert( sizeof(u64
b0b0: 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28 75  )==8 || sizeof(u
b0c0: 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73  64)==4 );.    as
b0d0: 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33 32  sert( sizeof(u32
b0e0: 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73 65  )==4 );.    asse
b0f0: 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29 3d  rt( sizeof(u16)=
b100: 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =2 );.    assert
b110: 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d 3d  ( sizeof(Pgno)==
b120: 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74 20  4 );.  .    pBt 
b130: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
b140: 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42 74  ero( sizeof(*pBt
b150: 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42 74  ) );.    if( pBt
b160: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ==0 ){.      rc 
b170: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
b180: 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
b190: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
b1a0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
b1b0: 33 50 61 67 65 72 4f 70 65 6e 28 70 56 66 73 2c  3PagerOpen(pVfs,
b1c0: 20 26 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a   &pBt->pPager, z
b1d0: 46 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20  Filename,.      
b1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b1f0: 20 20 20 20 45 58 54 52 41 5f 53 49 5a 45 2c 20      EXTRA_SIZE, 
b200: 66 6c 61 67 73 2c 20 76 66 73 46 6c 61 67 73 29  flags, vfsFlags)
b210: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
b220: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
b230: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
b240: 65 72 52 65 61 64 46 69 6c 65 68 65 61 64 65 72  erReadFileheader
b250: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 73 69 7a  (pBt->pPager,siz
b260: 65 6f 66 28 7a 44 62 48 65 61 64 65 72 29 2c 7a  eof(zDbHeader),z
b270: 44 62 48 65 61 64 65 72 29 3b 0a 20 20 20 20 7d  DbHeader);.    }
b280: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
b290: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
b2a0: 67 6f 74 6f 20 62 74 72 65 65 5f 6f 70 65 6e 5f  goto btree_open_
b2b0: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  out;.    }.    s
b2c0: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
b2d0: 73 79 68 61 6e 64 6c 65 72 28 70 42 74 2d 3e 70  syhandler(pBt->p
b2e0: 50 61 67 65 72 2c 20 62 74 72 65 65 49 6e 76 6f  Pager, btreeInvo
b2f0: 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 2c 20 70  keBusyHandler, p
b300: 42 74 29 3b 0a 20 20 20 20 70 2d 3e 70 42 74 20  Bt);.    p->pBt 
b310: 3d 20 70 42 74 3b 0a 20 20 0a 20 20 20 20 73 71  = pBt;.  .    sq
b320: 6c 69 74 65 33 50 61 67 65 72 53 65 74 52 65 69  lite3PagerSetRei
b330: 6e 69 74 65 72 28 70 42 74 2d 3e 70 50 61 67 65  niter(pBt->pPage
b340: 72 2c 20 70 61 67 65 52 65 69 6e 69 74 29 3b 0a  r, pageReinit);.
b350: 20 20 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72      pBt->pCursor
b360: 20 3d 20 30 3b 0a 20 20 20 20 70 42 74 2d 3e 70   = 0;.    pBt->p
b370: 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 70  Page1 = 0;.    p
b380: 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 73  Bt->readOnly = s
b390: 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
b3a0: 64 6f 6e 6c 79 28 70 42 74 2d 3e 70 50 61 67 65  donly(pBt->pPage
b3b0: 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e 70 61 67  r);.    pBt->pag
b3c0: 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65  eSize = get2byte
b3d0: 28 26 7a 44 62 48 65 61 64 65 72 5b 31 36 5d 29  (&zDbHeader[16])
b3e0: 3b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70  ;.    if( pBt->p
b3f0: 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c 20 70  ageSize<512 || p
b400: 42 74 2d 3e 70 61 67 65 53 69 7a 65 3e 53 51 4c  Bt->pageSize>SQL
b410: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
b420: 45 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 28  E.         || ((
b430: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2d 31 29  pBt->pageSize-1)
b440: 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 21  &pBt->pageSize)!
b450: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d  =0 ){.      pBt-
b460: 3e 70 61 67 65 53 69 7a 65 20 3d 20 30 3b 0a 20  >pageSize = 0;. 
b470: 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
b480: 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 42 74  rSetPagesize(pBt
b490: 2d 3e 70 50 61 67 65 72 2c 20 26 70 42 74 2d 3e  ->pPager, &pBt->
b4a0: 70 61 67 65 53 69 7a 65 29 3b 0a 23 69 66 6e 64  pageSize);.#ifnd
b4b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
b4c0: 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
b4d0: 2f 2a 20 49 66 20 74 68 65 20 6d 61 67 69 63 20  /* If the magic 
b4e0: 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  name ":memory:" 
b4f0: 77 69 6c 6c 20 63 72 65 61 74 65 20 61 6e 20 69  will create an i
b500: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
b510: 65 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a  e, then.      **
b520: 20 6c 65 61 76 65 20 74 68 65 20 61 75 74 6f 56   leave the autoV
b530: 61 63 75 75 6d 20 6d 6f 64 65 20 61 74 20 30 20  acuum mode at 0 
b540: 28 64 6f 20 6e 6f 74 20 61 75 74 6f 2d 76 61 63  (do not auto-vac
b550: 75 75 6d 29 2c 20 65 76 65 6e 20 69 66 0a 20 20  uum), even if.  
b560: 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 45      ** SQLITE_DE
b570: 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d  FAULT_AUTOVACUUM
b580: 20 69 73 20 74 72 75 65 2e 20 4f 6e 20 74 68 65   is true. On the
b590: 20 6f 74 68 65 72 20 68 61 6e 64 2c 20 69 66 0a   other hand, if.
b5a0: 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f        ** SQLITE_
b5b0: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 68 61  OMIT_MEMORYDB ha
b5c0: 73 20 62 65 65 6e 20 64 65 66 69 6e 65 64 2c 20  s been defined, 
b5d0: 74 68 65 6e 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  then ":memory:" 
b5e0: 69 73 20 6a 75 73 74 20 61 0a 20 20 20 20 20 20  is just a.      
b5f0: 2a 2a 20 72 65 67 75 6c 61 72 20 66 69 6c 65 2d  ** regular file-
b600: 6e 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61  name. In this ca
b610: 73 65 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  se the auto-vacu
b620: 75 6d 20 61 70 70 6c 69 65 73 20 61 73 20 70 65  um applies as pe
b630: 72 20 6e 6f 72 6d 61 6c 2e 0a 20 20 20 20 20 20  r normal..      
b640: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69  */.      if( zFi
b650: 6c 65 6e 61 6d 65 20 26 26 20 21 69 73 4d 65 6d  lename && !isMem
b660: 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  db ){.        pB
b670: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
b680: 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
b690: 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 31 20 3a  AUTOVACUUM ? 1 :
b6a0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 42 74   0);.        pBt
b6b0: 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
b6c0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
b6d0: 55 54 4f 56 41 43 55 55 4d 3d 3d 32 20 3f 20 31  UTOVACUUM==2 ? 1
b6e0: 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23   : 0);.      }.#
b6f0: 65 6e 64 69 66 0a 20 20 20 20 20 20 6e 52 65 73  endif.      nRes
b700: 65 72 76 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65  erve = 0;.    }e
b710: 6c 73 65 7b 0a 20 20 20 20 20 20 6e 52 65 73 65  lse{.      nRese
b720: 72 76 65 20 3d 20 7a 44 62 48 65 61 64 65 72 5b  rve = zDbHeader[
b730: 32 30 5d 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e  20];.      pBt->
b740: 70 61 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20  pageSizeFixed = 
b750: 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  1;.#ifndef SQLIT
b760: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
b770: 4d 0a 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74  M.      pBt->aut
b780: 6f 56 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62  oVacuum = (get4b
b790: 79 74 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33  yte(&zDbHeader[3
b7a0: 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a  6 + 4*4])?1:0);.
b7b0: 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
b7c0: 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
b7d0: 65 28 26 7a 44 62 48 65 61 64 65 72 5b 33 36 20  e(&zDbHeader[36 
b7e0: 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b 0a 23 65  + 7*4])?1:0);.#e
b7f0: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 70  ndif.    }.    p
b800: 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3d  Bt->usableSize =
b810: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 2d   pBt->pageSize -
b820: 20 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61   nReserve;.    a
b830: 73 73 65 72 74 28 20 28 70 42 74 2d 3e 70 61 67  ssert( (pBt->pag
b840: 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20 29 3b  eSize & 7)==0 );
b850: 20 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69 67    /* 8-byte alig
b860: 6e 6d 65 6e 74 20 6f 66 20 70 61 67 65 53 69 7a  nment of pageSiz
b870: 65 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  e */.    sqlite3
b880: 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
b890: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
b8a0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
b8b0: 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28    .#if !defined(
b8c0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
b8d0: 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
b8e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
b8f0: 54 5f 44 49 53 4b 49 4f 29 0a 20 20 20 20 2f 2a  T_DISKIO).    /*
b900: 20 41 64 64 20 74 68 65 20 6e 65 77 20 42 74 53   Add the new BtS
b910: 68 61 72 65 64 20 6f 62 6a 65 63 74 20 74 6f 20  hared object to 
b920: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
b930: 73 68 61 72 61 62 6c 65 20 42 74 53 68 61 72 65  sharable BtShare
b940: 64 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ds..    */.    i
b950: 66 28 20 70 2d 3e 73 68 61 72 61 62 6c 65 20 29  f( p->sharable )
b960: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
b970: 6d 75 74 65 78 20 2a 6d 75 74 65 78 53 68 61 72  mutex *mutexShar
b980: 65 64 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e  ed;.      pBt->n
b990: 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 20 20 6d  Ref = 1;.      m
b9a0: 75 74 65 78 53 68 61 72 65 64 20 3d 20 73 71 6c  utexShared = sql
b9b0: 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53  ite3MutexAlloc(S
b9c0: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
b9d0: 49 43 5f 4d 41 53 54 45 52 29 3b 0a 20 20 20 20  IC_MASTER);.    
b9e0: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 54 48 52    if( SQLITE_THR
b9f0: 45 41 44 53 41 46 45 20 26 26 20 73 71 6c 69 74  EADSAFE && sqlit
ba00: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
ba10: 43 6f 72 65 4d 75 74 65 78 20 29 7b 0a 20 20 20  CoreMutex ){.   
ba20: 20 20 20 20 20 70 42 74 2d 3e 6d 75 74 65 78 20       pBt->mutex 
ba30: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c  = sqlite3MutexAl
ba40: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
ba50: 5f 46 41 53 54 29 3b 0a 20 20 20 20 20 20 20 20  _FAST);.        
ba60: 69 66 28 20 70 42 74 2d 3e 6d 75 74 65 78 3d 3d  if( pBt->mutex==
ba70: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  0 ){.          r
ba80: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
ba90: 3b 0a 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e  ;.          db->
baa0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30  mallocFailed = 0
bab0: 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
bac0: 20 62 74 72 65 65 5f 6f 70 65 6e 5f 6f 75 74 3b   btree_open_out;
bad0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
bae0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
baf0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
bb00: 65 78 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20  exShared);.     
bb10: 20 70 42 74 2d 3e 70 4e 65 78 74 20 3d 20 47 4c   pBt->pNext = GL
bb20: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
bb30: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
bb40: 65 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 47 4c  eList);.      GL
bb50: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
bb60: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
bb70: 65 4c 69 73 74 29 20 3d 20 70 42 74 3b 0a 20 20  eList) = pBt;.  
bb80: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
bb90: 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 53 68 61  x_leave(mutexSha
bba0: 72 65 64 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  red);.    }.#end
bbb0: 69 66 0a 20 20 7d 0a 0a 23 69 66 20 21 64 65 66  if.  }..#if !def
bbc0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
bbd0: 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 20 26  _SHARED_CACHE) &
bbe0: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
bbf0: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a 20  E_OMIT_DISKIO). 
bc00: 20 2f 2a 20 49 66 20 74 68 65 20 6e 65 77 20 42   /* If the new B
bc10: 74 72 65 65 20 75 73 65 73 20 61 20 73 68 61 72  tree uses a shar
bc20: 61 62 6c 65 20 70 42 74 53 68 61 72 65 64 2c 20  able pBtShared, 
bc30: 74 68 65 6e 20 6c 69 6e 6b 20 74 68 65 20 6e 65  then link the ne
bc40: 77 0a 20 20 2a 2a 20 42 74 72 65 65 20 69 6e 74  w.  ** Btree int
bc50: 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c  o the list of al
bc60: 6c 20 73 68 61 72 61 62 6c 65 20 42 74 72 65 65  l sharable Btree
bc70: 73 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 63  s for the same c
bc80: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20  onnection..  ** 
bc90: 54 68 65 20 6c 69 73 74 20 69 73 20 6b 65 70 74  The list is kept
bca0: 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72   in ascending or
bcb0: 64 65 72 20 62 79 20 70 42 74 20 61 64 64 72 65  der by pBt addre
bcc0: 73 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ss..  */.  if( p
bcd0: 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b 0a 20 20  ->sharable ){.  
bce0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 42 74 72    int i;.    Btr
bcf0: 65 65 20 2a 70 53 69 62 3b 0a 20 20 20 20 66 6f  ee *pSib;.    fo
bd00: 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
bd10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
bd20: 28 20 28 70 53 69 62 20 3d 20 64 62 2d 3e 61 44  ( (pSib = db->aD
bd30: 62 5b 69 5d 2e 70 42 74 29 21 3d 30 20 26 26 20  b[i].pBt)!=0 && 
bd40: 70 53 69 62 2d 3e 73 68 61 72 61 62 6c 65 20 29  pSib->sharable )
bd50: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
bd60: 20 70 53 69 62 2d 3e 70 50 72 65 76 20 29 7b 20   pSib->pPrev ){ 
bd70: 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70 50 72  pSib = pSib->pPr
bd80: 65 76 3b 20 7d 0a 20 20 20 20 20 20 20 20 69 66  ev; }.        if
bd90: 28 20 70 2d 3e 70 42 74 3c 70 53 69 62 2d 3e 70  ( p->pBt<pSib->p
bda0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
bdb0: 70 2d 3e 70 4e 65 78 74 20 3d 20 70 53 69 62 3b  p->pNext = pSib;
bdc0: 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70 50  .          p->pP
bdd0: 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rev = 0;.       
bde0: 20 20 20 70 53 69 62 2d 3e 70 50 72 65 76 20 3d     pSib->pPrev =
bdf0: 20 70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   p;.        }els
be00: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  e{.          whi
be10: 6c 65 28 20 70 53 69 62 2d 3e 70 4e 65 78 74 20  le( pSib->pNext 
be20: 26 26 20 70 53 69 62 2d 3e 70 4e 65 78 74 2d 3e  && pSib->pNext->
be30: 70 42 74 3c 70 2d 3e 70 42 74 20 29 7b 0a 20 20  pBt<p->pBt ){.  
be40: 20 20 20 20 20 20 20 20 20 20 70 53 69 62 20 3d            pSib =
be50: 20 70 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20   pSib->pNext;.  
be60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
be70: 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 70      p->pNext = p
be80: 53 69 62 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Sib->pNext;.    
be90: 20 20 20 20 20 20 70 2d 3e 70 50 72 65 76 20 3d        p->pPrev =
bea0: 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20 20 20   pSib;.         
beb0: 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29 7b   if( p->pNext ){
bec0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
bed0: 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70  pNext->pPrev = p
bee0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
bef0: 20 20 20 20 20 20 20 20 70 53 69 62 2d 3e 70 4e          pSib->pN
bf00: 65 78 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  ext = p;.       
bf10: 20 7d 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b   }.        break
bf20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
bf30: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70    }.#endif.  *pp
bf40: 42 74 72 65 65 20 3d 20 70 3b 0a 0a 62 74 72 65  Btree = p;..btre
bf50: 65 5f 6f 70 65 6e 5f 6f 75 74 3a 0a 20 20 69 66  e_open_out:.  if
bf60: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
bf70: 29 7b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26  ){.    if( pBt &
bf80: 26 20 70 42 74 2d 3e 70 50 61 67 65 72 20 29 7b  & pBt->pPager ){
bf90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
bfa0: 67 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50  gerClose(pBt->pP
bfb0: 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ager);.    }.   
bfc0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
bfd0: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
bfe0: 66 72 65 65 28 70 29 3b 0a 20 20 20 20 2a 70 70  free(p);.    *pp
bff0: 42 74 72 65 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Btree = 0;.  }. 
c000: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
c010: 2a 0a 2a 2a 20 44 65 63 72 65 6d 65 6e 74 20 74  *.** Decrement t
c020: 68 65 20 42 74 53 68 61 72 65 64 2e 6e 52 65 66  he BtShared.nRef
c030: 20 63 6f 75 6e 74 65 72 2e 20 20 57 68 65 6e 20   counter.  When 
c040: 69 74 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2c  it reaches zero,
c050: 0a 2a 2a 20 72 65 6d 6f 76 65 20 74 68 65 20 42  .** remove the B
c060: 74 53 68 61 72 65 64 20 73 74 72 75 63 74 75 72  tShared structur
c070: 65 20 66 72 6f 6d 20 74 68 65 20 73 68 61 72 69  e from the shari
c080: 6e 67 20 6c 69 73 74 2e 20 20 52 65 74 75 72 6e  ng list.  Return
c090: 0a 2a 2a 20 74 72 75 65 20 69 66 20 74 68 65 20  .** true if the 
c0a0: 42 74 53 68 61 72 65 64 2e 6e 52 65 66 20 63 6f  BtShared.nRef co
c0b0: 75 6e 74 65 72 20 72 65 61 63 68 65 73 20 7a 65  unter reaches ze
c0c0: 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  ro and return.**
c0d0: 20 66 61 6c 73 65 20 69 66 20 69 74 20 69 73 20   false if it is 
c0e0: 73 74 69 6c 6c 20 70 6f 73 69 74 69 76 65 2e 0a  still positive..
c0f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
c100: 6d 6f 76 65 46 72 6f 6d 53 68 61 72 69 6e 67 4c  moveFromSharingL
c110: 69 73 74 28 42 74 53 68 61 72 65 64 20 2a 70 42  ist(BtShared *pB
c120: 74 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  t){.#ifndef SQLI
c130: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
c140: 41 43 48 45 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ACHE.  sqlite3_m
c150: 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 0a 20  utex *pMaster;. 
c160: 20 42 74 53 68 61 72 65 64 20 2a 70 4c 69 73 74   BtShared *pList
c170: 3b 0a 20 20 69 6e 74 20 72 65 6d 6f 76 65 64 20  ;.  int removed 
c180: 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
c190: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6e 6f  sqlite3_mutex_no
c1a0: 74 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  theld(pBt->mutex
c1b0: 29 20 29 3b 0a 20 20 70 4d 61 73 74 65 72 20 3d  ) );.  pMaster =
c1c0: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
c1d0: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
c1e0: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 0a  STATIC_MASTER);.
c1f0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
c200: 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a  enter(pMaster);.
c210: 20 20 70 42 74 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pBt->nRef--;. 
c220: 20 69 66 28 20 70 42 74 2d 3e 6e 52 65 66 3c 3d   if( pBt->nRef<=
c230: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 47 4c 4f  0 ){.    if( GLO
c240: 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71  BAL(BtShared*,sq
c250: 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65  lite3SharedCache
c260: 4c 69 73 74 29 3d 3d 70 42 74 20 29 7b 0a 20 20  List)==pBt ){.  
c270: 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53 68 61      GLOBAL(BtSha
c280: 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
c290: 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d 20 70  edCacheList) = p
c2a0: 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  Bt->pNext;.    }
c2b0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4c 69 73  else{.      pLis
c2c0: 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53 68 61  t = GLOBAL(BtSha
c2d0: 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61 72  red*,sqlite3Shar
c2e0: 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a 20 20  edCacheList);.  
c2f0: 20 20 20 20 77 68 69 6c 65 28 20 41 4c 57 41 59      while( ALWAY
c300: 53 28 70 4c 69 73 74 29 20 26 26 20 70 4c 69 73  S(pList) && pLis
c310: 74 2d 3e 70 4e 65 78 74 21 3d 70 42 74 20 29 7b  t->pNext!=pBt ){
c320: 0a 20 20 20 20 20 20 20 20 70 4c 69 73 74 3d 70  .        pList=p
c330: 4c 69 73 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  List->pNext;.   
c340: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 41     }.      if( A
c350: 4c 57 41 59 53 28 70 4c 69 73 74 29 20 29 7b 0a  LWAYS(pList) ){.
c360: 20 20 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 70          pList->p
c370: 4e 65 78 74 20 3d 20 70 42 74 2d 3e 70 4e 65 78  Next = pBt->pNex
c380: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
c390: 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
c3a0: 54 48 52 45 41 44 53 41 46 45 20 29 7b 0a 20 20  THREADSAFE ){.  
c3b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
c3c0: 78 5f 66 72 65 65 28 70 42 74 2d 3e 6d 75 74 65  x_free(pBt->mute
c3d0: 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  x);.    }.    re
c3e0: 6d 6f 76 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 20  moved = 1;.  }. 
c3f0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
c400: 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 20  eave(pMaster);. 
c410: 20 72 65 74 75 72 6e 20 72 65 6d 6f 76 65 64 3b   return removed;
c420: 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20  .#else.  return 
c430: 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  1;.#endif.}../*.
c440: 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 70 42 74  ** Make sure pBt
c450: 2d 3e 70 54 6d 70 53 70 61 63 65 20 70 6f 69 6e  ->pTmpSpace poin
c460: 74 73 20 74 6f 20 61 6e 20 61 6c 6c 6f 63 61 74  ts to an allocat
c470: 69 6f 6e 20 6f 66 20 0a 2a 2a 20 4d 58 5f 43 45  ion of .** MX_CE
c480: 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 62 79 74  LL_SIZE(pBt) byt
c490: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
c4a0: 69 64 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70 53  id allocateTempS
c4b0: 70 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70  pace(BtShared *p
c4c0: 42 74 29 7b 0a 20 20 69 66 28 20 21 70 42 74 2d  Bt){.  if( !pBt-
c4d0: 3e 70 54 6d 70 53 70 61 63 65 20 29 7b 0a 20 20  >pTmpSpace ){.  
c4e0: 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
c4f0: 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61   = sqlite3PageMa
c500: 6c 6c 6f 63 28 20 70 42 74 2d 3e 70 61 67 65 53  lloc( pBt->pageS
c510: 69 7a 65 20 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ize );.  }.}../*
c520: 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 70 42 74  .** Free the pBt
c530: 2d 3e 70 54 6d 70 53 70 61 63 65 20 61 6c 6c 6f  ->pTmpSpace allo
c540: 63 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  cation.*/.static
c550: 20 76 6f 69 64 20 66 72 65 65 54 65 6d 70 53 70   void freeTempSp
c560: 61 63 65 28 42 74 53 68 61 72 65 64 20 2a 70 42  ace(BtShared *pB
c570: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 61 67  t){.  sqlite3Pag
c580: 65 46 72 65 65 28 20 70 42 74 2d 3e 70 54 6d 70  eFree( pBt->pTmp
c590: 53 70 61 63 65 29 3b 0a 20 20 70 42 74 2d 3e 70  Space);.  pBt->p
c5a0: 54 6d 70 53 70 61 63 65 20 3d 20 30 3b 0a 7d 0a  TmpSpace = 0;.}.
c5b0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
c5c0: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 61 6e  open database an
c5d0: 64 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  d invalidate all
c5e0: 20 63 75 72 73 6f 72 73 2e 0a 2a 2f 0a 69 6e 74   cursors..*/.int
c5f0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
c600: 73 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  se(Btree *p){.  
c610: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
c620: 70 2d 3e 70 42 74 3b 0a 20 20 42 74 43 75 72 73  p->pBt;.  BtCurs
c630: 6f 72 20 2a 70 43 75 72 3b 0a 0a 20 20 2f 2a 20  or *pCur;..  /* 
c640: 43 6c 6f 73 65 20 61 6c 6c 20 63 75 72 73 6f 72  Close all cursor
c650: 73 20 6f 70 65 6e 65 64 20 76 69 61 20 74 68 69  s opened via thi
c660: 73 20 68 61 6e 64 6c 65 2e 20 20 2a 2f 0a 20 20  s handle.  */.  
c670: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
c680: 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
c690: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
c6a0: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
c6b0: 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20  p);.  pBt->db = 
c6c0: 70 2d 3e 64 62 3b 0a 20 20 70 43 75 72 20 3d 20  p->db;.  pCur = 
c6d0: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20  pBt->pCursor;.  
c6e0: 77 68 69 6c 65 28 20 70 43 75 72 20 29 7b 0a 20  while( pCur ){. 
c6f0: 20 20 20 42 74 43 75 72 73 6f 72 20 2a 70 54 6d     BtCursor *pTm
c700: 70 20 3d 20 70 43 75 72 3b 0a 20 20 20 20 70 43  p = pCur;.    pC
c710: 75 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74  ur = pCur->pNext
c720: 3b 0a 20 20 20 20 69 66 28 20 70 54 6d 70 2d 3e  ;.    if( pTmp->
c730: 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20  pBtree==p ){.   
c740: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43     sqlite3BtreeC
c750: 6c 6f 73 65 43 75 72 73 6f 72 28 70 54 6d 70 29  loseCursor(pTmp)
c760: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
c770: 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61  * Rollback any a
c780: 63 74 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f  ctive transactio
c790: 6e 20 61 6e 64 20 66 72 65 65 20 74 68 65 20 68  n and free the h
c7a0: 61 6e 64 6c 65 20 73 74 72 75 63 74 75 72 65 2e  andle structure.
c7b0: 0a 20 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74  .  ** The call t
c7c0: 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  o sqlite3BtreeRo
c7d0: 6c 6c 62 61 63 6b 28 29 20 64 72 6f 70 73 20 61  llback() drops a
c7e0: 6e 79 20 74 61 62 6c 65 2d 6c 6f 63 6b 73 20 68  ny table-locks h
c7f0: 65 6c 64 20 62 79 0a 20 20 2a 2a 20 74 68 69 73  eld by.  ** this
c800: 20 68 61 6e 64 6c 65 2e 0a 20 20 2a 2f 0a 20 20   handle..  */.  
c810: 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c 6c  sqlite3BtreeRoll
c820: 62 61 63 6b 28 70 29 3b 0a 20 20 73 71 6c 69 74  back(p);.  sqlit
c830: 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
c840: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20  ..  /* If there 
c850: 61 72 65 20 73 74 69 6c 6c 20 6f 74 68 65 72 20  are still other 
c860: 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66 65  outstanding refe
c870: 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73 68  rences to the sh
c880: 61 72 65 64 2d 62 74 72 65 65 0a 20 20 2a 2a 20  ared-btree.  ** 
c890: 73 74 72 75 63 74 75 72 65 2c 20 72 65 74 75 72  structure, retur
c8a0: 6e 20 6e 6f 77 2e 20 54 68 65 20 72 65 6d 61 69  n now. The remai
c8b0: 6e 64 65 72 20 6f 66 20 74 68 69 73 20 70 72 6f  nder of this pro
c8c0: 63 65 64 75 72 65 20 63 6c 65 61 6e 73 20 0a 20  cedure cleans . 
c8d0: 20 2a 2a 20 75 70 20 74 68 65 20 73 68 61 72 65   ** up the share
c8e0: 64 2d 62 74 72 65 65 2e 0a 20 20 2a 2f 0a 20 20  d-btree..  */.  
c8f0: 61 73 73 65 72 74 28 20 70 2d 3e 77 61 6e 74 54  assert( p->wantT
c900: 6f 4c 6f 63 6b 3d 3d 30 20 26 26 20 70 2d 3e 6c  oLock==0 && p->l
c910: 6f 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66  ocked==0 );.  if
c920: 28 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 7c  ( !p->sharable |
c930: 7c 20 72 65 6d 6f 76 65 46 72 6f 6d 53 68 61 72  | removeFromShar
c940: 69 6e 67 4c 69 73 74 28 70 42 74 29 20 29 7b 0a  ingList(pBt) ){.
c950: 20 20 20 20 2f 2a 20 54 68 65 20 70 42 74 20 69      /* The pBt i
c960: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6f 6e 20 74  s no longer on t
c970: 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2c  he sharing list,
c980: 20 73 6f 20 77 65 20 63 61 6e 20 61 63 63 65 73   so we can acces
c990: 73 0a 20 20 20 20 2a 2a 20 69 74 20 77 69 74 68  s.    ** it with
c9a0: 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 68 6f  out having to ho
c9b0: 6c 64 20 74 68 65 20 6d 75 74 65 78 2e 0a 20 20  ld the mutex..  
c9c0: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 43 6c 65 61    **.    ** Clea
c9d0: 6e 20 6f 75 74 20 61 6e 64 20 64 65 6c 65 74 65  n out and delete
c9e0: 20 74 68 65 20 42 74 53 68 61 72 65 64 20 6f 62   the BtShared ob
c9f0: 6a 65 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ject..    */.   
ca00: 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
ca10: 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 73 71  Cursor );.    sq
ca20: 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65 28  lite3PagerClose(
ca30: 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20  pBt->pPager);.  
ca40: 20 20 69 66 28 20 70 42 74 2d 3e 78 46 72 65 65    if( pBt->xFree
ca50: 53 63 68 65 6d 61 20 26 26 20 70 42 74 2d 3e 70  Schema && pBt->p
ca60: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
ca70: 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
ca80: 28 70 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a  (pBt->pSchema);.
ca90: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
caa0: 33 5f 66 72 65 65 28 70 42 74 2d 3e 70 53 63 68  3_free(pBt->pSch
cab0: 65 6d 61 29 3b 0a 20 20 20 20 66 72 65 65 54 65  ema);.    freeTe
cac0: 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20  mpSpace(pBt);.  
cad0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
cae0: 42 74 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  Bt);.  }..#ifnde
caf0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
cb00: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 61 73 73  ARED_CACHE.  ass
cb10: 65 72 74 28 20 70 2d 3e 77 61 6e 74 54 6f 4c 6f  ert( p->wantToLo
cb20: 63 6b 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ck==0 );.  asser
cb30: 74 28 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30 20  t( p->locked==0 
cb40: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 65  );.  if( p->pPre
cb50: 76 20 29 20 70 2d 3e 70 50 72 65 76 2d 3e 70 4e  v ) p->pPrev->pN
cb60: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
cb70: 20 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 29    if( p->pNext )
cb80: 20 70 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76   p->pNext->pPrev
cb90: 20 3d 20 70 2d 3e 70 50 72 65 76 3b 0a 23 65 6e   = p->pPrev;.#en
cba0: 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66  dif..  sqlite3_f
cbb0: 72 65 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ree(p);.  return
cbc0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
cbd0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
cbe0: 6c 69 6d 69 74 20 6f 6e 20 74 68 65 20 6e 75 6d  limit on the num
cbf0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 61 6c 6c  ber of pages all
cc00: 6f 77 65 64 20 69 6e 20 74 68 65 20 63 61 63 68  owed in the cach
cc10: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  e..**.** The max
cc20: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 63  imum number of c
cc30: 61 63 68 65 20 70 61 67 65 73 20 69 73 20 73 65  ache pages is se
cc40: 74 20 74 6f 20 74 68 65 20 61 62 73 6f 6c 75 74  t to the absolut
cc50: 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6d 78  e.** value of mx
cc60: 50 61 67 65 2e 20 20 49 66 20 6d 78 50 61 67 65  Page.  If mxPage
cc70: 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68   is negative, th
cc80: 65 20 70 61 67 65 72 20 77 69 6c 6c 0a 2a 2a 20  e pager will.** 
cc90: 6f 70 65 72 61 74 65 20 61 73 79 6e 63 68 72 6f  operate asynchro
cca0: 6e 6f 75 73 6c 79 20 2d 20 69 74 20 77 69 6c 6c  nously - it will
ccb0: 20 6e 6f 74 20 73 74 6f 70 20 74 6f 20 64 6f 20   not stop to do 
ccc0: 66 73 79 6e 63 28 29 73 0a 2a 2a 20 74 6f 20 69  fsync()s.** to i
ccd0: 6e 73 75 72 65 20 64 61 74 61 20 69 73 20 77 72  nsure data is wr
cce0: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 69 73  itten to the dis
ccf0: 6b 20 73 75 72 66 61 63 65 20 62 65 66 6f 72 65  k surface before
cd00: 0a 2a 2a 20 63 6f 6e 74 69 6e 75 69 6e 67 2e 20  .** continuing. 
cd10: 20 54 72 61 6e 73 61 63 74 69 6f 6e 73 20 73 74   Transactions st
cd20: 69 6c 6c 20 77 6f 72 6b 20 69 66 20 73 79 6e 63  ill work if sync
cd30: 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c 0a  hronous is off,.
cd40: 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  ** and the datab
cd50: 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f  ase cannot be co
cd60: 72 72 75 70 74 65 64 20 69 66 20 74 68 69 73 20  rrupted if this 
cd70: 70 72 6f 67 72 61 6d 0a 2a 2a 20 63 72 61 73 68  program.** crash
cd80: 65 73 2e 20 20 42 75 74 20 69 66 20 74 68 65 20  es.  But if the 
cd90: 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d  operating system
cda0: 20 63 72 61 73 68 65 73 20 6f 72 20 74 68 65 72   crashes or ther
cdb0: 65 20 69 73 0a 2a 2a 20 61 6e 20 61 62 72 75 70  e is.** an abrup
cdc0: 74 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  t power failure 
cdd0: 77 68 65 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73  when synchronous
cde0: 20 69 73 20 6f 66 66 2c 20 74 68 65 20 64 61 74   is off, the dat
cdf0: 61 62 61 73 65 0a 2a 2a 20 63 6f 75 6c 64 20 62  abase.** could b
ce00: 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
ce10: 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 20 75 6e  onsistent and un
ce20: 72 65 63 6f 76 65 72 61 62 6c 65 20 73 74 61 74  recoverable stat
ce30: 65 2e 0a 2a 2a 20 53 79 6e 63 68 72 6f 6e 6f 75  e..** Synchronou
ce40: 73 20 69 73 20 6f 6e 20 62 79 20 64 65 66 61 75  s is on by defau
ce50: 6c 74 20 73 6f 20 64 61 74 61 62 61 73 65 20 63  lt so database c
ce60: 6f 72 72 75 70 74 69 6f 6e 20 69 73 20 6e 6f 74  orruption is not
ce70: 0a 2a 2a 20 6e 6f 72 6d 61 6c 6c 79 20 61 20 77  .** normally a w
ce80: 6f 72 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  orry..*/.int sql
ce90: 69 74 65 33 42 74 72 65 65 53 65 74 43 61 63 68  ite3BtreeSetCach
cea0: 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70 2c 20  eSize(Btree *p, 
ceb0: 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 42  int mxPage){.  B
cec0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
ced0: 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74 28  ->pBt;.  assert(
cee0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
cef0: 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
cf00: 29 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ) );.  sqlite3Bt
cf10: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 73  reeEnter(p);.  s
cf20: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61  qlite3PagerSetCa
cf30: 63 68 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  chesize(pBt->pPa
cf40: 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
cf50: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
cf60: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  e(p);.  return S
cf70: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
cf80: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 77 61  ** Change the wa
cf90: 79 20 64 61 74 61 20 69 73 20 73 79 6e 63 65 64  y data is synced
cfa0: 20 74 6f 20 64 69 73 6b 20 69 6e 20 6f 72 64 65   to disk in orde
cfb0: 72 20 74 6f 20 69 6e 63 72 65 61 73 65 20 6f 72  r to increase or
cfc0: 20 64 65 63 72 65 61 73 65 0a 2a 2a 20 68 6f 77   decrease.** how
cfd0: 20 77 65 6c 6c 20 74 68 65 20 64 61 74 61 62 61   well the databa
cfe0: 73 65 20 72 65 73 69 73 74 73 20 64 61 6d 61 67  se resists damag
cff0: 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
d000: 68 65 73 20 61 6e 64 20 70 6f 77 65 72 0a 2a 2a  hes and power.**
d010: 20 66 61 69 6c 75 72 65 73 2e 20 20 4c 65 76 65   failures.  Leve
d020: 6c 20 31 20 69 73 20 74 68 65 20 73 61 6d 65 20  l 1 is the same 
d030: 61 73 20 61 73 79 6e 63 68 72 6f 6e 6f 75 73 20  as asynchronous 
d040: 28 6e 6f 20 73 79 6e 63 73 28 29 20 6f 63 63 75  (no syncs() occu
d050: 72 20 61 6e 64 0a 2a 2a 20 74 68 65 72 65 20 69  r and.** there i
d060: 73 20 61 20 68 69 67 68 20 70 72 6f 62 61 62 69  s a high probabi
d070: 6c 69 74 79 20 6f 66 20 64 61 6d 61 67 65 29 20  lity of damage) 
d080: 20 4c 65 76 65 6c 20 32 20 69 73 20 74 68 65 20   Level 2 is the 
d090: 64 65 66 61 75 6c 74 2e 20 20 54 68 65 72 65 0a  default.  There.
d0a0: 2a 2a 20 69 73 20 61 20 76 65 72 79 20 6c 6f 77  ** is a very low
d0b0: 20 62 75 74 20 6e 6f 6e 2d 7a 65 72 6f 20 70 72   but non-zero pr
d0c0: 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d  obability of dam
d0d0: 61 67 65 2e 20 20 4c 65 76 65 6c 20 33 20 72 65  age.  Level 3 re
d0e0: 64 75 63 65 73 20 74 68 65 0a 2a 2a 20 70 72 6f  duces the.** pro
d0f0: 62 61 62 69 6c 69 74 79 20 6f 66 20 64 61 6d 61  bability of dama
d100: 67 65 20 74 6f 20 6e 65 61 72 20 7a 65 72 6f 20  ge to near zero 
d110: 62 75 74 20 77 69 74 68 20 61 20 77 72 69 74 65  but with a write
d120: 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64   performance red
d130: 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 23 69 66 6e 64  uction..*/.#ifnd
d140: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
d150: 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 69 6e 74  AGER_PRAGMAS.int
d160: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
d170: 53 61 66 65 74 79 4c 65 76 65 6c 28 42 74 72 65  SafetyLevel(Btre
d180: 65 20 2a 70 2c 20 69 6e 74 20 6c 65 76 65 6c 2c  e *p, int level,
d190: 20 69 6e 74 20 66 75 6c 6c 53 79 6e 63 29 7b 0a   int fullSync){.
d1a0: 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
d1b0: 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65  = p->pBt;.  asse
d1c0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
d1d0: 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75  x_held(p->db->mu
d1e0: 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
d1f0: 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
d200: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65    sqlite3PagerSe
d210: 74 53 61 66 65 74 79 4c 65 76 65 6c 28 70 42 74  tSafetyLevel(pBt
d220: 2d 3e 70 50 61 67 65 72 2c 20 6c 65 76 65 6c 2c  ->pPager, level,
d230: 20 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71   fullSync);.  sq
d240: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
d250: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  p);.  return SQL
d260: 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
d270: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
d280: 52 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e  RUE if the given
d290: 20 62 74 72 65 65 20 69 73 20 73 65 74 20 74 6f   btree is set to
d2a0: 20 73 61 66 65 74 79 20 6c 65 76 65 6c 20 31 2e   safety level 1.
d2b0: 20 20 49 6e 20 6f 74 68 65 72 0a 2a 2a 20 77 6f    In other.** wo
d2c0: 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45  rds, return TRUE
d2d0: 20 69 66 20 6e 6f 20 73 79 6e 63 28 29 20 6f 63   if no sync() oc
d2e0: 63 75 72 73 20 6f 6e 20 74 68 65 20 64 69 73 6b  curs on the disk
d2f0: 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   files..*/.int s
d300: 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 44  qlite3BtreeSyncD
d310: 69 73 61 62 6c 65 64 28 42 74 72 65 65 20 2a 70  isabled(Btree *p
d320: 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  ){.  BtShared *p
d330: 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69  Bt = p->pBt;.  i
d340: 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
d350: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
d360: 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78  eld(p->db->mutex
d370: 29 20 29 3b 20 20 0a 20 20 73 71 6c 69 74 65 33  ) );  .  sqlite3
d380: 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
d390: 20 61 73 73 65 72 74 28 20 70 42 74 20 26 26 20   assert( pBt && 
d3a0: 70 42 74 2d 3e 70 50 61 67 65 72 20 29 3b 0a 20  pBt->pPager );. 
d3b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
d3c0: 65 72 4e 6f 73 79 6e 63 28 70 42 74 2d 3e 70 50  erNosync(pBt->pP
d3d0: 61 67 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ager);.  sqlite3
d3e0: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
d3f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
d400: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
d410: 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52  TE_OMIT_PAGER_PR
d420: 41 47 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e  AGMAS) || !defin
d430: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
d440: 41 43 55 55 4d 29 0a 2f 2a 0a 2a 2a 20 43 68 61  ACUUM)./*.** Cha
d450: 6e 67 65 20 74 68 65 20 64 65 66 61 75 6c 74 20  nge the default 
d460: 70 61 67 65 73 20 73 69 7a 65 20 61 6e 64 20 74  pages size and t
d470: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73  he number of res
d480: 65 72 76 65 64 20 62 79 74 65 73 20 70 65 72 20  erved bytes per 
d490: 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  page..**.** The 
d4a0: 70 61 67 65 20 73 69 7a 65 20 6d 75 73 74 20 62  page size must b
d4b0: 65 20 61 20 70 6f 77 65 72 20 6f 66 20 32 20 62  e a power of 2 b
d4c0: 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 36  etween 512 and 6
d4d0: 35 35 33 36 2e 20 20 49 66 20 74 68 65 20 70 61  5536.  If the pa
d4e0: 67 65 0a 2a 2a 20 73 69 7a 65 20 73 75 70 70 6c  ge.** size suppl
d4f0: 69 65 64 20 64 6f 65 73 20 6e 6f 74 20 6d 65 65  ied does not mee
d500: 74 20 74 68 69 73 20 63 6f 6e 73 74 72 61 69 6e  t this constrain
d510: 74 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  t then the page 
d520: 73 69 7a 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 63  size is not.** c
d530: 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 50 61  hanged..**.** Pa
d540: 67 65 20 73 69 7a 65 73 20 61 72 65 20 63 6f 6e  ge sizes are con
d550: 73 74 72 61 69 6e 65 64 20 74 6f 20 62 65 20 61  strained to be a
d560: 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 20 73 6f   power of two so
d570: 20 74 68 61 74 20 74 68 65 20 72 65 67 69 6f 6e   that the region
d580: 0a 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61 62  .** of the datab
d590: 61 73 65 20 66 69 6c 65 20 75 73 65 64 20 66 6f  ase file used fo
d5a0: 72 20 6c 6f 63 6b 69 6e 67 20 28 62 65 67 69 6e  r locking (begin
d5b0: 6e 69 6e 67 20 61 74 20 50 45 4e 44 49 4e 47 5f  ning at PENDING_
d5c0: 42 59 54 45 2c 0a 2a 2a 20 74 68 65 20 66 69 72  BYTE,.** the fir
d5d0: 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65  st byte past the
d5e0: 20 31 47 42 20 62 6f 75 6e 64 61 72 79 2c 20 30   1GB boundary, 0
d5f0: 78 34 30 30 30 30 30 30 30 29 20 6e 65 65 64 73  x40000000) needs
d600: 20 74 6f 20 6f 63 63 75 72 0a 2a 2a 20 61 74 20   to occur.** at 
d610: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
d620: 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49   a page..**.** I
d630: 66 20 70 61 72 61 6d 65 74 65 72 20 6e 52 65 73  f parameter nRes
d640: 65 72 76 65 20 69 73 20 6c 65 73 73 20 74 68 61  erve is less tha
d650: 6e 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  n zero, then the
d660: 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 73 65 72   number of reser
d670: 76 65 64 0a 2a 2a 20 62 79 74 65 73 20 70 65 72  ved.** bytes per
d680: 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e   page is left un
d690: 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20  changed..*/.int 
d6a0: 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
d6b0: 61 67 65 53 69 7a 65 28 42 74 72 65 65 20 2a 70  ageSize(Btree *p
d6c0: 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 2c 20  , int pageSize, 
d6d0: 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b 0a 20  int nReserve){. 
d6e0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
d6f0: 5f 4f 4b 3b 0a 20 20 42 74 53 68 61 72 65 64 20  _OK;.  BtShared 
d700: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
d710: 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72 76   assert( nReserv
d720: 65 3e 3d 2d 31 20 26 26 20 6e 52 65 73 65 72 76  e>=-1 && nReserv
d730: 65 3c 3d 32 35 35 20 29 3b 0a 20 20 73 71 6c 69  e<=255 );.  sqli
d740: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
d750: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67  ;.  if( pBt->pag
d760: 65 53 69 7a 65 46 69 78 65 64 20 29 7b 0a 20 20  eSizeFixed ){.  
d770: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
d780: 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75  ave(p);.    retu
d790: 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  rn SQLITE_READON
d7a0: 4c 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52  LY;.  }.  if( nR
d7b0: 65 73 65 72 76 65 3c 30 20 29 7b 0a 20 20 20 20  eserve<0 ){.    
d7c0: 6e 52 65 73 65 72 76 65 20 3d 20 70 42 74 2d 3e  nReserve = pBt->
d7d0: 70 61 67 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e  pageSize - pBt->
d7e0: 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a  usableSize;.  }.
d7f0: 20 20 61 73 73 65 72 74 28 20 6e 52 65 73 65 72    assert( nReser
d800: 76 65 3e 3d 30 20 26 26 20 6e 52 65 73 65 72 76  ve>=0 && nReserv
d810: 65 3c 3d 32 35 35 20 29 3b 0a 20 20 69 66 28 20  e<=255 );.  if( 
d820: 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
d830: 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54   pageSize<=SQLIT
d840: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
d850: 26 26 0a 20 20 20 20 20 20 20 20 28 28 70 61 67  &&.        ((pag
d860: 65 53 69 7a 65 2d 31 29 26 70 61 67 65 53 69 7a  eSize-1)&pageSiz
d870: 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  e)==0 ){.    ass
d880: 65 72 74 28 20 28 70 61 67 65 53 69 7a 65 20 26  ert( (pageSize &
d890: 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73   7)==0 );.    as
d8a0: 73 65 72 74 28 20 21 70 42 74 2d 3e 70 50 61 67  sert( !pBt->pPag
d8b0: 65 31 20 26 26 20 21 70 42 74 2d 3e 70 43 75 72  e1 && !pBt->pCur
d8c0: 73 6f 72 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e  sor );.    pBt->
d8d0: 70 61 67 65 53 69 7a 65 20 3d 20 28 75 31 36 29  pageSize = (u16)
d8e0: 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72  pageSize;.    fr
d8f0: 65 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  eeTempSpace(pBt)
d900: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
d910: 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
d920: 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ze(pBt->pPager, 
d930: 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b  &pBt->pageSize);
d940: 0a 20 20 7d 0a 20 20 70 42 74 2d 3e 75 73 61 62  .  }.  pBt->usab
d950: 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
d960: 67 65 53 69 7a 65 20 2d 20 28 75 31 36 29 6e 52  geSize - (u16)nR
d970: 65 73 65 72 76 65 3b 0a 20 20 73 71 6c 69 74 65  eserve;.  sqlite
d980: 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
d990: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
d9a0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
d9b0: 20 63 75 72 72 65 6e 74 6c 79 20 64 65 66 69 6e   currently defin
d9c0: 65 64 20 70 61 67 65 20 73 69 7a 65 0a 2a 2f 0a  ed page size.*/.
d9d0: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
d9e0: 47 65 74 50 61 67 65 53 69 7a 65 28 42 74 72 65  GetPageSize(Btre
d9f0: 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20  e *p){.  return 
da00: 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  p->pBt->pageSize
da10: 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
da20: 74 72 65 65 47 65 74 52 65 73 65 72 76 65 28 42  treeGetReserve(B
da30: 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
da40: 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  n;.  sqlite3Btre
da50: 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d  eEnter(p);.  n =
da60: 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a   p->pBt->pageSiz
da70: 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75 73 61 62  e - p->pBt->usab
da80: 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c 69 74 65  leSize;.  sqlite
da90: 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
daa0: 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
dab0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 6d 61 78  *.** Set the max
dac0: 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20  imum page count 
dad0: 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 69  for a database i
dae0: 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69  f mxPage is posi
daf0: 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63 68 61 6e  tive..** No chan
db00: 67 65 73 20 61 72 65 20 6d 61 64 65 20 69 66 20  ges are made if 
db10: 6d 78 50 61 67 65 20 69 73 20 30 20 6f 72 20 6e  mxPage is 0 or n
db20: 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52 65 67 61  egative..** Rega
db30: 72 64 6c 65 73 73 20 6f 66 20 74 68 65 20 76 61  rdless of the va
db40: 6c 75 65 20 6f 66 20 6d 78 50 61 67 65 2c 20 72  lue of mxPage, r
db50: 65 74 75 72 6e 20 74 68 65 20 6d 61 78 69 6d 75  eturn the maximu
db60: 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f  m page count..*/
db70: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
db80: 65 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 42 74  eMaxPageCount(Bt
db90: 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
dba0: 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  ge){.  int n;.  
dbb0: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
dbc0: 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73 71 6c 69  r(p);.  n = sqli
dbd0: 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65 43  te3PagerMaxPageC
dbe0: 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e 70 50 61  ount(p->pBt->pPa
dbf0: 67 65 72 2c 20 6d 78 50 61 67 65 29 3b 0a 20 20  ger, mxPage);.  
dc00: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
dc10: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e  e(p);.  return n
dc20: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  ;.}.#endif /* !d
dc30: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
dc40: 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
dc50: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
dc60: 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d  LITE_OMIT_VACUUM
dc70: 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  ) */../*.** Chan
dc80: 67 65 20 74 68 65 20 27 61 75 74 6f 2d 76 61 63  ge the 'auto-vac
dc90: 75 75 6d 27 20 70 72 6f 70 65 72 74 79 20 6f 66  uum' property of
dca0: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
dcb0: 66 20 74 68 65 20 27 61 75 74 6f 56 61 63 75 75  f the 'autoVacuu
dcc0: 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20  m'.** parameter 
dcd0: 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
dce0: 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f  n auto-vacuum mo
dcf0: 64 65 20 69 73 20 65 6e 61 62 6c 65 64 2e 20 49  de is enabled. I
dd00: 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a 20 69 73  f zero, it.** is
dd10: 20 64 69 73 61 62 6c 65 64 2e 20 54 68 65 20 64   disabled. The d
dd20: 65 66 61 75 6c 74 20 76 61 6c 75 65 20 66 6f 72  efault value for
dd30: 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
dd40: 20 70 72 6f 70 65 72 74 79 20 69 73 20 0a 2a 2a   property is .**
dd50: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
dd60: 68 65 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  he SQLITE_DEFAUL
dd70: 54 5f 41 55 54 4f 56 41 43 55 55 4d 20 6d 61 63  T_AUTOVACUUM mac
dd80: 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ro..*/.int sqlit
dd90: 65 33 42 74 72 65 65 53 65 74 41 75 74 6f 56 61  e3BtreeSetAutoVa
dda0: 63 75 75 6d 28 42 74 72 65 65 20 2a 70 2c 20 69  cuum(Btree *p, i
ddb0: 6e 74 20 61 75 74 6f 56 61 63 75 75 6d 29 7b 0a  nt autoVacuum){.
ddc0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
ddd0: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
dde0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
ddf0: 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65 0a 20 20  ADONLY;.#else.  
de00: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
de10: 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63  p->pBt;.  int rc
de20: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
de30: 75 38 20 61 76 20 3d 20 28 75 38 29 61 75 74 6f  u8 av = (u8)auto
de40: 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71 6c 69 74  Vacuum;..  sqlit
de50: 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
de60: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65  .  if( pBt->page
de70: 53 69 7a 65 46 69 78 65 64 20 26 26 20 28 61 76  SizeFixed && (av
de80: 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e 61 75 74   ?1:0)!=pBt->aut
de90: 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72  oVacuum ){.    r
dea0: 63 20 3d 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  c = SQLITE_READO
deb0: 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  NLY;.  }else{.  
dec0: 20 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75    pBt->autoVacuu
ded0: 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a 20 20 20  m = av ?1:0;.   
dee0: 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
def0: 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30 3b 0a 20   = av==2 ?1:0;. 
df00: 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
df10: 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
df20: 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d  urn rc;.#endif.}
df30: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
df40: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
df50: 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72  'auto-vacuum' pr
df60: 6f 70 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d  operty. If auto-
df70: 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e  vacuum is .** en
df80: 61 62 6c 65 64 20 31 20 69 73 20 72 65 74 75 72  abled 1 is retur
df90: 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30  ned. Otherwise 0
dfa0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
dfb0: 42 74 72 65 65 47 65 74 41 75 74 6f 56 61 63 75  BtreeGetAutoVacu
dfc0: 75 6d 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69  um(Btree *p){.#i
dfd0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
dfe0: 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65  _AUTOVACUUM.  re
dff0: 74 75 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56  turn BTREE_AUTOV
e000: 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73  ACUUM_NONE;.#els
e010: 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  e.  int rc;.  sq
e020: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
e030: 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20  p);.  rc = (.   
e040: 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56   (!p->pBt->autoV
e050: 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54  acuum)?BTREE_AUT
e060: 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20  OVACUUM_NONE:.  
e070: 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72    (!p->pBt->incr
e080: 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55  Vacuum)?BTREE_AU
e090: 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20  TOVACUUM_FULL:. 
e0a0: 20 20 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43     BTREE_AUTOVAC
e0b0: 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20  UUM_INCR.  );.  
e0c0: 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
e0d0: 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
e0e0: 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a  c;.#endif.}.../*
e0f0: 0a 2a 2a 20 47 65 74 20 61 20 72 65 66 65 72 65  .** Get a refere
e100: 6e 63 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66  nce to pPage1 of
e110: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
e120: 6c 65 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a  le.  This will.*
e130: 2a 20 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61  * also acquire a
e140: 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61   readlock on tha
e150: 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51  t file..**.** SQ
e160: 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
e170: 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  ned on success. 
e180: 20 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   If the file is 
e190: 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f  not a.** well-fo
e1a0: 72 6d 65 64 20 64 61 74 61 62 61 73 65 20 66 69  rmed database fi
e1b0: 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  le, then SQLITE_
e1c0: 43 4f 52 52 55 50 54 20 69 73 20 72 65 74 75 72  CORRUPT is retur
e1d0: 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42  ned..** SQLITE_B
e1e0: 55 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20  USY is returned 
e1f0: 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
e200: 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49  is locked.  SQLI
e210: 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72  TE_NOMEM.** is r
e220: 65 74 75 72 6e 65 64 20 69 66 20 77 65 20 72 75  eturned if we ru
e230: 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e  n out of memory.
e240: 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20   .*/.static int 
e250: 6c 6f 63 6b 42 74 72 65 65 28 42 74 53 68 61 72  lockBtree(BtShar
e260: 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20  ed *pBt){.  int 
e270: 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  rc;.  MemPage *p
e280: 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 6e 50 61  Page1;.  int nPa
e290: 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ge;..  assert( s
e2a0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
e2b0: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
e2c0: 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67  .  if( pBt->pPag
e2d0: 65 31 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  e1 ) return SQLI
e2e0: 54 45 5f 4f 4b 3b 0a 20 20 72 63 20 3d 20 73 71  TE_OK;.  rc = sq
e2f0: 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
e300: 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65  e(pBt, 1, &pPage
e310: 31 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  1, 0);.  if( rc!
e320: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
e330: 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f  urn rc;..  /* Do
e340: 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74   some checking t
e350: 6f 20 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68  o help insure th
e360: 65 20 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64  e file we opened
e370: 20 72 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20   really is.  ** 
e380: 61 20 76 61 6c 69 64 20 64 61 74 61 62 61 73 65  a valid database
e390: 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 72   file. .  */.  r
e3a0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
e3b0: 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
e3c0: 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
e3d0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
e3e0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
e3f0: 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
e400: 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  d;.  }else if( n
e410: 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 69 6e  Page>0 ){.    in
e420: 74 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  t pageSize;.    
e430: 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  int usableSize;.
e440: 20 20 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20      u8 *page1 = 
e450: 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20  pPage1->aData;. 
e460: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
e470: 4f 54 41 44 42 3b 0a 20 20 20 20 69 66 28 20 6d  OTADB;.    if( m
e480: 65 6d 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61  emcmp(page1, zMa
e490: 67 69 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d  gicHeader, 16)!=
e4a0: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
e4b0: 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65  page1_init_faile
e4c0: 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  d;.    }.    if(
e4d0: 20 70 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a   page1[18]>1 ){.
e4e0: 20 20 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f        pBt->readO
e4f0: 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  nly = 1;.    }. 
e500: 20 20 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d     if( page1[19]
e510: 3e 31 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  >1 ){.      goto
e520: 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c   page1_init_fail
e530: 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ed;.    }..    /
e540: 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 65 6d  * The maximum em
e550: 62 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20  bedded fraction 
e560: 6d 75 73 74 20 62 65 20 65 78 61 63 74 6c 79 20  must be exactly 
e570: 32 35 25 2e 20 20 41 6e 64 20 74 68 65 20 6d 69  25%.  And the mi
e580: 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20 65 6d 62  nimum.    ** emb
e590: 65 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d  edded fraction m
e5a0: 75 73 74 20 62 65 20 31 32 2e 35 25 20 66 6f 72  ust be 12.5% for
e5b0: 20 62 6f 74 68 20 6c 65 61 66 2d 64 61 74 61 20   both leaf-data 
e5c0: 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74  and non-leaf-dat
e5d0: 61 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72  a..    ** The or
e5e0: 69 67 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c  iginal design al
e5f0: 6c 6f 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75  lowed these amou
e600: 6e 74 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74  nts to vary, but
e610: 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65   as of.    ** ve
e620: 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20  rsion 3.6.0, we 
e630: 72 65 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20  require them to 
e640: 62 65 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f  be fixed..    */
e650: 0a 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  .    if( memcmp(
e660: 26 70 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30  &page1[21], "\10
e670: 30 5c 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30  0\040\040",3)!=0
e680: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
e690: 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
e6a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  ;.    }.    page
e6b0: 53 69 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28  Size = get2byte(
e6c0: 26 70 61 67 65 31 5b 31 36 5d 29 3b 0a 20 20 20  &page1[16]);.   
e6d0: 20 69 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d   if( ((pageSize-
e6e0: 31 29 26 70 61 67 65 53 69 7a 65 29 21 3d 30 20  1)&pageSize)!=0 
e6f0: 7c 7c 20 70 61 67 65 53 69 7a 65 3c 35 31 32 20  || pageSize<512 
e700: 7c 7c 0a 20 20 20 20 20 20 20 20 28 53 51 4c 49  ||.        (SQLI
e710: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
e720: 3c 33 32 37 36 38 20 26 26 20 70 61 67 65 53 69  <32768 && pageSi
e730: 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  ze>SQLITE_MAX_PA
e740: 47 45 5f 53 49 5a 45 29 0a 20 20 20 20 29 7b 0a  GE_SIZE).    ){.
e750: 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31        goto page1
e760: 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20  _init_failed;.  
e770: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
e780: 28 70 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d  (pageSize & 7)==
e790: 30 20 29 3b 0a 20 20 20 20 75 73 61 62 6c 65 53  0 );.    usableS
e7a0: 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d  ize = pageSize -
e7b0: 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20   page1[20];.    
e7c0: 69 66 28 20 70 61 67 65 53 69 7a 65 21 3d 70 42  if( pageSize!=pB
e7d0: 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  t->pageSize ){. 
e7e0: 20 20 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65       /* After re
e7f0: 61 64 69 6e 67 20 74 68 65 20 66 69 72 73 74 20  ading the first 
e800: 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61  page of the data
e810: 62 61 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20  base assuming a 
e820: 70 61 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20  page size.      
e830: 2a 2a 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70  ** of BtShared.p
e840: 61 67 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65  ageSize, we have
e850: 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74   discovered that
e860: 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69   the page-size i
e870: 73 0a 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61  s.      ** actua
e880: 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e  lly pageSize. Un
e890: 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
e8a0: 65 2c 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50  e, leave pBt->pP
e8b0: 61 67 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a  age1 at.      **
e8c0: 20 7a 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e   zero and return
e8d0: 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20   SQLITE_OK. The 
e8e0: 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c  caller will call
e8f0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20   this function. 
e900: 20 20 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69       ** again wi
e910: 74 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 70  th the correct p
e920: 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20  age-size..      
e930: 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  */.      release
e940: 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20  Page(pPage1);.  
e950: 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
e960: 69 7a 65 20 3d 20 28 75 31 36 29 75 73 61 62 6c  ize = (u16)usabl
e970: 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 42 74  eSize;.      pBt
e980: 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 28 75 31  ->pageSize = (u1
e990: 36 29 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  6)pageSize;.    
e9a0: 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
e9b0: 70 42 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  pBt);.      sqli
e9c0: 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73  te3PagerSetPages
e9d0: 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  ize(pBt->pPager,
e9e0: 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29   &pBt->pageSize)
e9f0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
ea00: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
ea10: 20 20 20 20 69 66 28 20 75 73 61 62 6c 65 53 69      if( usableSi
ea20: 7a 65 3c 35 30 30 20 29 7b 0a 20 20 20 20 20 20  ze<500 ){.      
ea30: 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f  goto page1_init_
ea40: 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20  failed;.    }.  
ea50: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20    pBt->pageSize 
ea60: 3d 20 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b  = (u16)pageSize;
ea70: 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65  .    pBt->usable
ea80: 53 69 7a 65 20 3d 20 28 75 31 36 29 75 73 61 62  Size = (u16)usab
ea90: 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64 65 66 20  leSize;.#ifndef 
eaa0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
eab0: 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74 2d 3e  VACUUM.    pBt->
eac0: 61 75 74 6f 56 61 63 75 75 6d 20 3d 20 28 67 65  autoVacuum = (ge
ead0: 74 34 62 79 74 65 28 26 70 61 67 65 31 5b 33 36  t4byte(&page1[36
eae0: 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29 3b 0a 20   + 4*4])?1:0);. 
eaf0: 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75     pBt->incrVacu
eb00: 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65 28 26  um = (get4byte(&
eb10: 70 61 67 65 31 5b 33 36 20 2b 20 37 2a 34 5d 29  page1[36 + 7*4])
eb20: 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ?1:0);.#endif.  
eb30: 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f 63 61 6c  }..  /* maxLocal
eb40: 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
eb50: 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c 6f 61  amount of payloa
eb60: 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c  d to store local
eb70: 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61 20 63 65  ly for.  ** a ce
eb80: 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 69  ll.  Make sure i
eb90: 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  t is small enoug
eba0: 68 20 73 6f 20 74 68 61 74 20 61 74 20 6c 65 61  h so that at lea
ebb0: 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a 20 20 2a  st minFanout.  *
ebc0: 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77 69 6c 6c  * cells can will
ebd0: 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70 61 67 65   fit on one page
ebe0: 2e 20 20 57 65 20 61 73 73 75 6d 65 20 61 20 31  .  We assume a 1
ebf0: 30 2d 62 79 74 65 20 70 61 67 65 20 68 65 61 64  0-byte page head
ec00: 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69 64 65 73  er..  ** Besides
ec10: 20 74 68 65 20 70 61 79 6c 6f 61 64 2c 20 74 68   the payload, th
ec20: 65 20 63 65 6c 6c 20 6d 75 73 74 20 73 74 6f 72  e cell must stor
ec30: 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32 2d 62 79  e:.  **     2-by
ec40: 74 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  te pointer to th
ec50: 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  e cell.  **     
ec60: 34 2d 62 79 74 65 20 63 68 69 6c 64 20 70 6f 69  4-byte child poi
ec70: 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20 20 39 2d  nter.  **     9-
ec80: 62 79 74 65 20 6e 4b 65 79 20 76 61 6c 75 65 0a  byte nKey value.
ec90: 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20    **     4-byte 
eca0: 6e 44 61 74 61 20 76 61 6c 75 65 0a 20 20 2a 2a  nData value.  **
ecb0: 20 20 20 20 20 34 2d 62 79 74 65 20 6f 76 65 72       4-byte over
ecc0: 66 6c 6f 77 20 70 61 67 65 20 70 6f 69 6e 74 65  flow page pointe
ecd0: 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63 65 6c 6c  r.  ** So a cell
ece0: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 32   consists of a 2
ecf0: 2d 62 79 74 65 20 70 6f 69 6e 65 72 2c 20 61 20  -byte poiner, a 
ed00: 68 65 61 64 65 72 20 77 68 69 63 68 20 69 73 20  header which is 
ed10: 61 73 20 6d 75 63 68 20 61 73 0a 20 20 2a 2a 20  as much as.  ** 
ed20: 31 37 20 62 79 74 65 73 20 6c 6f 6e 67 2c 20 30  17 bytes long, 0
ed30: 20 74 6f 20 4e 20 62 79 74 65 73 20 6f 66 20 70   to N bytes of p
ed40: 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61 6e 20 6f  ayload, and an o
ed50: 70 74 69 6f 6e 61 6c 20 34 20 62 79 74 65 20 6f  ptional 4 byte o
ed60: 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20 70 61 67  verflow.  ** pag
ed70: 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20 2a 2f 0a  e pointer..  */.
ed80: 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63 61 6c 20    pBt->maxLocal 
ed90: 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69  = (pBt->usableSi
eda0: 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35 20 2d 20  ze-12)*64/255 - 
edb0: 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 6f  23;.  pBt->minLo
edc0: 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62  cal = (pBt->usab
edd0: 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35  leSize-12)*32/25
ede0: 35 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d  5 - 23;.  pBt->m
edf0: 61 78 4c 65 61 66 20 3d 20 70 42 74 2d 3e 75 73  axLeaf = pBt->us
ee00: 61 62 6c 65 53 69 7a 65 20 2d 20 33 35 3b 0a 20  ableSize - 35;. 
ee10: 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66 20 3d 20   pBt->minLeaf = 
ee20: 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
ee30: 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33  -12)*32/255 - 23
ee40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
ee50: 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33 20 3c 3d  >maxLeaf + 23 <=
ee60: 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42   MX_CELL_SIZE(pB
ee70: 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e 70 50 61  t) );.  pBt->pPa
ee80: 67 65 31 20 3d 20 70 50 61 67 65 31 3b 0a 20 20  ge1 = pPage1;.  
ee90: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
eea0: 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  ;..page1_init_fa
eeb0: 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61 73 65 50  iled:.  releaseP
eec0: 61 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 70  age(pPage1);.  p
eed0: 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b 0a  Bt->pPage1 = 0;.
eee0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
eef0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
ef00: 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 6c 6f  ne works like lo
ef10: 63 6b 42 74 72 65 65 28 29 20 65 78 63 65 70 74  ckBtree() except
ef20: 20 74 68 61 74 20 69 74 20 61 6c 73 6f 20 69 6e   that it also in
ef30: 76 6f 6b 65 73 20 74 68 65 0a 2a 2a 20 62 75 73  vokes the.** bus
ef40: 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68  y callback if th
ef50: 65 72 65 20 69 73 20 6c 6f 63 6b 20 63 6f 6e 74  ere is lock cont
ef60: 65 6e 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ention..*/.stati
ef70: 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72 65 65 57  c int lockBtreeW
ef80: 69 74 68 52 65 74 72 79 28 42 74 72 65 65 20 2a  ithRetry(Btree *
ef90: 70 52 65 66 29 7b 0a 20 20 69 6e 74 20 72 63 20  pRef){.  int rc 
efa0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
efb0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
efc0: 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
efd0: 52 65 66 29 20 29 3b 0a 20 20 69 66 28 20 70 52  Ref) );.  if( pR
efe0: 65 66 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41  ef->inTrans==TRA
eff0: 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 75  NS_NONE ){.    u
f000: 38 20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  8 inTransaction 
f010: 3d 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69 6e 54  = pRef->pBt->inT
f020: 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20 20 20  ransaction;.    
f030: 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28 70  btreeIntegrity(p
f040: 52 65 66 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  Ref);.    rc = s
f050: 71 6c 69 74 65 33 42 74 72 65 65 42 65 67 69 6e  qlite3BtreeBegin
f060: 54 72 61 6e 73 28 70 52 65 66 2c 20 30 29 3b 0a  Trans(pRef, 0);.
f070: 20 20 20 20 70 52 65 66 2d 3e 70 42 74 2d 3e 69      pRef->pBt->i
f080: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 69  nTransaction = i
f090: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20 20  nTransaction;.  
f0a0: 20 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73 20    pRef->inTrans 
f0b0: 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
f0c0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
f0d0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 52 65  _OK ){.      pRe
f0e0: 66 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63  f->pBt->nTransac
f0f0: 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  tion--;.    }.  
f100: 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79    btreeIntegrity
f110: 28 70 52 65 66 29 3b 0a 20 20 7d 0a 20 20 72 65  (pRef);.  }.  re
f120: 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 20 20 20 20  turn rc;.}.     
f130: 20 20 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65    ../*.** If the
f140: 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
f150: 6e 64 69 6e 67 20 63 75 72 73 6f 72 73 20 61 6e  nding cursors an
f160: 64 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 20  d we are not in 
f170: 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a 20 6f 66  the middle.** of
f180: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62   a transaction b
f190: 75 74 20 74 68 65 72 65 20 69 73 20 61 20 72 65  ut there is a re
f1a0: 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ad lock on the d
f1b0: 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a 2a 2a  atabase, then.**
f1c0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 75 6e   this routine un
f1d0: 72 65 66 73 20 74 68 65 20 66 69 72 73 74 20 70  refs the first p
f1e0: 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
f1f0: 61 73 65 20 66 69 6c 65 20 77 68 69 63 68 20 0a  ase file which .
f200: 2a 2a 20 68 61 73 20 74 68 65 20 65 66 66 65 63  ** has the effec
f210: 74 20 6f 66 20 72 65 6c 65 61 73 69 6e 67 20 74  t of releasing t
f220: 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2a  he read lock..**
f230: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
f240: 20 61 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67   any outstanding
f250: 20 63 75 72 73 6f 72 73 2c 20 74 68 69 73 20 72   cursors, this r
f260: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
f270: 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  p..**.** If ther
f280: 65 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69  e is a transacti
f290: 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20  on in progress, 
f2a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
f2b0: 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74  a no-op..*/.stat
f2c0: 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 42 74  ic void unlockBt
f2d0: 72 65 65 49 66 55 6e 75 73 65 64 28 42 74 53 68  reeIfUnused(BtSh
f2e0: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 61 73  ared *pBt){.  as
f2f0: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
f300: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
f310: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 42  tex) );.  if( pB
f320: 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
f330: 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 26 26 20  ==TRANS_NONE && 
f340: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d 3d 30 20  pBt->pCursor==0 
f350: 26 26 20 70 42 74 2d 3e 70 50 61 67 65 31 21 3d  && pBt->pPage1!=
f360: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  0 ){.    if( sql
f370: 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
f380: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3e 3d  t(pBt->pPager)>=
f390: 31 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  1 ){.      asser
f3a0: 74 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  t( pBt->pPage1->
f3b0: 61 44 61 74 61 20 29 3b 0a 23 69 66 20 30 0a 20  aData );.#if 0. 
f3c0: 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 70 50       if( pBt->pP
f3d0: 61 67 65 31 2d 3e 61 44 61 74 61 3d 3d 30 20 29  age1->aData==0 )
f3e0: 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  {.        MemPag
f3f0: 65 20 2a 70 50 61 67 65 20 3d 20 70 42 74 2d 3e  e *pPage = pBt->
f400: 70 50 61 67 65 31 3b 0a 20 20 20 20 20 20 20 20  pPage1;.        
f410: 70 50 61 67 65 2d 3e 61 44 61 74 61 20 3d 20 73  pPage->aData = s
f420: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
f430: 74 61 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  ta(pPage->pDbPag
f440: 65 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67  e);.        pPag
f450: 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  e->pBt = pBt;.  
f460: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 67 6e        pPage->pgn
f470: 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 23  o = 1;.      }.#
f480: 65 6e 64 69 66 0a 20 20 20 20 20 20 72 65 6c 65  endif.      rele
f490: 61 73 65 50 61 67 65 28 70 42 74 2d 3e 70 50 61  asePage(pBt->pPa
f4a0: 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ge1);.    }.    
f4b0: 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20 30 3b  pBt->pPage1 = 0;
f4c0: 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d 74  .    pBt->inStmt
f4d0: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   = 0;.  }.}../*.
f4e0: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
f4f0: 64 61 74 61 62 61 73 65 20 62 79 20 69 6e 69 74  database by init
f500: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72  ializing the fir
f510: 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a  st page of the.*
f520: 2a 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  * file..*/.stati
f530: 63 20 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73  c int newDatabas
f540: 65 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 29  e(BtShared *pBt)
f550: 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31  {.  MemPage *pP1
f560: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
f570: 72 20 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72  r *data;.  int r
f580: 63 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a  c;.  int nPage;.
f590: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
f5a0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
f5b0: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  t->mutex) );.  r
f5c0: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
f5d0: 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
f5e0: 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
f5f0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
f600: 5f 4f 4b 20 7c 7c 20 6e 50 61 67 65 3e 30 20 29  _OK || nPage>0 )
f610: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
f620: 0a 20 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74  .  }.  pP1 = pBt
f630: 2d 3e 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65  ->pPage1;.  asse
f640: 72 74 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20  rt( pP1!=0 );.  
f650: 64 61 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74  data = pP1->aDat
f660: 61 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  a;.  rc = sqlite
f670: 33 50 61 67 65 72 57 72 69 74 65 28 70 50 31 2d  3PagerWrite(pP1-
f680: 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
f690: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
f6a0: 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20  .  memcpy(data, 
f6b0: 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 73 69  zMagicHeader, si
f6c0: 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65  zeof(zMagicHeade
f6d0: 72 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  r));.  assert( s
f6e0: 69 7a 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64  izeof(zMagicHead
f6f0: 65 72 29 3d 3d 31 36 20 29 3b 0a 20 20 70 75 74  er)==16 );.  put
f700: 32 62 79 74 65 28 26 64 61 74 61 5b 31 36 5d 2c  2byte(&data[16],
f710: 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b   pBt->pageSize);
f720: 0a 20 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b  .  data[18] = 1;
f730: 0a 20 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b  .  data[19] = 1;
f740: 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e  .  assert( pBt->
f750: 75 73 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d  usableSize<=pBt-
f760: 3e 70 61 67 65 53 69 7a 65 20 26 26 20 70 42 74  >pageSize && pBt
f770: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35  ->usableSize+255
f780: 3e 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  >=pBt->pageSize)
f790: 3b 0a 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28  ;.  data[20] = (
f7a0: 75 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  u8)(pBt->pageSiz
f7b0: 65 20 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e - pBt->usableS
f7c0: 69 7a 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d  ize);.  data[21]
f7d0: 20 3d 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32   = 64;.  data[22
f7e0: 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32  ] = 32;.  data[2
f7f0: 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65  3] = 32;.  memse
f800: 74 28 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20  t(&data[24], 0, 
f810: 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50  100-24);.  zeroP
f820: 61 67 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54  age(pP1, PTF_INT
f830: 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46  KEY|PTF_LEAF|PTF
f840: 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70  _LEAFDATA );.  p
f850: 42 74 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65  Bt->pageSizeFixe
f860: 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53  d = 1;.#ifndef S
f870: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
f880: 41 43 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20  ACUUM.  assert( 
f890: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d  pBt->autoVacuum=
f8a0: 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56  =1 || pBt->autoV
f8b0: 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73  acuum==0 );.  as
f8c0: 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56  sert( pBt->incrV
f8d0: 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d  acuum==1 || pBt-
f8e0: 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29  >incrVacuum==0 )
f8f0: 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64 61  ;.  put4byte(&da
f900: 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42  ta[36 + 4*4], pB
f910: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a  t->autoVacuum);.
f920: 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
f930: 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d  [36 + 7*4], pBt-
f940: 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65  >incrVacuum);.#e
f950: 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
f960: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
f970: 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61  * Attempt to sta
f980: 72 74 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  rt a new transac
f990: 74 69 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72  tion. A write-tr
f9a0: 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20  ansaction.** is 
f9b0: 73 74 61 72 74 65 64 20 69 66 20 74 68 65 20 73  started if the s
f9c0: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
f9d0: 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72  s nonzero, other
f9e0: 77 69 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20  wise a read-.** 
f9f0: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66  transaction.  If
fa00: 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
fa10: 6d 65 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72  ment is 2 or mor
fa20: 65 20 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a  e and exclusive.
fa30: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
fa40: 73 20 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69  s started, meani
fa50: 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ng that no other
fa60: 20 70 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f   process is allo
fa70: 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73  wed.** to access
fa80: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
fa90: 41 20 70 72 65 65 78 69 73 74 69 6e 67 20 74 72  A preexisting tr
faa0: 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f  ansaction may no
fab0: 74 20 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64  t be.** upgraded
fac0: 20 74 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79   to exclusive by
fad0: 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
fae0: 75 74 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74  utine a second t
faf0: 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63  ime - the.** exc
fb00: 6c 75 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e  lusivity flag on
fb10: 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e  ly works for a n
fb20: 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ew transaction..
fb30: 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72  **.** A write-tr
fb40: 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62  ansaction must b
fb50: 65 20 73 74 61 72 74 65 64 20 62 65 66 6f 72 65  e started before
fb60: 20 61 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20   attempting any 
fb70: 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74  .** changes to t
fb80: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f  he database.  No
fb90: 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ne of the follow
fba0: 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a  ing routines .**
fbb0: 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73   will work unles
fbc0: 73 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  s a transaction 
fbd0: 69 73 20 73 74 61 72 74 65 64 20 66 69 72 73 74  is started first
fbe0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c  :.**.**      sql
fbf0: 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 54  ite3BtreeCreateT
fc00: 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  able().**      s
fc10: 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61 74  qlite3BtreeCreat
fc20: 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20  eIndex().**     
fc30: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
fc40: 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  arTable().**    
fc50: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72    sqlite3BtreeDr
fc60: 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  opTable().**    
fc70: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e    sqlite3BtreeIn
fc80: 73 65 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73  sert().**      s
fc90: 71 6c 69 74 65 33 42 74 72 65 65 44 65 6c 65 74  qlite3BtreeDelet
fca0: 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  e().**      sqli
fcb0: 74 65 33 42 74 72 65 65 55 70 64 61 74 65 4d 65  te3BtreeUpdateMe
fcc0: 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ta().**.** If an
fcd0: 20 69 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74   initial attempt
fce0: 20 74 6f 20 61 63 71 75 69 72 65 20 74 68 65 20   to acquire the 
fcf0: 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75  lock fails becau
fd00: 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65  se of lock conte
fd10: 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65  ntion.** and the
fd20: 20 64 61 74 61 62 61 73 65 20 77 61 73 20 70 72   database was pr
fd30: 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65  eviously unlocke
fd40: 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74  d, then invoke t
fd50: 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a  he busy handler.
fd60: 2a 2a 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ** if there is o
fd70: 6e 65 2e 20 20 42 75 74 20 69 66 20 74 68 65 72  ne.  But if ther
fd80: 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  e was previously
fd90: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f   a read-lock, do
fda0: 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74   not.** invoke t
fdb0: 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
fdc0: 2d 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51  - just return SQ
fdd0: 4c 49 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49  LITE_BUSY.  SQLI
fde0: 54 45 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72  TE_BUSY is .** r
fdf0: 65 74 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65  eturned when the
fe00: 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 20  re is already a 
fe10: 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64  read-lock in ord
fe20: 65 72 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65  er to avoid a de
fe30: 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75  adlock..**.** Su
fe40: 70 70 6f 73 65 20 74 68 65 72 65 20 61 72 65 20  ppose there are 
fe50: 74 77 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20  two processes A 
fe60: 61 6e 64 20 42 2e 20 20 41 20 68 61 73 20 61 20  and B.  A has a 
fe70: 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20  read lock and B 
fe80: 68 61 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65  has.** a reserve
fe90: 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73  d lock.  B tries
fea0: 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65   to promote to e
feb0: 78 63 6c 75 73 69 76 65 20 62 75 74 20 69 73 20  xclusive but is 
fec0: 62 6c 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a  blocked because.
fed0: 2a 2a 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c  ** of A's read l
fee0: 6f 63 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f  ock.  A tries to
fef0: 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65   promote to rese
ff00: 72 76 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63  rved but is bloc
ff10: 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65  ked by B..** One
ff20: 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
ff30: 20 74 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73   the two process
ff40: 65 73 20 6d 75 73 74 20 67 69 76 65 20 77 61 79  es must give way
ff50: 20 6f 72 20 74 68 65 72 65 20 63 61 6e 20 62 65   or there can be
ff60: 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e  .** no progress.
ff70: 20 20 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53    By returning S
ff80: 51 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e  QLITE_BUSY and n
ff90: 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20  ot invoking the 
ffa0: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  busy callback.**
ffb0: 20 77 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20   when A already 
ffc0: 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c  has a read lock,
ffd0: 20 77 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20   we encourage A 
ffe0: 74 6f 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c  to give up and l
fff0: 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e  et B.** proceed.
10000 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
10010 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42  treeBeginTrans(B
10020 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66  tree *p, int wrf
10030 6c 61 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  lag){.  sqlite3 
10040 2a 70 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42  *pBlock = 0;.  B
10050 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
10060 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20  ->pBt;.  int rc 
10070 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
10080 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
10090 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20  r(p);.  pBt->db 
100a0 3d 20 70 2d 3e 64 62 3b 0a 20 20 62 74 72 65 65  = p->db;.  btree
100b0 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20  Integrity(p);.. 
100c0 20 2f 2a 20 49 66 20 74 68 65 20 62 74 72 65 65   /* If the btree
100d0 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61   is already in a
100e0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
100f0 6f 6e 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69  on, or it.  ** i
10100 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72  s already in a r
10110 65 61 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ead-transaction 
10120 61 6e 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73  and a read-trans
10130 61 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72  action.  ** is r
10140 65 71 75 65 73 74 65 64 2c 20 74 68 69 73 20 69  equested, this i
10150 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a  s a no-op..  */.
10160 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
10170 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c  ==TRANS_WRITE ||
10180 20 28 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52   (p->inTrans==TR
10190 41 4e 53 5f 52 45 41 44 20 26 26 20 21 77 72 66  ANS_READ && !wrf
101a0 6c 61 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  lag) ){.    goto
101b0 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20   trans_begun;.  
101c0 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72  }..  /* Write tr
101d0 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e  ansactions are n
101e0 6f 74 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61  ot possible on a
101f0 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62   read-only datab
10200 61 73 65 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ase */.  if( pBt
10210 2d 3e 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72  ->readOnly && wr
10220 66 6c 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d  flag ){.    rc =
10230 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
10240 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  ;.    goto trans
10250 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66  _begun;.  }..#if
10260 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
10270 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
10280 2f 2a 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61  /* If another da
10290 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61  tabase handle ha
102a0 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64  s already opened
102b0 20 61 20 77 72 69 74 65 20 74 72 61 6e 73 61 63   a write transac
102c0 74 69 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68  tion .  ** on th
102d0 69 73 20 73 68 61 72 65 64 2d 62 74 72 65 65 20  is shared-btree 
102e0 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61 20  structure and a 
102f0 73 65 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61  second write tra
10300 6e 73 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a  nsaction is.  **
10310 20 72 65 71 75 65 73 74 65 64 2c 20 72 65 74 75   requested, retu
10320 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
10330 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72  ..  */.  if( (wr
10340 66 6c 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54  flag && pBt->inT
10350 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
10360 53 5f 57 52 49 54 45 29 20 7c 7c 20 70 42 74 2d  S_WRITE) || pBt-
10370 3e 69 73 50 65 6e 64 69 6e 67 20 29 7b 0a 20 20  >isPending ){.  
10380 20 20 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e    pBlock = pBt->
10390 70 57 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d  pWriter->db;.  }
103a0 65 6c 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e  else if( wrflag>
103b0 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20  1 ){.    BtLock 
103c0 2a 70 49 74 65 72 3b 0a 20 20 20 20 66 6f 72 28  *pIter;.    for(
103d0 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b  pIter=pBt->pLock
103e0 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70  ; pIter; pIter=p
103f0 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  Iter->pNext){.  
10400 20 20 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70      if( pIter->p
10410 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20  Btree!=p ){.    
10420 20 20 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74      pBlock = pIt
10430 65 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a  er->pBtree->db;.
10440 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
10450 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
10460 0a 20 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b  .  if( pBlock ){
10470 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e  .    sqlite3Conn
10480 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d  ectionBlocked(p-
10490 3e 64 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20  >db, pBlock);.  
104a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f    rc = SQLITE_LO
104b0 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
104c0 3b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73  ;.    goto trans
104d0 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64  _begun;.  }.#end
104e0 69 66 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69  if..  do {.    i
104f0 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d  f( pBt->pPage1==
10500 30 20 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20  0 ){.      do{. 
10510 20 20 20 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b         rc = lock
10520 42 74 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20  Btree(pBt);.    
10530 20 20 7d 77 68 69 6c 65 28 20 70 42 74 2d 3e 70    }while( pBt->p
10540 50 61 67 65 31 3d 3d 30 20 26 26 20 72 63 3d 3d  Page1==0 && rc==
10550 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
10560 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   }..    if( rc==
10570 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66  SQLITE_OK && wrf
10580 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28  lag ){.      if(
10590 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29   pBt->readOnly )
105a0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
105b0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
105c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
105d0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
105e0 33 50 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d  3PagerBegin(pBt-
105f0 3e 70 50 61 67 65 72 2c 20 77 72 66 6c 61 67 3e  >pPager, wrflag>
10600 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
10610 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
10620 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
10630 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74 29  newDatabase(pBt)
10640 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10650 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20    }.    }.  .   
10660 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
10670 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  OK ){.      if( 
10680 77 72 66 6c 61 67 20 29 20 70 42 74 2d 3e 69 6e  wrflag ) pBt->in
10690 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d 65  Stmt = 0;.    }e
106a0 6c 73 65 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63  lse{.      unloc
106b0 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
106c0 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68  Bt);.    }.  }wh
106d0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
106e0 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54  BUSY && pBt->inT
106f0 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
10700 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20  S_NONE &&.      
10710 20 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42      btreeInvokeB
10720 75 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20  usyHandler(pBt) 
10730 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  );..  if( rc==SQ
10740 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
10750 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  f( p->inTrans==T
10760 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20  RANS_NONE ){.   
10770 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63     pBt->nTransac
10780 74 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  tion++;.    }.  
10790 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28    p->inTrans = (
107a0 77 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49  wrflag?TRANS_WRI
107b0 54 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a  TE:TRANS_READ);.
107c0 20 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61      if( p->inTra
107d0 6e 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  ns>pBt->inTransa
107e0 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70  ction ){.      p
107f0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
10800 6e 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a  n = p->inTrans;.
10810 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
10820 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
10830 5f 43 41 43 48 45 0a 20 20 20 20 69 66 28 20 77  _CACHE.    if( w
10840 72 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 61  rflag ){.      a
10850 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72  ssert( !pBt->pWr
10860 69 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42  iter );.      pB
10870 74 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a  t->pWriter = p;.
10880 20 20 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63        pBt->isExc
10890 6c 75 73 69 76 65 20 3d 20 28 77 72 66 6c 61 67  lusive = (wrflag
108a0 3e 31 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  >1);.    }.#endi
108b0 66 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65  f.  }...trans_be
108c0 67 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  gun:.  if( rc==S
108d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c  QLITE_OK && wrfl
108e0 61 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69  ag ){.    /* Thi
108f0 73 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72  s call makes sur
10900 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  e that the pager
10910 20 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74   has the correct
10920 20 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a   number of.    *
10930 2a 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  * open savepoint
10940 73 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  s. If the second
10950 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72   parameter is gr
10960 65 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64  eater than 0 and
10970 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d  .    ** the sub-
10980 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61  journal is not a
10990 6c 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65  lready open, the
109a0 6e 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65  n it will be ope
109b0 6e 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f  ned here..    */
109c0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
109d0 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f  3PagerOpenSavepo
109e0 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  int(pBt->pPager,
109f0 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69   p->db->nSavepoi
10a00 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65  nt);.  }..  btre
10a10 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20  eIntegrity(p);. 
10a20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
10a30 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
10a40 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  rc;.}..#ifndef S
10a50 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
10a60 41 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  ACUUM../*.** Set
10a70 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
10a80 20 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c   entries for all
10a90 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67   children of pag
10aa0 65 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69  e pPage. Also, i
10ab0 66 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61  f.** pPage conta
10ac0 69 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70  ins cells that p
10ad0 6f 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77  oint to overflow
10ae0 20 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20   pages, set the 
10af0 70 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65  pointer.** map e
10b00 6e 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f  ntries for the o
10b10 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
10b20 20 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   well..*/.static
10b30 20 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72   int setChildPtr
10b40 6d 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50  maps(MemPage *pP
10b50 61 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  age){.  int i;  
10b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10b70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
10b80 75 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a  unter variable *
10b90 2f 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20  /.  int nCell;  
10ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bb0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
10bc0 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67   of cells in pag
10bd0 65 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74  e pPage */.  int
10be0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
10bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c00 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
10c10 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
10c20 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
10c30 20 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20    u8 isInitOrig 
10c40 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b  = pPage->isInit;
10c50 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70  .  Pgno pgno = p
10c60 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61  Page->pgno;..  a
10c70 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
10c80 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
10c90 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
10ca0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
10cb0 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67  reeInitPage(pPag
10cc0 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
10cd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
10ce0 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74  oto set_child_pt
10cf0 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20  rmaps_out;.  }. 
10d00 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
10d10 6e 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d  nCell;..  for(i=
10d20 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
10d30 7b 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20  {.    u8 *pCell 
10d40 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
10d50 2c 20 69 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20  , i);..    rc = 
10d60 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72  ptrmapPutOvflPtr
10d70 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a  (pPage, pCell);.
10d80 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
10d90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
10da0 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74  oto set_child_pt
10db0 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d  rmaps_out;.    }
10dc0 0a 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  ..    if( !pPage
10dd0 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20  ->leaf ){.      
10de0 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d  Pgno childPgno =
10df0 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
10e00 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  ;.      rc = ptr
10e10 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c  mapPut(pBt, chil
10e20 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  dPgno, PTRMAP_BT
10e30 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  REE, pgno);.    
10e40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10e50 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 65 74 5f 63  _OK ) goto set_c
10e60 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74  hild_ptrmaps_out
10e70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  ;.    }.  }..  i
10e80 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
10e90 29 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c  ){.    Pgno chil
10ea0 64 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65  dPgno = get4byte
10eb0 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
10ec0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
10ed0 38 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 74  8]);.    rc = pt
10ee0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69  rmapPut(pBt, chi
10ef0 6c 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42  ldPgno, PTRMAP_B
10f00 54 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  TREE, pgno);.  }
10f10 0a 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d  ..set_child_ptrm
10f20 61 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65  aps_out:.  pPage
10f30 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69  ->isInit = isIni
10f40 74 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20  tOrig;.  return 
10f50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d  rc;.}../*.** Som
10f60 65 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 2c  ewhere on pPage,
10f70 20 77 68 69 63 68 20 69 73 20 67 75 61 72 65 6e   which is guaren
10f80 74 65 65 64 20 74 6f 20 62 65 20 61 20 62 74 72  teed to be a btr
10f90 65 65 20 70 61 67 65 2c 20 6e 6f 74 20 61 6e 20  ee page, not an 
10fa0 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65  overflow.** page
10fb0 2c 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  , is a pointer t
10fc0 6f 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 4d 6f  o page iFrom. Mo
10fd0 64 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65  dify this pointe
10fe0 72 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69  r so that it poi
10ff0 6e 74 73 20 74 6f 0a 2a 2a 20 69 54 6f 2e 20 50  nts to.** iTo. P
11000 61 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64  arameter eType d
11010 65 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70  escribes the typ
11020 65 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 20  e of pointer to 
11030 62 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20  be modified, as 
11040 0a 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a  .** follows:.**.
11050 2a 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a  ** PTRMAP_BTREE:
11060 20 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20       pPage is a 
11070 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20  btree-page. The 
11080 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61  pointer points a
11090 74 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20  t a child .**   
110a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110b0 70 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a  page of pPage..*
110c0 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52  *.** PTRMAP_OVER
110d0 46 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20  FLOW1: pPage is 
110e0 61 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68  a btree-page. Th
110f0 65 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73  e pointer points
11100 20 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a   at an overflow.
11110 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
11120 20 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65       page pointe
11130 64 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74  d to by one of t
11140 68 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67  he cells on pPag
11150 65 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f  e..**.** PTRMAP_
11160 4f 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65  OVERFLOW2: pPage
11170 20 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d   is an overflow-
11180 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65  page. The pointe
11190 72 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20  r points at the 
111a0 6e 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  next.**         
111b0 20 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c            overfl
111c0 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c  ow page in the l
111d0 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
111e0 6e 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69  nt modifyPagePoi
111f0 6e 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50  nter(MemPage *pP
11200 61 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c  age, Pgno iFrom,
11210 20 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54   Pgno iTo, u8 eT
11220 79 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ype){.  assert( 
11230 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
11240 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
11250 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
11260 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
11270 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
11280 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
11290 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
112a0 50 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20  P_OVERFLOW2 ){. 
112b0 20 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65     /* The pointe
112c0 72 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20  r is always the 
112d0 66 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66  first 4 bytes of
112e0 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69   the page in thi
112f0 73 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20  s case.  */.    
11300 69 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61  if( get4byte(pPa
11310 67 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f  ge->aData)!=iFro
11320 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
11330 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
11340 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
11350 20 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d   put4byte(pPage-
11360 3e 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20  >aData, iTo);.  
11370 7d 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73  }else{.    u8 is
11380 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65  InitOrig = pPage
11390 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e  ->isInit;.    in
113a0 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65  t i;.    int nCe
113b0 6c 6c 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33  ll;..    sqlite3
113c0 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50  BtreeInitPage(pP
113d0 61 67 65 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20  age);.    nCell 
113e0 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a  = pPage->nCell;.
113f0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
11400 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
11410 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66     u8 *pCell = f
11420 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
11430 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  );.      if( eTy
11440 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46  pe==PTRMAP_OVERF
11450 4c 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20  LOW1 ){.        
11460 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
11470 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74         sqlite3Bt
11480 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28  reeParseCellPtr(
11490 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69  pPage, pCell, &i
114a0 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nfo);.        if
114b0 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77  ( info.iOverflow
114c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
114d0 28 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74  ( iFrom==get4byt
114e0 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
114f0 76 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20 20 20  verflow]) ){.   
11500 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
11510 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f  e(&pCell[info.iO
11520 76 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a  verflow], iTo);.
11530 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
11540 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
11550 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
11560 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
11570 28 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c  ( get4byte(pCell
11580 29 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20  )==iFrom ){.    
11590 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70        put4byte(p
115a0 43 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20  Cell, iTo);.    
115b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
115c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
115d0 20 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20     }.  .    if( 
115e0 69 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20  i==nCell ){.    
115f0 20 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52    if( eType!=PTR
11600 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20  MAP_BTREE || .  
11610 20 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65          get4byte
11620 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70  (&pPage->aData[p
11630 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
11640 38 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20  8])!=iFrom ){.  
11650 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
11660 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
11670 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11680 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  put4byte(&pPage-
11690 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
116a0 72 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29  rOffset+8], iTo)
116b0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61  ;.    }..    pPa
116c0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49  ge->isInit = isI
116d0 6e 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72  nitOrig;.  }.  r
116e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
116f0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  .}.../*.** Move 
11700 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73  the open databas
11710 65 20 70 61 67 65 20 70 44 62 50 61 67 65 20 74  e page pDbPage t
11720 6f 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65  o location iFree
11730 50 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  Page in the .** 
11740 64 61 74 61 62 61 73 65 2e 20 54 68 65 20 70 44  database. The pD
11750 62 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 20  bPage reference 
11760 72 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a  remains valid..*
11770 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c  /.static int rel
11780 6f 63 61 74 65 50 61 67 65 28 0a 20 20 42 74 53  ocatePage(.  BtS
11790 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20  hared *pBt,     
117a0 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a        /* Btree *
117b0 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62  /.  MemPage *pDb
117c0 50 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Page,        /* 
117d0 4f 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76  Open page to mov
117e0 65 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c  e */.  u8 eType,
117f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11800 2f 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27  /* Pointer map '
11810 74 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20  type' entry for 
11820 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
11830 6f 20 69 50 74 72 50 61 67 65 2c 20 20 20 20 20  o iPtrPage,     
11840 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
11850 20 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65   map 'page-no' e
11860 6e 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65  ntry for pDbPage
11870 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65   */.  Pgno iFree
11880 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f  Page,          /
11890 2a 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74  * The location t
118a0 6f 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74  o move pDbPage t
118b0 6f 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d  o */.  int isCom
118c0 6d 69 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65  mit.){.  MemPage
118d0 20 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a   *pPtrPage;   /*
118e0 20 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63   The page that c
118f0 6f 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65  ontains a pointe
11900 72 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a  r to pDbPage */.
11910 20 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d    Pgno iDbPage =
11920 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a   pDbPage->pgno;.
11930 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
11940 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
11950 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
11960 72 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  rt( eType==PTRMA
11970 50 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65  P_OVERFLOW2 || e
11980 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45  Type==PTRMAP_OVE
11990 52 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20  RFLOW1 || .     
119a0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42   eType==PTRMAP_B
119b0 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50  TREE || eType==P
119c0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
119d0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
119e0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
119f0 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
11a00 61 73 73 65 72 74 28 20 70 44 62 50 61 67 65 2d  assert( pDbPage-
11a10 3e 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20  >pBt==pBt );..  
11a20 2f 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62  /* Move page iDb
11a30 50 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75  Page from its cu
11a40 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74  rrent location t
11a50 6f 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46  o page number iF
11a60 72 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41  reePage */.  TRA
11a70 43 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a  CE(("AUTOVACUUM:
11a80 20 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72   Moving %d to fr
11a90 65 65 20 70 61 67 65 20 25 64 20 28 70 74 72 20  ee page %d (ptr 
11aa0 70 61 67 65 20 25 64 20 74 79 70 65 20 25 64 29  page %d type %d)
11ab0 5c 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50  \n", .      iDbP
11ac0 61 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20  age, iFreePage, 
11ad0 69 50 74 72 50 61 67 65 2c 20 65 54 79 70 65 29  iPtrPage, eType)
11ae0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
11af0 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70  3PagerMovepage(p
11b00 50 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e  Pager, pDbPage->
11b10 70 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61  pDbPage, iFreePa
11b20 67 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20  ge, isCommit);. 
11b30 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11b40 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
11b50 20 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61   rc;.  }.  pDbPa
11b60 67 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65  ge->pgno = iFree
11b70 50 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70  Page;..  /* If p
11b80 44 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72  DbPage was a btr
11b90 65 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74  ee-page, then it
11ba0 20 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20   may have child 
11bb0 70 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c  pages and/or cel
11bc0 6c 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69  ls.  ** that poi
11bd0 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70  nt to overflow p
11be0 61 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65  ages. The pointe
11bf0 72 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f  r map entries fo
11c00 72 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a  r all these.  **
11c10 20 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62   pages need to b
11c20 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a  e changed..  **.
11c30 20 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20    ** If pDbPage 
11c40 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  is an overflow p
11c50 61 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69  age, then the fi
11c60 72 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20  rst 4 bytes may 
11c70 73 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69  store a.  ** poi
11c80 6e 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71  nter to a subseq
11c90 75 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  uent overflow pa
11ca0 67 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ge. If this is t
11cb0 68 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20  he case, then.  
11cc0 2a 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  ** the pointer m
11cd0 61 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75  ap needs to be u
11ce0 70 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73  pdated for the s
11cf0 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c  ubsequent overfl
11d00 6f 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20  ow page..  */.  
11d10 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
11d20 50 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65  P_BTREE || eType
11d30 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47  ==PTRMAP_ROOTPAG
11d40 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65  E ){.    rc = se
11d50 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44  tChildPtrmaps(pD
11d60 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  bPage);.    if( 
11d70 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11d80 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
11d90 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
11da0 0a 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76  .    Pgno nextOv
11db0 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44  fl = get4byte(pD
11dc0 62 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20  bPage->aData);. 
11dd0 20 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21     if( nextOvfl!
11de0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
11df0 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
11e00 6e 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50  nextOvfl, PTRMAP
11e10 5f 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65  _OVERFLOW2, iFre
11e20 65 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  ePage);.      if
11e30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11e40 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
11e50 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
11e60 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69    }.  }..  /* Fi
11e70 78 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  x the database p
11e80 6f 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69  ointer on page i
11e90 50 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69  PtrPage that poi
11ea0 6e 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20  nted at iDbPage 
11eb0 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20  so.  ** that it 
11ec0 70 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50  points at iFreeP
11ed0 61 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68  age. Also fix th
11ee0 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e  e pointer map en
11ef0 74 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74  try for.  ** iPt
11f00 72 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66  rPage..  */.  if
11f10 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f  ( eType!=PTRMAP_
11f20 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
11f30 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
11f40 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50  eGetPage(pBt, iP
11f50 74 72 50 61 67 65 2c 20 26 70 50 74 72 50 61 67  trPage, &pPtrPag
11f60 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
11f70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
11f80 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
11f90 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
11fa0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
11fb0 65 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50  e(pPtrPage->pDbP
11fc0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
11fd0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11fe0 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
11ff0 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20  (pPtrPage);.    
12000 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
12010 20 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69   }.    rc = modi
12020 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50  fyPagePointer(pP
12030 74 72 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c  trPage, iDbPage,
12040 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70   iFreePage, eTyp
12050 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  e);.    releaseP
12060 61 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20  age(pPtrPage);. 
12070 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
12080 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
12090 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
120a0 2c 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79  , iFreePage, eTy
120b0 70 65 2c 20 69 50 74 72 50 61 67 65 29 3b 0a 20  pe, iPtrPage);. 
120c0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
120d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  n rc;.}../* Forw
120e0 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20  ard declaration 
120f0 72 65 71 75 69 72 65 64 20 62 79 20 69 6e 63 72  required by incr
12100 56 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f  VacuumStep(). */
12110 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f  .static int allo
12120 63 61 74 65 42 74 72 65 65 50 61 67 65 28 42 74  cateBtreePage(Bt
12130 53 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67  Shared *, MemPag
12140 65 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67  e **, Pgno *, Pg
12150 6e 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20  no, u8);../*.** 
12160 50 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65  Perform a single
12170 20 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72   step of an incr
12180 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20  emental-vacuum. 
12190 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a  If successful,.*
121a0 2a 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * return SQLITE_
121b0 4f 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  OK. If there is 
121c0 6e 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61  no work to do (a
121d0 6e 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 0a  nd therefore no.
121e0 2a 2a 20 70 6f 69 6e 74 20 69 6e 20 63 61 6c 6c  ** point in call
121f0 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ing this functio
12200 6e 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e  n again), return
12210 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a   SQLITE_DONE..**
12220 0a 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69  .** More specifi
12230 63 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69  cly, this functi
12240 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72  on attempts to r
12250 65 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 0a  e-organize the .
12260 2a 2a 20 64 61 74 61 62 61 73 65 20 73 6f 20 74  ** database so t
12270 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67  hat the last pag
12280 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75  e of the file cu
12290 72 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 0a 2a  rrently in use.*
122a0 2a 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69  * is no longer i
122b0 6e 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  n use..**.** If 
122c0 74 68 65 20 6e 46 69 6e 20 70 61 72 61 6d 65 74  the nFin paramet
122d0 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
122e0 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  the implementati
122f0 6f 6e 20 61 73 73 75 6d 65 73 0a 2a 2a 20 74 68  on assumes.** th
12300 61 74 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69  at the caller wi
12310 6c 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20  ll keep calling 
12320 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29  incrVacuumStep()
12330 20 75 6e 74 69 6c 0a 2a 2a 20 69 74 20 72 65 74   until.** it ret
12340 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
12350 20 6f 72 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e   or an error, an
12360 64 20 74 68 61 74 20 6e 46 69 6e 20 69 73 20 74  d that nFin is t
12370 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  he.** number of 
12380 70 61 67 65 73 20 74 68 65 20 64 61 74 61 62 61  pages the databa
12390 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 63 6f 6e  se file will con
123a0 74 61 69 6e 20 61 66 74 65 72 20 74 68 69 73 20  tain after this 
123b0 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 63  .** process is c
123c0 6f 6d 70 6c 65 74 65 2e 0a 2a 2f 0a 73 74 61 74  omplete..*/.stat
123d0 69 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75  ic int incrVacuu
123e0 6d 53 74 65 70 28 42 74 53 68 61 72 65 64 20 2a  mStep(BtShared *
123f0 70 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20  pBt, Pgno nFin, 
12400 50 67 6e 6f 20 69 4c 61 73 74 50 67 29 7b 0a 20  Pgno iLastPg){. 
12410 20 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b   Pgno nFreeList;
12420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
12430 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74  mber of pages st
12440 69 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ill on the free-
12450 6c 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  list */..  asser
12460 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
12470 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
12480 29 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52  ) );..  if( !PTR
12490 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
124a0 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73  iLastPg) && iLas
124b0 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54  tPg!=PENDING_BYT
124c0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
124d0 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 75     int rc;.    u
124e0 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e  8 eType;.    Pgn
124f0 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20  o iPtrPage;..   
12500 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74   nFreeList = get
12510 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
12520 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
12530 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73      if( nFreeLis
12540 74 3d 3d 30 20 7c 7c 20 6e 46 69 6e 3d 3d 69 4c  t==0 || nFin==iL
12550 61 73 74 50 67 20 29 7b 0a 20 20 20 20 20 20 72  astPg ){.      r
12560 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
12570 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63  E;.    }..    rc
12580 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74   = ptrmapGet(pBt
12590 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70  , iLastPg, &eTyp
125a0 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20  e, &iPtrPage);. 
125b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
125c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
125d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
125e0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
125f0 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b  RMAP_ROOTPAGE ){
12600 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
12610 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
12620 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  T;.    }..    if
12630 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
12640 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
12650 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b    if( nFin==0 ){
12660 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f  .        /* Remo
12670 76 65 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ve the page from
12680 20 74 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d   the files free-
12690 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f  list. This is no
126a0 74 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 20  t required.     
126b0 20 20 20 2a 2a 20 69 66 20 6e 46 69 6e 20 69 73     ** if nFin is
126c0 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68   non-zero. In th
126d0 61 74 20 63 61 73 65 2c 20 74 68 65 20 66 72 65  at case, the fre
126e0 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20  e-list will be. 
126f0 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61         ** trunca
12700 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65  ted to zero afte
12710 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
12720 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64  returns, so it d
12730 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20  oesn't .        
12740 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74 20  ** matter if it 
12750 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73  still contains s
12760 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74 72  ome garbage entr
12770 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ies..        */.
12780 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72          Pgno iFr
12790 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65  eePg;.        Me
127a0 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a  mPage *pFreePg;.
127b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c          rc = all
127c0 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
127d0 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69  Bt, &pFreePg, &i
127e0 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c  FreePg, iLastPg,
127f0 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   1);.        if(
12800 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12810 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
12820 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
12830 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
12840 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50   iFreePg==iLastP
12850 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  g );.        rel
12860 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67  easePage(pFreePg
12870 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
12880 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67   else {.      Pg
12890 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20 20  no iFreePg;     
128a0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
128b0 20 6f 66 20 66 72 65 65 20 70 61 67 65 20 74 6f   of free page to
128c0 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f   move pLastPg to
128d0 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   */.      MemPag
128e0 65 20 2a 70 4c 61 73 74 50 67 3b 0a 0a 20 20 20  e *pLastPg;..   
128f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
12900 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
12910 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74   iLastPg, &pLast
12920 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  Pg, 0);.      if
12930 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
12940 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
12950 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
12960 20 20 20 20 20 2f 2a 20 49 66 20 6e 46 69 6e 20       /* If nFin 
12970 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f  is zero, this lo
12980 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20  op runs exactly 
12990 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c  once and page pL
129a0 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69  astPg.      ** i
129b0 73 20 73 77 61 70 70 65 64 20 77 69 74 68 20 74  s swapped with t
129c0 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61  he first free pa
129d0 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68  ge pulled off th
129e0 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20  e free list..   
129f0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f     **.      ** O
12a00 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64  n the other hand
12a10 2c 20 69 66 20 6e 46 69 6e 20 69 73 20 67 72 65  , if nFin is gre
12a20 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20  ater than zero, 
12a30 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20  then keep.      
12a40 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c  ** looping until
12a50 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63   a free-page loc
12a60 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ated within the 
12a70 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73  first nFin pages
12a80 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
12a90 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a   file is found..
12aa0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64        */.      d
12ab0 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50  o {.        MemP
12ac0 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20  age *pFreePg;.  
12ad0 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
12ae0 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
12af0 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72  , &pFreePg, &iFr
12b00 65 65 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20  eePg, 0, 0);.   
12b10 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
12b20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12b30 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
12b40 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20  pLastPg);.      
12b50 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12b60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12b70 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72   releasePage(pFr
12b80 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68  eePg);.      }wh
12b90 69 6c 65 28 20 6e 46 69 6e 21 3d 30 20 26 26 20  ile( nFin!=0 && 
12ba0 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a  iFreePg>nFin );.
12bb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46        assert( iF
12bc0 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b  reePg<iLastPg );
12bd0 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 72 63  .      .      rc
12be0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
12bf0 72 69 74 65 28 70 4c 61 73 74 50 67 2d 3e 70 44  rite(pLastPg->pD
12c00 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
12c10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
12c20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
12c30 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  relocatePage(pBt
12c40 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65  , pLastPg, eType
12c50 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46 72 65  , iPtrPage, iFre
12c60 65 50 67 2c 20 6e 46 69 6e 21 3d 30 29 3b 0a 20  ePg, nFin!=0);. 
12c70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c       }.      rel
12c80 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67  easePage(pLastPg
12c90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
12ca0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12cb0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
12cc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
12cd0 20 7d 0a 0a 20 20 69 66 28 20 6e 46 69 6e 3d 3d   }..  if( nFin==
12ce0 30 20 29 7b 0a 20 20 20 20 69 4c 61 73 74 50 67  0 ){.    iLastPg
12cf0 2d 2d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69  --;.    while( i
12d00 4c 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f  LastPg==PENDING_
12d10 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 7c 7c  BYTE_PAGE(pBt)||
12d20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
12d30 74 2c 20 69 4c 61 73 74 50 67 29 20 29 7b 0a 20  t, iLastPg) ){. 
12d40 20 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a       iLastPg--;.
12d50 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
12d60 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d  3PagerTruncateIm
12d70 61 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  age(pBt->pPager,
12d80 20 69 4c 61 73 74 50 67 29 3b 0a 20 20 7d 0a 20   iLastPg);.  }. 
12d90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12da0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72  K;.}../*.** A wr
12db0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
12dc0 6d 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62  must be opened b
12dd0 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68  efore calling th
12de0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20  is function..** 
12df0 49 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69  It performs a si
12e00 6e 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72  ngle unit of wor
12e10 6b 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63  k towards an inc
12e20 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e  remental vacuum.
12e30 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e  .**.** If the in
12e40 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
12e50 20 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74   is finished aft
12e60 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
12e70 20 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c   has run,.** SQL
12e80 49 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75  ITE_DONE is retu
12e90 72 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e  rned. If it is n
12ea0 6f 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74  ot finished, but
12eb0 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72   no error occurr
12ec0 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  ed,.** SQLITE_OK
12ed0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
12ee0 68 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74  herwise an SQLit
12ef0 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a  e error code. .*
12f00 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
12f10 65 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72  eeIncrVacuum(Btr
12f20 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  ee *p){.  int rc
12f30 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
12f40 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73  t = p->pBt;..  s
12f50 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
12f60 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d  (p);.  pBt->db =
12f70 20 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74   p->db;.  assert
12f80 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
12f90 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54  tion==TRANS_WRIT
12fa0 45 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d  E && p->inTrans=
12fb0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
12fc0 20 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f    if( !pBt->auto
12fd0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63  Vacuum ){.    rc
12fe0 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a   = SQLITE_DONE;.
12ff0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 76    }else{.    inv
13000 61 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c  alidateAllOverfl
13010 6f 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20  owCache(pBt);.  
13020 20 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75    rc = incrVacuu
13030 6d 53 74 65 70 28 70 42 74 2c 20 30 2c 20 70 61  mStep(pBt, 0, pa
13040 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
13050 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ));.  }.  sqlite
13060 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
13070 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13080 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
13090 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69  ne is called pri
130a0 6f 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  or to sqlite3Pag
130b0 65 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20  erCommit when a 
130c0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69  transaction.** i
130d0 73 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61  s commited for a
130e0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
130f0 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  tabase..**.** If
13100 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
13110 74 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e  turned, then *pn
13120 54 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20  Trunc is set to 
13130 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
13140 67 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ges.** the datab
13150 61 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20  ase file should 
13160 62 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20  be truncated to 
13170 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69  during the commi
13180 74 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69  t process. .** i
13190 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73 65  .e. the database
131a0 20 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61   has been reorga
131b0 6e 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e  nized so that on
131c0 6c 79 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e  ly the first *pn
131d0 54 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61  Trunc.** pages a
131e0 72 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74  re in use..*/.st
131f0 61 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63  atic int autoVac
13200 75 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72  uumCommit(BtShar
13210 65 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20  ed *pBt){.  int 
13220 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
13230 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
13240 3d 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20  = pBt->pPager;. 
13250 20 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e   VVA_ONLY( int n
13260 52 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67  Ref = sqlite3Pag
13270 65 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65  erRefcount(pPage
13280 72 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  r) );..  assert(
13290 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
132a0 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20  eld(pBt->mutex) 
132b0 29 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41  );.  invalidateA
132c0 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28  llOverflowCache(
132d0 70 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70  pBt);.  assert(p
132e0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b  Bt->autoVacuum);
132f0 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63  .  if( !pBt->inc
13300 72 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  rVacuum ){.    P
13310 67 6e 6f 20 6e 46 69 6e 3b 0a 20 20 20 20 50 67  gno nFin;.    Pg
13320 6e 6f 20 6e 46 72 65 65 3b 0a 20 20 20 20 50 67  no nFree;.    Pg
13330 6e 6f 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20  no nPtrmap;.    
13340 50 67 6e 6f 20 69 46 72 65 65 3b 0a 20 20 20 20  Pgno iFree;.    
13350 63 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d  const int pgsz =
13360 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a   pBt->pageSize;.
13370 20 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d      Pgno nOrig =
13380 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28   pagerPagecount(
13390 70 42 74 29 3b 0a 0a 20 20 20 20 69 66 28 20 50  pBt);..    if( P
133a0 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
133b0 2c 20 6e 4f 72 69 67 29 20 29 7b 0a 20 20 20 20  , nOrig) ){.    
133c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
133d0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
133e0 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 72 69    }.    if( nOri
133f0 67 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  g==PENDING_BYTE_
13400 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
13410 20 20 20 6e 4f 72 69 67 2d 2d 3b 0a 20 20 20 20     nOrig--;.    
13420 7d 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65  }.    nFree = ge
13430 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
13440 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
13450 0a 20 20 20 20 6e 50 74 72 6d 61 70 20 3d 20 28  .    nPtrmap = (
13460 6e 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d  nFree-nOrig+PTRM
13470 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e  AP_PAGENO(pBt, n
13480 4f 72 69 67 29 2b 70 67 73 7a 2f 35 29 2f 28 70  Orig)+pgsz/5)/(p
13490 67 73 7a 2f 35 29 3b 0a 20 20 20 20 6e 46 69 6e  gsz/5);.    nFin
134a0 20 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65   = nOrig - nFree
134b0 20 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20   - nPtrmap;.    
134c0 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e  if( nOrig>PENDIN
134d0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
134e0 20 26 26 20 6e 46 69 6e 3c 3d 50 45 4e 44 49 4e   && nFin<=PENDIN
134f0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
13500 20 29 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d   ){.      nFin--
13510 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
13520 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
13530 28 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e  (pBt, nFin) || n
13540 46 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  Fin==PENDING_BYT
13550 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
13560 20 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20       nFin--;.   
13570 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 46 72 65   }..    for(iFre
13580 65 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e  e=nOrig; iFree>n
13590 46 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  Fin && rc==SQLIT
135a0 45 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a  E_OK; iFree--){.
135b0 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56        rc = incrV
135c0 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e  acuumStep(pBt, n
135d0 46 69 6e 2c 20 69 46 72 65 65 29 3b 0a 20 20 20  Fin, iFree);.   
135e0 20 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d   }.    if( (rc==
135f0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72  SQLITE_DONE || r
13600 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26  c==SQLITE_OK) &&
13610 20 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20   nFree>0 ){.    
13620 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
13630 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
13640 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
13650 42 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50  Bt->pPage1->pDbP
13660 61 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34  age);.      put4
13670 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
13680 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29  1->aData[32], 0)
13690 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
136a0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
136b0 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20  Data[36], 0);.  
136c0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
136d0 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42  TruncateImage(pB
136e0 74 2d 3e 70 50 61 67 65 72 2c 20 6e 46 69 6e 29  t->pPager, nFin)
136f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13700 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
13710 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
13720 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  gerRollback(pPag
13730 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  er);.    }.  }..
13740 20 20 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d    assert( nRef==
13750 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
13760 6f 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a  ount(pPager) );.
13770 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13780 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66  #endif /* ifndef
13790 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
137a0 4f 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a  OVACUUM */../*.*
137b0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
137c0 6f 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68  oes the first ph
137d0 61 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61  ase of a two-pha
137e0 73 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73  se commit.  This
137f0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73   routine.** caus
13800 65 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  es a rollback jo
13810 75 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61  urnal to be crea
13820 74 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20  ted (if it does 
13830 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
13840 74 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61  t).** and popula
13850 74 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20  ted with enough 
13860 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74  information so t
13870 68 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c  hat if a power l
13880 6f 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68  oss occurs.** th
13890 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62  e database can b
138a0 65 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74  e restored to it
138b0 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65  s original state
138c0 20 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   by playing back
138d0 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  .** the journal.
138e0 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65    Then the conte
138f0 6e 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  nts of the journ
13900 61 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f  al are flushed o
13910 75 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73  ut to.** the dis
13920 6b 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f  k.  After the jo
13930 75 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20  urnal is safely 
13940 6f 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68  on oxide, the ch
13950 61 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20  anges to the.** 
13960 64 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69  database are wri
13970 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61  tten into the da
13980 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
13990 66 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65  flushed to oxide
139a0 2e 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20  ..** At the end 
139b0 6f 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68  of this call, th
139c0 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
139d0 61 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20  al still exists 
139e0 6f 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61  on the.** disk a
139f0 6e 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20  nd we are still 
13a00 68 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b  holding all lock
13a10 73 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61  s, so the transa
13a20 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a  ction has not.**
13a30 20 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65   committed.  See
13a40 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
13a50 6d 69 74 28 29 20 66 6f 72 20 74 68 65 20 73 65  mit() for the se
13a60 63 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68  cond phase of th
13a70 65 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63  e.** commit proc
13a80 65 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ess..**.** This 
13a90 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20  call is a no-op 
13aa0 69 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e  if no write-tran
13ab0 73 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65  saction is curre
13ac0 6e 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70  ntly active on p
13ad0 42 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  Bt..**.** Otherw
13ae0 69 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61  ise, sync the da
13af0 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
13b00 74 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a  the btree pBt. z
13b10 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f  Master points to
13b20 0a 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  .** the name of 
13b30 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
13b40 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c   file that shoul
13b50 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74  d be written int
13b60 6f 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64  o the.** individ
13b70 75 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ual journal file
13b80 2c 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e  , or is NULL, in
13b90 64 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74  dicating no mast
13ba0 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
13bb0 0a 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61  .** (single data
13bc0 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  base transaction
13bd0 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  )..**.** When th
13be0 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  is is called, th
13bf0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
13c00 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
13c10 68 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65  have been.** cre
13c20 61 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20  ated, populated 
13c30 77 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61  with this journa
13c40 6c 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79  l pointer and sy
13c50 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
13c60 0a 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73  .** Once this is
13c70 20 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74   routine has ret
13c80 75 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20  urned, the only 
13c90 74 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74  thing required t
13ca0 6f 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20  o commit.** the 
13cb0 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f  write-transactio
13cc0 6e 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62  n for this datab
13cd0 61 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64  ase file is to d
13ce0 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
13cf0 6c 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  l..*/.int sqlite
13d00 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
13d10 65 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63  eOne(Btree *p, c
13d20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
13d30 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
13d40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
13d50 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
13d60 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
13d70 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
13d80 70 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69  p->pBt;.    sqli
13d90 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
13da0 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20  ;.    pBt->db = 
13db0 70 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20 53  p->db;.#ifndef S
13dc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
13dd0 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42  ACUUM.    if( pB
13de0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
13df0 0a 20 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f  .      rc = auto
13e00 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74  VacuumCommit(pBt
13e10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
13e20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13e30 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
13e40 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20  eeLeave(p);.    
13e50 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13e60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
13e70 64 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  dif.    rc = sql
13e80 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
13e90 68 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61  haseOne(pBt->pPa
13ea0 67 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29  ger, zMaster, 0)
13eb0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
13ec0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a  eeLeave(p);.  }.
13ed0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13ee0 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65  /*.** Commit the
13ef0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72   transaction cur
13f00 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65  rently in progre
13f10 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ss..**.** This r
13f20 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74  outine implement
13f30 73 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61  s the second pha
13f40 73 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20  se of a 2-phase 
13f50 63 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20  commit.  The.** 
13f60 73 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63  sqlite3BtreeSync
13f70 28 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  () routine does 
13f80 74 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20  the first phase 
13f90 61 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e  and should be in
13fa0 76 6f 6b 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74  voked.** prior t
13fb0 6f 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  o calling this r
13fc0 6f 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c  outine.  The sql
13fd0 69 74 65 33 42 74 72 65 65 53 79 6e 63 28 29 20  ite3BtreeSync() 
13fe0 72 6f 75 74 69 6e 65 20 64 69 64 0a 2a 2a 20 61  routine did.** a
13ff0 6c 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77  ll the work of w
14000 72 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  riting informati
14010 6f 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61  on out to disk a
14020 6e 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a  nd flushing the.
14030 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74  ** contents so t
14040 68 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69  hat they are wri
14050 74 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69  tten onto the di
14060 73 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c  sk platter.  All
14070 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
14080 20 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65   has to do is de
14090 6c 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65  lete or truncate
140a0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
140b0 75 72 6e 61 6c 0a 2a 2a 20 28 77 68 69 63 68 20  urnal.** (which 
140c0 63 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73  causes the trans
140d0 61 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74  action to commit
140e0 29 20 61 6e 64 20 64 72 6f 70 20 6c 6f 63 6b 73  ) and drop locks
140f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c  ..**.** This wil
14100 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72  l release the wr
14110 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite lock on the 
14120 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
14130 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20  If there.** are 
14140 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72  no active cursor
14150 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61  s, it also relea
14160 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ses the read loc
14170 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
14180 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73  3BtreeCommitPhas
14190 65 54 77 6f 28 42 74 72 65 65 20 2a 70 29 7b 0a  eTwo(Btree *p){.
141a0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
141b0 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c  = p->pBt;..  sql
141c0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
141d0 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70  );.  pBt->db = p
141e0 2d 3e 64 62 3b 0a 20 20 62 74 72 65 65 49 6e 74  ->db;.  btreeInt
141f0 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a  egrity(p);..  /*
14200 20 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68   If the handle h
14210 61 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73  as a write-trans
14220 61 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d  action open, com
14230 6d 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62  mit the shared-b
14240 74 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e  trees .  ** tran
14250 73 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20  saction and set 
14260 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65  the shared state
14270 20 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a   to TRANS_READ..
14280 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e    */.  if( p->in
14290 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
142a0 54 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  TE ){.    int rc
142b0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
142c0 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
142d0 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b  ==TRANS_WRITE );
142e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
142f0 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30  ->nTransaction>0
14300 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
14310 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
14320 68 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61  haseTwo(pBt->pPa
14330 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
14340 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14350 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
14360 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
14370 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
14380 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61  }.    pBt->inTra
14390 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
143a0 5f 52 45 41 44 3b 0a 20 20 20 20 70 42 74 2d 3e  _READ;.    pBt->
143b0 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a  inStmt = 0;.  }.
143c0 20 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64    clearAllShared
143d0 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28  CacheTableLocks(
143e0 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65  p);..  /* If the
143f0 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6e 79 20   handle has any 
14400 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63 74  kind of transact
14410 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65 6d  ion open, decrem
14420 65 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  ent the transact
14430 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74 20 6f  ion.  ** count o
14440 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74 72  f the shared btr
14450 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e 73  ee. If the trans
14460 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 72 65 61  action count rea
14470 63 68 65 73 20 30 2c 20 73 65 74 0a 20 20 2a 2a  ches 0, set.  **
14480 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61 74   the shared stat
14490 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 2e  e to TRANS_NONE.
144a0 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65 65   The unlockBtree
144b0 49 66 55 6e 75 73 65 64 28 29 20 63 61 6c 6c 20  IfUnused() call 
144c0 62 65 6c 6f 77 0a 20 20 2a 2a 20 77 69 6c 6c 20  below.  ** will 
144d0 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65 72  unlock the pager
144e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e  ..  */.  if( p->
144f0 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 4e  inTrans!=TRANS_N
14500 4f 4e 45 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e  ONE ){.    pBt->
14510 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a  nTransaction--;.
14520 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e      if( 0==pBt->
14530 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a  nTransaction ){.
14540 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61        pBt->inTra
14550 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53  nsaction = TRANS
14560 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _NONE;.    }.  }
14570 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20 68  ..  /* Set the h
14580 61 6e 64 6c 65 73 20 63 75 72 72 65 6e 74 20 74  andles current t
14590 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74 65  ransaction state
145a0 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20 61   to TRANS_NONE a
145b0 6e 64 20 75 6e 6c 6f 63 6b 0a 20 20 2a 2a 20 74  nd unlock.  ** t
145c0 68 65 20 70 61 67 65 72 20 69 66 20 74 68 69 73  he pager if this
145d0 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68 65   call closed the
145e0 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77 72   only read or wr
145f0 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ite transaction.
14600 0a 20 20 2a 2f 0a 20 20 62 74 72 65 65 43 6c 65  .  */.  btreeCle
14610 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42 74  arHasContent(pBt
14620 29 3b 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20  );.  p->inTrans 
14630 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20  = TRANS_NONE;.  
14640 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
14650 73 65 64 28 70 42 74 29 3b 0a 0a 20 20 62 74 72  sed(pBt);..  btr
14660 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
14670 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
14680 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
14690 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
146a0 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68 20 70 68 61  *.** Do both pha
146b0 73 65 73 20 6f 66 20 61 20 63 6f 6d 6d 69 74 2e  ses of a commit.
146c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
146d0 74 72 65 65 43 6f 6d 6d 69 74 28 42 74 72 65 65  treeCommit(Btree
146e0 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a   *p){.  int rc;.
146f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
14700 74 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 73  ter(p);.  rc = s
14710 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d 69  qlite3BtreeCommi
14720 74 50 68 61 73 65 4f 6e 65 28 70 2c 20 30 29 3b  tPhaseOne(p, 0);
14730 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
14740 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
14750 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d   sqlite3BtreeCom
14760 6d 69 74 50 68 61 73 65 54 77 6f 28 70 29 3b 0a  mitPhaseTwo(p);.
14770 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
14780 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
14790 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
147a0 64 65 66 20 4e 44 45 42 55 47 0a 2f 2a 0a 2a 2a  def NDEBUG./*.**
147b0 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
147c0 65 72 20 6f 66 20 77 72 69 74 65 2d 63 75 72 73  er of write-curs
147d0 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68 69 73  ors open on this
147e0 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73   handle. This is
147f0 20 66 6f 72 20 75 73 65 0a 2a 2a 20 69 6e 20 61   for use.** in a
14800 73 73 65 72 74 28 29 20 65 78 70 72 65 73 73 69  ssert() expressi
14810 6f 6e 73 2c 20 73 6f 20 69 74 20 69 73 20 6f 6e  ons, so it is on
14820 6c 79 20 63 6f 6d 70 69 6c 65 64 20 69 66 20 4e  ly compiled if N
14830 44 45 42 55 47 20 69 73 20 6e 6f 74 0a 2a 2a 20  DEBUG is not.** 
14840 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 46  defined..**.** F
14850 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
14860 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2c  of this routine,
14870 20 61 20 77 72 69 74 65 2d 63 75 72 73 6f 72 20   a write-cursor 
14880 69 73 20 61 6e 79 20 63 75 72 73 6f 72 20 74 68  is any cursor th
14890 61 74 0a 2a 2a 20 69 73 20 63 61 70 61 62 6c 65  at.** is capable
148a0 20 6f 66 20 77 72 69 74 69 6e 67 20 74 6f 20 74   of writing to t
148b0 68 65 20 64 61 74 61 62 73 65 2e 20 20 54 68 61  he databse.  Tha
148c0 74 20 6d 65 61 6e 73 20 74 68 65 20 63 75 72 73  t means the curs
148d0 6f 72 20 77 61 73 0a 2a 2a 20 6f 72 69 67 69 6e  or was.** origin
148e0 61 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20  ally opened for 
148f0 77 72 69 74 69 6e 67 20 61 6e 64 20 74 68 65 20  writing and the 
14900 63 75 72 73 6f 72 20 68 61 73 20 6e 6f 74 20 62  cursor has not b
14910 65 20 64 69 73 61 62 6c 65 64 0a 2a 2a 20 62 79  e disabled.** by
14920 20 68 61 76 69 6e 67 20 69 74 73 20 73 74 61 74   having its stat
14930 65 20 63 68 61 6e 67 65 64 20 74 6f 20 43 55 52  e changed to CUR
14940 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a 2f 0a 73 74  SOR_FAULT..*/.st
14950 61 74 69 63 20 69 6e 74 20 63 6f 75 6e 74 57 72  atic int countWr
14960 69 74 65 43 75 72 73 6f 72 73 28 42 74 53 68 61  iteCursors(BtSha
14970 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42 74 43  red *pBt){.  BtC
14980 75 72 73 6f 72 20 2a 70 43 75 72 3b 0a 20 20 69  ursor *pCur;.  i
14990 6e 74 20 72 20 3d 20 30 3b 0a 20 20 66 6f 72 28  nt r = 0;.  for(
149a0 70 43 75 72 3d 70 42 74 2d 3e 70 43 75 72 73 6f  pCur=pBt->pCurso
149b0 72 3b 20 70 43 75 72 3b 20 70 43 75 72 3d 70 43  r; pCur; pCur=pC
149c0 75 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  ur->pNext){.    
149d0 69 66 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  if( pCur->wrFlag
149e0 20 26 26 20 70 43 75 72 2d 3e 65 53 74 61 74 65   && pCur->eState
149f0 21 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 29  !=CURSOR_FAULT )
14a00 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20 20 72 65 74   r++; .  }.  ret
14a10 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn r;.}.#endif.
14a20 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
14a30 69 6e 65 20 73 65 74 73 20 74 68 65 20 73 74 61  ine sets the sta
14a40 74 65 20 74 6f 20 43 55 52 53 4f 52 5f 46 41 55  te to CURSOR_FAU
14a50 4c 54 20 61 6e 64 20 74 68 65 20 65 72 72 6f 72  LT and the error
14a60 0a 2a 2a 20 63 6f 64 65 20 74 6f 20 65 72 72 43  .** code to errC
14a70 6f 64 65 20 66 6f 72 20 65 76 65 72 79 20 63 75  ode for every cu
14a80 72 73 6f 72 20 6f 6e 20 42 74 53 68 61 72 65 64  rsor on BtShared
14a90 20 74 68 61 74 20 70 42 74 72 65 65 0a 2a 2a 20   that pBtree.** 
14aa0 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a  references..**.*
14ab0 2a 20 45 76 65 72 79 20 63 75 72 73 6f 72 20 69  * Every cursor i
14ac0 73 20 74 72 69 70 70 65 64 2c 20 69 6e 63 6c 75  s tripped, inclu
14ad0 64 69 6e 67 20 63 75 72 73 6f 72 73 20 74 68 61  ding cursors tha
14ae0 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20 74 6f 20 6f  t belong.** to o
14af0 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63 6f  ther database co
14b00 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 68  nnections that h
14b10 61 70 70 65 6e 20 74 6f 20 62 65 20 73 68 61 72  appen to be shar
14b20 69 6e 67 0a 2a 2a 20 74 68 65 20 63 61 63 68 65  ing.** the cache
14b30 20 77 69 74 68 20 70 42 74 72 65 65 2e 0a 2a 2a   with pBtree..**
14b40 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
14b50 20 67 65 74 73 20 63 61 6c 6c 65 64 20 77 68 65   gets called whe
14b60 6e 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  n a rollback occ
14b70 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20 63 75 72 73  urs..** All curs
14b80 6f 72 73 20 75 73 69 6e 67 20 74 68 65 20 73 61  ors using the sa
14b90 6d 65 20 63 61 63 68 65 20 6d 75 73 74 20 62 65  me cache must be
14ba0 20 74 72 69 70 70 65 64 0a 2a 2a 20 74 6f 20 70   tripped.** to p
14bb0 72 65 76 65 6e 74 20 74 68 65 6d 20 66 72 6f 6d  revent them from
14bc0 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74   trying to use t
14bd0 68 65 20 62 74 72 65 65 20 61 66 74 65 72 0a 2a  he btree after.*
14be0 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2e 20  * the rollback. 
14bf0 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   The rollback ma
14c00 79 20 68 61 76 65 20 64 65 6c 65 74 65 64 20 74  y have deleted t
14c10 61 62 6c 65 73 0a 2a 2a 20 6f 72 20 6d 6f 76 65  ables.** or move
14c20 64 20 72 6f 6f 74 20 70 61 67 65 73 2c 20 73 6f  d root pages, so
14c30 20 69 74 20 69 73 20 6e 6f 74 20 73 75 66 66 69   it is not suffi
14c40 63 69 65 6e 74 20 74 6f 0a 2a 2a 20 73 61 76 65  cient to.** save
14c50 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
14c60 65 20 63 75 72 73 6f 72 2e 20 20 54 68 65 20 63  e cursor.  The c
14c70 75 72 73 6f 72 20 6d 75 73 74 20 62 65 0a 2a 2a  ursor must be.**
14c80 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2f   invalidated..*/
14c90 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
14ca0 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
14cb0 28 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20  (Btree *pBtree, 
14cc0 69 6e 74 20 65 72 72 43 6f 64 65 29 7b 0a 20 20  int errCode){.  
14cd0 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 73  BtCursor *p;.  s
14ce0 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
14cf0 28 70 42 74 72 65 65 29 3b 0a 20 20 66 6f 72 28  (pBtree);.  for(
14d00 70 3d 70 42 74 72 65 65 2d 3e 70 42 74 2d 3e 70  p=pBtree->pBt->p
14d10 43 75 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e  Cursor; p; p=p->
14d20 70 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20  pNext){.    int 
14d30 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  i;.    sqlite3Bt
14d40 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
14d50 29 3b 0a 20 20 20 20 70 2d 3e 65 53 74 61 74 65  );.    p->eState
14d60 20 3d 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 3b   = CURSOR_FAULT;
14d70 0a 20 20 20 20 70 2d 3e 73 6b 69 70 20 3d 20 65  .    p->skip = e
14d80 72 72 43 6f 64 65 3b 0a 20 20 20 20 66 6f 72 28  rrCode;.    for(
14d90 69 3d 30 3b 20 69 3c 3d 70 2d 3e 69 50 61 67 65  i=0; i<=p->iPage
14da0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65  ; i++){.      re
14db0 6c 65 61 73 65 50 61 67 65 28 70 2d 3e 61 70 50  leasePage(p->apP
14dc0 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 70  age[i]);.      p
14dd0 2d 3e 61 70 50 61 67 65 5b 69 5d 20 3d 20 30 3b  ->apPage[i] = 0;
14de0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
14df0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
14e00 42 74 72 65 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Btree);.}../*.**
14e10 20 52 6f 6c 6c 62 61 63 6b 20 74 68 65 20 74 72   Rollback the tr
14e20 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 70 72 6f  ansaction in pro
14e30 67 72 65 73 73 2e 20 20 41 6c 6c 20 63 75 72 73  gress.  All curs
14e40 6f 72 73 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 69  ors will be.** i
14e50 6e 76 61 6c 69 64 65 64 20 62 79 20 74 68 69 73  nvalided by this
14e60 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e 79   operation.  Any
14e70 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
14e80 61 20 63 75 72 73 6f 72 0a 2a 2a 20 74 68 61 74  a cursor.** that
14e90 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74 68 65   was open at the
14ea0 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
14eb0 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 77 69 6c  is operation wil
14ec0 6c 20 72 65 73 75 6c 74 0a 2a 2a 20 69 6e 20 61  l result.** in a
14ed0 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 54  n error..**.** T
14ee0 68 69 73 20 77 69 6c 6c 20 72 65 6c 65 61 73 65  his will release
14ef0 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 20   the write lock 
14f00 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
14f10 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 0a  file.  If there.
14f20 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
14f30 20 63 75 72 73 6f 72 73 2c 20 69 74 20 61 6c 73   cursors, it als
14f40 6f 20 72 65 6c 65 61 73 65 73 20 74 68 65 20 72  o releases the r
14f50 65 61 64 20 6c 6f 63 6b 2e 0a 2a 2f 0a 69 6e 74  ead lock..*/.int
14f60 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
14f70 6c 62 61 63 6b 28 42 74 72 65 65 20 2a 70 29 7b  lback(Btree *p){
14f80 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
14f90 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
14fa0 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  pBt;.  MemPage *
14fb0 70 50 61 67 65 31 3b 0a 0a 20 20 73 71 6c 69 74  pPage1;..  sqlit
14fc0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
14fd0 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  .  pBt->db = p->
14fe0 64 62 3b 0a 20 20 72 63 20 3d 20 73 61 76 65 41  db;.  rc = saveA
14ff0 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 30  llCursors(pBt, 0
15000 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  , 0);.#ifndef SQ
15010 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44  LITE_OMIT_SHARED
15020 5f 43 41 43 48 45 0a 20 20 69 66 28 20 72 63 21  _CACHE.  if( rc!
15030 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15040 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 68    /* This is a h
15050 6f 72 72 69 62 6c 65 20 73 69 74 75 61 74 69 6f  orrible situatio
15060 6e 2e 20 41 6e 20 49 4f 20 6f 72 20 6d 61 6c 6c  n. An IO or mall
15070 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72  oc() error occur
15080 72 65 64 20 77 68 69 6c 73 74 0a 20 20 20 20 2a  red whilst.    *
15090 2a 20 74 72 79 69 6e 67 20 74 6f 20 73 61 76 65  * trying to save
150a0 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e   cursor position
150b0 73 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  s. If this is an
150c0 20 61 75 74 6f 6d 61 74 69 63 20 72 6f 6c 6c 62   automatic rollb
150d0 61 63 6b 20 28 61 73 0a 20 20 20 20 2a 2a 20 74  ack (as.    ** t
150e0 68 65 20 72 65 73 75 6c 74 20 6f 66 20 61 20 63  he result of a c
150f0 6f 6e 73 74 72 61 69 6e 74 2c 20 6d 61 6c 6c 6f  onstraint, mallo
15100 63 28 29 20 66 61 69 6c 75 72 65 20 6f 72 20 49  c() failure or I
15110 4f 20 65 72 72 6f 72 29 20 74 68 65 6e 20 0a 20  O error) then . 
15120 20 20 20 2a 2a 20 74 68 65 20 63 61 63 68 65 20     ** the cache 
15130 6d 61 79 20 62 65 20 69 6e 74 65 72 6e 61 6c 6c  may be internall
15140 79 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 28  y inconsistent (
15150 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 76 61 6c 69  not contain vali
15160 64 20 74 72 65 65 73 29 20 73 6f 0a 20 20 20 20  d trees) so.    
15170 2a 2a 20 77 65 20 63 61 6e 6e 6f 74 20 73 69 6d  ** we cannot sim
15180 70 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 65  ply return the e
15190 72 72 6f 72 20 74 6f 20 74 68 65 20 63 61 6c 6c  rror to the call
151a0 65 72 2e 20 49 6e 73 74 65 61 64 2c 20 61 62 6f  er. Instead, abo
151b0 72 74 20 0a 20 20 20 20 2a 2a 20 61 6c 6c 20 71  rt .    ** all q
151c0 75 65 72 69 65 73 20 74 68 61 74 20 6d 61 79 20  ueries that may 
151d0 62 65 20 75 73 69 6e 67 20 61 6e 79 20 6f 66 20  be using any of 
151e0 74 68 65 20 63 75 72 73 6f 72 73 20 74 68 61 74  the cursors that
151f0 20 66 61 69 6c 65 64 20 74 6f 20 73 61 76 65 2e   failed to save.
15200 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
15210 74 65 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43  te3BtreeTripAllC
15220 75 72 73 6f 72 73 28 70 2c 20 72 63 29 3b 0a 20  ursors(p, rc);. 
15230 20 7d 0a 23 65 6e 64 69 66 0a 20 20 62 74 72 65   }.#endif.  btre
15240 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20  eIntegrity(p);. 
15250 20 63 6c 65 61 72 41 6c 6c 53 68 61 72 65 64 43   clearAllSharedC
15260 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 73 28 70  acheTableLocks(p
15270 29 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54  );..  if( p->inT
15280 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
15290 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  E ){.    int rc2
152a0 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 54  ;..    assert( T
152b0 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70 42 74 2d  RANS_WRITE==pBt-
152c0 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29  >inTransaction )
152d0 3b 0a 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69  ;.    rc2 = sqli
152e0 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
152f0 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
15300 20 20 20 69 66 28 20 72 63 32 21 3d 53 51 4c 49     if( rc2!=SQLI
15310 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
15320 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 0a  c = rc2;.    }..
15330 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6c 6c 62      /* The rollb
15340 61 63 6b 20 6d 61 79 20 68 61 76 65 20 64 65 73  ack may have des
15350 74 72 6f 79 65 64 20 74 68 65 20 70 50 61 67 65  troyed the pPage
15360 31 2d 3e 61 44 61 74 61 20 76 61 6c 75 65 2e 20  1->aData value. 
15370 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20   So.    ** call 
15380 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
15390 61 67 65 28 29 20 6f 6e 20 70 61 67 65 20 31 20  age() on page 1 
153a0 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65 0a 20 20  again to make.  
153b0 20 20 2a 2a 20 73 75 72 65 20 70 50 61 67 65 31    ** sure pPage1
153c0 2d 3e 61 44 61 74 61 20 69 73 20 73 65 74 20 63  ->aData is set c
153d0 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a 20 20 20  orrectly. */.   
153e0 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65   if( sqlite3Btre
153f0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 31 2c  eGetPage(pBt, 1,
15400 20 26 70 50 61 67 65 31 2c 20 30 29 3d 3d 53 51   &pPage1, 0)==SQ
15410 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15420 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
15430 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ge1);.    }.    
15440 61 73 73 65 72 74 28 20 63 6f 75 6e 74 57 72 69  assert( countWri
15450 74 65 43 75 72 73 6f 72 73 28 70 42 74 29 3d 3d  teCursors(pBt)==
15460 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  0 );.    pBt->in
15470 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52  Transaction = TR
15480 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d 0a 0a 20  ANS_READ;.  }.. 
15490 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
154a0 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20  =TRANS_NONE ){. 
154b0 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
154c0 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20 29  nTransaction>0 )
154d0 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e  ;.    pBt->nTran
154e0 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69  saction--;.    i
154f0 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e  f( 0==pBt->nTran
15500 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20  saction ){.     
15510 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
15520 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ion = TRANS_NONE
15530 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 62  ;.    }.  }..  b
15540 74 72 65 65 43 6c 65 61 72 48 61 73 43 6f 6e 74  treeClearHasCont
15550 65 6e 74 28 70 42 74 29 3b 0a 20 20 70 2d 3e 69  ent(pBt);.  p->i
15560 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e  nTrans = TRANS_N
15570 4f 4e 45 3b 0a 20 20 70 42 74 2d 3e 69 6e 53 74  ONE;.  pBt->inSt
15580 6d 74 20 3d 20 30 3b 0a 20 20 75 6e 6c 6f 63 6b  mt = 0;.  unlock
15590 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
155a0 74 29 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65  t);..  btreeInte
155b0 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69  grity(p);.  sqli
155c0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
155d0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
155e0 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 72 74 20 61 20  ../*.** Start a 
155f0 73 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61  statement subtra
15600 6e 73 61 63 74 69 6f 6e 2e 20 20 54 68 65 20 73  nsaction.  The s
15610 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 61  ubtransaction ca
15620 6e 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c 6c  n.** can be roll
15630 65 64 20 62 61 63 6b 20 69 6e 64 65 70 65 6e 64  ed back independ
15640 65 6e 74 6c 79 20 6f 66 20 74 68 65 20 6d 61 69  ently of the mai
15650 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  n transaction..*
15660 2a 20 59 6f 75 20 6d 75 73 74 20 73 74 61 72 74  * You must start
15670 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62   a transaction b
15680 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67 20 61  efore starting a
15690 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
156a0 0a 2a 2a 20 54 68 65 20 73 75 62 74 72 61 6e 73  .** The subtrans
156b0 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20  action is ended 
156c0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 69 66  automatically if
156d0 20 74 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61   the main transa
156e0 63 74 69 6f 6e 0a 2a 2a 20 63 6f 6d 6d 69 74 73  ction.** commits
156f0 20 6f 72 20 72 6f 6c 6c 73 20 62 61 63 6b 2e 0a   or rolls back..
15700 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 6f 6e 65 20 73  **.** Only one s
15710 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61  ubtransaction ma
15720 79 20 62 65 20 61 63 74 69 76 65 20 61 74 20 61  y be active at a
15730 20 74 69 6d 65 2e 20 20 49 74 20 69 73 20 61 6e   time.  It is an
15740 20 65 72 72 6f 72 20 74 6f 20 74 72 79 0a 2a 2a   error to try.**
15750 20 74 6f 20 73 74 61 72 74 20 61 20 6e 65 77 20   to start a new 
15760 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  subtransaction i
15770 66 20 61 6e 6f 74 68 65 72 20 73 75 62 74 72 61  f another subtra
15780 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c 72 65  nsaction is alre
15790 61 64 79 20 61 63 74 69 76 65 2e 0a 2a 2a 0a 2a  ady active..**.*
157a0 2a 20 53 74 61 74 65 6d 65 6e 74 20 73 75 62 74  * Statement subt
157b0 72 61 6e 73 61 63 74 69 6f 6e 73 20 61 72 65 20  ransactions are 
157c0 75 73 65 64 20 61 72 6f 75 6e 64 20 69 6e 64 69  used around indi
157d0 76 69 64 75 61 6c 20 53 51 4c 20 73 74 61 74 65  vidual SQL state
157e0 6d 65 6e 74 73 0a 2a 2a 20 74 68 61 74 20 61 72  ments.** that ar
157f0 65 20 63 6f 6e 74 61 69 6e 65 64 20 77 69 74 68  e contained with
15800 69 6e 20 61 20 42 45 47 49 4e 2e 2e 2e 43 4f 4d  in a BEGIN...COM
15810 4d 49 54 20 62 6c 6f 63 6b 2e 20 20 49 66 20 61  MIT block.  If a
15820 20 63 6f 6e 73 74 72 61 69 6e 74 0a 2a 2a 20 65   constraint.** e
15830 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74 68  rror occurs with
15840 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
15850 2c 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20  , the effect of 
15860 74 68 61 74 20 6f 6e 65 20 73 74 61 74 65 6d 65  that one stateme
15870 6e 74 0a 2a 2a 20 63 61 6e 20 62 65 20 72 6f 6c  nt.** can be rol
15880 6c 65 64 20 62 61 63 6b 20 77 69 74 68 6f 75 74  led back without
15890 20 68 61 76 69 6e 67 20 74 6f 20 72 6f 6c 6c 62   having to rollb
158a0 61 63 6b 20 74 68 65 20 65 6e 74 69 72 65 20 74  ack the entire t
158b0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  ransaction..*/.i
158c0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 42  nt sqlite3BtreeB
158d0 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20 2a  eginStmt(Btree *
158e0 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
158f0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
15900 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
15910 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
15920 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64    pBt->db = p->d
15930 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  b;.  assert( p->
15940 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
15950 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
15960 28 20 21 70 42 74 2d 3e 69 6e 53 74 6d 74 20 29  ( !pBt->inStmt )
15970 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
15980 3e 72 65 61 64 4f 6e 6c 79 3d 3d 30 20 29 3b 0a  >readOnly==0 );.
15990 20 20 69 66 28 20 4e 45 56 45 52 28 70 2d 3e 69    if( NEVER(p->i
159a0 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f 57 52  nTrans!=TRANS_WR
159b0 49 54 45 20 7c 7c 20 70 42 74 2d 3e 69 6e 53 74  ITE || pBt->inSt
159c0 6d 74 20 7c 7c 20 70 42 74 2d 3e 72 65 61 64 4f  mt || pBt->readO
159d0 6e 6c 79 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  nly) ){.    rc =
159e0 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c   SQLITE_INTERNAL
159f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
15a00 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72  ssert( pBt->inTr
15a10 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
15a20 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20 2f 2a  _WRITE );.    /*
15a30 20 41 74 20 74 68 65 20 70 61 67 65 72 20 6c 65   At the pager le
15a40 76 65 6c 2c 20 61 20 73 74 61 74 65 6d 65 6e 74  vel, a statement
15a50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
15a60 61 20 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68  a savepoint with
15a70 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 64 65 78  .    ** an index
15a80 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 61 6c   greater than al
15a90 6c 20 73 61 76 65 70 6f 69 6e 74 73 20 63 72 65  l savepoints cre
15aa0 61 74 65 64 20 65 78 70 6c 69 63 69 74 6c 79 20  ated explicitly 
15ab0 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20 53 51 4c  using.    ** SQL
15ac0 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 49 74 20   statements. It 
15ad0 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 6f 70  is illegal to op
15ae0 65 6e 2c 20 72 65 6c 65 61 73 65 20 6f 72 20 72  en, release or r
15af0 6f 6c 6c 62 61 63 6b 20 61 6e 79 0a 20 20 20 20  ollback any.    
15b00 2a 2a 20 73 75 63 68 20 73 61 76 65 70 6f 69 6e  ** such savepoin
15b10 74 73 20 77 68 69 6c 65 20 74 68 65 20 73 74 61  ts while the sta
15b20 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
15b30 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20  on savepoint is 
15b40 61 63 74 69 76 65 2e 0a 20 20 20 20 2a 2f 0a 20  active..    */. 
15b50 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
15b60 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69 6e  agerOpenSavepoin
15b70 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 70  t(pBt->pPager, p
15b80 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ->db->nSavepoint
15b90 2b 31 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  +1);.    pBt->in
15ba0 53 74 6d 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Stmt = 1;.  }.  
15bb0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
15bc0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
15bd0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d  c;.}../*.** Comm
15be0 69 74 20 74 68 65 20 73 74 61 74 6d 65 6e 74 20  it the statment 
15bf0 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 63  subtransaction c
15c00 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67  urrently in prog
15c10 72 65 73 73 2e 20 20 49 66 20 6e 6f 0a 2a 2a 20  ress.  If no.** 
15c20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  subtransaction i
15c30 73 20 61 63 74 69 76 65 2c 20 74 68 69 73 20 69  s active, this i
15c40 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e  s a no-op..*/.in
15c50 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
15c60 6d 6d 69 74 53 74 6d 74 28 42 74 72 65 65 20 2a  mmitStmt(Btree *
15c70 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  p){.  int rc = S
15c80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53 68  QLITE_OK;.  BtSh
15c90 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
15ca0 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  Bt;.  sqlite3Btr
15cb0 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42  eeEnter(p);.  pB
15cc0 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  t->db = p->db;. 
15cd0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d   if( p->inTrans=
15ce0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20  =TRANS_WRITE && 
15cf0 70 42 74 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a 20  pBt->inStmt ){. 
15d00 20 20 20 69 6e 74 20 69 53 74 6d 74 70 6f 69 6e     int iStmtpoin
15d10 74 20 3d 20 70 2d 3e 64 62 2d 3e 6e 53 61 76 65  t = p->db->nSave
15d20 70 6f 69 6e 74 3b 0a 20 20 20 20 61 73 73 65 72  point;.    asser
15d30 74 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  t( pBt->readOnly
15d40 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
15d50 73 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65  sqlite3PagerSave
15d60 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67 65  point(pBt->pPage
15d70 72 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c  r, SAVEPOINT_REL
15d80 45 41 53 45 2c 20 69 53 74 6d 74 70 6f 69 6e 74  EASE, iStmtpoint
15d90 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74  );.    pBt->inSt
15da0 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  mt = 0;.  }.  sq
15db0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
15dc0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
15dd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61  .}../*.** Rollba
15de0 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 73 74  ck the active st
15df0 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73  atement subtrans
15e00 61 63 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 20 73  action.  If no s
15e10 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a  ubtransaction.**
15e20 20 69 73 20 61 63 74 69 76 65 20 74 68 69 73 20   is active this 
15e30 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d  routine is a no-
15e40 6f 70 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63 75  op..**.** All cu
15e50 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 20 69 6e  rsors will be in
15e60 76 61 6c 69 64 61 74 65 64 20 62 79 20 74 68 69  validated by thi
15e70 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41 6e  s operation.  An
15e80 79 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20  y attempt.** to 
15e90 75 73 65 20 61 20 63 75 72 73 6f 72 20 74 68 61  use a cursor tha
15ea0 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74 68  t was open at th
15eb0 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
15ec0 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2a  his operation.**
15ed0 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20   will result in 
15ee0 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74  an error..*/.int
15ef0 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f 6c   sqlite3BtreeRol
15f00 6c 62 61 63 6b 53 74 6d 74 28 42 74 72 65 65 20  lbackStmt(Btree 
15f10 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  *p){.  int rc = 
15f20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74 53  SQLITE_OK;.  BtS
15f30 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
15f40 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  pBt;.  sqlite3Bt
15f50 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
15f60 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
15f70 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
15f80 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26  ==TRANS_WRITE &&
15f90 20 70 42 74 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a   pBt->inStmt ){.
15fa0 20 20 20 20 69 6e 74 20 69 53 74 6d 74 70 6f 69      int iStmtpoi
15fb0 6e 74 20 3d 20 70 2d 3e 64 62 2d 3e 6e 53 61 76  nt = p->db->nSav
15fc0 65 70 6f 69 6e 74 3b 0a 20 20 20 20 61 73 73 65  epoint;.    asse
15fd0 72 74 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  rt( pBt->readOnl
15fe0 79 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  y==0 );.    rc =
15ff0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 61 76   sqlite3PagerSav
16000 65 70 6f 69 6e 74 28 70 42 74 2d 3e 70 50 61 67  epoint(pBt->pPag
16010 65 72 2c 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  er, SAVEPOINT_RO
16020 4c 4c 42 41 43 4b 2c 20 69 53 74 6d 74 70 6f 69  LLBACK, iStmtpoi
16030 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  nt);.    if( rc=
16040 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16050 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
16060 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70  PagerSavepoint(p
16070 42 74 2d 3e 70 50 61 67 65 72 2c 20 53 41 56 45  Bt->pPager, SAVE
16080 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 69  POINT_RELEASE, i
16090 53 74 6d 74 70 6f 69 6e 74 29 3b 0a 20 20 20 20  Stmtpoint);.    
160a0 7d 0a 20 20 20 20 70 42 74 2d 3e 69 6e 53 74 6d  }.    pBt->inStm
160b0 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  t = 0;.  }.  sql
160c0 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
160d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
160e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65 63  }../*.** The sec
160f0 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
16100 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 6f  this function, o
16110 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41 56  p, is always SAV
16120 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 0a  EPOINT_ROLLBACK.
16130 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54 5f  ** or SAVEPOINT_
16140 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66 75  RELEASE. This fu
16150 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72 65  nction either re
16160 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73 20  leases or rolls 
16170 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76 65  back the.** save
16180 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65 64  point identified
16190 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 69 53   by parameter iS
161a0 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e 64  avepoint, depend
161b0 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75 65  ing on the value
161c0 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a 2a   .** of op..**.*
161d0 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61 76  * Normally, iSav
161e0 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74 65  epoint is greate
161f0 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20  r than or equal 
16200 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65 72  to zero. However
16210 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53 41  , if op is.** SA
16220 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
16230 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69 6e  , then iSavepoin
16240 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d 31  t may also be -1
16250 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
16260 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  he .** contents 
16270 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74 72  of the entire tr
16280 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72 6f  ansaction are ro
16290 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73 20  lled back. This 
162a0 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20  is different.** 
162b0 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74 72  from a normal tr
162c0 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62 61  ansaction rollba
162d0 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73 20  ck, as no locks 
162e0 61 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e 64  are released and
162f0 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74   the.** transact
16300 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65 6e  ion remains open
16310 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16320 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28 42  BtreeSavepoint(B
16330 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70 2c  tree *p, int op,
16340 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 29   int iSavepoint)
16350 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
16360 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 20  ITE_OK;.  if( p 
16370 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54  && p->inTrans==T
16380 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20  RANS_WRITE ){.  
16390 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20    BtShared *pBt 
163a0 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61 73  = p->pBt;.    as
163b0 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 53 74 6d  sert( pBt->inStm
163c0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  t==0 );.    asse
163d0 72 74 28 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e  rt( op==SAVEPOIN
163e0 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20 6f 70 3d  T_RELEASE || op=
163f0 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42  =SAVEPOINT_ROLLB
16400 41 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ACK );.    asser
16410 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d 30  t( iSavepoint>=0
16420 20 7c 7c 20 28 69 53 61 76 65 70 6f 69 6e 74 3d   || (iSavepoint=
16430 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41 56 45 50  =-1 && op==SAVEP
16440 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 20 29  OINT_ROLLBACK) )
16450 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
16460 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 20 20  eeEnter(p);.    
16470 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
16480 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
16490 33 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28  3PagerSavepoint(
164a0 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6f 70 2c  pBt->pPager, op,
164b0 20 69 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20   iSavepoint);.  
164c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
164d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
164e0 3d 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42  = newDatabase(pB
164f0 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  t);.    }.    sq
16500 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
16510 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
16520 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72   rc;.}../*.** Cr
16530 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73 6f  eate a new curso
16540 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65 20  r for the BTree 
16550 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f 6e  whose root is on
16560 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54 61   the page.** iTa
16570 62 6c 65 2e 20 20 54 68 65 20 61 63 74 20 6f 66  ble.  The act of
16580 20 61 63 71 75 69 72 69 6e 67 20 61 20 63 75 72   acquiring a cur
16590 73 6f 72 20 67 65 74 73 20 61 20 72 65 61 64 20  sor gets a read 
165a0 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65 20  lock on .** the 
165b0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
165c0 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d  *.** If wrFlag==
165d0 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  0, then the curs
165e0 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 75  or can only be u
165f0 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67 2e  sed for reading.
16600 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d 31  .** If wrFlag==1
16610 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f  , then the curso
16620 72 20 63 61 6e 20 62 65 20 75 73 65 64 20 66 6f  r can be used fo
16630 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f 72  r reading or for
16640 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20 6f  .** writing if o
16650 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  ther conditions 
16660 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65 20  for writing are 
16670 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73 65  also met.  These
16680 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e 64  .** are the cond
16690 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73 74  itions that must
166a0 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65 72   be met in order
166b0 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 0a   for writing to.
166c0 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a 2a  ** be allowed:.*
166d0 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75 72  *.** 1:  The cur
166e0 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62 65  sor must have be
166f0 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77  en opened with w
16700 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20 32  rFlag==1.**.** 2
16710 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61 73  :  Other databas
16720 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
16730 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61 6d  at share the sam
16740 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a 2a  e pager cache.**
16750 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20 61       but which a
16760 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 45  re not in the RE
16770 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20 73  AD_UNCOMMITTED s
16780 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61 76  tate may not hav
16790 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72 73  e.**     cursors
167a0 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c 61   open with wrFla
167b0 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d 65  g==0 on the same
167c0 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77 69   table.  Otherwi
167d0 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63 68  se.**     the ch
167e0 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74 68  anges made by th
167f0 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72 20  is write cursor 
16800 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c 65  would be visible
16810 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 72   to.**     the r
16820 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20 74  ead cursors in t
16830 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  he other databas
16840 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  e connection..**
16850 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74 61  .** 3:  The data
16860 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72 69  base must be wri
16870 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72 65  table (not on re
16880 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a 2a  ad-only media).*
16890 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20 6d  *.** 4:  There m
168a0 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76 65  ust be an active
168b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
168c0 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67 20  .** No checking 
168d0 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65 20  is done to make 
168e0 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20 69  sure that page i
168f0 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73 20  Table really is 
16900 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65  the.** root page
16910 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20 49   of a b-tree.  I
16920 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65  f it is not, the
16930 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63 71  n the cursor acq
16940 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  uired.** will no
16950 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c 79  t work correctly
16960 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61 73  ..**.** It is as
16970 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 73  sumed that the s
16980 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73 6f  qlite3BtreeCurso
16990 72 53 69 7a 65 28 29 20 62 79 74 65 73 20 6f 66  rSize() bytes of
169a0 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 70 6f 69 6e   memory .** poin
169b0 74 65 64 20 74 6f 20 62 79 20 70 43 75 72 20 68  ted to by pCur h
169c0 61 76 65 20 62 65 65 6e 20 7a 65 72 6f 65 64 20  ave been zeroed 
169d0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  by the caller..*
169e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
169f0 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72 65  eeCursor(.  Btre
16a00 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
16a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65 20     /* The btree 
16a30 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65 2c  */.  int iTable,
16a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
16a60 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62 6c  oot page of tabl
16a70 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69  e to open */.  i
16a80 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20 20  nt wrFlag,      
16a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16aa0 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72        /* 1 to wr
16ab0 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79  ite. 0 read-only
16ac0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79   */.  struct Key
16ad0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
16ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16af0 46 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f 6d  First arg to com
16b00 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f 6e  parison function
16b10 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20 2a   */.  BtCursor *
16b20 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20 20  pCur            
16b30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16b40 53 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63 75  Space for new cu
16b50 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  rsor */.){.  int
16b60 20 72 63 3b 0a 20 20 50 67 6e 6f 20 6e 50 61 67   rc;.  Pgno nPag
16b70 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  e;.  BtShared *p
16b80 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20  Bt = p->pBt;..  
16b90 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
16ba0 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
16bb0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 77  ) );.  assert( w
16bc0 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77 72 46 6c  rFlag==0 || wrFl
16bd0 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 77  ag==1 );.  if( w
16be0 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 61 73 73  rFlag ){.    ass
16bf0 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f  ert( !pBt->readO
16c00 6e 6c 79 20 29 3b 0a 20 20 20 20 69 66 28 20 4e  nly );.    if( N
16c10 45 56 45 52 28 70 42 74 2d 3e 72 65 61 64 4f 6e  EVER(pBt->readOn
16c20 6c 79 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ly) ){.      ret
16c30 75 72 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  urn SQLITE_READO
16c40 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  NLY;.    }.    r
16c50 63 20 3d 20 63 68 65 63 6b 46 6f 72 52 65 61 64  c = checkForRead
16c60 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61  Conflicts(p, iTa
16c70 62 6c 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ble, 0, 0);.    
16c80 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16c90 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
16ca0 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f  t( rc==SQLITE_LO
16cb0 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45  CKED_SHAREDCACHE
16cc0 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   );.      return
16cd0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a   rc;.    }.  }..
16ce0 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65    if( pBt->pPage
16cf0 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  1==0 ){.    rc =
16d00 20 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65   lockBtreeWithRe
16d10 74 72 79 28 70 29 3b 0a 20 20 20 20 69 66 28 20  try(p);.    if( 
16d20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
16d30 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
16d40 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43  ;.    }.  }.  pC
16d50 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28  ur->pgnoRoot = (
16d60 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 72  Pgno)iTable;.  r
16d70 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
16d80 50 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70  Pagecount(pBt->p
16d90 50 61 67 65 72 2c 20 28 69 6e 74 20 2a 29 26 6e  Pager, (int *)&n
16da0 50 61 67 65 29 3b 20 0a 20 20 69 66 28 20 72 63  Page); .  if( rc
16db0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16dc0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
16dd0 7d 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d  }.  if( iTable==
16de0 31 20 26 26 20 6e 50 61 67 65 3d 3d 30 20 29 7b  1 && nPage==0 ){
16df0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
16e00 5f 45 4d 50 54 59 3b 0a 20 20 20 20 67 6f 74 6f  _EMPTY;.    goto
16e10 20 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65   create_cursor_e
16e20 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20  xception;.  }.  
16e30 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50  rc = getAndInitP
16e40 61 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70  age(pBt, pCur->p
16e50 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e  gnoRoot, &pCur->
16e60 61 70 50 61 67 65 5b 30 5d 29 3b 0a 20 20 69 66  apPage[0]);.  if
16e70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16e80 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61  ){.    goto crea
16e90 74 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74  te_cursor_except
16ea0 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e  ion;.  }..  /* N
16eb0 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72  ow that no other
16ec0 20 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75   errors can occu
16ed0 72 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e  r, finish fillin
16ee0 67 20 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f  g in the BtCurso
16ef0 72 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73  r.  ** variables
16f00 2c 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f  , link the curso
16f10 72 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61  r into the BtSha
16f20 72 65 64 20 6c 69 73 74 20 61 6e 64 20 73 65 74  red list and set
16f30 20 2a 70 70 43 75 72 20 28 74 68 65 0a 20 20 2a   *ppCur (the.  *
16f40 2a 20 6f 75 74 70 75 74 20 61 72 67 75 6d 65 6e  * output argumen
16f50 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
16f60 6f 6e 29 2e 0a 20 20 2a 2f 0a 20 20 70 43 75 72  on)..  */.  pCur
16f70 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65  ->pKeyInfo = pKe
16f80 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70  yInfo;.  pCur->p
16f90 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75  Btree = p;.  pCu
16fa0 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20  r->pBt = pBt;.  
16fb0 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20 28  pCur->wrFlag = (
16fc0 75 38 29 77 72 46 6c 61 67 3b 0a 20 20 70 43 75  u8)wrFlag;.  pCu
16fd0 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42 74 2d 3e  r->pNext = pBt->
16fe0 70 43 75 72 73 6f 72 3b 0a 20 20 69 66 28 20 70  pCursor;.  if( p
16ff0 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  Cur->pNext ){.  
17000 20 20 70 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70    pCur->pNext->p
17010 50 72 65 76 20 3d 20 70 43 75 72 3b 0a 20 20 7d  Prev = pCur;.  }
17020 0a 20 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  .  pBt->pCursor 
17030 3d 20 70 43 75 72 3b 0a 20 20 70 43 75 72 2d 3e  = pCur;.  pCur->
17040 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
17050 49 4e 56 41 4c 49 44 3b 0a 0a 20 20 72 65 74 75  INVALID;..  retu
17060 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 63  rn SQLITE_OK;..c
17070 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63  reate_cursor_exc
17080 65 70 74 69 6f 6e 3a 0a 20 20 72 65 6c 65 61 73  eption:.  releas
17090 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50 61  ePage(pCur->apPa
170a0 67 65 5b 30 5d 29 3b 0a 20 20 75 6e 6c 6f 63 6b  ge[0]);.  unlock
170b0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
170c0 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  t);.  return rc;
170d0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
170e0 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72  reeCursor(.  Btr
170f0 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ee *p,          
17100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17110 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
17120 62 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69  btree */.  int i
17130 54 61 62 6c 65 2c 20 20 20 20 20 20 20 20 20 20  Table,          
17140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17150 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70         /* Root p
17160 61 67 65 20 6f 66 20 74 61 62 6c 65 20 74 6f 20  age of table to 
17170 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 77 72  open */.  int wr
17180 46 6c 61 67 2c 20 20 20 20 20 20 20 20 20 20 20  Flag,           
17190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171a0 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77 72        /* 1 to wr
171b0 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c 79  ite. 0 read-only
171c0 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65 79   */.  struct Key
171d0 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c 20  Info *pKeyInfo, 
171e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171f0 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74    /* First arg t
17200 6f 20 78 43 6f 6d 70 61 72 65 28 29 20 2a 2f 0a  o xCompare() */.
17210 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
17220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17240 20 57 72 69 74 65 20 6e 65 77 20 63 75 72 73 6f   Write new curso
17250 72 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69  r here */.){.  i
17260 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
17270 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
17280 20 70 2d 3e 70 42 74 2d 3e 64 62 20 3d 20 70 2d   p->pBt->db = p-
17290 3e 64 62 3b 0a 20 20 72 63 20 3d 20 62 74 72 65  >db;.  rc = btre
172a0 65 43 75 72 73 6f 72 28 70 2c 20 69 54 61 62 6c  eCursor(p, iTabl
172b0 65 2c 20 77 72 46 6c 61 67 2c 20 70 4b 65 79 49  e, wrFlag, pKeyI
172c0 6e 66 6f 2c 20 70 43 75 72 29 3b 0a 20 20 73 71  nfo, pCur);.  sq
172d0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
172e0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
172f0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
17300 72 65 65 43 75 72 73 6f 72 53 69 7a 65 28 29 7b  reeCursorSize(){
17310 0a 20 20 72 65 74 75 72 6e 20 73 69 7a 65 6f 66  .  return sizeof
17320 28 42 74 43 75 72 73 6f 72 29 3b 0a 7d 0a 0a 0a  (BtCursor);.}...
17330 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 63  ./*.** Close a c
17340 75 72 73 6f 72 2e 20 20 54 68 65 20 72 65 61 64  ursor.  The read
17350 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
17360 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 72 65  abase file is re
17370 6c 65 61 73 65 64 0a 2a 2a 20 77 68 65 6e 20 74  leased.** when t
17380 68 65 20 6c 61 73 74 20 63 75 72 73 6f 72 20 69  he last cursor i
17390 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74  s closed..*/.int
173a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 6f   sqlite3BtreeClo
173b0 73 65 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f  seCursor(BtCurso
173c0 72 20 2a 70 43 75 72 29 7b 0a 20 20 42 74 72 65  r *pCur){.  Btre
173d0 65 20 2a 70 42 74 72 65 65 20 3d 20 70 43 75 72  e *pBtree = pCur
173e0 2d 3e 70 42 74 72 65 65 3b 0a 20 20 69 66 28 20  ->pBtree;.  if( 
173f0 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 69 6e  pBtree ){.    in
17400 74 20 69 3b 0a 20 20 20 20 42 74 53 68 61 72 65  t i;.    BtShare
17410 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e 70  d *pBt = pCur->p
17420 42 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  Bt;.    sqlite3B
17430 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
17440 29 3b 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d  );.    pBt->db =
17450 20 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20   pBtree->db;.   
17460 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
17470 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a  arCursor(pCur);.
17480 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 70 50      if( pCur->pP
17490 72 65 76 20 29 7b 0a 20 20 20 20 20 20 70 43 75  rev ){.      pCu
174a0 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74 20  r->pPrev->pNext 
174b0 3d 20 70 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20  = pCur->pNext;. 
174c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
174d0 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70  pBt->pCursor = p
174e0 43 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Cur->pNext;.    
174f0 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  }.    if( pCur->
17500 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 70  pNext ){.      p
17510 43 75 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65  Cur->pNext->pPre
17520 76 20 3d 20 70 43 75 72 2d 3e 70 50 72 65 76 3b  v = pCur->pPrev;
17530 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
17540 3d 30 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61  =0; i<=pCur->iPa
17550 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
17560 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
17570 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
17580 20 20 7d 0a 20 20 20 20 75 6e 6c 6f 63 6b 42 74    }.    unlockBt
17590 72 65 65 49 66 55 6e 75 73 65 64 28 70 42 74 29  reeIfUnused(pBt)
175a0 3b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65  ;.    invalidate
175b0 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 43  OverflowCache(pC
175c0 75 72 29 3b 0a 20 20 20 20 2f 2a 20 73 71 6c 69  ur);.    /* sqli
175d0 74 65 33 5f 66 72 65 65 28 70 43 75 72 29 3b 20  te3_free(pCur); 
175e0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  */.    sqlite3Bt
175f0 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
17600 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
17610 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
17620 2a 2a 20 4d 61 6b 65 20 61 20 74 65 6d 70 6f 72  ** Make a tempor
17630 61 72 79 20 63 75 72 73 6f 72 20 62 79 20 66 69  ary cursor by fi
17640 6c 6c 69 6e 67 20 69 6e 20 74 68 65 20 66 69 65  lling in the fie
17650 6c 64 73 20 6f 66 20 70 54 65 6d 70 43 75 72 2e  lds of pTempCur.
17660 0a 2a 2a 20 54 68 65 20 74 65 6d 70 6f 72 61 72  .** The temporar
17670 79 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  y cursor is not 
17680 6f 6e 20 74 68 65 20 63 75 72 73 6f 72 20 6c 69  on the cursor li
17690 73 74 20 66 6f 72 20 74 68 65 20 42 74 72 65 65  st for the Btree
176a0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
176b0 33 42 74 72 65 65 47 65 74 54 65 6d 70 43 75 72  3BtreeGetTempCur
176c0 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
176d0 75 72 2c 20 42 74 43 75 72 73 6f 72 20 2a 70 54  ur, BtCursor *pT
176e0 65 6d 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 69  empCur){.  int i
176f0 3b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ;.  assert( curs
17700 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
17710 72 29 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70  r) );.  memcpy(p
17720 54 65 6d 70 43 75 72 2c 20 70 43 75 72 2c 20 73  TempCur, pCur, s
17730 69 7a 65 6f 66 28 42 74 43 75 72 73 6f 72 29 29  izeof(BtCursor))
17740 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d 3e 70 4e  ;.  pTempCur->pN
17750 65 78 74 20 3d 20 30 3b 0a 20 20 70 54 65 6d 70  ext = 0;.  pTemp
17760 43 75 72 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a  Cur->pPrev = 0;.
17770 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 54    for(i=0; i<=pT
17780 65 6d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  empCur->iPage; i
17790 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
177a0 50 61 67 65 72 52 65 66 28 70 54 65 6d 70 43 75  PagerRef(pTempCu
177b0 72 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 70 44  r->apPage[i]->pD
177c0 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 61 73  bPage);.  }.  as
177d0 73 65 72 74 28 20 70 54 65 6d 70 43 75 72 2d 3e  sert( pTempCur->
177e0 70 4b 65 79 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a  pKey==0 );.}../*
177f0 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 74 65 6d  .** Delete a tem
17800 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20 73 75  porary cursor su
17810 63 68 20 61 73 20 77 61 73 20 6d 61 64 65 20 62  ch as was made b
17820 79 20 74 68 65 20 43 72 65 61 74 65 54 65 6d 70  y the CreateTemp
17830 6f 72 61 72 79 43 75 72 73 6f 72 28 29 0a 2a 2a  oraryCursor().**
17840 20 66 75 6e 63 74 69 6f 6e 20 61 62 6f 76 65 2e   function above.
17850 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
17860 42 74 72 65 65 52 65 6c 65 61 73 65 54 65 6d 70  BtreeReleaseTemp
17870 43 75 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20  Cursor(BtCursor 
17880 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b  *pCur){.  int i;
17890 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
178a0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
178b0 29 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ) );.  for(i=0; 
178c0 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  i<=pCur->iPage; 
178d0 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
178e0 33 50 61 67 65 72 55 6e 72 65 66 28 70 43 75 72  3PagerUnref(pCur
178f0 2d 3e 61 70 50 61 67 65 5b 69 5d 2d 3e 70 44 62  ->apPage[i]->pDb
17900 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  Page);.  }.  sql
17910 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
17920 70 4b 65 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pKey);.}../*.** 
17930 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 42 74  Make sure the Bt
17940 43 75 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e  Cursor* given in
17950 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61   the argument ha
17960 73 20 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43  s a valid.** BtC
17970 75 72 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63  ursor.info struc
17980 74 75 72 65 2e 20 20 49 66 20 69 74 20 69 73 20  ture.  If it is 
17990 6e 6f 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69  not already vali
179a0 64 2c 20 63 61 6c 6c 0a 2a 2a 20 73 71 6c 69 74  d, call.** sqlit
179b0 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
179c0 28 29 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e  () to fill it in
179d0 2e 0a 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72  ..**.** BtCursor
179e0 2e 69 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65  .info is a cache
179f0 20 6f 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74   of the informat
17a00 69 6f 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65  ion in the curre
17a10 6e 74 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e  nt cell..** Usin
17a20 67 20 74 68 69 73 20 63 61 63 68 65 20 72 65 64  g this cache red
17a30 75 63 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  uces the number 
17a40 6f 66 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  of calls to sqli
17a50 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
17a60 6c 28 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d  l()..**.** 2007-
17a70 30 36 2d 32 35 3a 20 20 54 68 65 72 65 20 69 73  06-25:  There is
17a80 20 61 20 62 75 67 20 69 6e 20 73 6f 6d 65 20 76   a bug in some v
17a90 65 72 73 69 6f 6e 73 20 6f 66 20 4d 53 56 43 20  ersions of MSVC 
17aa0 74 68 61 74 20 63 61 75 73 65 20 74 68 65 0a 2a  that cause the.*
17ab0 2a 20 63 6f 6d 70 69 6c 65 72 20 74 6f 20 63 72  * compiler to cr
17ac0 61 73 68 20 77 68 65 6e 20 67 65 74 43 65 6c 6c  ash when getCell
17ad0 49 6e 66 6f 28 29 20 69 73 20 69 6d 70 6c 65 6d  Info() is implem
17ae0 65 6e 74 65 64 20 61 73 20 61 20 6d 61 63 72 6f  ented as a macro
17af0 2e 0a 2a 2a 20 42 75 74 20 74 68 65 72 65 20 69  ..** But there i
17b00 73 20 61 20 6d 65 61 73 75 72 65 61 62 6c 65 20  s a measureable 
17b10 73 70 65 65 64 20 61 64 76 61 6e 74 61 67 65 20  speed advantage 
17b20 74 6f 20 75 73 69 6e 67 20 74 68 65 20 6d 61 63  to using the mac
17b30 72 6f 20 6f 6e 20 67 63 63 0a 2a 2a 20 28 77 68  ro on gcc.** (wh
17b40 65 6e 20 6c 65 73 73 20 63 6f 6d 70 69 6c 65 72  en less compiler
17b50 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c   optimizations l
17b60 69 6b 65 20 2d 4f 73 20 6f 72 20 2d 4f 30 20 61  ike -Os or -O0 a
17b70 72 65 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a  re used and the.
17b80 2a 2a 20 63 6f 6d 70 69 6c 65 72 20 69 73 20 6e  ** compiler is n
17b90 6f 74 20 64 6f 69 6e 67 20 61 67 72 65 73 73 69  ot doing agressi
17ba0 76 65 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20 53  ve inlining.)  S
17bb0 6f 20 77 65 20 75 73 65 20 61 20 72 65 61 6c 20  o we use a real 
17bc0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20  function.** for 
17bd0 4d 53 56 43 20 61 6e 64 20 61 20 6d 61 63 72 6f  MSVC and a macro
17be0 20 66 6f 72 20 65 76 65 72 79 74 68 69 6e 67 20   for everything 
17bf0 65 6c 73 65 2e 20 20 54 69 63 6b 65 74 20 23 32  else.  Ticket #2
17c00 34 35 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  457..*/.#ifndef 
17c10 4e 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20  NDEBUG.  static 
17c20 76 6f 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49  void assertCellI
17c30 6e 66 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nfo(BtCursor *pC
17c40 75 72 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66  ur){.    CellInf
17c50 6f 20 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20  o info;.    int 
17c60 69 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50  iPage = pCur->iP
17c70 61 67 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  age;.    memset(
17c80 26 69 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  &info, 0, sizeof
17c90 28 69 6e 66 6f 29 29 3b 0a 20 20 20 20 73 71 6c  (info));.    sql
17ca0 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65  ite3BtreeParseCe
17cb0 6c 6c 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ll(pCur->apPage[
17cc0 69 50 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69  iPage], pCur->ai
17cd0 49 64 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66  Idx[iPage], &inf
17ce0 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  o);.    assert( 
17cf0 6d 65 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70  memcmp(&info, &p
17d00 43 75 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f  Cur->info, sizeo
17d10 66 28 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20  f(info))==0 );. 
17d20 20 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69   }.#else.  #defi
17d30 6e 65 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66  ne assertCellInf
17d40 6f 28 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64  o(x).#endif.#ifd
17d50 65 66 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a  ef _MSC_VER.  /*
17d60 20 55 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63   Use a real func
17d70 74 69 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20  tion in MSVC to 
17d80 77 6f 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73  work around bugs
17d90 20 69 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65   in that compile
17da0 72 2e 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76  r. */.  static v
17db0 6f 69 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28  oid getCellInfo(
17dc0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
17dd0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69  .    if( pCur->i
17de0 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a  nfo.nSize==0 ){.
17df0 20 20 20 20 20 20 69 6e 74 20 69 50 61 67 65 20        int iPage 
17e00 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20  = pCur->iPage;. 
17e10 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
17e20 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d  eParseCell(pCur-
17e30 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70  >apPage[iPage],p
17e40 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65  Cur->aiIdx[iPage
17e50 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a  ],&pCur->info);.
17e60 20 20 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69        pCur->vali
17e70 64 4e 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d  dNKey = 1;.    }
17e80 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
17e90 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  rtCellInfo(pCur)
17ea0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73  ;.    }.  }.#els
17eb0 65 20 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d 53 43  e /* if not _MSC
17ec0 5f 56 45 52 20 2a 2f 0a 20 20 2f 2a 20 55 73 65  _VER */.  /* Use
17ed0 20 61 20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c 20   a macro in all 
17ee0 6f 74 68 65 72 20 63 6f 6d 70 69 6c 65 72 73 20  other compilers 
17ef0 73 6f 20 74 68 61 74 20 74 68 65 20 66 75 6e 63  so that the func
17f00 74 69 6f 6e 20 69 73 20 69 6e 6c 69 6e 65 64 20  tion is inlined 
17f10 2a 2f 0a 23 64 65 66 69 6e 65 20 67 65 74 43 65  */.#define getCe
17f20 6c 6c 49 6e 66 6f 28 70 43 75 72 29 20 20 20 20  llInfo(pCur)    
17f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f60 20 20 5c 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    \.  if( pCur->
17f70 69 6e 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b  info.nSize==0 ){
17f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17fb0 20 20 20 5c 0a 20 20 20 20 69 6e 74 20 69 50 61     \.    int iPa
17fc0 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65  ge = pCur->iPage
17fd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
17fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18000 20 20 20 20 5c 0a 20 20 20 20 73 71 6c 69 74 65      \.    sqlite
18010 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
18020 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61  pCur->apPage[iPa
18030 67 65 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b  ge],pCur->aiIdx[
18040 69 50 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e  iPage],&pCur->in
18050 66 6f 29 3b 20 5c 0a 20 20 20 20 70 43 75 72 2d  fo); \.    pCur-
18060 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 20  >validNKey = 1; 
18070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180a0 20 20 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b        \.  }else{
180b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180f0 20 20 20 20 20 20 20 5c 0a 20 20 20 20 61 73 73         \.    ass
18100 65 72 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72  ertCellInfo(pCur
18110 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  );              
18120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18140 20 20 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65          \.  }.#e
18150 6e 64 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52  ndif /* _MSC_VER
18160 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a   */../*.** Set *
18170 70 53 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a  pSize to the siz
18180 65 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  e of the buffer 
18190 6e 65 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74  needed to hold t
181a0 68 65 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74  he value of.** t
181b0 68 65 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63  he key for the c
181c0 75 72 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49  urrent entry.  I
181d0 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
181e0 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20  not pointing.** 
181f0 74 6f 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  to a valid entry
18200 2c 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20  , *pSize is set 
18210 74 6f 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72  to 0. .**.** For
18220 20 61 20 74 61 62 6c 65 20 77 69 74 68 20 74 68   a table with th
18230 65 20 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65  e INTKEY flag se
18240 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  t, this routine 
18250 72 65 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a  returns the key.
18260 2a 2a 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74  ** itself, not t
18270 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74  he number of byt
18280 65 73 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a  es in the key..*
18290 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
182a0 65 65 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73  eeKeySize(BtCurs
182b0 6f 72 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70  or *pCur, i64 *p
182c0 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Size){.  int rc;
182d0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
182e0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
182f0 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
18300 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
18310 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
18320 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
18330 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
18340 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
18350 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75  R_INVALID || pCu
18360 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
18370 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69  R_VALID );.    i
18380 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d  f( pCur->eState=
18390 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20  =CURSOR_INVALID 
183a0 29 7b 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20  ){.      *pSize 
183b0 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
183c0 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66        getCellInf
183d0 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a  o(pCur);.      *
183e0 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e  pSize = pCur->in
183f0 66 6f 2e 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20  fo.nKey;.    }. 
18400 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
18410 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53  }../*.** Set *pS
18420 69 7a 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ize to the numbe
18430 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61  r of bytes of da
18440 74 61 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20  ta in the entry 
18450 74 68 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75  the.** cursor cu
18460 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74  rrently points t
18470 6f 2e 20 20 41 6c 77 61 79 73 20 72 65 74 75 72  o.  Always retur
18480 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20  n SQLITE_OK..** 
18490 46 61 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70  Failure is not p
184a0 6f 73 73 69 62 6c 65 2e 20 20 49 66 20 74 68 65  ossible.  If the
184b0 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 63   cursor is not c
184c0 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e  urrently.** poin
184d0 74 69 6e 67 20 74 6f 20 61 6e 20 65 6e 74 72 79  ting to an entry
184e0 20 28 77 68 69 63 68 20 63 61 6e 20 68 61 70 70   (which can happ
184f0 65 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  en, for example,
18500 20 69 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62   if.** the datab
18510 61 73 65 20 69 73 20 65 6d 70 74 79 29 20 74 68  ase is empty) th
18520 65 6e 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74  en *pSize is set
18530 20 74 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71   to 0..*/.int sq
18540 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 53 69  lite3BtreeDataSi
18550 7a 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ze(BtCursor *pCu
18560 72 2c 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a  r, u32 *pSize){.
18570 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
18580 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
18590 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
185a0 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72   rc = restoreCur
185b0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72  sorPosition(pCur
185c0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
185d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
185e0 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
185f0 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
18600 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61  ID || pCur->eSta
18610 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
18620 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72   );.    if( pCur
18630 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
18640 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20  _INVALID ){.    
18650 20 20 2f 2a 20 4e 6f 74 20 70 6f 69 6e 74 69 6e    /* Not pointin
18660 67 20 61 74 20 61 20 76 61 6c 69 64 20 65 6e 74  g at a valid ent
18670 72 79 20 2d 20 73 65 74 20 2a 70 53 69 7a 65 20  ry - set *pSize 
18680 74 6f 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2a  to 0. */.      *
18690 70 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d  pSize = 0;.    }
186a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 65 74 43  else{.      getC
186b0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
186c0 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43       *pSize = pC
186d0 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a  ur->info.nData;.
186e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
186f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
18700 47 69 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e  Given the page n
18710 75 6d 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72  umber of an over
18720 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
18730 20 64 61 74 61 62 61 73 65 20 28 70 61 72 61 6d   database (param
18740 65 74 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74  eter.** ovfl), t
18750 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e  his function fin
18760 64 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ds the page numb
18770 65 72 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70  er of the next p
18780 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c  age in the .** l
18790 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76  inked list of ov
187a0 65 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66  erflow pages. If
187b0 20 70 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73   possible, it us
187c0 65 73 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75  es the auto-vacu
187d0 75 6d 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61  um.** pointer-ma
187e0 70 20 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f  p data instead o
187f0 66 20 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f  f reading the co
18800 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76  ntent of page ov
18810 66 6c 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a  fl to do so. .**
18820 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
18830 6f 63 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65  occurs an SQLite
18840 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
18850 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69  eturned. Otherwi
18860 73 65 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  se:.**.** The pa
18870 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
18880 20 6e 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70   next overflow p
18890 61 67 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65  age in the linke
188a0 64 20 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72  d list is .** wr
188b0 69 74 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e  itten to *pPgnoN
188c0 65 78 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66  ext. If page ovf
188d0 6c 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61  l is the last pa
188e0 67 65 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64  ge in its linked
188f0 20 0a 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e   .** list, *pPgn
18900 6f 4e 65 78 74 20 69 73 20 73 65 74 20 74 6f 20  oNext is set to 
18910 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  zero. .**.** If 
18920 70 70 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55  ppPage is not NU
18930 4c 4c 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65  LL, and a refere
18940 6e 63 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61  nce to the MemPa
18950 67 65 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73  ge object corres
18960 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61  ponding.** to pa
18970 67 65 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20  ge number pOvfl 
18980 77 61 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68  was obtained, th
18990 65 6e 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  en *ppPage is se
189a0 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68  t to point to th
189b0 61 74 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e  at.** reference.
189c0 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
189d0 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
189e0 20 63 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20   caller to call 
189f0 72 65 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a  releasePage().**
18a00 20 6f 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66   on *ppPage to f
18a10 72 65 65 20 74 68 65 20 72 65 66 65 72 65 6e 63  ree the referenc
18a20 65 2e 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e  e. In no referen
18a30 63 65 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20  ce was obtained 
18a40 28 62 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20  (because.** the 
18a50 70 6f 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20  pointer-map was 
18a60 75 73 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74  used to obtain t
18a70 68 65 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50  he value for *pP
18a80 67 6e 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a  gnoNext), then.*
18a90 2a 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  * *ppPage is set
18aa0 20 74 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61   to zero..*/.sta
18ab0 74 69 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66  tic int getOverf
18ac0 6c 6f 77 50 61 67 65 28 0a 20 20 42 74 53 68 61  lowPage(.  BtSha
18ad0 72 65 64 20 2a 70 42 74 2c 20 0a 20 20 50 67 6e  red *pBt, .  Pgn
18ae0 6f 20 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20  o ovfl,         
18af0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 76 65            /* Ove
18b00 72 66 6c 6f 77 20 70 61 67 65 20 2a 2f 0a 20 20  rflow page */.  
18b10 4d 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65  MemPage **ppPage
18b20 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
18b30 4f 55 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e  OUT: MemPage han
18b40 64 6c 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c  dle (may be NULL
18b50 29 20 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67  ) */.  Pgno *pPg
18b60 6e 6f 4e 65 78 74 20 20 20 20 20 20 20 20 20 20  noNext          
18b70 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74      /* OUT: Next
18b80 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e   overflow page n
18b90 75 6d 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67  umber */.){.  Pg
18ba0 6e 6f 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d  no next = 0;.  M
18bb0 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
18bc0 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  0;.  int rc = SQ
18bd0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65  LITE_OK;..  asse
18be0 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
18bf0 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65  x_held(pBt->mute
18c00 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70  x) );.  assert(p
18c10 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e  PgnoNext);..#ifn
18c20 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18c30 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20  AUTOVACUUM.  /* 
18c40 54 72 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20  Try to find the 
18c50 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68 65  next page in the
18c60 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75   overflow list u
18c70 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75  sing the.  ** au
18c80 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72  tovacuum pointer
18c90 2d 6d 61 70 20 70 61 67 65 73 2e 20 47 75 65 73  -map pages. Gues
18ca0 73 20 74 68 61 74 20 74 68 65 20 6e 65 78 74 20  s that the next 
18cb0 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68  page in .  ** th
18cc0 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20  e overflow list 
18cd0 69 73 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28  is page number (
18ce0 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74  ovfl+1). If that
18cf0 20 67 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20   guess turns .  
18d00 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f  ** out to be wro
18d10 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f  ng, fall back to
18d20 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74   loading the dat
18d30 61 20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20  a of page .  ** 
18d40 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64  number ovfl to d
18d50 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78  etermine the nex
18d60 74 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20  t page number.. 
18d70 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61   */.  if( pBt->a
18d80 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
18d90 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20   Pgno pgno;.    
18da0 50 67 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76  Pgno iGuess = ov
18db0 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79  fl+1;.    u8 eTy
18dc0 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20  pe;..    while( 
18dd0 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
18de0 74 2c 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47  t, iGuess) || iG
18df0 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  uess==PENDING_BY
18e00 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
18e10 20 20 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a        iGuess++;.
18e20 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69      }..    if( i
18e30 47 75 65 73 73 3c 3d 70 61 67 65 72 50 61 67 65  Guess<=pagerPage
18e40 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20  count(pBt) ){.  
18e50 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47      rc = ptrmapG
18e60 65 74 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20  et(pBt, iGuess, 
18e70 26 65 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a  &eType, &pgno);.
18e80 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
18e90 4c 49 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65  LITE_OK && eType
18ea0 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
18eb0 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c  W2 && pgno==ovfl
18ec0 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74   ){.        next
18ed0 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20   = iGuess;.     
18ee0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44     rc = SQLITE_D
18ef0 4f 4e 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ONE;.      }.   
18f00 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20   }.  }.#endif.. 
18f10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
18f20 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
18f30 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
18f40 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70  ge(pBt, ovfl, &p
18f50 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20 61 73  Page, 0);.    as
18f60 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f  sert(rc==SQLITE_
18f70 4f 4b 20 7c 7c 20 70 50 61 67 65 3d 3d 30 29 3b  OK || pPage==0);
18f80 0a 20 20 20 20 69 66 28 20 6e 65 78 74 3d 3d 30  .    if( next==0
18f90 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
18fa0 4b 20 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20  K ){.      next 
18fb0 3d 20 67 65 74 34 62 79 74 65 28 70 50 61 67 65  = get4byte(pPage
18fc0 2d 3e 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a  ->aData);.    }.
18fd0 20 20 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78    }..  *pPgnoNex
18fe0 74 20 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28 20  t = next;.  if( 
18ff0 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70  ppPage ){.    *p
19000 70 50 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20  pPage = pPage;. 
19010 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65   }else{.    rele
19020 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
19030 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 72 63    }.  return (rc
19040 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20  ==SQLITE_DONE ? 
19050 53 51 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b  SQLITE_OK : rc);
19060 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64  .}../*.** Copy d
19070 61 74 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65  ata from a buffe
19080 72 20 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20  r to a page, or 
19090 66 72 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61  from a page to a
190a0 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70   buffer..**.** p
190b0 50 61 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69  Payload is a poi
190c0 6e 74 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f  nter to data sto
190d0 72 65 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20  red on database 
190e0 70 61 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a  page pDbPage..**
190f0 20 49 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70   If argument eOp
19100 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20   is false, then 
19110 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 64  nByte bytes of d
19120 61 74 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a  ata are copied.*
19130 2a 20 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20  * from pPayload 
19140 74 6f 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  to the buffer po
19150 69 6e 74 65 64 20 61 74 20 62 79 20 70 42 75 66  inted at by pBuf
19160 2e 20 49 66 20 65 4f 70 20 69 73 20 74 72 75 65  . If eOp is true
19170 2c 0a 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65  ,.** then sqlite
19180 33 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73  3PagerWrite() is
19190 20 63 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61   called on pDbPa
191a0 67 65 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74  ge and nByte byt
191b0 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72  es.** of data ar
191c0 65 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68  e copied from th
191d0 65 20 62 75 66 66 65 72 20 70 42 75 66 20 74 6f  e buffer pBuf to
191e0 20 70 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a   pPayload..**.**
191f0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
19200 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
19210 73 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20  s, otherwise an 
19220 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73  error code..*/.s
19230 74 61 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61  tatic int copyPa
19240 79 6c 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70  yload(.  void *p
19250 50 61 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20  Payload,        
19260 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
19270 20 70 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20   page data */.  
19280 76 6f 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20  void *pBuf,     
19290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69            /* Poi
192a0 6e 74 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a  nter to buffer *
192b0 2f 0a 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20  /.  int nByte,  
192c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
192d0 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
192e0 20 74 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e   to copy */.  in
192f0 74 20 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20  t eOp,          
19300 20 20 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20          /* 0 -> 
19310 63 6f 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20  copy from page, 
19320 31 20 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67  1 -> copy to pag
19330 65 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70  e */.  DbPage *p
19340 44 62 50 61 67 65 20 20 20 20 20 20 20 20 20 20  DbPage          
19350 20 2f 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e   /* Page contain
19360 69 6e 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a  ing pPayload */.
19370 29 7b 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a  ){.  if( eOp ){.
19380 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61      /* Copy data
19390 20 66 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20   from buffer to 
193a0 70 61 67 65 20 28 61 20 77 72 69 74 65 20 6f 70  page (a write op
193b0 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20  eration) */.    
193c0 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
193d0 50 61 67 65 72 57 72 69 74 65 28 70 44 62 50 61  PagerWrite(pDbPa
193e0 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
193f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
19400 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
19410 20 20 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28     }.    memcpy(
19420 70 50 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20  pPayload, pBuf, 
19430 6e 42 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  nByte);.  }else{
19440 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74  .    /* Copy dat
19450 61 20 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62  a from page to b
19460 75 66 66 65 72 20 28 61 20 72 65 61 64 20 6f 70  uffer (a read op
19470 65 72 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20  eration) */.    
19480 6d 65 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61  memcpy(pBuf, pPa
19490 79 6c 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20  yload, nByte);. 
194a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
194b0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
194c0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
194d0 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72   used to read or
194e0 20 6f 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f   overwrite paylo
194f0 61 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a  ad information.*
19500 2a 20 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20  * for the entry 
19510 74 68 61 74 20 74 68 65 20 70 43 75 72 20 63 75  that the pCur cu
19520 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
19530 20 74 6f 2e 20 49 66 20 74 68 65 20 65 4f 70 0a   to. If the eOp.
19540 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ** parameter is 
19550 30 2c 20 74 68 69 73 20 69 73 20 61 20 72 65 61  0, this is a rea
19560 64 20 6f 70 65 72 61 74 69 6f 6e 20 28 64 61 74  d operation (dat
19570 61 20 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a  a copied into.**
19580 20 62 75 66 66 65 72 20 70 42 75 66 29 2e 20 49   buffer pBuf). I
19590 66 20 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  f it is non-zero
195a0 2c 20 61 20 77 72 69 74 65 20 28 64 61 74 61 20  , a write (data 
195b0 63 6f 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62  copied from.** b
195c0 75 66 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a  uffer pBuf)..**.
195d0 2a 2a 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61  ** A total of "a
195e0 6d 74 22 20 62 79 74 65 73 20 61 72 65 20 72 65  mt" bytes are re
195f0 61 64 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65  ad or written be
19600 67 69 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73  ginning at "offs
19610 65 74 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20  et"..** Data is 
19620 72 65 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20  read to or from 
19630 74 68 65 20 62 75 66 66 65 72 20 70 42 75 66 2e  the buffer pBuf.
19640 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
19650 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b  ine does not mak
19660 65 20 61 20 64 69 73 74 69 6e 63 74 69 6f 6e 20  e a distinction 
19670 62 65 74 77 65 65 6e 20 6b 65 79 20 61 6e 64 20  between key and 
19680 64 61 74 61 2e 0a 2a 2a 20 49 74 20 6a 75 73 74  data..** It just
19690 20 72 65 61 64 73 20 6f 72 20 77 72 69 74 65 73   reads or writes
196a0 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
196b0 70 61 79 6c 6f 61 64 20 61 72 65 61 2e 20 20 44  payload area.  D
196c0 61 74 61 20 6d 69 67 68 74 20 0a 2a 2a 20 61 70  ata might .** ap
196d0 70 65 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e  pear on the main
196e0 20 70 61 67 65 20 6f 72 20 62 65 20 73 63 61 74   page or be scat
196f0 74 65 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c  tered out on mul
19700 74 69 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 0a  tiple overflow .
19710 2a 2a 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20  ** pages..**.** 
19720 49 66 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e  If the BtCursor.
19730 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
19740 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 61 6e   flag is set, an
19750 64 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  d the current.**
19760 20 63 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73   cursor entry us
19770 65 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f  es one or more o
19780 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74  verflow pages, t
19790 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
197a0 61 6c 6c 6f 63 61 74 65 73 20 73 70 61 63 65 20  allocates space 
197b0 66 6f 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70  for and lazily p
197c0 6f 70 6c 75 61 74 65 73 20 74 68 65 20 6f 76 65  opluates the ove
197d0 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
197e0 0a 2a 2a 20 63 61 63 68 65 20 61 72 72 61 79 20  .** cache array 
197f0 28 42 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66  (BtCursor.aOverf
19800 6c 6f 77 29 2e 20 53 75 62 73 65 71 75 65 6e 74  low). Subsequent
19810 20 63 61 6c 6c 73 20 75 73 65 20 74 68 69 73 0a   calls use this.
19820 2a 2a 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65  ** cache to make
19830 20 73 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20   seeking to the 
19840 73 75 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20  supplied offset 
19850 6d 6f 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a  more efficient..
19860 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76  **.** Once an ov
19870 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
19880 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20   cache has been 
19890 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 61  allocated, it ma
198a0 79 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61  y be.** invalida
198b0 74 65 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65  ted if some othe
198c0 72 20 63 75 72 73 6f 72 20 77 72 69 74 65 73 20  r cursor writes 
198d0 74 6f 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c  to the same tabl
198e0 65 2c 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20  e, or if.** the 
198f0 63 75 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20  cursor is moved 
19900 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 72  to a different r
19910 6f 77 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79  ow. Additionally
19920 2c 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  , in auto-vacuum
19930 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f  .** mode, the fo
19940 6c 6c 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d  llowing events m
19950 61 79 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e  ay invalidate an
19960 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
19970 69 73 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  ist cache..**.**
19980 20 20 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e     * An incremen
19990 74 61 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20  tal vacuum,.**  
199a0 20 2a 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61   * A commit in a
199b0 75 74 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c  uto_vacuum="full
199c0 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43  " mode,.**   * C
199d0 72 65 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20  reating a table 
199e0 28 6d 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76  (may require mov
199f0 69 6e 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20  ing an overflow 
19a00 70 61 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  page)..*/.static
19a10 20 69 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f   int accessPaylo
19a20 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ad(.  BtCursor *
19a30 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75  pCur,      /* Cu
19a40 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f  rsor pointing to
19a50 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66   entry to read f
19a60 72 6f 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66  rom */.  u32 off
19a70 73 65 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  set,          /*
19a80 20 42 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74   Begin reading t
19a90 68 69 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79  his far into pay
19aa0 6c 6f 61 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d  load */.  u32 am
19ab0 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t,             /
19ac0 2a 20 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79  * Read this many
19ad0 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69   bytes */.  unsi
19ae0 67 6e 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c  gned char *pBuf,
19af0 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 62 79   /* Write the by
19b00 74 65 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75  tes into this bu
19b10 66 66 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 73  ffer */ .  int s
19b20 6b 69 70 4b 65 79 2c 20 20 20 20 20 20 20 20 20  kipKey,         
19b30 2f 2a 20 6f 66 66 73 65 74 20 62 65 67 69 6e 73  /* offset begins
19b40 20 61 74 20 64 61 74 61 20 69 66 20 74 68 69 73   at data if this
19b50 20 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e   is true */.  in
19b60 74 20 65 4f 70 20 20 20 20 20 20 20 20 20 20 20  t eOp           
19b70 20 20 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65     /* zero to re
19b80 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20  ad. non-zero to 
19b90 77 72 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75  write. */.){.  u
19ba0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50  nsigned char *aP
19bb0 61 79 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63  ayload;.  int rc
19bc0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
19bd0 75 33 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20  u32 nKey;.  int 
19be0 69 49 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50  iIdx = 0;.  MemP
19bf0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
19c00 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
19c10 69 50 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65  iPage]; /* Btree
19c20 20 70 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74   page of current
19c30 20 65 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68   entry */.  BtSh
19c40 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72  ared *pBt = pCur
19c50 2d 3e 70 42 74 3b 20 20 20 20 20 20 20 20 20 20  ->pBt;          
19c60 20 20 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65          /* Btree
19c70 20 74 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c   this cursor bel
19c80 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73  ongs to */..  as
19c90 73 65 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20  sert( pPage );. 
19ca0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
19cb0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
19cc0 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
19cd0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
19ce0 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d  r->iPage]<pPage-
19cf0 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65  >nCell );.  asse
19d00 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
19d10 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20  utex(pCur) );.. 
19d20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75   getCellInfo(pCu
19d30 72 29 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d  r);.  aPayload =
19d40 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c   pCur->info.pCel
19d50 6c 20 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  l + pCur->info.n
19d60 48 65 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d  Header;.  nKey =
19d70 20 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   (pPage->intKey 
19d80 3f 20 30 20 3a 20 28 69 6e 74 29 70 43 75 72 2d  ? 0 : (int)pCur-
19d90 3e 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20  >info.nKey);..  
19da0 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20  if( skipKey ){. 
19db0 20 20 20 6f 66 66 73 65 74 20 2b 3d 20 6e 4b 65     offset += nKe
19dc0 79 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 66 66  y;.  }.  if( off
19dd0 73 65 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70  set+amt > nKey+p
19de0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 20  Cur->info.nData 
19df0 0a 20 20 20 7c 7c 20 26 61 50 61 79 6c 6f 61 64  .   || &aPayload
19e00 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  [pCur->info.nLoc
19e10 61 6c 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44  al] > &pPage->aD
19e20 61 74 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53  ata[pBt->usableS
19e30 69 7a 65 5d 0a 20 20 29 7b 0a 20 20 20 20 2f 2a  ize].  ){.    /*
19e40 20 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20   Trying to read 
19e50 6f 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68  or write past th
19e60 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
19e70 61 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f  a is an error */
19e80 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
19e90 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
19ea0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
19eb0 20 69 66 20 64 61 74 61 20 6d 75 73 74 20 62 65   if data must be
19ec0 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f   read/written to
19ed0 2f 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20  /from the btree 
19ee0 70 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a  page itself. */.
19ef0 20 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75    if( offset<pCu
19f00 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  r->info.nLocal )
19f10 7b 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d  {.    int a = am
19f20 74 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66  t;.    if( a+off
19f30 73 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  set>pCur->info.n
19f40 4c 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61  Local ){.      a
19f50 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   = pCur->info.nL
19f60 6f 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20  ocal - offset;. 
19f70 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f     }.    rc = co
19f80 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c  pyPayload(&aPayl
19f90 6f 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75  oad[offset], pBu
19fa0 66 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65  f, a, eOp, pPage
19fb0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
19fc0 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20  offset = 0;.    
19fd0 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61  pBuf += a;.    a
19fe0 6d 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65  mt -= a;.  }else
19ff0 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20  {.    offset -= 
1a000 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
1a010 6c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  l;.  }..  if( rc
1a020 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61  ==SQLITE_OK && a
1a030 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  mt>0 ){.    cons
1a040 74 20 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d  t u32 ovflSize =
1a050 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
1a060 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20   - 4;  /* Bytes 
1a070 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c  content per ovfl
1a080 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e   page */.    Pgn
1a090 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20  o nextPage;..   
1a0a0 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65 74 34   nextPage = get4
1a0b0 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70  byte(&aPayload[p
1a0c0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1a0d0 5d 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ]);..#ifndef SQL
1a0e0 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f  ITE_OMIT_INCRBLO
1a0f0 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  B.    /* If the 
1a100 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
1a110 20 66 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64   flag is set and
1a120 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f   the BtCursor.aO
1a130 76 65 72 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a  verflow[].    **
1a140 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c   has not been al
1a150 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74  located, allocat
1a160 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 20 61 72  e it now. The ar
1a170 72 61 79 20 69 73 20 73 69 7a 65 64 20 61 74 0a  ray is sized at.
1a180 20 20 20 20 2a 2a 20 6f 6e 65 20 65 6e 74 72 79      ** one entry
1a190 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c   for each overfl
1a1a0 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  ow page in the o
1a1b0 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54  verflow chain. T
1a1c0 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 6e  he.    ** page n
1a1d0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66 69 72  umber of the fir
1a1e0 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
1a1f0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 4f   is stored in aO
1a200 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20  verflow[0],.    
1a210 2a 2a 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20  ** etc. A value 
1a220 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65  of 0 in the aOve
1a230 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d 65  rflow[] array me
1a240 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f  ans "not yet kno
1a250 77 6e 22 0a 20 20 20 20 2a 2a 20 28 74 68 65 20  wn".    ** (the 
1a260 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20  cache is lazily 
1a270 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20  populated)..    
1a280 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  */.    if( pCur-
1a290 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c  >isIncrblobHandl
1a2a0 65 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65  e && !pCur->aOve
1a2b0 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 69  rflow ){.      i
1a2c0 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72  nt nOvfl = (pCur
1a2d0 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d  ->info.nPayload-
1a2e0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
1a2f0 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76  l+ovflSize-1)/ov
1a300 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 43  flSize;.      pC
1a310 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20  ur->aOverflow = 
1a320 28 50 67 6e 6f 20 2a 29 73 71 6c 69 74 65 33 4d  (Pgno *)sqlite3M
1a330 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66  allocZero(sizeof
1a340 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20  (Pgno)*nOvfl);. 
1a350 20 20 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 26       if( nOvfl &
1a360 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c  & !pCur->aOverfl
1a370 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ow ){.        rc
1a380 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
1a390 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1a3a0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76      /* If the ov
1a3b0 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74  erflow page-list
1a3c0 20 63 61 63 68 65 20 68 61 73 20 62 65 65 6e 20   cache has been 
1a3d0 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68  allocated and th
1a3e0 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66  e.    ** entry f
1a3f0 6f 72 20 74 68 65 20 66 69 72 73 74 20 72 65 71  or the first req
1a400 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70  uired overflow p
1a410 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b  age is valid, sk
1a420 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74  ip.    ** direct
1a430 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f  ly to it..    */
1a440 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61  .    if( pCur->a
1a450 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72  Overflow && pCur
1a460 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73  ->aOverflow[offs
1a470 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a  et/ovflSize] ){.
1a480 20 20 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66        iIdx = (of
1a490 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a  fset/ovflSize);.
1a4a0 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
1a4b0 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
1a4c0 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66  [iIdx];.      of
1a4d0 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f  fset = (offset%o
1a4e0 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  vflSize);.    }.
1a4f0 23 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72 28  #endif..    for(
1a500 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   ; rc==SQLITE_OK
1a510 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78   && amt>0 && nex
1a520 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a  tPage; iIdx++){.
1a530 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1a540 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20  OMIT_INCRBLOB.  
1a550 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72      /* If requir
1a560 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65  ed, populate the
1a570 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
1a580 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20  ist cache. */.  
1a590 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f      if( pCur->aO
1a5a0 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
1a5b0 20 20 20 61 73 73 65 72 74 28 21 70 43 75 72 2d     assert(!pCur-
1a5c0 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d  >aOverflow[iIdx]
1a5d0 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   || pCur->aOverf
1a5e0 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50  low[iIdx]==nextP
1a5f0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43  age);.        pC
1a600 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49  ur->aOverflow[iI
1a610 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a  dx] = nextPage;.
1a620 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a        }.#endif..
1a630 20 20 20 20 20 20 69 66 28 20 6f 66 66 73 65 74        if( offset
1a640 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20  >=ovflSize ){.  
1a650 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c        /* The onl
1a660 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64  y reason to read
1a670 20 74 68 69 73 20 70 61 67 65 20 69 73 20 74 6f   this page is to
1a680 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61 67 65   obtain the page
1a690 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
1a6a0 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20  er for the next 
1a6b0 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72  page in the over
1a6c0 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20  flow chain. The 
1a6d0 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  page.        ** 
1a6e0 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75  data is not requ
1a6f0 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74  ired. So first t
1a700 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65  ry to lookup the
1a710 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20   overflow.      
1a720 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63    ** page-list c
1a730 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68  ache, if any, th
1a740 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20  en fall back to 
1a750 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  the getOverflowP
1a760 61 67 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a  age().        **
1a770 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20   function..     
1a780 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51     */.#ifndef SQ
1a790 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
1a7a0 4f 42 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  OB.        if( p
1a7b0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26  Cur->aOverflow &
1a7c0 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  & pCur->aOverflo
1a7d0 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20  w[iIdx+1] ){.   
1a7e0 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20         nextPage 
1a7f0 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  = pCur->aOverflo
1a800 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20  w[iIdx+1];.     
1a810 20 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64 69     } else .#endi
1a820 66 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  f.          rc =
1a830 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65   getOverflowPage
1a840 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20  (pBt, nextPage, 
1a850 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20  0, &nextPage);. 
1a860 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d         offset -=
1a870 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20   ovflSize;.     
1a880 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1a890 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20  /* Need to read 
1a8a0 74 68 69 73 20 70 61 67 65 20 70 72 6f 70 65 72  this page proper
1a8b0 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20  ly. It contains 
1a8c0 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20  some of the.    
1a8d0 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20      ** range of 
1a8e0 64 61 74 61 20 74 68 61 74 20 69 73 20 62 65 69  data that is bei
1a8f0 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29  ng read (eOp==0)
1a900 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70   or written (eOp
1a910 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f  !=0)..        */
1a920 0a 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20  .        DbPage 
1a930 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20  *pDbPage;.      
1a940 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20    int a = amt;. 
1a950 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1a960 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 2d  te3PagerGet(pBt-
1a970 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67  >pPager, nextPag
1a980 65 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  e, &pDbPage);.  
1a990 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
1a9a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1a9b0 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20       aPayload = 
1a9c0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
1a9d0 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ata(pDbPage);.  
1a9e0 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67 65          nextPage
1a9f0 20 3d 20 67 65 74 34 62 79 74 65 28 61 50 61 79   = get4byte(aPay
1aa00 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20  load);.         
1aa10 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20   if( a + offset 
1aa20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20  > ovflSize ){.  
1aa30 20 20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76            a = ov
1aa40 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b  flSize - offset;
1aa50 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1aa60 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79         rc = copy
1aa70 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61  Payload(&aPayloa
1aa80 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75  d[offset+4], pBu
1aa90 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62 50 61  f, a, eOp, pDbPa
1aaa0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ge);.          s
1aab0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
1aac0 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  (pDbPage);.     
1aad0 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b       offset = 0;
1aae0 0a 20 20 20 20 20 20 20 20 20 20 61 6d 74 20 2d  .          amt -
1aaf0 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = a;.          p
1ab00 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20  Buf += a;.      
1ab10 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1ab20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  }.  }..  if( rc=
1ab30 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d  =SQLITE_OK && am
1ab40 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  t>0 ){.    retur
1ab50 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1ab60 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74  _BKPT;.  }.  ret
1ab70 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1ab80 20 52 65 61 64 20 70 61 72 74 20 6f 66 20 74 68   Read part of th
1ab90 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64  e key associated
1aba0 20 77 69 74 68 20 63 75 72 73 6f 72 20 70 43 75   with cursor pCu
1abb0 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22  r.  Exactly.** "
1abc0 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20  amt" bytes will 
1abd0 62 65 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e  be transfered in
1abe0 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20  to pBuf[].  The 
1abf0 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69  transfer.** begi
1ac00 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a  ns at "offset"..
1ac10 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
1ac20 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
1ac30 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
1ac40 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  de if anything g
1ac50 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41  oes.** wrong.  A
1ac60 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75 72  n error is retur
1ac70 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61  ned if "offset+a
1ac80 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20 74 68  mt" is larger th
1ac90 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61  an.** the availa
1aca0 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a  ble payload..*/.
1acb0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1acc0 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43  Key(BtCursor *pC
1acd0 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20  ur, u32 offset, 
1ace0 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70  u32 amt, void *p
1acf0 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Buf){.  int rc;.
1ad00 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1ad10 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1ad20 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  ) );.  rc = rest
1ad30 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
1ad40 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
1ad50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1ad60 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1ad70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1ad80 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73  _VALID );.    as
1ad90 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67  sert( pCur->iPag
1ada0 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70  e>=0 && pCur->ap
1adb0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1adc0 5d 20 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75  ] );.    if( pCu
1add0 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
1ade0 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65  tKey ){.      re
1adf0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1ae00 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
1ae10 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1ae20 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1ae30 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67  age]<pCur->apPag
1ae40 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
1ae50 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20  nCell );.    rc 
1ae60 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28  = accessPayload(
1ae70 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d  pCur, offset, am
1ae80 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61  t, (unsigned cha
1ae90 72 2a 29 70 42 75 66 2c 20 30 2c 20 30 29 3b 0a  r*)pBuf, 0, 0);.
1aea0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1aeb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70  .}../*.** Read p
1aec0 61 72 74 20 6f 66 20 74 68 65 20 64 61 74 61 20  art of the data 
1aed0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1aee0 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78  cursor pCur.  Ex
1aef0 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62  actly.** "amt" b
1af00 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61  ytes will be tra
1af10 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75  nsfered into pBu
1af20 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66  f[].  The transf
1af30 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20  er.** begins at 
1af40 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20  "offset"..**.** 
1af50 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1af60 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61   on success or a
1af70 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
1af80 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a  anything goes.**
1af90 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f   wrong.  An erro
1afa0 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  r is returned if
1afb0 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73   "offset+amt" is
1afc0 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20   larger than.** 
1afd0 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61  the available pa
1afe0 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  yload..*/.int sq
1aff0 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 28 42  lite3BtreeData(B
1b000 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
1b010 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61  32 offset, u32 a
1b020 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b  mt, void *pBuf){
1b030 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e  .  int rc;..#ifn
1b040 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1b050 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20  INCRBLOB.  if ( 
1b060 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1b070 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
1b080 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1b090 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e  E_ABORT;.  }.#en
1b0a0 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63  dif..  assert( c
1b0b0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1b0c0 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20  pCur) );.  rc = 
1b0d0 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73  restoreCursorPos
1b0e0 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69  ition(pCur);.  i
1b0f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1b100 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1b110 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1b120 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1b130 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1b140 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72  iPage>=0 && pCur
1b150 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1b160 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73  Page] );.    ass
1b170 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
1b180 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
1b190 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1b1a0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
1b1b0 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63 65 73  ;.    rc = acces
1b1c0 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f  sPayload(pCur, o
1b1d0 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66  ffset, amt, pBuf
1b1e0 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 1, 0);.  }.  r
1b1f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1b200 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
1b210 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69  ter to payload i
1b220 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
1b230 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
1b240 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73  he .** pCur curs
1b250 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
1b260 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20  o.  The pointer 
1b270 69 73 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e  is to the beginn
1b280 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65  ing of.** the ke
1b290 79 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20  y if skipKey==0 
1b2a0 61 6e 64 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  and it points to
1b2b0 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
1b2c0 66 20 64 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69  f data if.** ski
1b2d0 70 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75  pKey==1.  The nu
1b2e0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66  mber of bytes of
1b2f0 20 61 76 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64   available key/d
1b300 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 0a 2a  ata is written.*
1b310 2a 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49  * into *pAmt.  I
1b320 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e  f *pAmt==0, then
1b330 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
1b340 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a  ned will not be.
1b350 2a 2a 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74  ** a valid point
1b360 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  er..**.** This r
1b370 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74  outine is an opt
1b380 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69  imization.  It i
1b390 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65  s common for the
1b3a0 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61   entire key.** a
1b3b0 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f  nd data to fit o
1b3c0 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65  n the local page
1b3d0 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74   and for there t
1b3e0 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77  o be no overflow
1b3f0 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e  .** pages.  When
1b400 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69   that is so, thi
1b410 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  s routine can be
1b420 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
1b430 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64  the.** key and d
1b440 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69  ata without maki
1b450 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74  ng a copy.  If t
1b460 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61  he key and/or da
1b470 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74  ta spills.** ont
1b480 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
1b490 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50 61 79  , then accessPay
1b4a0 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65 20 75  load() must be u
1b4b0 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c  sed to reassembl
1b4c0 79 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74  y.** the key/dat
1b4d0 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e  a and copy it in
1b4e0 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65  to a preallocate
1b4f0 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  d buffer..**.** 
1b500 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75  The pointer retu
1b510 72 6e 65 64 20 62 79 20 74 68 69 73 20 72 6f 75  rned by this rou
1b520 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63  tine looks direc
1b530 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63  tly into the cac
1b540 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74  hed.** page of t
1b550 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
1b560 65 20 64 61 74 61 20 6d 69 67 68 74 20 63 68 61  e data might cha
1b570 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20  nge or move the 
1b580 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79  next time.** any
1b590 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69   btree routine i
1b5a0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61  s called..*/.sta
1b5b0 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
1b5c0 65 64 20 63 68 61 72 20 2a 66 65 74 63 68 50 61  ed char *fetchPa
1b5d0 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f  yload(.  BtCurso
1b5e0 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a  r *pCur,      /*
1b5f0 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67   Cursor pointing
1b600 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61   to entry to rea
1b610 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20  d from */.  int 
1b620 2a 70 41 6d 74 2c 20 20 20 20 20 20 20 20 20 20  *pAmt,          
1b630 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75   /* Write the nu
1b640 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c  mber of availabl
1b650 65 20 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a  e bytes here */.
1b660 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 20 20 20    int skipKey   
1b670 20 20 20 20 20 20 20 2f 2a 20 72 65 61 64 20 62         /* read b
1b680 65 67 69 6e 6e 69 6e 67 20 61 74 20 64 61 74 61  eginning at data
1b690 20 69 66 20 74 68 69 73 20 69 73 20 74 72 75 65   if this is true
1b6a0 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
1b6b0 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64  d char *aPayload
1b6c0 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
1b6d0 67 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a  ge;.  u32 nKey;.
1b6e0 20 20 75 33 32 20 6e 4c 6f 63 61 6c 3b 0a 0a 20    u32 nLocal;.. 
1b6f0 20 61 73 73 65 72 74 28 20 70 43 75 72 21 3d 30   assert( pCur!=0
1b700 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e   && pCur->iPage>
1b710 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61  =0 && pCur->apPa
1b720 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29  ge[pCur->iPage])
1b730 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1b740 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1b750 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65  _VALID );.  asse
1b760 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1b770 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1b780 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
1b790 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1b7a0 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  ];.  assert( pCu
1b7b0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1b7c0 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65  Page]<pPage->nCe
1b7d0 6c 6c 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49  ll );.  getCellI
1b7e0 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61  nfo(pCur);.  aPa
1b7f0 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e  yload = pCur->in
1b800 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79  fo.pCell;.  aPay
1b810 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e  load += pCur->in
1b820 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66  fo.nHeader;.  if
1b830 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
1b840 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b  ){.    nKey = 0;
1b850 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b  .  }else{.    nK
1b860 65 79 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e  ey = (int)pCur->
1b870 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20  info.nKey;.  }. 
1b880 20 69 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a   if( skipKey ){.
1b890 20 20 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20      aPayload += 
1b8a0 6e 4b 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c  nKey;.    nLocal
1b8b0 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   = pCur->info.nL
1b8c0 6f 63 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d  ocal - nKey;.  }
1b8d0 65 6c 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c  else{.    nLocal
1b8e0 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c   = pCur->info.nL
1b8f0 6f 63 61 6c 3b 0a 20 20 20 20 69 66 28 20 6e 4c  ocal;.    if( nL
1b900 6f 63 61 6c 3e 6e 4b 65 79 20 29 7b 0a 20 20 20  ocal>nKey ){.   
1b910 20 20 20 6e 4c 6f 63 61 6c 20 3d 20 6e 4b 65 79     nLocal = nKey
1b920 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
1b930 41 6d 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20  Amt = nLocal;.  
1b940 72 65 74 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b  return aPayload;
1b950 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74  .}.../*.** For t
1b960 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 63 75  he entry that cu
1b970 72 73 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69  rsor pCur is poi
1b980 6e 74 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73  nt to, return as
1b990 0a 2a 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f  .** many bytes o
1b9a0 66 20 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74  f the key or dat
1b9b0 61 20 61 73 20 61 72 65 20 61 76 61 69 6c 61 62  a as are availab
1b9c0 6c 65 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a  le on the local.
1b9d0 2a 2a 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20  ** b-tree page. 
1b9e0 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65   Write the numbe
1b9f0 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62  r of available b
1ba00 79 74 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e  ytes into *pAmt.
1ba10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74  .**.** The point
1ba20 65 72 20 72 65 74 75 72 6e 65 64 20 69 73 20 65  er returned is e
1ba30 70 68 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b  phemeral.  The k
1ba40 65 79 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65  ey/data may move
1ba50 0a 2a 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f  .** or be destro
1ba60 79 65 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20  yed on the next 
1ba70 63 61 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65  call to any Btre
1ba80 65 20 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e  e routine,.** in
1ba90 63 6c 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72  cluding calls fr
1baa0 6f 6d 20 6f 74 68 65 72 20 74 68 72 65 61 64 73  om other threads
1bab0 20 61 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d   against the sam
1bac0 65 20 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63  e cache..** Henc
1bad0 65 2c 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68  e, a mutex on th
1bae0 65 20 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c  e BtShared shoul
1baf0 64 20 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20  d be held prior 
1bb00 74 6f 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68  to calling.** th
1bb10 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
1bb20 2a 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73  * These routines
1bb30 20 69 73 20 75 73 65 64 20 74 6f 20 67 65 74 20   is used to get 
1bb40 71 75 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20  quick access to 
1bb50 6b 65 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20  key and data.** 
1bb60 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61  in the common ca
1bb70 73 65 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72  se where no over
1bb80 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 20 75  flow pages are u
1bb90 73 65 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f  sed..*/.const vo
1bba0 69 64 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  id *sqlite3Btree
1bbb0 4b 65 79 46 65 74 63 68 28 42 74 43 75 72 73 6f  KeyFetch(BtCurso
1bbc0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41  r *pCur, int *pA
1bbd0 6d 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63  mt){.  assert( c
1bbe0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1bbf0 70 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70  pCur) );.  if( p
1bc00 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1bc10 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
1bc20 20 72 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76   return (const v
1bc30 6f 69 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61  oid*)fetchPayloa
1bc40 64 28 70 43 75 72 2c 20 70 41 6d 74 2c 20 30 29  d(pCur, pAmt, 0)
1bc50 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
1bc60 3b 0a 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ;.}.const void *
1bc70 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
1bc80 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a  Fetch(BtCursor *
1bc90 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29  pCur, int *pAmt)
1bca0 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
1bcb0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1bcc0 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  r) );.  if( pCur
1bcd0 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
1bce0 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65  _VALID ){.    re
1bcf0 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64  turn (const void
1bd00 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70  *)fetchPayload(p
1bd10 43 75 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20  Cur, pAmt, 1);. 
1bd20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1bd30 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  .../*.** Move th
1bd40 65 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f  e cursor down to
1bd50 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67   a new child pag
1bd60 65 2e 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20  e.  The newPgno 
1bd70 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a  argument is the.
1bd80 2a 2a 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  ** page number o
1bd90 66 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  f the child page
1bda0 20 74 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f 0a   to move to..*/.
1bdb0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
1bdc0 6f 43 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20  oChild(BtCursor 
1bdd0 2a 70 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67  *pCur, u32 newPg
1bde0 6e 6f 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  no){.  int rc;. 
1bdf0 20 69 6e 74 20 69 20 3d 20 70 43 75 72 2d 3e 69   int i = pCur->i
1be00 50 61 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20  Page;.  MemPage 
1be10 2a 70 4e 65 77 50 61 67 65 3b 0a 20 20 42 74 53  *pNewPage;.  BtS
1be20 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75  hared *pBt = pCu
1be30 72 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72  r->pBt;..  asser
1be40 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1be50 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
1be60 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
1be70 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
1be80 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
1be90 43 75 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52  Cur->iPage<BTCUR
1bea0 53 4f 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b  SOR_MAX_DEPTH );
1beb0 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61  .  if( pCur->iPa
1bec0 67 65 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41  ge>=(BTCURSOR_MA
1bed0 58 5f 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20  X_DEPTH-1) ){.  
1bee0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1bef0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
1bf00 7d 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49  }.  rc = getAndI
1bf10 6e 69 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77  nitPage(pBt, new
1bf20 50 67 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65 29  Pgno, &pNewPage)
1bf30 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
1bf40 75 72 6e 20 72 63 3b 0a 20 20 70 43 75 72 2d 3e  urn rc;.  pCur->
1bf50 61 70 50 61 67 65 5b 69 2b 31 5d 20 3d 20 70 4e  apPage[i+1] = pN
1bf60 65 77 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e  ewPage;.  pCur->
1bf70 61 69 49 64 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a  aiIdx[i+1] = 0;.
1bf80 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b    pCur->iPage++;
1bf90 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  ..  pCur->info.n
1bfa0 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72  Size = 0;.  pCur
1bfb0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b  ->validNKey = 0;
1bfc0 0a 20 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d  .  if( pNewPage-
1bfd0 3e 6e 43 65 6c 6c 3c 31 20 29 7b 0a 20 20 20 20  >nCell<1 ){.    
1bfe0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1bff0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
1c000 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1c010 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e  OK;.}..#ifndef N
1c020 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65  DEBUG./*.** Page
1c030 20 70 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69   pParent is an i
1c040 6e 74 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61  nternal (non-lea
1c050 66 29 20 74 72 65 65 20 70 61 67 65 2e 20 54 68  f) tree page. Th
1c060 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20  is function .** 
1c070 61 73 73 65 72 74 73 20 74 68 61 74 20 70 61 67  asserts that pag
1c080 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20  e number iChild 
1c090 69 73 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c  is the left-chil
1c0a0 64 20 69 66 20 74 68 65 20 69 49 64 78 27 74 68  d if the iIdx'th
1c0b0 0a 2a 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65  .** cell in page
1c0c0 20 70 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66   pParent. Or, if
1c0d0 20 69 49 64 78 20 69 73 20 65 71 75 61 6c 20 74   iIdx is equal t
1c0e0 6f 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  o the total numb
1c0f0 65 72 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69  er of.** cells i
1c100 6e 20 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20  n pParent, that 
1c110 70 61 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69  page number iChi
1c120 6c 64 20 69 73 20 74 68 65 20 72 69 67 68 74 2d  ld is the right-
1c130 63 68 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20  child of.** the 
1c140 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  page..*/.static 
1c150 76 6f 69 64 20 61 73 73 65 72 74 50 61 72 65 6e  void assertParen
1c160 74 49 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a  tIndex(MemPage *
1c170 70 50 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64  pParent, int iId
1c180 78 2c 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b  x, Pgno iChild){
1c190 0a 20 20 61 73 73 65 72 74 28 20 69 49 64 78 3c  .  assert( iIdx<
1c1a0 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
1c1b0 29 3b 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70  );.  if( iIdx==p
1c1c0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b  Parent->nCell ){
1c1d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74  .    assert( get
1c1e0 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e  4byte(&pParent->
1c1f0 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68  aData[pParent->h
1c200 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43  drOffset+8])==iC
1c210 68 69 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  hild );.  }else{
1c220 0a 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74  .    assert( get
1c230 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70  4byte(findCell(p
1c240 50 61 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d  Parent, iIdx))==
1c250 69 43 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a  iChild );.  }.}.
1c260 23 65 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20  #else.#  define 
1c270 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
1c280 78 28 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66  x(x,y,z) .#endif
1c290 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
1c2a0 20 63 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68   cursor up to th
1c2b0 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a  e parent page..*
1c2c0 2a 0a 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69  *.** pCur->idx i
1c2d0 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c  s set to the cel
1c2e0 6c 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e  l index that con
1c2f0 74 61 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65  tains the pointe
1c300 72 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65  r.** to the page
1c310 20 77 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66   we are coming f
1c320 72 6f 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20  rom.  If we are 
1c330 63 6f 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a  coming from the.
1c340 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68  ** right-most ch
1c350 69 6c 64 20 70 61 67 65 20 74 68 65 6e 20 70 43  ild page then pC
1c360 75 72 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74  ur->idx is set t
1c370 6f 20 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a  o one more than.
1c380 2a 2a 20 74 68 65 20 6c 61 72 67 65 73 74 20 63  ** the largest c
1c390 65 6c 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f  ell index..*/.vo
1c3a0 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d  id sqlite3BtreeM
1c3b0 6f 76 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75  oveToParent(BtCu
1c3c0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61  rsor *pCur){.  a
1c3d0 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
1c3e0 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
1c3f0 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1c400 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1c410 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72  VALID );.  asser
1c420 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30  t( pCur->iPage>0
1c430 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1c440 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1c450 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
1c460 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a  ertParentIndex(.
1c470 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
1c480 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c  [pCur->iPage-1],
1c490 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64   .    pCur->aiId
1c4a0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
1c4b0 2c 20 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50  , .    pCur->apP
1c4c0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1c4d0 2d 3e 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 72 65  ->pgno.  );.  re
1c4e0 6c 65 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e  leasePage(pCur->
1c4f0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1c500 67 65 5d 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50  ge]);.  pCur->iP
1c510 61 67 65 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e 69  age--;.  pCur->i
1c520 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
1c530 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
1c540 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d   = 0;.}../*.** M
1c550 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
1c560 6f 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 0a  o the root page.
1c570 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
1c580 76 65 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f  veToRoot(BtCurso
1c590 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50  r *pCur){.  MemP
1c5a0 61 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e  age *pRoot;.  in
1c5b0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1c5c0 3b 0a 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70  ;.  Btree *p = p
1c5d0 43 75 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42  Cur->pBtree;.  B
1c5e0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
1c5f0 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74  ->pBt;..  assert
1c600 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1c610 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1c620 73 65 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56  sert( CURSOR_INV
1c630 41 4c 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45  ALID < CURSOR_RE
1c640 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61  QUIRESEEK );.  a
1c650 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41  ssert( CURSOR_VA
1c660 4c 49 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52  LID   < CURSOR_R
1c670 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20  EQUIRESEEK );.  
1c680 61 73 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46  assert( CURSOR_F
1c690 41 55 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f  AULT   > CURSOR_
1c6a0 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
1c6b0 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
1c6c0 65 3e 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52  e>=CURSOR_REQUIR
1c6d0 45 53 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28  ESEEK ){.    if(
1c6e0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1c6f0 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20  URSOR_FAULT ){. 
1c700 20 20 20 20 20 72 65 74 75 72 6e 20 70 43 75 72       return pCur
1c710 2d 3e 73 6b 69 70 3b 0a 20 20 20 20 7d 0a 20 20  ->skip;.    }.  
1c720 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
1c730 65 61 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b  earCursor(pCur);
1c740 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72  .  }..  if( pCur
1c750 2d 3e 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20  ->iPage>=0 ){.  
1c760 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
1c770 28 69 3d 31 3b 20 69 3c 3d 70 43 75 72 2d 3e 69  (i=1; i<=pCur->i
1c780 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
1c790 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 43    releasePage(pC
1c7a0 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a  ur->apPage[i]);.
1c7b0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
1c7c0 20 20 20 69 66 28 20 0a 20 20 20 20 20 20 53 51     if( .      SQ
1c7d0 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 67  LITE_OK!=(rc = g
1c7e0 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42  etAndInitPage(pB
1c7f0 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f  t, pCur->pgnoRoo
1c800 74 2c 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65  t, &pCur->apPage
1c810 5b 30 5d 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  [0])).    ){.   
1c820 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
1c830 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
1c840 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
1c850 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  c;.    }.  }..  
1c860 70 52 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70  pRoot = pCur->ap
1c870 50 61 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72  Page[0];.  asser
1c880 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d  t( pRoot->pgno==
1c890 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29  pCur->pgnoRoot )
1c8a0 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20  ;.  pCur->iPage 
1c8b0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49  = 0;.  pCur->aiI
1c8c0 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75  dx[0] = 0;.  pCu
1c8d0 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20  r->info.nSize = 
1c8e0 30 3b 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61 73  0;.  pCur->atLas
1c8f0 74 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76  t = 0;.  pCur->v
1c900 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20  alidNKey = 0;.. 
1c910 20 69 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c   if( pRoot->nCel
1c920 6c 3d 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d 3e  l==0 && !pRoot->
1c930 6c 65 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f  leaf ){.    Pgno
1c940 20 73 75 62 70 61 67 65 3b 0a 20 20 20 20 61 73   subpage;.    as
1c950 73 65 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e  sert( pRoot->pgn
1c960 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 73 75 62 70  o==1 );.    subp
1c970 61 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 26  age = get4byte(&
1c980 70 52 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f  pRoot->aData[pRo
1c990 6f 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ot->hdrOffset+8]
1c9a0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  );.    assert( s
1c9b0 75 62 70 61 67 65 3e 30 20 29 3b 0a 20 20 20 20  ubpage>0 );.    
1c9c0 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
1c9d0 55 52 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20  URSOR_VALID;.   
1c9e0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
1c9f0 64 28 70 43 75 72 2c 20 73 75 62 70 61 67 65 29  d(pCur, subpage)
1ca00 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1ca10 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 28  Cur->eState = ((
1ca20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 29 3f  pRoot->nCell>0)?
1ca30 43 55 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52  CURSOR_VALID:CUR
1ca40 53 4f 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20  SOR_INVALID);.  
1ca50 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1ca60 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65  ../*.** Move the
1ca70 20 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20   cursor down to 
1ca80 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  the left-most le
1ca90 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
1caa0 20 74 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f   the.** entry to
1cab0 20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72   which it is cur
1cac0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e  rently pointing.
1cad0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d  .**.** The left-
1cae0 6d 6f 73 74 20 6c 65 61 66 20 69 73 20 74 68 65  most leaf is the
1caf0 20 6f 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d   one with the sm
1cb00 61 6c 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65  allest key - the
1cb10 20 66 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63   first.** in asc
1cb20 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f  ending order..*/
1cb30 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
1cb40 54 6f 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72  ToLeftmost(BtCur
1cb50 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67  sor *pCur){.  Pg
1cb60 6e 6f 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  no pgno;.  int r
1cb70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1cb80 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
1cb90 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1cba0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1cbb0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1cbc0 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1cbd0 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20  RSOR_VALID );.  
1cbe0 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
1cbf0 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20  E_OK && !(pPage 
1cc00 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
1cc10 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65  Cur->iPage])->le
1cc20 61 66 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  af ){.    assert
1cc30 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
1cc40 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65  ur->iPage]<pPage
1cc50 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70  ->nCell );.    p
1cc60 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66  gno = get4byte(f
1cc70 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70  indCell(pPage, p
1cc80 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1cc90 3e 69 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72  >iPage]));.    r
1cca0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
1ccb0 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d  pCur, pgno);.  }
1ccc0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1ccd0 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1cce0 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74  cursor down to t
1ccf0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65  he right-most le
1cd00 61 66 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  af entry beneath
1cd10 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20   the.** page to 
1cd20 77 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72  which it is curr
1cd30 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20  ently pointing. 
1cd40 20 4e 6f 74 69 63 65 20 74 68 65 20 64 69 66 66   Notice the diff
1cd50 65 72 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65  erence.** betwee
1cd60 6e 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74  n moveToLeftmost
1cd70 28 29 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67  () and moveToRig
1cd80 68 74 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54  htmost().  moveT
1cd90 6f 4c 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66  oLeftmost().** f
1cda0 69 6e 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f  inds the left-mo
1cdb0 73 74 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68  st entry beneath
1cdc0 20 74 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65   the *entry* whe
1cdd0 72 65 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74  reas moveToRight
1cde0 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20  most().** finds 
1cdf0 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65  the right-most e
1ce00 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74 68 65  ntry beneath the
1ce10 20 2a 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54   *page*..**.** T
1ce20 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e  he right-most en
1ce30 74 72 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77  try is the one w
1ce40 69 74 68 20 74 68 65 20 6c 61 72 67 65 73 74 20  ith the largest 
1ce50 6b 65 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a  key - the last.*
1ce60 2a 20 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69  * key in ascendi
1ce70 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61  ng order..*/.sta
1ce80 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69  tic int moveToRi
1ce90 67 68 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72  ghtmost(BtCursor
1cea0 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20   *pCur){.  Pgno 
1ceb0 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d  pgno;.  int rc =
1cec0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65   SQLITE_OK;.  Me
1ced0 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
1cee0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
1cef0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1cf00 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ur) );.  assert(
1cf10 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
1cf20 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20  URSOR_VALID );. 
1cf30 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
1cf40 54 45 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65  TE_OK && !(pPage
1cf50 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
1cf60 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c  pCur->iPage])->l
1cf70 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20  eaf ){.    pgno 
1cf80 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
1cf90 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
1cfa0 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20  hdrOffset+8]);. 
1cfb0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
1cfc0 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50  Cur->iPage] = pP
1cfd0 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20  age->nCell;.    
1cfe0 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64  rc = moveToChild
1cff0 28 70 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  (pCur, pgno);.  
1d000 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
1d010 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75  TE_OK ){.    pCu
1d020 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1d030 50 61 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e  Page] = pPage->n
1d040 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 70 43 75 72  Cell-1;.    pCur
1d050 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30  ->info.nSize = 0
1d060 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69  ;.    pCur->vali
1d070 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  dNKey = 0;.  }. 
1d080 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1d090 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f  * Move the curso
1d0a0 72 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  r to the first e
1d0b0 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c  ntry in the tabl
1d0c0 65 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  e.  Return SQLIT
1d0d0 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
1d0e0 73 73 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74  ss.  Set *pRes t
1d0f0 6f 20 30 20 69 66 20 74 68 65 20 63 75 72 73 6f  o 0 if the curso
1d100 72 20 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74  r actually point
1d110 73 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a  s to something.*
1d120 2a 20 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74  * or set *pRes t
1d130 6f 20 31 20 69 66 20 74 68 65 20 74 61 62 6c 65  o 1 if the table
1d140 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e   is empty..*/.in
1d150 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 69  t sqlite3BtreeFi
1d160 72 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  rst(BtCursor *pC
1d170 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a  ur, int *pRes){.
1d180 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1d190 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1d1a0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1d1b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
1d1c0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72  _mutex_held(pCur
1d1d0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75  ->pBtree->db->mu
1d1e0 74 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d  tex) );.  rc = m
1d1f0 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b  oveToRoot(pCur);
1d200 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1d210 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
1d220 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1d230 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
1d240 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
1d250 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1d260 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d  >iPage]->nCell==
1d270 30 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73  0 );.      *pRes
1d280 20 3d 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 1;.      rc =
1d290 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1d2a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
1d2b0 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
1d2c0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
1d2d0 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20  nCell>0 );.     
1d2e0 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
1d2f0 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
1d300 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20  tmost(pCur);.   
1d310 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1d320 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74  rc;.}../* Move t
1d330 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65  he cursor to the
1d340 20 6c 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74   last entry in t
1d350 68 65 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72  he table.  Retur
1d360 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f  n SQLITE_OK.** o
1d370 6e 20 73 75 63 63 65 73 73 2e 20 20 53 65 74 20  n success.  Set 
1d380 2a 70 52 65 73 20 74 6f 20 30 20 69 66 20 74 68  *pRes to 0 if th
1d390 65 20 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c  e cursor actuall
1d3a0 79 20 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65  y points to some
1d3b0 74 68 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20  thing.** or set 
1d3c0 2a 70 52 65 73 20 74 6f 20 31 20 69 66 20 74 68  *pRes to 1 if th
1d3d0 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79  e table is empty
1d3e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1d3f0 42 74 72 65 65 4c 61 73 74 28 42 74 43 75 72 73  BtreeLast(BtCurs
1d400 6f 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70  or *pCur, int *p
1d410 52 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Res){.  int rc;.
1d420 20 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73   .  assert( curs
1d430 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1d440 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1d450 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1d460 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
1d470 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
1d480 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74   rc = moveToRoot
1d490 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
1d4a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1d4b0 20 20 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e     if( CURSOR_IN
1d4c0 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
1d4d0 61 74 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ate ){.      ass
1d4e0 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
1d4f0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
1d500 6e 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  nCell==0 );.    
1d510 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
1d520 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
1d530 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1d540 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1d550 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   );.      *pRes 
1d560 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
1d570 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
1d580 70 43 75 72 29 3b 0a 20 20 20 20 20 20 67 65 74  pCur);.      get
1d590 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
1d5a0 20 20 20 20 20 20 70 43 75 72 2d 3e 61 74 4c 61        pCur->atLa
1d5b0 73 74 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f  st = rc==SQLITE_
1d5c0 4f 4b 20 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a 20  OK ?1:0;.    }. 
1d5d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1d5e0 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
1d5f0 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74  ursor so that it
1d600 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e   points to an en
1d610 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79  try near the key
1d620 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62   .** specified b
1d630 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74  y pIdxKey or int
1d640 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20  Key.   Return a 
1d650 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a  success code..**
1d660 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74  .** For INTKEY t
1d670 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65  ables, the intKe
1d680 79 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75  y parameter is u
1d690 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a  sed.  pIdxKey .*
1d6a0 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20  * must be NULL. 
1d6b0 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65   For index table
1d6c0 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75 73  s, pIdxKey is us
1d6d0 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a  ed and intKey.**
1d6e0 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a   is ignored..**.
1d6f0 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d  ** If an exact m
1d700 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e  atch is not foun
1d710 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  d, then the curs
1d720 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20  or is always.** 
1d730 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
1d740 20 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69   a leaf page whi
1d750 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68  ch would hold th
1d760 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a  e entry if it.**
1d770 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20   were present.  
1d780 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74  The cursor might
1d790 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74   point to an ent
1d7a0 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a  ry that comes.**
1d7b0 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72   before or after
1d7c0 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20   the key..**.** 
1d7d0 41 6e 20 69 6e 74 65 67 65 72 20 69 73 20 77 72  An integer is wr
1d7e0 69 74 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73  itten into *pRes
1d7f0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 72 65   which is the re
1d800 73 75 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61  sult of.** compa
1d810 72 69 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74  ring the key wit
1d820 68 20 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77  h the entry to w
1d830 68 69 63 68 20 74 68 65 20 63 75 72 73 6f 72 20  hich the cursor 
1d840 69 73 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e  is .** pointing.
1d850 20 20 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66    The meaning of
1d860 20 74 68 65 20 69 6e 74 65 67 65 72 20 77 72 69   the integer wri
1d870 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52  tten into.** *pR
1d880 65 73 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73  es is as follows
1d890 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65  :.**.**     *pRe
1d8a0 73 3c 30 20 20 20 20 20 20 54 68 65 20 63 75 72  s<0      The cur
1d8b0 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e  sor is left poin
1d8c0 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79  ting at an entry
1d8d0 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20   that.**        
1d8e0 20 20 20 20 20 20 20 20 20 20 69 73 20 73 6d 61            is sma
1d8f0 6c 6c 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79  ller than intKey
1d900 2f 70 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74  /pIdxKey or if t
1d910 68 65 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74  he table is empt
1d920 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  y.**            
1d930 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75        and the cu
1d940 72 73 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72  rsor is therefor
1d950 65 20 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20  e left point to 
1d960 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  nothing..**.**  
1d970 20 20 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20     *pRes==0     
1d980 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65  The cursor is le
1d990 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
1d9a0 6e 20 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20  n entry that.** 
1d9b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d9c0 20 65 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73   exactly matches
1d9d0 20 69 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e   intKey/pIdxKey.
1d9e0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
1d9f0 3e 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  >0      The curs
1da00 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
1da10 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
1da20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
1da30 20 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67           is larg
1da40 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70  er than intKey/p
1da50 49 64 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e  IdxKey..**.*/.in
1da60 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  t sqlite3BtreeMo
1da70 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20  vetoUnpacked(.  
1da80 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1da90 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1daa0 63 75 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76  cursor to be mov
1dab0 65 64 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  ed */.  Unpacked
1dac0 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c  Record *pIdxKey,
1dad0 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64   /* Unpacked ind
1dae0 65 78 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20  ex key */.  i64 
1daf0 69 6e 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20  intKey,         
1db00 20 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c       /* The tabl
1db10 65 20 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62  e key */.  int b
1db20 69 61 73 52 69 67 68 74 2c 20 20 20 20 20 20 20  iasRight,       
1db30 20 20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20      /* If true, 
1db40 62 69 61 73 20 74 68 65 20 73 65 61 72 63 68 20  bias the search 
1db50 74 6f 20 74 68 65 20 68 69 67 68 20 65 6e 64 20  to the high end 
1db60 2a 2f 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20  */.  int *pRes  
1db70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1db80 20 57 72 69 74 65 20 73 65 61 72 63 68 20 72 65   Write search re
1db90 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b  sults here */.){
1dba0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
1dbb0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
1dbc0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
1dbd0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
1dbe0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75  3_mutex_held(pCu
1dbf0 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d  r->pBtree->db->m
1dc00 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  utex) );..  /* I
1dc10 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20  f the cursor is 
1dc20 61 6c 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e  already position
1dc30 65 64 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20  ed at the point 
1dc40 77 65 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20  we are trying.  
1dc50 2a 2a 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74  ** to move to, t
1dc60 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
1dc70 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e  without doing an
1dc80 79 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20  y work */.  if( 
1dc90 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1dca0 52 53 4f 52 5f 56 41 4c 49 44 20 26 26 20 70 43  RSOR_VALID && pC
1dcb0 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 0a 20  ur->validNKey . 
1dcc0 20 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67    && pCur->apPag
1dcd0 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20  e[0]->intKey .  
1dce0 29 7b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  ){.    if( pCur-
1dcf0 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b  >info.nKey==intK
1dd00 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65  ey ){.      *pRe
1dd10 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  s = 0;.      ret
1dd20 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1dd30 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75     }.    if( pCu
1dd40 72 2d 3e 61 74 4c 61 73 74 20 26 26 20 70 43 75  r->atLast && pCu
1dd50 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74  r->info.nKey<int
1dd60 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52  Key ){.      *pR
1dd70 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72  es = -1;.      r
1dd80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1dd90 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 63  .    }.  }..  rc
1dda0 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43   = moveToRoot(pC
1ddb0 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
1ddc0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1ddd0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43    }.  assert( pC
1dde0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1ddf0 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73  >iPage] );.  ass
1de00 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
1de10 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
1de20 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20  isInit );.  if( 
1de30 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55  pCur->eState==CU
1de40 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a  RSOR_INVALID ){.
1de50 20 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a      *pRes = -1;.
1de60 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1de70 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1de80 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  Page]->nCell==0 
1de90 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
1dea0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61  LITE_OK;.  }.  a
1deb0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50  ssert( pCur->apP
1dec0 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c  age[0]->intKey |
1ded0 7c 20 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66  | pIdxKey );.  f
1dee0 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20  or(;;){.    int 
1def0 6c 77 72 2c 20 75 70 72 3b 0a 20 20 20 20 50 67  lwr, upr;.    Pg
1df00 6e 6f 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d  no chldPg;.    M
1df10 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
1df20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1df30 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69  r->iPage];.    i
1df40 6e 74 20 63 20 3d 20 2d 31 3b 20 20 2f 2a 20 70  nt c = -1;  /* p
1df50 52 65 73 20 72 65 74 75 72 6e 20 69 66 20 74 61  Res return if ta
1df60 62 6c 65 20 69 73 20 65 6d 70 74 79 20 6d 75 73  ble is empty mus
1df70 74 20 62 65 20 2d 31 20 2a 2f 0a 20 20 20 20 6c  t be -1 */.    l
1df80 77 72 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20  wr = 0;.    upr 
1df90 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31  = pPage->nCell-1
1dfa0 3b 0a 20 20 20 20 69 66 28 20 28 21 70 50 61 67  ;.    if( (!pPag
1dfb0 65 2d 3e 69 6e 74 4b 65 79 20 26 26 20 70 49 64  e->intKey && pId
1dfc0 78 4b 65 79 3d 3d 30 29 20 7c 7c 20 75 70 72 3c  xKey==0) || upr<
1dfd0 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1dfe0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1dff0 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
1e000 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
1e010 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 69 61     }.    if( bia
1e020 73 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  sRight ){.      
1e030 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1e040 2d 3e 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29  ->iPage] = (u16)
1e050 75 70 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  upr;.    }else{.
1e060 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
1e070 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
1e080 20 28 75 31 36 29 28 28 75 70 72 2b 6c 77 72 29   (u16)((upr+lwr)
1e090 2f 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  /2);.    }.    f
1e0a0 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 76 6f  or(;;){.      vo
1e0b0 69 64 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20  id *pCellKey;.  
1e0c0 20 20 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79      i64 nCellKey
1e0d0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 64 78 20  ;.      int idx 
1e0e0 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  = pCur->aiIdx[pC
1e0f0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20  ur->iPage];.    
1e100 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
1e110 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 43  ze = 0;.      pC
1e120 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
1e130 31 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  1;.      if( pPa
1e140 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20  ge->intKey ){.  
1e150 20 20 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b        u8 *pCell;
1e160 0a 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d  .        pCell =
1e170 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
1e180 20 69 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63   idx) + pPage->c
1e190 68 69 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20  hildPtrSize;.   
1e1a0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
1e1b0 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20  hasData ){.     
1e1c0 20 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a       u32 dummy;.
1e1d0 20 20 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20            pCell 
1e1e0 2b 3d 20 67 65 74 56 61 72 69 6e 74 33 32 28 70  += getVarint32(p
1e1f0 43 65 6c 6c 2c 20 64 75 6d 6d 79 29 3b 0a 20 20  Cell, dummy);.  
1e200 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e210 67 65 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c  getVarint(pCell,
1e220 20 28 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79   (u64*)&nCellKey
1e230 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
1e240 43 65 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20  CellKey==intKey 
1e250 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  ){.          c =
1e260 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
1e270 65 20 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69  e if( nCellKey<i
1e280 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20  ntKey ){.       
1e290 20 20 20 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20     c = -1;.     
1e2a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e2b0 20 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c      assert( nCel
1e2c0 6c 4b 65 79 3e 69 6e 74 4b 65 79 20 29 3b 0a 20  lKey>intKey );. 
1e2d0 20 20 20 20 20 20 20 20 20 63 20 3d 20 2b 31 3b           c = +1;
1e2e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1e2f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e300 69 6e 74 20 61 76 61 69 6c 61 62 6c 65 3b 0a 20  int available;. 
1e310 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20         pCellKey 
1e320 3d 20 28 76 6f 69 64 20 2a 29 66 65 74 63 68 50  = (void *)fetchP
1e330 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 26 61 76  ayload(pCur, &av
1e340 61 69 6c 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20  ailable, 0);.   
1e350 20 20 20 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20       nCellKey = 
1e360 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b  pCur->info.nKey;
1e370 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 76 61  .        if( ava
1e380 69 6c 61 62 6c 65 3e 3d 6e 43 65 6c 6c 4b 65 79  ilable>=nCellKey
1e390 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20   ){.          c 
1e3a0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63  = sqlite3VdbeRec
1e3b0 6f 72 64 43 6f 6d 70 61 72 65 28 28 69 6e 74 29  ordCompare((int)
1e3c0 6e 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b  nCellKey, pCellK
1e3d0 65 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20  ey, pIdxKey);.  
1e3e0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1e3f0 20 20 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20         pCellKey 
1e400 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28  = sqlite3Malloc(
1e410 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 20 29   (int)nCellKey )
1e420 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1e430 70 43 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20  pCellKey==0 ){. 
1e440 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1e450 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1e460 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
1e470 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
1e480 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e490 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1e4a0 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30  BtreeKey(pCur, 0
1e4b0 2c 20 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c  , (int)nCellKey,
1e4c0 20 28 76 6f 69 64 2a 29 70 43 65 6c 6c 4b 65 79   (void*)pCellKey
1e4d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  );.          c =
1e4e0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1e4f0 72 64 43 6f 6d 70 61 72 65 28 28 69 6e 74 29 6e  rdCompare((int)n
1e500 43 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65  CellKey, pCellKe
1e510 79 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20  y, pIdxKey);.   
1e520 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
1e530 72 65 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20  ree(pCellKey);. 
1e540 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20           if( rc 
1e550 29 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69  ) goto moveto_fi
1e560 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nish;.        }.
1e570 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1e580 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( c==0 ){.      
1e590 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65    pCur->info.nKe
1e5a0 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20  y = nCellKey;.  
1e5b0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d        if( pPage-
1e5c0 3e 69 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67  >intKey && !pPag
1e5d0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20  e->leaf ){.     
1e5e0 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a       lwr = idx;.
1e5f0 20 20 20 20 20 20 20 20 20 20 75 70 72 20 3d 20            upr = 
1e600 6c 77 72 20 2d 20 31 3b 0a 20 20 20 20 20 20 20  lwr - 1;.       
1e610 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1e620 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1e630 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20     *pRes = 0;.  
1e640 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
1e650 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
1e660 20 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69    goto moveto_fi
1e670 6e 69 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nish;.        }.
1e680 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1e690 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ( c<0 ){.       
1e6a0 20 6c 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20   lwr = idx+1;.  
1e6b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e6c0 20 20 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a     upr = idx-1;.
1e6d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1e6e0 28 20 6c 77 72 3e 75 70 72 20 29 7b 0a 20 20 20  ( lwr>upr ){.   
1e6f0 20 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e       pCur->info.
1e700 6e 4b 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b  nKey = nCellKey;
1e710 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1e720 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43        }.      pC
1e730 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
1e740 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 28 28  iPage] = (u16)((
1e750 6c 77 72 2b 75 70 72 29 2f 32 29 3b 0a 20 20 20  lwr+upr)/2);.   
1e760 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c   }.    assert( l
1e770 77 72 3d 3d 75 70 72 2b 31 20 29 3b 0a 20 20 20  wr==upr+1 );.   
1e780 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
1e790 69 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66  isInit );.    if
1e7a0 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b  ( pPage->leaf ){
1e7b0 0a 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20  .      chldPg = 
1e7c0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
1e7d0 20 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65   lwr>=pPage->nCe
1e7e0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64  ll ){.      chld
1e7f0 50 67 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  Pg = get4byte(&p
1e800 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1e810 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
1e820 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1e830 20 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34     chldPg = get4
1e840 62 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50  byte(findCell(pP
1e850 61 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20  age, lwr));.    
1e860 7d 0a 20 20 20 20 69 66 28 20 63 68 6c 64 50 67  }.    if( chldPg
1e870 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ==0 ){.      ass
1e880 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
1e890 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43  [pCur->iPage]<pC
1e8a0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1e8b0 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29  >iPage]->nCell )
1e8c0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 73  ;.      if( pRes
1e8d0 20 29 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20   ) *pRes = c;.  
1e8e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1e8f0 4f 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d  OK;.      goto m
1e900 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20  oveto_finish;.  
1e910 20 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 69    }.    pCur->ai
1e920 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1e930 20 3d 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20   = (u16)lwr;.   
1e940 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1e950 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  e = 0;.    pCur-
1e960 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
1e970 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43      rc = moveToC
1e980 68 69 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50  hild(pCur, chldP
1e990 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  g);.    if( rc )
1e9a0 20 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e   goto moveto_fin
1e9b0 69 73 68 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f  ish;.  }.moveto_
1e9c0 66 69 6e 69 73 68 3a 0a 20 20 72 65 74 75 72 6e  finish:.  return
1e9d0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e   rc;.}../*.** In
1e9e0 20 74 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66   this version of
1e9f0 20 42 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b   BtreeMoveto, pK
1ea00 65 79 20 69 73 20 61 20 70 61 63 6b 65 64 20 69  ey is a packed i
1ea10 6e 64 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73  ndex record.** s
1ea20 75 63 68 20 61 73 20 69 73 20 67 65 6e 65 72 61  uch as is genera
1ea30 74 65 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61  ted by the OP_Ma
1ea40 6b 65 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e  keRecord opcode.
1ea50 20 20 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20    Unpack the.** 
1ea60 72 65 63 6f 72 64 20 61 6e 64 20 74 68 65 6e 20  record and then 
1ea70 63 61 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f  call BtreeMoveto
1ea80 55 6e 70 61 63 6b 65 64 28 29 20 74 6f 20 64 6f  Unpacked() to do
1ea90 20 74 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 69 6e   the work..*/.in
1eaa0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  t sqlite3BtreeMo
1eab0 76 65 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72  veto(.  BtCursor
1eac0 20 2a 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43   *pCur,     /* C
1ead0 75 72 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68  ursor open on th
1eae0 65 20 62 74 72 65 65 20 74 6f 20 62 65 20 73 65  e btree to be se
1eaf0 61 72 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  arched */.  cons
1eb00 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20  t void *pKey,   
1eb10 2f 2a 20 50 61 63 6b 65 64 20 6b 65 79 20 69 66  /* Packed key if
1eb20 20 74 68 65 20 62 74 72 65 65 20 69 73 20 61 6e   the btree is an
1eb30 20 69 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34 20   index */.  i64 
1eb40 6e 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  nKey,           
1eb50 2f 2a 20 49 6e 74 65 67 65 72 20 6b 65 79 20 66  /* Integer key f
1eb60 6f 72 20 74 61 62 6c 65 73 2e 20 20 53 69 7a 65  or tables.  Size
1eb70 20 6f 66 20 70 4b 65 79 20 66 6f 72 20 69 6e 64   of pKey for ind
1eb80 69 63 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69  ices */.  int bi
1eb90 61 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  as,           /*
1eba0 20 42 69 61 73 20 73 65 61 72 63 68 20 74 6f 20   Bias search to 
1ebb0 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a  the high end */.
1ebc0 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20    int *pRes     
1ebd0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73        /* Write s
1ebe0 65 61 72 63 68 20 72 65 73 75 6c 74 73 20 68 65  earch results he
1ebf0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
1ec00 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1ec10 20 20 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20        /* Status 
1ec20 63 6f 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b  code */.  Unpack
1ec30 65 64 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65  edRecord *pIdxKe
1ec40 79 3b 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64  y;   /* Unpacked
1ec50 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20   index key */.  
1ec60 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64 20 61  UnpackedRecord a
1ec70 53 70 61 63 65 5b 31 36 5d 3b 20 2f 2a 20 54 65  Space[16]; /* Te
1ec80 6d 70 20 73 70 61 63 65 20 66 6f 72 20 70 49 64  mp space for pId
1ec90 78 4b 65 79 20 2d 20 74 6f 20 61 76 6f 69 64 20  xKey - to avoid 
1eca0 61 20 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20 20 69  a malloc */..  i
1ecb0 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61  f( pKey ){.    a
1ecc0 73 73 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36  ssert( nKey==(i6
1ecd0 34 29 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20  4)(int)nKey );. 
1ece0 20 20 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c     pIdxKey = sql
1ecf0 69 74 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e  ite3VdbeRecordUn
1ed00 70 61 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49  pack(pCur->pKeyI
1ed10 6e 66 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20  nfo, (int)nKey, 
1ed20 70 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20  pKey,.          
1ed30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed40 20 20 20 20 20 20 20 20 20 20 20 20 61 53 70 61              aSpa
1ed50 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70 61 63  ce, sizeof(aSpac
1ed60 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64  e));.    if( pId
1ed70 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e  xKey==0 ) return
1ed80 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1ed90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78   }else{.    pIdx
1eda0 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Key = 0;.  }.  r
1edb0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
1edc0 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70  MovetoUnpacked(p
1edd0 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b  Cur, pIdxKey, nK
1ede0 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b  ey, bias, pRes);
1edf0 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20  .  if( pKey ){. 
1ee00 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65     sqlite3VdbeDe
1ee10 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f  leteUnpackedReco
1ee20 72 64 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 7d  rd(pIdxKey);.  }
1ee30 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1ee40 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
1ee50 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73 6f  RUE if the curso
1ee60 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
1ee70 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66  g at an entry of
1ee80 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a   the table..**.*
1ee90 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72  * TRUE will be r
1eea0 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61 20  eturned after a 
1eeb0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42  call to sqlite3B
1eec0 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73  treeNext() moves
1eed0 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73  .** past the las
1eee0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  t entry in the t
1eef0 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42  able or sqlite3B
1ef00 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73  treePrev() moves
1ef10 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72   past.** the fir
1ef20 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20  st entry.  TRUE 
1ef30 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64  is also returned
1ef40 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73   if the table is
1ef50 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73   empty..*/.int s
1ef60 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28 42  qlite3BtreeEof(B
1ef70 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
1ef80 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20    /* TODO: What 
1ef90 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  if the cursor is
1efa0 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49   in CURSOR_REQUI
1efb0 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74  RESEEK but all t
1efc0 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a  able entries.  *
1efd0 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65  * have been dele
1efe0 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77 69  ted? This API wi
1eff0 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67  ll need to chang
1f000 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65  e to return an e
1f010 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61  rror code.  ** a
1f020 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f  s well as the bo
1f030 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c  olean result val
1f040 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72  ue..  */.  retur
1f050 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21  n (CURSOR_VALID!
1f060 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a  =pCur->eState);.
1f070 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1f080 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  the database con
1f090 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 66  nection handle f
1f0a0 6f 72 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a  or a cursor..*/.
1f0b0 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33  sqlite3 *sqlite3
1f0c0 42 74 72 65 65 43 75 72 73 6f 72 44 62 28 63 6f  BtreeCursorDb(co
1f0d0 6e 73 74 20 42 74 43 75 72 73 6f 72 20 2a 70 43  nst BtCursor *pC
1f0e0 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  ur){.  assert( s
1f0f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1f100 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e  d(pCur->pBtree->
1f110 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
1f120 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 70 42 74  return pCur->pBt
1f130 72 65 65 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a  ree->db;.}../*.*
1f140 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63 75  * Advance the cu
1f150 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  rsor to the next
1f160 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
1f170 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73  tabase.  If.** s
1f180 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73  uccessful then s
1f190 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20  et *pRes=0.  If 
1f1a0 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61  the cursor.** wa
1f1b0 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69  s already pointi
1f1c0 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65  ng to the last e
1f1d0 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
1f1e0 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  base before.** t
1f1f0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
1f200 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74  called, then set
1f210 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74   *pRes=1..*/.int
1f220 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
1f230 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
1f240 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
1f250 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64  int rc;.  int id
1f260 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  x;.  MemPage *pP
1f270 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  age;..  assert( 
1f280 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1f290 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d  (pCur) );.  rc =
1f2a0 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f   restoreCursorPo
1f2b0 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20  sition(pCur);.  
1f2c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1f2d0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
1f2e0 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rc;.  }.  assert
1f2f0 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 69  ( pRes!=0 );.  i
1f300 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  f( CURSOR_INVALI
1f310 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20  D==pCur->eState 
1f320 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31  ){.    *pRes = 1
1f330 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
1f340 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
1f350 28 20 70 43 75 72 2d 3e 73 6b 69 70 3e 30 20 29  ( pCur->skip>0 )
1f360 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70  {.    pCur->skip
1f370 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20   = 0;.    *pRes 
1f380 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
1f390 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
1f3a0 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b   pCur->skip = 0;
1f3b0 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ..  pPage = pCur
1f3c0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1f3d0 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b  Page];.  idx = +
1f3e0 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75  +pCur->aiIdx[pCu
1f3f0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73  r->iPage];.  ass
1f400 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
1f410 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  it );.  assert( 
1f420 69 64 78 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  idx<=pPage->nCel
1f430 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e  l );..  pCur->in
1f440 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20  fo.nSize = 0;.  
1f450 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1f460 3d 20 30 3b 0a 20 20 69 66 28 20 69 64 78 3e 3d  = 0;.  if( idx>=
1f470 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a  pPage->nCell ){.
1f480 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e      if( !pPage->
1f490 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63  leaf ){.      rc
1f4a0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
1f4b0 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70  Cur, get4byte(&p
1f4c0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
1f4d0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29  e->hdrOffset+8])
1f4e0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
1f4f0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
1f500 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65     rc = moveToLe
1f510 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20  ftmost(pCur);.  
1f520 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
1f530 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1f540 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20      }.    do{.  
1f550 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
1f560 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
1f570 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
1f580 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74       pCur->eStat
1f590 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
1f5a0 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ID;.        retu
1f5b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1f5c0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1f5d0 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61  te3BtreeMoveToPa
1f5e0 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20  rent(pCur);.    
1f5f0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
1f600 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1f610 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  ge];.    }while(
1f620 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
1f630 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67 65  r->iPage]>=pPage
1f640 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a  ->nCell );.    *
1f650 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 66  pRes = 0;.    if
1f660 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20  ( pPage->intKey 
1f670 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
1f680 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 70  lite3BtreeNext(p
1f690 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20  Cur, pRes);.    
1f6a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
1f6b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1f6c0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
1f6d0 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20  ;.  }.  *pRes = 
1f6e0 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e  0;.  if( pPage->
1f6f0 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75  leaf ){.    retu
1f700 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1f710 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c  }.  rc = moveToL
1f720 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
1f730 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
1f740 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63  /*.** Step the c
1f750 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63  ursor to the bac
1f760 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  k to the previou
1f770 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  s entry in the d
1f780 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20  atabase.  If.** 
1f790 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20  successful then 
1f7a0 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66  set *pRes=0.  If
1f7b0 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
1f7c0 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  as already point
1f7d0 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73 74  ing to the first
1f7e0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61   entry in the da
1f7f0 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a  tabase before.**
1f800 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
1f810 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73  s called, then s
1f820 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69  et *pRes=1..*/.i
1f830 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  nt sqlite3BtreeP
1f840 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72  revious(BtCursor
1f850 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
1f860 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
1f870 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
1f880 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1f890 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1f8a0 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74  ) );.  rc = rest
1f8b0 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
1f8c0 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72  n(pCur);.  if( r
1f8d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1f8e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1f8f0 20 7d 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61 73   }.  pCur->atLas
1f900 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 43 55 52  t = 0;.  if( CUR
1f910 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75  SOR_INVALID==pCu
1f920 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20  r->eState ){.   
1f930 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20   *pRes = 1;.    
1f940 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1f950 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72  ;.  }.  if( pCur
1f960 2d 3e 73 6b 69 70 3c 30 20 29 7b 0a 20 20 20 20  ->skip<0 ){.    
1f970 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a  pCur->skip = 0;.
1f980 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20      *pRes = 0;. 
1f990 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1f9a0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d  _OK;.  }.  pCur-
1f9b0 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20 70 50  >skip = 0;..  pP
1f9c0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
1f9d0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
1f9e0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1f9f0 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66  ->isInit );.  if
1fa00 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
1fa10 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20  {.    int idx = 
1fa20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1fa30 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63  ->iPage];.    rc
1fa40 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
1fa50 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 66 69  Cur, get4byte(fi
1fa60 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  ndCell(pPage, id
1fa70 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63  x)));.    if( rc
1fa80 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1fa90 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
1faa0 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d  c = moveToRightm
1fab0 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c  ost(pCur);.  }el
1fac0 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70  se{.    while( p
1fad0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1fae0 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20  >iPage]==0 ){.  
1faf0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50      if( pCur->iP
1fb00 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  age==0 ){.      
1fb10 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d    pCur->eState =
1fb20 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b   CURSOR_INVALID;
1fb30 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d  .        *pRes =
1fb40 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   1;.        retu
1fb50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
1fb60 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1fb70 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61  te3BtreeMoveToPa
1fb80 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20  rent(pCur);.    
1fb90 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f  }.    pCur->info
1fba0 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  .nSize = 0;.    
1fbb0 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20  pCur->validNKey 
1fbc0 3d 20 30 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e  = 0;..    pCur->
1fbd0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
1fbe0 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20  e]--;.    pPage 
1fbf0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
1fc00 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
1fc10 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
1fc20 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  ey && !pPage->le
1fc30 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
1fc40 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
1fc50 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73  vious(pCur, pRes
1fc60 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1fc70 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1fc80 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
1fc90 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 65 74  *pRes = 0;.  ret
1fca0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1fcb0 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20   Allocate a new 
1fcc0 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61  page from the da
1fcd0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
1fce0 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65 20  ** The new page 
1fcf0 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  is marked as dir
1fd00 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77  ty.  (In other w
1fd10 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67  ords, sqlite3Pag
1fd20 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73  erWrite().** has
1fd30 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
1fd40 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20  lled on the new 
1fd50 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20  page.)  The new 
1fd60 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a  page has also.**
1fd70 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64   been referenced
1fd80 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67   and the calling
1fd90 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70   routine is resp
1fda0 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c  onsible for call
1fdb0 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  ing.** sqlite3Pa
1fdc0 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68  gerUnref() on th
1fdd0 65 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20  e new page when 
1fde0 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a  it is done..**.*
1fdf0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
1fe00 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65  eturned on succe
1fe10 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72  ss.  Any other r
1fe20 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69  eturn value indi
1fe30 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f  cates.** an erro
1fe40 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20  r.  *ppPage and 
1fe50 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66  *pPgno are undef
1fe60 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e  ined in the even
1fe70 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  t of an error..*
1fe80 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20  * Do not invoke 
1fe90 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
1fea0 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69  f() on *ppPage i
1feb0 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65  f an error is re
1fec0 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  turned..**.** If
1fed0 20 74 68 65 20 22 6e 65 61 72 62 79 22 20 70 61   the "nearby" pa
1fee0 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30  rameter is not 0
1fef0 2c 20 74 68 65 6e 20 61 20 28 66 65 65 62 6c 65  , then a (feeble
1ff00 29 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65  ) effort is made
1ff10 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61   to .** locate a
1ff20 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74   page close to t
1ff30 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22  he page number "
1ff40 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73 20 63  nearby".  This c
1ff50 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e  an be used in an
1ff60 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b  .** attempt to k
1ff70 65 65 70 20 72 65 6c 61 74 65 64 20 70 61 67 65  eep related page
1ff80 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20  s close to each 
1ff90 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64 61 74  other in the dat
1ffa0 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77  abase file,.** w
1ffb0 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e  hich in turn can
1ffc0 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20 61   make database a
1ffd0 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a  ccess faster..**
1ffe0 0a 2a 2a 20 49 66 20 74 68 65 20 22 65 78 61 63  .** If the "exac
1fff0 74 22 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  t" parameter is 
20000 6e 6f 74 20 30 2c 20 61 6e 64 20 74 68 65 20 70  not 0, and the p
20010 61 67 65 2d 6e 75 6d 62 65 72 20 6e 65 61 72 62  age-number nearb
20020 79 20 65 78 69 73 74 73 20 0a 2a 2a 20 61 6e 79  y exists .** any
20030 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65  where on the fre
20040 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20  e-list, then it 
20050 69 73 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f  is guarenteed to
20060 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68   be returned. Th
20070 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73  is.** is only us
20080 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ed by auto-vacuu
20090 6d 20 64 61 74 61 62 61 73 65 73 20 77 68 65 6e  m databases when
200a0 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65   allocating a ne
200b0 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  w table..*/.stat
200c0 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42  ic int allocateB
200d0 74 72 65 65 50 61 67 65 28 0a 20 20 42 74 53 68  treePage(.  BtSh
200e0 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65  ared *pBt, .  Me
200f0 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
20100 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20  .  Pgno *pPgno, 
20110 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a  .  Pgno nearby,.
20120 20 20 75 38 20 65 78 61 63 74 0a 29 7b 0a 20 20    u8 exact.){.  
20130 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b  MemPage *pPage1;
20140 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
20150 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65   n;     /* Numbe
20160 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68  r of pages on th
20170 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20  e freelist */.  
20180 69 6e 74 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75  int k;     /* Nu
20190 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f  mber of leaves o
201a0 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74  n the trunk of t
201b0 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
201c0 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b   MemPage *pTrunk
201d0 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20   = 0;.  MemPage 
201e0 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b  *pPrevTrunk = 0;
201f0 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
20200 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
20210 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
20220 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
20230 61 67 65 31 3b 0a 20 20 6e 20 3d 20 67 65 74 34  age1;.  n = get4
20240 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44  byte(&pPage1->aD
20250 61 74 61 5b 33 36 5d 29 3b 0a 20 20 69 66 28 20  ata[36]);.  if( 
20260 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  n>0 ){.    /* Th
20270 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e  ere are pages on
20280 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20   the freelist.  
20290 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f  Reuse one of tho
202a0 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20  se pages. */.   
202b0 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20   Pgno iTrunk;.  
202c0 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74 20    u8 searchList 
202d0 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66  = 0; /* If the f
202e0 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65  ree-list must be
202f0 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e   searched for 'n
20300 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20  earby' */.    . 
20310 20 20 20 2f 2a 20 49 66 20 74 68 65 20 27 65 78     /* If the 'ex
20320 61 63 74 27 20 70 61 72 61 6d 65 74 65 72 20 77  act' parameter w
20330 61 73 20 74 72 75 65 20 61 6e 64 20 61 20 71 75  as true and a qu
20340 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74  ery of the point
20350 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68  er-map.    ** sh
20360 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ows that the pag
20370 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f  e 'nearby' is so
20380 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66  mewhere on the f
20390 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20  ree-list, then. 
203a0 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65     ** the entire
203b0 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65  -list will be se
203c0 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74 20  arched for that 
203d0 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66  page..    */.#if
203e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
203f0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
20400 69 66 28 20 65 78 61 63 74 20 26 26 20 6e 65 61  if( exact && nea
20410 72 62 79 3c 3d 70 61 67 65 72 50 61 67 65 63 6f  rby<=pagerPageco
20420 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
20430 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20    u8 eType;.    
20440 20 20 61 73 73 65 72 74 28 20 6e 65 61 72 62 79    assert( nearby
20450 3e 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >0 );.      asse
20460 72 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63  rt( pBt->autoVac
20470 75 75 6d 20 29 3b 0a 20 20 20 20 20 20 72 63 20  uum );.      rc 
20480 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
20490 20 6e 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c   nearby, &eType,
204a0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
204b0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
204c0 20 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d       if( eType==
204d0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20  PTRMAP_FREEPAGE 
204e0 29 7b 0a 20 20 20 20 20 20 20 20 73 65 61 72 63  ){.        searc
204f0 68 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20  hList = 1;.     
20500 20 7d 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f 20   }.      *pPgno 
20510 3d 20 6e 65 61 72 62 79 3b 0a 20 20 20 20 7d 0a  = nearby;.    }.
20520 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44  #endif..    /* D
20530 65 63 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65  ecrement the fre
20540 65 2d 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20  e-list count by 
20550 31 2e 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f  1. Set iTrunk to
20560 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
20570 65 0a 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66  e.    ** first f
20580 72 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70  ree-list trunk p
20590 61 67 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20  age. iPrevTrunk 
205a0 69 73 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a  is initially 1..
205b0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
205c0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
205d0 65 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67  e(pPage1->pDbPag
205e0 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  e);.    if( rc )
205f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
20600 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
20610 2d 3e 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31  ->aData[36], n-1
20620 29 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63  );..    /* The c
20630 6f 64 65 20 77 69 74 68 69 6e 20 74 68 69 73 20  ode within this 
20640 6c 6f 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79  loop is run only
20650 20 6f 6e 63 65 20 69 66 20 74 68 65 20 27 73 65   once if the 'se
20660 61 72 63 68 4c 69 73 74 27 20 76 61 72 69 61 62  archList' variab
20670 6c 65 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  le.    ** is not
20680 20 74 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65   true. Otherwise
20690 2c 20 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66  , it runs once f
206a0 6f 72 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61  or each trunk-pa
206b0 67 65 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ge on the.    **
206c0 20 66 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c   free-list until
206d0 20 74 68 65 20 70 61 67 65 20 27 6e 65 61 72 62   the page 'nearb
206e0 79 27 20 69 73 20 6c 6f 63 61 74 65 64 2e 0a 20  y' is located.. 
206f0 20 20 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20     */.    do {. 
20700 20 20 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20       pPrevTrunk 
20710 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
20720 69 66 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29  if( pPrevTrunk )
20730 7b 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b  {.        iTrunk
20740 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 72   = get4byte(&pPr
20750 65 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  evTrunk->aData[0
20760 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ]);.      }else{
20770 0a 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20  .        iTrunk 
20780 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  = get4byte(&pPag
20790 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a  e1->aData[32]);.
207a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
207b0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
207c0 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75  etPage(pBt, iTru
207d0 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b  nk, &pTrunk, 0);
207e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
207f0 0a 20 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20  .        pTrunk 
20800 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 0;.        got
20810 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
20820 61 67 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  age;.      }..  
20830 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65      k = get4byte
20840 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
20850 34 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b  4]);.      if( k
20860 3d 3d 30 20 26 26 20 21 73 65 61 72 63 68 4c 69  ==0 && !searchLi
20870 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  st ){.        /*
20880 20 54 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e   The trunk has n
20890 6f 20 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65  o leaves and the
208a0 20 6c 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69   list is not bei
208b0 6e 67 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20  ng searched. .  
208c0 20 20 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72        ** So extr
208d0 61 63 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61  act the trunk pa
208e0 67 65 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73  ge itself and us
208f0 65 20 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c  e it as the newl
20900 79 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  y .        ** al
20910 6c 6f 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a  located page */.
20920 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
20930 70 50 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b  pPrevTrunk==0 );
20940 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
20950 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
20960 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
20970 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
20980 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
20990 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
209a0 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
209b0 20 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d          *pPgno =
209c0 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20   iTrunk;.       
209d0 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d   memcpy(&pPage1-
209e0 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72  >aData[32], &pTr
209f0 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34  unk->aData[0], 4
20a00 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61  );.        *ppPa
20a10 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20  ge = pTrunk;.   
20a20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b       pTrunk = 0;
20a30 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28  .        TRACE((
20a40 22 41 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72  "ALLOCATE: %d tr
20a50 75 6e 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61  unk - %d free pa
20a60 67 65 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50  ges left\n", *pP
20a70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20  gno, n-1));.    
20a80 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3e 70 42    }else if( k>pB
20a90 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  t->usableSize/4 
20aa0 2d 20 32 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  - 2 ){.        /
20ab0 2a 20 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20  * Value of k is 
20ac0 6f 75 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44  out of range.  D
20ad0 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69  atabase corrupti
20ae0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63  on */.        rc
20af0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
20b00 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20  T_BKPT;.        
20b10 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
20b20 65 5f 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20  e_page;.#ifndef 
20b30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
20b40 56 41 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c  VACUUM.      }el
20b50 73 65 20 69 66 28 20 73 65 61 72 63 68 4c 69 73  se if( searchLis
20b60 74 20 26 26 20 6e 65 61 72 62 79 3d 3d 69 54 72  t && nearby==iTr
20b70 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  unk ){.        /
20b80 2a 20 54 68 65 20 6c 69 73 74 20 69 73 20 62 65  * The list is be
20b90 69 6e 67 20 73 65 61 72 63 68 65 64 20 61 6e 64  ing searched and
20ba0 20 74 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65   this trunk page
20bb0 20 69 73 20 74 68 65 20 70 61 67 65 0a 20 20 20   is the page.   
20bc0 20 20 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63       ** to alloc
20bd0 61 74 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20  ate, regardless 
20be0 6f 66 20 77 68 65 74 68 65 72 20 69 74 20 68 61  of whether it ha
20bf0 73 20 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20  s leaves..      
20c00 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73    */.        ass
20c10 65 72 74 28 20 2a 70 50 67 6e 6f 3d 3d 69 54 72  ert( *pPgno==iTr
20c20 75 6e 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 2a  unk );.        *
20c30 70 70 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b  ppPage = pTrunk;
20c40 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c  .        searchL
20c50 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ist = 0;.       
20c60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
20c70 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e  erWrite(pTrunk->
20c80 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
20c90 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
20ca0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
20cb0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
20cc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
20cd0 69 66 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  if( k==0 ){.    
20ce0 20 20 20 20 20 20 69 66 28 20 21 70 50 72 65 76        if( !pPrev
20cf0 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20  Trunk ){.       
20d00 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61       memcpy(&pPa
20d10 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20  ge1->aData[32], 
20d20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
20d30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
20d40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
20d50 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65      memcpy(&pPre
20d60 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
20d70 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  , &pTrunk->aData
20d80 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  [0], 4);.       
20d90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
20da0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
20db0 20 54 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20   The trunk page 
20dc0 69 73 20 72 65 71 75 69 72 65 64 20 62 79 20 74  is required by t
20dd0 68 65 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74  he caller but it
20de0 20 63 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20   contains .     
20df0 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73       ** pointers
20e00 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65   to free-list le
20e10 61 76 65 73 2e 20 54 68 65 20 66 69 72 73 74 20  aves. The first 
20e20 6c 65 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74  leaf becomes a t
20e30 72 75 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a  runk.          *
20e40 2a 20 70 61 67 65 20 69 6e 20 74 68 69 73 20 63  * page in this c
20e50 61 73 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ase..          *
20e60 2f 0a 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50  /.          MemP
20e70 61 67 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a  age *pNewTrunk;.
20e80 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69            Pgno i
20e90 4e 65 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62  NewTrunk = get4b
20ea0 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61  yte(&pTrunk->aDa
20eb0 74 61 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20  ta[8]);.        
20ec0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
20ed0 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
20ee0 69 4e 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77  iNewTrunk, &pNew
20ef0 54 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20  Trunk, 0);.     
20f00 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
20f10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20f20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
20f30 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
20f40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20f50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20f60 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77 54  PagerWrite(pNewT
20f70 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
20f80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
20f90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
20fa0 20 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61             relea
20fb0 73 65 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b  sePage(pNewTrunk
20fc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  );.            g
20fd0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
20fe0 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
20ff0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d   }.          mem
21000 63 70 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  cpy(&pNewTrunk->
21010 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e  aData[0], &pTrun
21020 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
21030 0a 20 20 20 20 20 20 20 20 20 20 70 75 74 34 62  .          put4b
21040 79 74 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e  yte(&pNewTrunk->
21050 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a  aData[4], k-1);.
21060 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
21070 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61  (&pNewTrunk->aDa
21080 74 61 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e  ta[8], &pTrunk->
21090 61 44 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29  aData[12], (k-1)
210a0 2a 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  *4);.          r
210b0 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 54  eleasePage(pNewT
210c0 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
210d0 20 69 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b   if( !pPrevTrunk
210e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
210f0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
21100 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
21110 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
21120 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
21130 70 75 74 34 62 79 74 65 28 26 70 50 61 67 65 31  put4byte(&pPage1
21140 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65  ->aData[32], iNe
21150 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20  wTrunk);.       
21160 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21170 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
21180 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 72  e3PagerWrite(pPr
21190 65 76 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  evTrunk->pDbPage
211a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
211b0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
211c0 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
211d0 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
211e0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
211f0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
21200 65 28 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61  e(&pPrevTrunk->a
21210 44 61 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75  Data[0], iNewTru
21220 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nk);.          }
21230 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21240 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
21250 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
21260 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e  LLOCATE: %d trun
21270 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65  k - %d free page
21280 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e  s left\n", *pPgn
21290 6f 2c 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66  o, n-1));.#endif
212a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
212b0 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74        /* Extract
212c0 20 61 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65   a leaf from the
212d0 20 74 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20   trunk */.      
212e0 20 20 69 6e 74 20 63 6c 6f 73 65 73 74 3b 0a 20    int closest;. 
212f0 20 20 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67         Pgno iPag
21300 65 3b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67  e;.        unsig
21310 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 20  ned char *aData 
21320 3d 20 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b  = pTrunk->aData;
21330 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
21340 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
21350 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29  pTrunk->pDbPage)
21360 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
21370 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
21380 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
21390 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  page;.        }.
213a0 20 20 20 20 20 20 20 20 69 66 28 20 6e 65 61 72          if( near
213b0 62 79 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  by>0 ){.        
213c0 20 20 69 6e 74 20 69 2c 20 64 69 73 74 3b 0a 20    int i, dist;. 
213d0 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
213e0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
213f0 64 69 73 74 20 3d 20 67 65 74 34 62 79 74 65 28  dist = get4byte(
21400 26 61 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61  &aData[8]) - nea
21410 72 62 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69  rby;.          i
21420 66 28 20 64 69 73 74 3c 30 20 29 20 64 69 73 74  f( dist<0 ) dist
21430 20 3d 20 2d 64 69 73 74 3b 0a 20 20 20 20 20 20   = -dist;.      
21440 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b      for(i=1; i<k
21450 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
21460 20 20 20 20 69 6e 74 20 64 32 20 3d 20 67 65 74      int d2 = get
21470 34 62 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69  4byte(&aData[8+i
21480 2a 34 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20  *4]) - nearby;. 
21490 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64             if( d
214a0 32 3c 30 20 29 20 64 32 20 3d 20 2d 64 32 3b 0a  2<0 ) d2 = -d2;.
214b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
214c0 64 32 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20  d2<dist ){.     
214d0 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74           closest
214e0 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20   = i;.          
214f0 20 20 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20      dist = d2;. 
21500 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
21510 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21520 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21530 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20    closest = 0;. 
21540 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
21550 20 20 69 50 61 67 65 20 3d 20 67 65 74 34 62 79    iPage = get4by
21560 74 65 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73  te(&aData[8+clos
21570 65 73 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20  est*4]);.       
21580 20 69 66 28 20 21 73 65 61 72 63 68 4c 69 73 74   if( !searchList
21590 20 7c 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72 62   || iPage==nearb
215a0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  y ){.          i
215b0 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20  nt noContent;.  
215c0 20 20 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61          Pgno nPa
215d0 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70  ge;.          *p
215e0 50 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20  Pgno = iPage;.  
215f0 20 20 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20          nPage = 
21600 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
21610 42 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  Bt);.          i
21620 66 28 20 2a 70 50 67 6e 6f 3e 6e 50 61 67 65 20  f( *pPgno>nPage 
21630 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
21640 2a 20 46 72 65 65 20 70 61 67 65 20 6f 66 66 20  * Free page off 
21650 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66  the end of the f
21660 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ile */.         
21670 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
21680 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
21690 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
216a0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
216b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
216c0 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
216d0 4c 4c 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20  LLOCATE: %d was 
216e0 6c 65 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e  leaf %d of %d on
216f0 20 74 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20   trunk %d".     
21700 20 20 20 20 20 20 20 20 20 20 20 20 22 3a 20 25              ": %
21710 64 20 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65  d more free page
21720 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
21730 20 20 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63         *pPgno, c
21740 6c 6f 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72  losest+1, k, pTr
21750 75 6e 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29  unk->pgno, n-1))
21760 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
21770 63 6c 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20  closest<k-1 ){. 
21780 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
21790 79 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65  y(&aData[8+close
217a0 73 74 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b  st*4], &aData[4+
217b0 6b 2a 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  k*4], 4);.      
217c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
217d0 70 75 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  put4byte(&aData[
217e0 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20  4], k-1);.      
217f0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
21800 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
21810 62 6c 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50  ble(pTrunk->pDbP
21820 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  age) );.        
21830 20 20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62    noContent = !b
21840 74 72 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e  treeGetHasConten
21850 74 28 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3b 0a  t(pBt, *pPgno);.
21860 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
21870 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
21880 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20  ge(pBt, *pPgno, 
21890 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e  ppPage, noConten
218a0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  t);.          if
218b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
218c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
218d0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
218e0 57 72 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d  Write((*ppPage)-
218f0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
21900 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
21910 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21920 20 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73            releas
21930 65 50 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a  ePage(*ppPage);.
21940 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
21950 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21960 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
21970 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
21980 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65      }.      rele
21990 61 73 65 50 61 67 65 28 70 50 72 65 76 54 72 75  asePage(pPrevTru
219a0 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76  nk);.      pPrev
219b0 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d  Trunk = 0;.    }
219c0 77 68 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73  while( searchLis
219d0 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  t );.  }else{.  
219e0 20 20 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e    /* There are n
219f0 6f 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66  o pages on the f
21a00 72 65 65 6c 69 73 74 2c 20 73 6f 20 63 72 65 61  reelist, so crea
21a10 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 61 74  te a new page at
21a20 20 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64 20   the.    ** end 
21a30 6f 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  of the file */. 
21a40 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 70     int nPage = p
21a50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
21a60 74 29 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d  t);.    *pPgno =
21a70 20 6e 50 61 67 65 20 2b 20 31 3b 0a 0a 20 20 20   nPage + 1;..   
21a80 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e   if( *pPgno==PEN
21a90 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
21aa0 42 74 29 20 29 7b 0a 20 20 20 20 20 20 28 2a 70  Bt) ){.      (*p
21ab0 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 7d 0a 0a  Pgno)++;.    }..
21ac0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
21ad0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
21ae0 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f     if( pBt->auto
21af0 56 61 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50  Vacuum && PTRMAP
21b00 5f 49 53 50 41 47 45 28 70 42 74 2c 20 2a 70 50  _ISPAGE(pBt, *pP
21b10 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  gno) ){.      /*
21b20 20 49 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72   If *pPgno refer
21b30 73 20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d  s to a pointer-m
21b40 61 70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74  ap page, allocat
21b50 65 20 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a  e two new pages.
21b60 20 20 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20        ** at the 
21b70 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
21b80 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20  instead of one. 
21b90 54 68 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61  The first alloca
21ba0 74 65 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ted page.      *
21bb0 2a 20 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20  * becomes a new 
21bc0 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
21bd0 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20  , the second is 
21be0 75 73 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  used by the call
21bf0 65 72 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  er..      */.   
21c00 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43     TRACE(("ALLOC
21c10 41 54 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64  ATE: %d from end
21c20 20 6f 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65   of file (pointe
21c30 72 2d 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20  r-map page)\n", 
21c40 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  *pPgno));.      
21c50 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d  assert( *pPgno!=
21c60 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
21c70 45 28 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20  E(pBt) );.      
21c80 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20  (*pPgno)++;.    
21c90 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45    if( *pPgno==PE
21ca0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
21cb0 70 42 74 29 20 29 7b 20 28 2a 70 50 67 6e 6f 29  pBt) ){ (*pPgno)
21cc0 2b 2b 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64  ++; }.    }.#end
21cd0 69 66 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  if..    assert( 
21ce0 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
21cf0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
21d00 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
21d10 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
21d20 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61  Bt, *pPgno, ppPa
21d30 67 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ge, 0);.    if( 
21d40 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
21d50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21d60 50 61 67 65 72 57 72 69 74 65 28 28 2a 70 70 50  PagerWrite((*ppP
21d70 61 67 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a  age)->pDbPage);.
21d80 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
21d90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
21da0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
21db0 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  ge);.    }.    T
21dc0 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a  RACE(("ALLOCATE:
21dd0 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20   %d from end of 
21de0 66 69 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29  file\n", *pPgno)
21df0 29 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74  );.  }..  assert
21e00 28 20 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  ( *pPgno!=PENDIN
21e10 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
21e20 20 29 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74   );..end_allocat
21e30 65 5f 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73  e_page:.  releas
21e40 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20  ePage(pTrunk);. 
21e50 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 72   releasePage(pPr
21e60 65 76 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20  evTrunk);.  if( 
21e70 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21e80 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
21e90 50 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e  PagerPageRefcoun
21ea0 74 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  t((*ppPage)->pDb
21eb0 50 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20  Page)>1 ){.     
21ec0 20 72 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70   releasePage(*pp
21ed0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74  Page);.      ret
21ee0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
21ef0 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  PT_BKPT;.    }. 
21f00 20 20 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73     (*ppPage)->is
21f10 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Init = 0;.  }.  
21f20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
21f30 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
21f40 6e 20 69 73 20 75 73 65 64 20 74 6f 20 61 64 64  n is used to add
21f50 20 70 61 67 65 20 69 50 61 67 65 20 74 6f 20 74   page iPage to t
21f60 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
21f70 20 66 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20   free-list. .** 
21f80 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
21f90 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  at the page is n
21fa0 6f 74 20 61 6c 72 65 61 64 79 20 61 20 70 61 72  ot already a par
21fb0 74 20 6f 66 20 74 68 65 20 66 72 65 65 2d 6c 69  t of the free-li
21fc0 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61  st..**.** The va
21fd0 6c 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68  lue passed as th
21fe0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
21ff0 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
22000 6f 6e 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a  on is optional..
22010 2a 2a 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72  ** If the caller
22020 20 68 61 70 70 65 6e 73 20 74 6f 20 68 61 76 65   happens to have
22030 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
22040 65 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74  e MemPage object
22050 20 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69   .** correspondi
22060 6e 67 20 74 6f 20 70 61 67 65 20 69 50 61 67 65  ng to page iPage
22070 20 68 61 6e 64 79 2c 20 69 74 20 6d 61 79 20 70   handy, it may p
22080 61 73 73 20 69 74 20 61 73 20 74 68 65 20 73 65  ass it as the se
22090 63 6f 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20  cond value. .** 
220a0 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 6d 61  Otherwise, it ma
220b0 79 20 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a  y pass NULL..**.
220c0 2a 2a 20 49 66 20 61 20 70 6f 69 6e 74 65 72 20  ** If a pointer 
220d0 74 6f 20 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a  to a MemPage obj
220e0 65 63 74 20 69 73 20 70 61 73 73 65 64 20 61 73  ect is passed as
220f0 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
22100 6d 65 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66  ment,.** its ref
22110 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20  erence count is 
22120 6e 6f 74 20 61 6c 74 65 72 65 64 20 62 79 20 74  not altered by t
22130 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  his function..*/
22140 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65  .static int free
22150 50 61 67 65 32 28 42 74 53 68 61 72 65 64 20 2a  Page2(BtShared *
22160 70 42 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d  pBt, MemPage *pM
22170 65 6d 50 61 67 65 2c 20 50 67 6e 6f 20 69 50 61  emPage, Pgno iPa
22180 67 65 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ge){.  MemPage *
22190 70 54 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20  pTrunk = 0;     
221a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72             /* Fr
221b0 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
221c0 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72  ge */.  Pgno iTr
221d0 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20  unk = 0;        
221e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
221f0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  age number of fr
22200 65 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61  ee-list trunk pa
22210 67 65 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65  ge */ .  MemPage
22220 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e   *pPage1 = pBt->
22230 70 50 61 67 65 31 3b 20 20 20 20 20 20 2f 2a 20  pPage1;      /* 
22240 4c 6f 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20  Local reference 
22250 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d  to page 1 */.  M
22260 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20  emPage *pPage;  
22270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22280 20 20 20 2f 2a 20 50 61 67 65 20 62 65 69 6e 67     /* Page being
22290 20 66 72 65 65 64 2e 20 4d 61 79 20 62 65 20 4e   freed. May be N
222a0 55 4c 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ULL. */.  int rc
222b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
222c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
222d0 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
222e0 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20    int nFree;    
222f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22300 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c        /* Initial
22310 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
22320 20 6f 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f   on free-list */
22330 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
22340 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
22350 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  Bt->mutex) );.  
22360 61 73 73 65 72 74 28 20 69 50 61 67 65 3e 31 20  assert( iPage>1 
22370 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 4d  );.  assert( !pM
22380 65 6d 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61  emPage || pMemPa
22390 67 65 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20  ge->pgno==iPage 
223a0 29 3b 0a 0a 20 20 69 66 28 20 70 4d 65 6d 50 61  );..  if( pMemPa
223b0 67 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20  ge ){.    pPage 
223c0 3d 20 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20  = pMemPage;.    
223d0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
223e0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
223f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
22400 61 67 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c  age = btreePageL
22410 6f 6f 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65  ookup(pBt, iPage
22420 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63  );.  }..  /* Inc
22430 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20  rement the free 
22440 70 61 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50  page count on pP
22450 61 67 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73  age1 */.  rc = s
22460 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
22470 28 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65  (pPage1->pDbPage
22480 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
22490 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
224a0 0a 20 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62  .  nFree = get4b
224b0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
224c0 74 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62  ta[36]);.  put4b
224d0 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
224e0 74 61 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29  ta[36], nFree+1)
224f0 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
22500 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20  _SECURE_DELETE. 
22510 20 2f 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54   /* If the SQLIT
22520 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20  E_SECURE_DELETE 
22530 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74  compile-time opt
22540 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ion is enabled, 
22550 74 68 65 6e 0a 20 20 2a 2a 20 61 6c 77 61 79 73  then.  ** always
22560 20 66 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65   fully overwrite
22570 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61   deleted informa
22580 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e  tion with zeros.
22590 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 21 70 50  .  */.  if( (!pP
225a0 61 67 65 20 26 26 20 28 72 63 20 3d 20 73 71 6c  age && (rc = sql
225b0 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
225c0 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50  (pBt, iPage, &pP
225d0 61 67 65 2c 20 30 29 29 29 0a 20 20 20 7c 7c 20  age, 0))).   || 
225e0 20 20 20 20 20 20 20 20 20 20 20 28 72 63 20 3d             (rc =
225f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
22600 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  te(pPage->pDbPag
22610 65 29 29 0a 20 20 29 7b 0a 20 20 20 20 67 6f 74  e)).  ){.    got
22620 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
22630 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 70 50 61    }.  memset(pPa
22640 67 65 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50  ge->aData, 0, pP
22650 61 67 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69  age->pBt->pageSi
22660 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  ze);.#endif..  /
22670 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
22680 65 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d  e supports auto-
22690 76 61 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e  vacuum, write an
226a0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f   entry in the po
226b0 69 6e 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74  inter-map.  ** t
226c0 6f 20 69 6e 64 69 63 61 74 65 20 74 68 61 74 20  o indicate that 
226d0 74 68 65 20 70 61 67 65 20 69 73 20 66 72 65 65  the page is free
226e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41  ..  */.  if( ISA
226f0 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
22700 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
22710 70 42 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d  pBt, iPage, PTRM
22720 41 50 5f 46 52 45 45 50 41 47 45 2c 20 30 29 3b  AP_FREEPAGE, 0);
22730 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
22740 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b  to freepage_out;
22750 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d  .  }..  /* Now m
22760 61 6e 69 70 75 6c 61 74 65 20 74 68 65 20 61 63  anipulate the ac
22770 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 66 72  tual database fr
22780 65 65 2d 6c 69 73 74 20 73 74 72 75 63 74 75 72  ee-list structur
22790 65 2e 20 54 68 65 72 65 20 61 72 65 20 74 77 6f  e. There are two
227a0 0a 20 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74  .  ** possibilit
227b0 69 65 73 2e 20 49 66 20 74 68 65 20 66 72 65 65  ies. If the free
227c0 2d 6c 69 73 74 20 69 73 20 63 75 72 72 65 6e 74  -list is current
227d0 6c 79 20 65 6d 70 74 79 2c 20 6f 72 20 69 66 20  ly empty, or if 
227e0 74 68 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74  the first.  ** t
227f0 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65  runk page in the
22800 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75   free-list is fu
22810 6c 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61  ll, then this pa
22820 67 65 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61  ge will become a
22830 0a 20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c  .  ** new free-l
22840 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20  ist trunk page. 
22850 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 77 69  Otherwise, it wi
22860 6c 6c 20 62 65 63 6f 6d 65 20 61 20 6c 65 61 66  ll become a leaf
22870 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 72   of the.  ** fir
22880 73 74 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e  st trunk page in
22890 20 74 68 65 20 63 75 72 72 65 6e 74 20 66 72 65   the current fre
228a0 65 2d 6c 69 73 74 2e 20 54 68 69 73 20 62 6c 6f  e-list. This blo
228b0 63 6b 20 74 65 73 74 73 20 69 66 20 69 74 0a 20  ck tests if it. 
228c0 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20   ** is possible 
228d0 74 6f 20 61 64 64 20 74 68 65 20 70 61 67 65 20  to add the page 
228e0 61 73 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69  as a new free-li
228f0 73 74 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20  st leaf..  */.  
22900 69 66 28 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a  if( nFree!=0 ){.
22910 20 20 20 20 69 6e 74 20 6e 4c 65 61 66 3b 20 20      int nLeaf;  
22920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
22930 20 49 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20   Initial number 
22940 6f 66 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e  of leaf cells on
22950 20 74 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a   trunk page */..
22960 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74      iTrunk = get
22970 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
22980 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72  Data[32]);.    r
22990 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
229a0 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 54 72  GetPage(pBt, iTr
229b0 75 6e 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29  unk, &pTrunk, 0)
229c0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
229d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
229e0 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f   goto freepage_o
229f0 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e  ut;.    }..    n
22a00 4c 65 61 66 20 3d 20 67 65 74 34 62 79 74 65 28  Leaf = get4byte(
22a10 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  &pTrunk->aData[4
22a20 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61  ]);.    if( nLea
22a30 66 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  f<0 ){.      rc 
22a40 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
22a50 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74  _BKPT;.      got
22a60 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
22a70 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c      }.    if( nL
22a80 65 61 66 3c 70 42 74 2d 3e 75 73 61 62 6c 65 53  eaf<pBt->usableS
22a90 69 7a 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20  ize/4 - 8 ){.   
22aa0 20 20 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61     /* In this ca
22ab0 73 65 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d  se there is room
22ac0 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61   on the trunk pa
22ad0 67 65 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  ge to insert the
22ae0 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62   page.      ** b
22af0 65 69 6e 67 20 66 72 65 65 64 20 61 73 20 61 20  eing freed as a 
22b00 6e 65 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20  new leaf..      
22b10 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65  **.      ** Note
22b20 20 74 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20   that the trunk 
22b30 70 61 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c  page is not real
22b40 6c 79 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74  ly full until it
22b50 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20   contains.      
22b60 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20  ** usableSize/4 
22b70 2d 20 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74  - 2 entries, not
22b80 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
22b90 38 20 65 6e 74 72 69 65 73 20 61 73 20 77 65 20  8 entries as we 
22ba0 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  have.      ** co
22bb0 64 65 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f  ded.  But due to
22bc0 20 61 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20   a coding error 
22bd0 69 6e 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53  in versions of S
22be0 51 4c 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20  QLite prior to. 
22bf0 20 20 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64       ** 3.6.0, d
22c00 61 74 61 62 61 73 65 73 20 77 69 74 68 20 66 72  atabases with fr
22c10 65 65 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  eelist trunk pag
22c20 65 73 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20  es holding more 
22c30 74 68 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73  than.      ** us
22c40 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65  ableSize/4 - 8 e
22c50 6e 74 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72  ntries will be r
22c60 65 70 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75  eported as corru
22c70 70 74 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20  pt.  In order.  
22c80 20 20 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61      ** to mainta
22c90 69 6e 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d  in backwards com
22ca0 70 61 74 69 62 69 6c 69 74 79 20 77 69 74 68 20  patibility with 
22cb0 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f  older versions o
22cc0 66 20 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20  f SQLite,.      
22cd0 2a 2a 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 61  ** we will conta
22ce0 69 6e 20 74 6f 20 72 65 73 74 72 69 63 74 20 74  in to restrict t
22cf0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74  he number of ent
22d00 72 69 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69  ries to usableSi
22d10 7a 65 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a  ze/4 - 8.      *
22d20 2a 20 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73  * for now.  At s
22d30 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  ome point in the
22d40 20 66 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76   future (once ev
22d50 65 72 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61  eryone has upgra
22d60 64 65 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20  ded.      ** to 
22d70 33 2e 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20  3.6.0 or later) 
22d80 77 65 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64  we should consid
22d90 65 72 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f  er fixing the co
22da0 6e 64 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a  nditional above.
22db0 20 20 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64        ** to read
22dc0 20 22 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32   "usableSize/4-2
22dd0 22 20 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73  " instead of "us
22de0 61 62 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20  ableSize/4-8".. 
22df0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
22e00 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
22e10 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62  rite(pTrunk->pDb
22e20 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
22e30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22e40 7b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  {.        put4by
22e50 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
22e60 61 5b 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a  a[4], nLeaf+1);.
22e70 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
22e80 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
22e90 38 2b 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67  8+nLeaf*4], iPag
22ea0 65 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  e);.#ifndef SQLI
22eb0 54 45 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45  TE_SECURE_DELETE
22ec0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
22ed0 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ge ){.          
22ee0 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
22ef0 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
22f00 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Page);.        }
22f10 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
22f20 72 63 20 3d 20 62 74 72 65 65 53 65 74 48 61 73  rc = btreeSetHas
22f30 43 6f 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61  Content(pBt, iPa
22f40 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ge);.      }.   
22f50 20 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d     TRACE(("FREE-
22f60 50 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e  PAGE: %d leaf on
22f70 20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e   trunk page %d\n
22f80 22 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54  ",pPage->pgno,pT
22f90 72 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  runk->pgno));.  
22fa0 20 20 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67      goto freepag
22fb0 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  e_out;.    }.  }
22fc0 0a 0a 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f  ..  /* If contro
22fd0 6c 20 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20  l flows to this 
22fe0 70 6f 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77  point, then it w
22ff0 61 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  as not possible 
23000 74 6f 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20  to add the.  ** 
23010 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 66  the page being f
23020 72 65 65 64 20 61 73 20 61 20 6c 65 61 66 20 70  reed as a leaf p
23030 61 67 65 20 6f 66 20 74 68 65 20 66 69 72 73 74  age of the first
23040 20 74 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72   trunk in the fr
23050 65 65 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f  ee-list..  ** Po
23060 73 73 69 62 6c 79 20 62 65 63 61 75 73 65 20 74  ssibly because t
23070 68 65 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20  he free-list is 
23080 65 6d 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62  empty, or possib
23090 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20 0a  ly because the .
230a0 20 20 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b    ** first trunk
230b0 20 69 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   in the free-lis
230c0 74 20 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65  t is full. Eithe
230d0 72 20 77 61 79 2c 20 74 68 65 20 70 61 67 65 20  r way, the page 
230e0 62 65 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a  being freed.  **
230f0 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65   will become the
23100 20 6e 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b   new first trunk
23110 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 72 65   page in the fre
23120 65 2d 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69  e-list..  */.  i
23130 66 28 20 20 20 28 28 21 70 50 61 67 65 29 20 26  f(   ((!pPage) &
23140 26 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71  & (0 != (rc = sq
23150 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
23160 65 28 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70  e(pBt, iPage, &p
23170 50 61 67 65 2c 20 30 29 29 29 29 0a 20 20 20 20  Page, 0)))).    
23180 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
23190 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
231a0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
231b0 29 29 29 0a 20 20 29 7b 0a 20 20 20 20 67 6f 74  ))).  ){.    got
231c0 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a  o freepage_out;.
231d0 20 20 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70    }.  put4byte(p
231e0 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72  Page->aData, iTr
231f0 75 6e 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65  unk);.  put4byte
23200 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34  (&pPage->aData[4
23210 5d 2c 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74  ], 0);.  put4byt
23220 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
23230 5b 33 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20  [32], iPage);.  
23240 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41 47  TRACE(("FREE-PAG
23250 45 3a 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20  E: %d new trunk 
23260 70 61 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25  page replacing %
23270 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e  d\n", pPage->pgn
23280 6f 2c 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72  o, iTrunk));..fr
23290 65 65 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66  eepage_out:.  if
232a0 28 20 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70  ( pPage ){.    p
232b0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
232c0 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50  ;.  }.  releaseP
232d0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65  age(pPage);.  re
232e0 6c 65 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b  leasePage(pTrunk
232f0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
23300 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 66 72 65  }.static int fre
23310 65 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  ePage(MemPage *p
23320 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  Page){.  return 
23330 66 72 65 65 50 61 67 65 32 28 70 50 61 67 65 2d  freePage2(pPage-
23340 3e 70 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61  >pBt, pPage, pPa
23350 67 65 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a  ge->pgno);.}../*
23360 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65  .** Free any ove
23370 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f  rflow pages asso
23380 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
23390 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73  given Cell..*/.s
233a0 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43  tatic int clearC
233b0 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ell(MemPage *pPa
233c0 67 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ge, unsigned cha
233d0 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74 53  r *pCell){.  BtS
233e0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61  hared *pBt = pPa
233f0 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49  ge->pBt;.  CellI
23400 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f  nfo info;.  Pgno
23410 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74   ovflPgno;.  int
23420 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c   rc;.  int nOvfl
23430 3b 0a 20 20 75 31 36 20 6f 76 66 6c 50 61 67 65  ;.  u16 ovflPage
23440 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Size;..  assert(
23450 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
23460 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
23470 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69  mutex) );.  sqli
23480 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
23490 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
234a0 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28  l, &info);.  if(
234b0 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d   info.iOverflow=
234c0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
234d0 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20   SQLITE_OK;  /* 
234e0 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  No overflow page
234f0 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75  s. Return withou
23500 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67  t doing anything
23510 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67   */.  }.  ovflPg
23520 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  no = get4byte(&p
23530 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66  Cell[info.iOverf
23540 6c 6f 77 5d 29 3b 0a 20 20 61 73 73 65 72 74 28  low]);.  assert(
23550 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
23560 20 3e 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61   > 4 );.  ovflPa
23570 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  geSize = pBt->us
23580 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20  ableSize - 4;.  
23590 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50  nOvfl = (info.nP
235a0 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c  ayload - info.nL
235b0 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53  ocal + ovflPageS
235c0 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67  ize - 1)/ovflPag
235d0 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28  eSize;.  assert(
235e0 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20   ovflPgno==0 || 
235f0 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69  nOvfl>0 );.  whi
23600 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20  le( nOvfl-- ){. 
23610 20 20 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20     Pgno iNext = 
23620 30 3b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a  0;.    MemPage *
23630 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69  pOvfl = 0;.    i
23640 66 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c  f( ovflPgno==0 |
23650 7c 20 6f 76 66 6c 50 67 6e 6f 3e 70 61 67 65 72  | ovflPgno>pager
23660 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29  Pagecount(pBt) )
23670 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
23680 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
23690 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  PT;.    }.    if
236a0 28 20 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20  ( nOvfl ){.     
236b0 20 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f   rc = getOverflo
236c0 77 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50  wPage(pBt, ovflP
236d0 67 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e  gno, &pOvfl, &iN
236e0 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ext);.      if( 
236f0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
23700 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 66      }.    rc = f
23710 72 65 65 50 61 67 65 32 28 70 42 74 2c 20 70 4f  reePage2(pBt, pO
23720 76 66 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a  vfl, ovflPgno);.
23730 20 20 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b      if( pOvfl ){
23740 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
23750 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e  gerUnref(pOvfl->
23760 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  pDbPage);.    }.
23770 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
23780 75 72 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c  urn rc;.    ovfl
23790 50 67 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20  Pgno = iNext;.  
237a0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
237b0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
237c0 72 65 61 74 65 20 74 68 65 20 62 79 74 65 20 73  reate the byte s
237d0 65 71 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20  equence used to 
237e0 72 65 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c  represent a cell
237f0 20 6f 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a   on page pPage.*
23800 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 61 74  * and write that
23810 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20 69   byte sequence i
23820 6e 74 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76  nto pCell[].  Ov
23830 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65  erflow pages are
23840 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e  .** allocated an
23850 64 20 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e  d filled in as n
23860 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 20 63  ecessary.  The c
23870 61 6c 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65  alling procedure
23880 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62  .** is responsib
23890 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75  le for making su
238a0 72 65 20 73 75 66 66 69 63 69 65 6e 74 20 73 70  re sufficient sp
238b0 61 63 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c  ace has been all
238c0 6f 63 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43  ocated.** for pC
238d0 65 6c 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  ell[]..**.** Not
238e0 65 20 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65  e that pCell doe
238f0 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20  s not necessary 
23900 6e 65 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f  need to point to
23910 20 74 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74   the pPage->aDat
23920 61 0a 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c  a.** area.  pCel
23930 6c 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  l might point to
23940 20 73 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20   some temporary 
23950 73 74 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65  storage.  The ce
23960 6c 6c 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f  ll will.** be co
23970 6e 73 74 72 75 63 74 65 64 20 69 6e 20 74 68 69  nstructed in thi
23980 73 20 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61  s temporary area
23990 20 74 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74   then copied int
239a0 6f 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a  o pPage->aData.*
239b0 2a 20 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  * later..*/.stat
239c0 69 63 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c  ic int fillInCel
239d0 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
239e0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  age,            
239f0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
23a00 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
23a10 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69  e cell */.  unsi
23a20 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c  gned char *pCell
23a30 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ,          /* Co
23a40 6d 70 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74  mplete text of t
23a50 68 65 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e  he cell */.  con
23a60 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69  st void *pKey, i
23a70 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54  64 nKey,    /* T
23a80 68 65 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73  he key */.  cons
23a90 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e  t void *pData,in
23aa0 74 20 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68  t nData,   /* Th
23ab0 65 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20  e data */.  int 
23ac0 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20  nZero,          
23ad0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
23ae0 74 72 61 20 7a 65 72 6f 20 62 79 74 65 73 20 74  tra zero bytes t
23af0 6f 20 61 70 70 65 6e 64 20 74 6f 20 70 44 61 74  o append to pDat
23b00 61 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69  a */.  int *pnSi
23b10 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
23b20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63        /* Write c
23b30 65 6c 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f  ell size here */
23b40 0a 29 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f  .){.  int nPaylo
23b50 61 64 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a  ad;.  const u8 *
23b60 70 53 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63  pSrc;.  int nSrc
23b70 2c 20 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73  , n, rc;.  int s
23b80 70 61 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50  paceLeft;.  MemP
23b90 61 67 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a  age *pOvfl = 0;.
23ba0 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65    MemPage *pToRe
23bb0 6c 65 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73  lease = 0;.  uns
23bc0 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69  igned char *pPri
23bd0 6f 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  or;.  unsigned c
23be0 68 61 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20  har *pPayload;. 
23bf0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
23c00 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50   pPage->pBt;.  P
23c10 67 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30  gno pgnoOvfl = 0
23c20 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b  ;.  int nHeader;
23c30 0a 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f  .  CellInfo info
23c40 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
23c50 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
23c60 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
23c70 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67  x) );..  /* pPag
23c80 65 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61  e is not necessa
23c90 72 69 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73  rily writeable s
23ca0 69 6e 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74  ince pCell might
23cb0 20 62 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20   be auxiliary.  
23cc0 2a 2a 20 62 75 66 66 65 72 20 73 70 61 63 65 20  ** buffer space 
23cd0 74 68 61 74 20 69 73 20 73 65 70 61 72 61 74 65  that is separate
23ce0 20 66 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20   from the pPage 
23cf0 62 75 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20  buffer area */. 
23d00 20 61 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70   assert( pCell<p
23d10 50 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70  Page->aData || p
23d20 43 65 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44  Cell>=&pPage->aD
23d30 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
23d40 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
23d50 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
23d60 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
23d70 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
23d80 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68  /* Fill in the h
23d90 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61  eader. */.  nHea
23da0 64 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 21  der = 0;.  if( !
23db0 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
23dc0 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b     nHeader += 4;
23dd0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
23de0 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20  ->hasData ){.   
23df0 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56   nHeader += putV
23e00 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65  arint(&pCell[nHe
23e10 61 64 65 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65  ader], nData+nZe
23e20 72 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ro);.  }else{.  
23e30 20 20 6e 44 61 74 61 20 3d 20 6e 5a 65 72 6f 20    nData = nZero 
23e40 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64  = 0;.  }.  nHead
23e50 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28  er += putVarint(
23e60 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c  &pCell[nHeader],
23e70 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a   *(u64*)&nKey);.
23e80 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
23e90 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
23ea0 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
23eb0 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
23ec0 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72  nHeader==nHeader
23ed0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e   );.  assert( in
23ee0 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b  fo.nKey==nKey );
23ef0 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e  .  assert( info.
23f00 6e 44 61 74 61 3d 3d 28 75 33 32 29 28 6e 44 61  nData==(u32)(nDa
23f10 74 61 2b 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a  ta+nZero) );.  .
23f20 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65    /* Fill in the
23f30 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50   payload */.  nP
23f40 61 79 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b  ayload = nData +
23f50 20 6e 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50   nZero;.  if( pP
23f60 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20  age->intKey ){. 
23f70 20 20 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b     pSrc = pData;
23f80 0a 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74  .    nSrc = nDat
23f90 61 3b 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30  a;.    nData = 0
23fa0 3b 0a 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20  ;.  }else{ .    
23fb0 69 66 28 20 6e 4b 65 79 3e 30 78 37 66 66 66 66  if( nKey>0x7ffff
23fc0 66 66 66 20 7c 7c 20 70 4b 65 79 3d 3d 30 20 29  fff || pKey==0 )
23fd0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
23fe0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
23ff0 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61     }.    nPayloa
24000 64 20 2b 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a  d += (int)nKey;.
24010 20 20 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b      pSrc = pKey;
24020 0a 20 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74  .    nSrc = (int
24030 29 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e  )nKey;.  }.  *pn
24040 53 69 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a  Size = info.nSiz
24050 65 3b 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d  e;.  spaceLeft =
24060 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20   info.nLocal;.  
24070 70 50 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c  pPayload = &pCel
24080 6c 5b 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70 50  l[nHeader];.  pP
24090 72 69 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e  rior = &pCell[in
240a0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a  fo.iOverflow];..
240b0 20 20 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61    while( nPayloa
240c0 64 3e 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73  d>0 ){.    if( s
240d0 70 61 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23  paceLeft==0 ){.#
240e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
240f0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
24100 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72      Pgno pgnoPtr
24110 6d 61 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20  map = pgnoOvfl; 
24120 2f 2a 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65  /* Overflow page
24130 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
24140 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20  ry page */.     
24150 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
24160 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20  cuum ){.        
24170 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67  do{.          pg
24180 6e 6f 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20  noOvfl++;.      
24190 20 20 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20    } while( .    
241a0 20 20 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50        PTRMAP_ISP
241b0 41 47 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66  AGE(pBt, pgnoOvf
241c0 6c 29 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d  l) || pgnoOvfl==
241d0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
241e0 45 28 70 42 74 29 20 0a 20 20 20 20 20 20 20 20  E(pBt) .        
241f0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
24200 66 0a 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c  f.      rc = all
24210 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
24220 42 74 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e  Bt, &pOvfl, &pgn
24230 6f 4f 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c  oOvfl, pgnoOvfl,
24240 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c   0);.#ifndef SQL
24250 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
24260 55 55 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  UUM.      /* If 
24270 74 68 65 20 64 61 74 61 62 61 73 65 20 73 75 70  the database sup
24280 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75  ports auto-vacuu
24290 6d 2c 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  m, and the secon
242a0 64 20 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a  d or subsequent.
242b0 20 20 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f        ** overflo
242c0 77 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  w page is being 
242d0 61 6c 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61  allocated, add a
242e0 6e 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70  n entry to the p
242f0 6f 69 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20  ointer-map.     
24300 20 2a 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67   ** for that pag
24310 65 20 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a  e now. .      **
24320 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69  .      ** If thi
24330 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 6f  s is the first o
24340 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68  verflow page, th
24350 65 6e 20 77 72 69 74 65 20 61 20 70 61 72 74 69  en write a parti
24360 61 6c 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20  al entry .      
24370 2a 2a 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65  ** to the pointe
24380 72 2d 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69  r-map. If we wri
24390 74 65 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68  te nothing to th
243a0 69 73 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73  is pointer-map s
243b0 6c 6f 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68  lot,.      ** th
243c0 65 6e 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69  en the optimisti
243d0 63 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e  c overflow chain
243e0 20 70 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63   processing in c
243f0 6c 65 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20  learCell().     
24400 20 2a 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72   ** may misinter
24410 70 72 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69  pret the uniniti
24420 61 6c 69 73 65 64 20 76 61 6c 75 65 73 20 61 6e  alised values an
24430 64 20 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20  d delete the.   
24440 20 20 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65     ** wrong page
24450 73 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  s from the datab
24460 61 73 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ase..      */.  
24470 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74      if( pBt->aut
24480 6f 56 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53  oVacuum && rc==S
24490 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
244a0 20 20 20 20 75 38 20 65 54 79 70 65 20 3d 20 28      u8 eType = (
244b0 70 67 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41  pgnoPtrmap?PTRMA
244c0 50 5f 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d  P_OVERFLOW2:PTRM
244d0 41 50 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20  AP_OVERFLOW1);. 
244e0 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
244f0 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f  apPut(pBt, pgnoO
24500 76 66 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f  vfl, eType, pgno
24510 50 74 72 6d 61 70 29 3b 0a 20 20 20 20 20 20 20  Ptrmap);.       
24520 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
24530 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
24540 28 70 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20  (pOvfl);.       
24550 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
24560 66 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  f.      if( rc )
24570 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  {.        releas
24580 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
24590 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
245a0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  n rc;.      }.. 
245b0 20 20 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65       /* If pToRe
245c0 6c 65 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72  lease is not zer
245d0 6f 20 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f  o than pPrior po
245e0 69 6e 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61  ints into the da
245f0 74 61 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a  ta area.      **
24600 20 6f 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20   of pToRelease. 
24610 20 4d 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65   Make sure pToRe
24620 6c 65 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77  lease is still w
24630 72 69 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20  riteable. */.   
24640 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 52 65     assert( pToRe
24650 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  lease==0 || sqli
24660 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
24670 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e  ble(pToRelease->
24680 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20  pDbPage) );..   
24690 20 20 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20     /* If pPrior 
246a0 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64  is part of the d
246b0 61 74 61 20 61 72 65 61 20 6f 66 20 70 50 61 67  ata area of pPag
246c0 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72  e, then make sur
246d0 65 20 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a  e pPage.      **
246e0 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
246f0 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73  ble */.      ass
24700 65 72 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67  ert( pPrior<pPag
24710 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69  e->aData || pPri
24720 6f 72 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  or>=&pPage->aDat
24730 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
24740 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
24750 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
24760 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
24770 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20  DbPage) );..    
24780 20 20 70 75 74 34 62 79 74 65 28 70 50 72 69 6f    put4byte(pPrio
24790 72 2c 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20  r, pgnoOvfl);.  
247a0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
247b0 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20  pToRelease);.   
247c0 20 20 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20     pToRelease = 
247d0 70 4f 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72  pOvfl;.      pPr
247e0 69 6f 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61  ior = pOvfl->aDa
247f0 74 61 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79  ta;.      put4by
24800 74 65 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20  te(pPrior, 0);. 
24810 20 20 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20       pPayload = 
24820 26 70 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d  &pOvfl->aData[4]
24830 3b 0a 20 20 20 20 20 20 73 70 61 63 65 4c 65 66  ;.      spaceLef
24840 74 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  t = pBt->usableS
24850 69 7a 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20  ize - 4;.    }. 
24860 20 20 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b     n = nPayload;
24870 0a 20 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65  .    if( n>space
24880 4c 65 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65  Left ) n = space
24890 4c 65 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  Left;..    /* If
248a0 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e   pToRelease is n
248b0 6f 74 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61  ot zero than pPa
248c0 79 6c 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74  yload points int
248d0 6f 20 74 68 65 20 64 61 74 61 20 61 72 65 61 0a  o the data area.
248e0 20 20 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c      ** of pToRel
248f0 65 61 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65  ease.  Make sure
24900 20 70 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73   pToRelease is s
24910 74 69 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20  till writeable. 
24920 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
24930 54 6f 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20  ToRelease==0 || 
24940 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
24950 69 74 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61  iteable(pToRelea
24960 73 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  se->pDbPage) );.
24970 0a 20 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c  .    /* If pPayl
24980 6f 61 64 20 69 73 20 70 61 72 74 20 6f 66 20 74  oad is part of t
24990 68 65 20 64 61 74 61 20 61 72 65 61 20 6f 66 20  he data area of 
249a0 70 50 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65  pPage, then make
249b0 20 73 75 72 65 20 70 50 61 67 65 0a 20 20 20 20   sure pPage.    
249c0 2a 2a 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74  ** is still writ
249d0 65 61 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73  eable */.    ass
249e0 65 72 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50  ert( pPayload<pP
249f0 61 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50  age->aData || pP
24a00 61 79 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e  ayload>=&pPage->
24a10 61 44 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53  aData[pBt->pageS
24a20 69 7a 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20  ize].           
24a30 20 7c 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72   || sqlite3Pager
24a40 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67  Iswriteable(pPag
24a50 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a  e->pDbPage) );..
24a60 20 20 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29      if( nSrc>0 )
24a70 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53  {.      if( n>nS
24a80 72 63 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20  rc ) n = nSrc;. 
24a90 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72       assert( pSr
24aa0 63 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70  c );.      memcp
24ab0 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63  y(pPayload, pSrc
24ac0 2c 20 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , n);.    }else{
24ad0 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
24ae0 61 79 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20  ayload, 0, n);. 
24af0 20 20 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61     }.    nPayloa
24b00 64 20 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79  d -= n;.    pPay
24b10 6c 6f 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70  load += n;.    p
24b20 53 72 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53  Src += n;.    nS
24b30 72 63 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61  rc -= n;.    spa
24b40 63 65 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20  ceLeft -= n;.   
24b50 20 69 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a   if( nSrc==0 ){.
24b60 20 20 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61        nSrc = nDa
24b70 74 61 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d  ta;.      pSrc =
24b80 20 70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20   pData;.    }.  
24b90 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65 28  }.  releasePage(
24ba0 70 54 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72  pToRelease);.  r
24bb0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
24bc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
24bd0 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66   the i-th cell f
24be0 72 6f 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73  rom pPage.  This
24bf0 20 72 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73   routine effects
24c00 20 70 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20   pPage only..** 
24c10 54 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74  The cell content
24c20 20 69 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72   is not freed or
24c30 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49   deallocated.  I
24c40 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  t is assumed tha
24c50 74 0a 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f  t.** the cell co
24c60 6e 74 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63  ntent has been c
24c70 6f 70 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20  opied someplace 
24c80 65 6c 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74  else.  This rout
24c90 69 6e 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f  ine just.** remo
24ca0 76 65 73 20 74 68 65 20 72 65 66 65 72 65 6e 63  ves the referenc
24cb0 65 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72  e to the cell fr
24cc0 6f 6d 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  om pPage..**.** 
24cd0 22 73 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65  "sz" must be the
24ce0 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
24cf0 20 69 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f   in the cell..*/
24d00 0a 73 74 61 74 69 63 20 69 6e 74 20 64 72 6f 70  .static int drop
24d10 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50  Cell(MemPage *pP
24d20 61 67 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e  age, int idx, in
24d30 74 20 73 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 20  t sz){.  int i; 
24d40 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
24d50 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   counter */.  in
24d60 74 20 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a  t pc;         /*
24d70 20 4f 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20   Offset to cell 
24d80 63 6f 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20  content of cell 
24d90 62 65 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f  being deleted */
24da0 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20  .  u8 *data;    
24db0 20 20 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61     /* pPage->aDa
24dc0 74 61 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b  ta */.  u8 *ptr;
24dd0 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
24de0 74 6f 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72  to move bytes ar
24df0 6f 75 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61  ound within data
24e00 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  [] */.  int rc; 
24e10 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
24e20 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
24e30 20 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20   assert( idx>=0 
24e40 26 26 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43  && idx<pPage->nC
24e50 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ell );.  assert(
24e60 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50   sz==cellSize(pP
24e70 61 67 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61  age, idx) );.  a
24e80 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
24e90 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
24ea0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
24eb0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
24ec0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
24ed0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
24ee0 29 20 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50  ) );.  data = pP
24ef0 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74  age->aData;.  pt
24f00 72 20 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d  r = &data[pPage-
24f10 3e 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a  >cellOffset + 2*
24f20 69 64 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74  idx];.  pc = get
24f30 32 62 79 74 65 28 70 74 72 29 3b 0a 20 20 69 66  2byte(ptr);.  if
24f40 28 20 28 70 63 3c 70 50 61 67 65 2d 3e 68 64 72  ( (pc<pPage->hdr
24f50 4f 66 66 73 65 74 2b 36 2b 28 70 50 61 67 65 2d  Offset+6+(pPage-
24f60 3e 6c 65 61 66 3f 30 3a 34 29 29 0a 20 20 20 20  >leaf?0:4)).    
24f70 20 7c 7c 20 28 70 63 2b 73 7a 3e 70 50 61 67 65   || (pc+sz>pPage
24f80 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
24f90 65 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  e) ){.    return
24fa0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
24fb0 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  BKPT;.  }.  rc =
24fc0 20 66 72 65 65 53 70 61 63 65 28 70 50 61 67 65   freeSpace(pPage
24fd0 2c 20 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28  , pc, sz);.  if(
24fe0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
24ff0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
25000 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 69 64 78  .  }.  for(i=idx
25010 2b 31 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65  +1; i<pPage->nCe
25020 6c 6c 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d 32 29  ll; i++, ptr+=2)
25030 7b 0a 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70  {.    ptr[0] = p
25040 74 72 5b 32 5d 3b 0a 20 20 20 20 70 74 72 5b 31  tr[2];.    ptr[1
25050 5d 20 3d 20 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a  ] = ptr[3];.  }.
25060 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d    pPage->nCell--
25070 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64 61  ;.  put2byte(&da
25080 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
25090 73 65 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e  set+3], pPage->n
250a0 43 65 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e  Cell);.  pPage->
250b0 6e 46 72 65 65 20 2b 3d 20 32 3b 0a 20 20 72 65  nFree += 2;.  re
250c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
250d0 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20  }../*.** Insert 
250e0 61 20 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50  a new cell on pP
250f0 61 67 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65  age at cell inde
25100 78 20 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f  x "i".  pCell po
25110 69 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63  ints to the.** c
25120 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65  ontent of the ce
25130 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ll..**.** If the
25140 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69   cell content wi
25150 6c 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61  ll fit on the pa
25160 67 65 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20  ge, then put it 
25170 74 68 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a  there.  If it.**
25180 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74   will not fit, t
25190 68 65 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  hen make a copy 
251a0 6f 66 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  of the cell cont
251b0 65 6e 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69  ent into pTemp i
251c0 66 0a 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f  f.** pTemp is no
251d0 74 20 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c  t null.  Regardl
251e0 65 73 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c  ess of pTemp, al
251f0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74  locate a new ent
25200 72 79 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e  ry.** in pPage->
25210 61 4f 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65  aOvfl[] and make
25220 20 69 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65   it point to the
25230 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65   cell content (e
25240 69 74 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d  ither.** in pTem
25250 70 20 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61  p or the origina
25260 6c 20 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73  l pCell) and als
25270 6f 20 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64  o record its ind
25280 65 78 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69  ex. .** Allocati
25290 6e 67 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69  ng a new entry i
252a0 6e 20 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d  n pPage->aCell[]
252b0 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a   implies that .*
252c0 2a 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  * pPage->nOverfl
252d0 6f 77 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65  ow is incremente
252e0 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69  d..**.** If nSki
252f0 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  p is non-zero, t
25300 68 65 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20  hen do not copy 
25310 74 68 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20  the first nSkip 
25320 62 79 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20  bytes of the.** 
25330 63 65 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72  cell. The caller
25340 20 77 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20   will overwrite 
25350 74 68 65 6d 20 61 66 74 65 72 20 74 68 69 73 20  them after this 
25360 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
25370 2e 20 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73  . If.** nSkip is
25380 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
25390 70 43 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f  pCell may not po
253a0 69 6e 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69  int to an invali
253b0 64 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  d memory locatio
253c0 6e 20 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c  n .** (but pCell
253d0 2b 6e 53 6b 69 70 20 69 73 20 61 6c 77 61 79 73  +nSkip is always
253e0 20 76 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74   valid)..*/.stat
253f0 69 63 20 69 6e 74 20 69 6e 73 65 72 74 43 65 6c  ic int insertCel
25400 6c 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  l(.  MemPage *pP
25410 61 67 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69  age,   /* Page i
25420 6e 74 6f 20 77 68 69 63 68 20 77 65 20 61 72 65  nto which we are
25430 20 63 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e   copying */.  in
25440 74 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20  t i,            
25450 2f 2a 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f  /* New cell beco
25460 6d 65 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c  mes the i-th cel
25470 6c 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  l of the page */
25480 0a 20 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20  .  u8 *pCell,   
25490 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20       /* Content 
254a0 6f 66 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20  of the new cell 
254b0 2a 2f 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20  */.  int sz,    
254c0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
254d0 6f 66 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43  of content in pC
254e0 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65  ell */.  u8 *pTe
254f0 6d 70 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65  mp,        /* Te
25500 6d 70 20 73 74 6f 72 61 67 65 20 73 70 61 63 65  mp storage space
25510 20 66 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e   for pCell, if n
25520 65 65 64 65 64 20 2a 2f 0a 20 20 75 38 20 6e 53  eeded */.  u8 nS
25530 6b 69 70 20 20 20 20 20 20 20 20 20 20 2f 2a 20  kip          /* 
25540 44 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65  Do not write the
25550 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74   first nSkip byt
25560 65 73 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a  es of the cell *
25570 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 64 78 3b 20  /.){.  int idx; 
25580 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72           /* Wher
25590 65 20 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63  e to write new c
255a0 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64  ell content in d
255b0 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a  ata[] */.  int j
255c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
255d0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
255e0 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20    int top;      
255f0 20 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74      /* First byt
25600 65 20 6f 66 20 63 6f 6e 74 65 6e 74 20 66 6f 72  e of content for
25610 20 61 6e 79 20 63 65 6c 6c 20 69 6e 20 64 61 74   any cell in dat
25620 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64  a[] */.  int end
25630 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ;          /* Fi
25640 72 73 74 20 62 79 74 65 20 70 61 73 74 20 74 68  rst byte past th
25650 65 20 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e  e last cell poin
25660 74 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ter in data[] */
25670 0a 20 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20  .  int ins;     
25680 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
25690 20 64 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65   data[] where ne
256a0 77 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69  w cell pointer i
256b0 73 20 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20  s inserted */.  
256c0 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20 20  int hdr;        
256d0 20 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f    /* Offset into
256e0 20 64 61 74 61 5b 5d 20 6f 66 20 74 68 65 20 70   data[] of the p
256f0 61 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  age header */.  
25700 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20  int cellOffset; 
25710 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
25720 66 69 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74  first cell point
25730 65 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a  er in data[] */.
25740 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
25750 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65      /* The conte
25760 6e 74 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20  nt of the whole 
25770 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74  page */.  u8 *pt
25780 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55  r;          /* U
25790 73 65 64 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69  sed for moving i
257a0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e  nformation aroun
257b0 64 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a  d in data[] */..
257c0 20 20 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26    assert( i>=0 &
257d0 26 20 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  & i<=pPage->nCel
257e0 6c 2b 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  l+pPage->nOverfl
257f0 6f 77 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ow );.  assert( 
25800 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58  pPage->nCell<=MX
25810 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74  _CELL(pPage->pBt
25820 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61  ) && MX_CELL(pPa
25830 67 65 2d 3e 70 42 74 29 3c 3d 35 34 36 30 20 29  ge->pBt)<=5460 )
25840 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
25850 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72  e->nOverflow<=Ar
25860 72 61 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61  raySize(pPage->a
25870 4f 76 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72  Ovfl) );.  asser
25880 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50  t( sz==cellSizeP
25890 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  tr(pPage, pCell)
258a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
258b0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
258c0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
258d0 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  ex) );.  if( pPa
258e0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c  ge->nOverflow ||
258f0 20 73 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72   sz+2>pPage->nFr
25900 65 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54  ee ){.    if( pT
25910 65 6d 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  emp ){.      mem
25920 63 70 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c  cpy(pTemp+nSkip,
25930 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a   pCell+nSkip, sz
25940 2d 6e 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 70  -nSkip);.      p
25950 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20  Cell = pTemp;.  
25960 20 20 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67    }.    j = pPag
25970 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a  e->nOverflow++;.
25980 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 28 69      assert( j<(i
25990 6e 74 29 28 73 69 7a 65 6f 66 28 70 50 61 67 65  nt)(sizeof(pPage
259a0 2d 3e 61 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28  ->aOvfl)/sizeof(
259b0 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29  pPage->aOvfl[0])
259c0 29 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  ) );.    pPage->
259d0 61 4f 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d  aOvfl[j].pCell =
259e0 20 70 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67   pCell;.    pPag
259f0 65 2d 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20  e->aOvfl[j].idx 
25a00 3d 20 28 75 31 36 29 69 3b 0a 20 20 20 20 70 50  = (u16)i;.    pP
25a10 61 67 65 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a  age->nFree = 0;.
25a20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
25a30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
25a40 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
25a50 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
25a60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
25a70 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
25a80 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  c;.    }.    ass
25a90 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
25aa0 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
25ab0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
25ac0 20 20 20 20 64 61 74 61 20 3d 20 70 50 61 67 65      data = pPage
25ad0 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 68 64 72  ->aData;.    hdr
25ae0 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
25af0 73 65 74 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67  set;.    top = g
25b00 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
25b10 72 2b 35 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 4f  r+5]);.    cellO
25b20 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63  ffset = pPage->c
25b30 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65  ellOffset;.    e
25b40 6e 64 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20  nd = cellOffset 
25b50 2b 20 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  + 2*pPage->nCell
25b60 20 2b 20 32 3b 0a 20 20 20 20 69 6e 73 20 3d 20   + 2;.    ins = 
25b70 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69  cellOffset + 2*i
25b80 3b 0a 20 20 20 20 69 66 28 20 65 6e 64 20 3e 20  ;.    if( end > 
25b90 74 6f 70 20 2d 20 73 7a 20 29 7b 0a 20 20 20 20  top - sz ){.    
25ba0 20 20 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e    rc = defragmen
25bb0 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  tPage(pPage);.  
25bc0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
25bd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
25be0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
25bf0 20 20 7d 0a 20 20 20 20 20 20 74 6f 70 20 3d 20    }.      top = 
25c00 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
25c10 64 72 2b 35 5d 29 3b 0a 20 20 20 20 20 20 61 73  dr+5]);.      as
25c20 73 65 72 74 28 20 65 6e 64 20 2b 20 73 7a 20 3c  sert( end + sz <
25c30 3d 20 74 6f 70 20 29 3b 0a 20 20 20 20 7d 0a 20  = top );.    }. 
25c40 20 20 20 69 64 78 20 3d 20 61 6c 6c 6f 63 61 74     idx = allocat
25c50 65 53 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a  eSpace(pPage, sz
25c60 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  );.    assert( i
25c70 64 78 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  dx>0 );.    asse
25c80 72 74 28 20 65 6e 64 20 3c 3d 20 67 65 74 32 62  rt( end <= get2b
25c90 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d  yte(&data[hdr+5]
25ca0 29 20 29 3b 0a 20 20 20 20 69 66 20 28 69 64 78  ) );.    if (idx
25cb0 2b 73 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74  +sz > pPage->pBt
25cc0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 20 7b 0a  ->usableSize) {.
25cd0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
25ce0 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
25cf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
25d00 65 2d 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20  e->nCell++;.    
25d10 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20  pPage->nFree -= 
25d20 32 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  2;.    memcpy(&d
25d30 61 74 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20  ata[idx+nSkip], 
25d40 70 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d  pCell+nSkip, sz-
25d50 6e 53 6b 69 70 29 3b 0a 20 20 20 20 66 6f 72 28  nSkip);.    for(
25d60 6a 3d 65 6e 64 2d 32 2c 20 70 74 72 3d 26 64 61  j=end-2, ptr=&da
25d70 74 61 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d  ta[j]; j>ins; j-
25d80 3d 32 2c 20 70 74 72 2d 3d 32 29 7b 0a 20 20 20  =2, ptr-=2){.   
25d90 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b     ptr[0] = ptr[
25da0 2d 32 5d 3b 0a 20 20 20 20 20 20 70 74 72 5b 31  -2];.      ptr[1
25db0 5d 20 3d 20 70 74 72 5b 2d 31 5d 3b 0a 20 20 20  ] = ptr[-1];.   
25dc0 20 7d 0a 20 20 20 20 70 75 74 32 62 79 74 65 28   }.    put2byte(
25dd0 26 64 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29  &data[ins], idx)
25de0 3b 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26  ;.    put2byte(&
25df0 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61  data[hdr+3], pPa
25e00 67 65 2d 3e 6e 43 65 6c 6c 29 3b 0a 23 69 66 6e  ge->nCell);.#ifn
25e10 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
25e20 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
25e30 66 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61  f( pPage->pBt->a
25e40 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
25e50 20 20 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d     /* The cell m
25e60 61 79 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69  ay contain a poi
25e70 6e 74 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66  nter to an overf
25e80 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c  low page. If so,
25e90 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20   write.      ** 
25ea0 74 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68  the entry for th
25eb0 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20  e overflow page 
25ec0 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72  into the pointer
25ed0 20 6d 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   map..      */. 
25ee0 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e       CellInfo in
25ef0 66 6f 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  fo;.      sqlite
25f00 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
25f10 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
25f20 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 61   &info);.      a
25f30 73 73 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61  ssert( (info.nDa
25f40 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ta+(pPage->intKe
25f50 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d  y?0:info.nKey))=
25f60 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29  =info.nPayload )
25f70 3b 0a 20 20 20 20 20 20 69 66 28 20 28 69 6e 66  ;.      if( (inf
25f80 6f 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e  o.nData+(pPage->
25f90 69 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b  intKey?0:info.nK
25fa0 65 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  ey))>info.nLocal
25fb0 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   ){.        Pgno
25fc0 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34   pgnoOvfl = get4
25fd0 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f  byte(&pCell[info
25fe0 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20  .iOverflow]);.  
25ff0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
26000 70 50 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c  pPut(pPage->pBt,
26010 20 70 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41   pgnoOvfl, PTRMA
26020 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61  P_OVERFLOW1, pPa
26030 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  ge->pgno);.     
26040 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
26050 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
26060 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
26070 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65  #endif.  }..  re
26080 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
26090 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c  }../*.** Add a l
260a0 69 73 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20  ist of cells to 
260b0 61 20 70 61 67 65 2e 20 20 54 68 65 20 70 61 67  a page.  The pag
260c0 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74  e should be init
260d0 69 61 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20  ially empty..** 
260e0 54 68 65 20 63 65 6c 6c 73 20 61 72 65 20 67 75  The cells are gu
260f0 61 72 61 6e 74 65 65 64 20 74 6f 20 66 69 74 20  aranteed to fit 
26100 6f 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a  on the page..*/.
26110 73 74 61 74 69 63 20 76 6f 69 64 20 61 73 73 65  static void asse
26120 6d 62 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d 50  mblePage(.  MemP
26130 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a  age *pPage,   /*
26140 20 54 68 65 20 70 61 67 65 20 74 6f 20 62 65 20   The page to be 
26150 61 73 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20  assemblied */.  
26160 69 6e 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20  int nCell,      
26170 20 20 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20    /* The number 
26180 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20  of cells to add 
26190 74 6f 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  to this page */.
261a0 20 20 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20    u8 **apCell,  
261b0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20      /* Pointers 
261c0 74 6f 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a  to cell bodies *
261d0 2f 0a 20 20 75 31 36 20 2a 61 53 69 7a 65 20 20  /.  u16 *aSize  
261e0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f        /* Sizes o
261f0 66 20 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29  f the cells */.)
26200 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  {.  int i;      
26210 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
26220 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74  unter */.  int t
26230 6f 74 61 6c 53 69 7a 65 3b 20 20 20 20 2f 2a 20  otalSize;    /* 
26240 54 6f 74 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c  Total size of al
26250 6c 20 63 65 6c 6c 73 20 2a 2f 0a 20 20 69 6e 74  l cells */.  int
26260 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20 2f   hdr;          /
26270 2a 20 49 6e 64 65 78 20 6f 66 20 70 61 67 65 20  * Index of page 
26280 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20  header */.  int 
26290 63 65 6c 6c 70 74 72 3b 20 20 20 20 20 20 2f 2a  cellptr;      /*
262a0 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74   Address of next
262b0 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f   cell pointer */
262c0 0a 20 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b  .  int cellbody;
262d0 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
262e0 6f 66 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64  of next cell bod
262f0 79 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b  y */.  u8 *data;
26300 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
26310 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f   for the page */
26320 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
26330 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20  e->nOverflow==0 
26340 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
26350 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
26360 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
26370 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
26380 6e 43 65 6c 6c 3e 3d 30 20 26 26 20 6e 43 65 6c  nCell>=0 && nCel
26390 6c 3c 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  l<=MX_CELL(pPage
263a0 2d 3e 70 42 74 29 20 26 26 20 4d 58 5f 43 45 4c  ->pBt) && MX_CEL
263b0 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 35  L(pPage->pBt)<=5
263c0 34 36 30 20 29 3b 0a 20 20 74 6f 74 61 6c 53 69  460 );.  totalSi
263d0 7a 65 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d  ze = 0;.  for(i=
263e0 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29  0; i<nCell; i++)
263f0 7b 0a 20 20 20 20 74 6f 74 61 6c 53 69 7a 65 20  {.    totalSize 
26400 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 7d  += aSize[i];.  }
26410 0a 20 20 61 73 73 65 72 74 28 20 74 6f 74 61 6c  .  assert( total
26420 53 69 7a 65 2b 32 2a 6e 43 65 6c 6c 3c 3d 70 50  Size+2*nCell<=pP
26430 61 67 65 2d 3e 6e 46 72 65 65 20 29 3b 0a 20 20  age->nFree );.  
26440 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e  assert( pPage->n
26450 43 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73  Cell==0 );.  ass
26460 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
26470 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
26480 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
26490 20 20 63 65 6c 6c 70 74 72 20 3d 20 70 50 61 67    cellptr = pPag
264a0 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20  e->cellOffset;. 
264b0 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61   data = pPage->a
264c0 44 61 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50  Data;.  hdr = pP
264d0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a  age->hdrOffset;.
264e0 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
264f0 5b 68 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b  [hdr+3], nCell);
26500 0a 20 20 69 66 28 20 6e 43 65 6c 6c 20 29 7b 0a  .  if( nCell ){.
26510 20 20 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20 61      cellbody = a
26520 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 70 50 61  llocateSpace(pPa
26530 67 65 2c 20 74 6f 74 61 6c 53 69 7a 65 29 3b 0a  ge, totalSize);.
26540 20 20 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c      assert( cell
26550 62 6f 64 79 3e 30 20 29 3b 0a 20 20 20 20 61 73  body>0 );.    as
26560 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72  sert( pPage->nFr
26570 65 65 20 3e 3d 20 32 2a 6e 43 65 6c 6c 20 29 3b  ee >= 2*nCell );
26580 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  .    pPage->nFre
26590 65 20 2d 3d 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20  e -= 2*nCell;.  
265a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65    for(i=0; i<nCe
265b0 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ll; i++){.      
265c0 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 63  put2byte(&data[c
265d0 65 6c 6c 70 74 72 5d 2c 20 63 65 6c 6c 62 6f 64  ellptr], cellbod
265e0 79 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79  y);.      memcpy
265f0 28 26 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d  (&data[cellbody]
26600 2c 20 61 70 43 65 6c 6c 5b 69 5d 2c 20 61 53 69  , apCell[i], aSi
26610 7a 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20 63 65  ze[i]);.      ce
26620 6c 6c 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20  llptr += 2;.    
26630 20 20 63 65 6c 6c 62 6f 64 79 20 2b 3d 20 61 53    cellbody += aS
26640 69 7a 65 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20  ize[i];.    }.  
26650 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c 62 6f    assert( cellbo
26660 64 79 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e  dy==pPage->pBt->
26670 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20  usableSize );.  
26680 7d 0a 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  }.  pPage->nCell
26690 20 3d 20 28 75 31 36 29 6e 43 65 6c 6c 3b 0a 7d   = (u16)nCell;.}
266a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
266b0 6f 77 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73  owing parameters
266c0 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d   determine how m
266d0 61 6e 79 20 61 64 6a 61 63 65 6e 74 20 70 61 67  any adjacent pag
266e0 65 73 20 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a  es get involved.
266f0 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e  ** in a balancin
26700 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e  g operation.  NN
26710 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
26720 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65  f neighbors on e
26730 69 74 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66  ither side.** of
26740 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 70   the page that p
26750 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68  articipate in th
26760 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72  e balancing oper
26770 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68  ation.  NB is th
26780 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65  e.** total numbe
26790 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  r of pages that 
267a0 70 61 72 74 69 63 69 70 61 74 65 2c 20 69 6e 63  participate, inc
267b0 6c 75 64 69 6e 67 20 74 68 65 20 74 61 72 67 65  luding the targe
267c0 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e  t page and.** NN
267d0 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
267e0 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a  ther side..**.**
267f0 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c   The minimum val
26800 75 65 20 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f  ue of NN is 1 (o
26810 66 20 63 6f 75 72 73 65 29 2e 20 20 49 6e 63 72  f course).  Incr
26820 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20  easing NN above 
26830 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33 29  1.** (to 2 or 3)
26840 20 67 69 76 65 73 20 61 20 6d 6f 64 65 73 74 20   gives a modest 
26850 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53  improvement in S
26860 45 4c 45 43 54 20 61 6e 64 20 44 45 4c 45 54 45  ELECT and DELETE
26870 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20   performance.** 
26880 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72 20  in exchange for 
26890 61 20 6c 61 72 67 65 72 20 64 65 67 72 61 64 61  a larger degrada
268a0 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20 61  tion in INSERT a
268b0 6e 64 20 55 50 44 41 54 45 20 70 65 72 66 6f 72  nd UPDATE perfor
268c0 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61  mance..** The va
268d0 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70 65 61 72  lue of NN appear
268e0 73 20 74 6f 20 67 69 76 65 20 74 68 65 20 62 65  s to give the be
268f0 73 74 20 72 65 73 75 6c 74 73 20 6f 76 65 72 61  st results overa
26900 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  ll..*/.#define N
26910 4e 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20  N 1             
26920 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69  /* Number of nei
26930 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72  ghbors on either
26940 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 20 2a   side of pPage *
26950 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e  /.#define NB (NN
26960 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a 20 54 6f  *2+1)      /* To
26970 74 61 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c 76  tal pages involv
26980 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63  ed in the balanc
26990 65 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  e */../* Forward
269a0 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
269b0 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
269c0 28 42 74 43 75 72 73 6f 72 2a 2c 20 69 6e 74 29  (BtCursor*, int)
269d0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
269e0 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
269f0 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76  NCE./*.** This v
26a00 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63  ersion of balanc
26a10 65 28 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20  e() handles the 
26a20 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63  common special c
26a30 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e  ase where.** a n
26a40 65 77 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e  ew entry is bein
26a50 67 20 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68  g inserted on th
26a60 65 20 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d  e extreme right-
26a70 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72  end of the.** tr
26a80 65 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72  ee, in other wor
26a90 64 73 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77  ds, when the new
26aa0 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f   entry will beco
26ab0 6d 65 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a  me the largest.*
26ac0 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  * entry in the t
26ad0 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65  ree..**.** Inste
26ae0 61 64 20 6f 66 20 74 72 79 69 6e 67 20 62 61 6c  ad of trying bal
26af0 61 6e 63 65 20 74 68 65 20 33 20 72 69 67 68 74  ance the 3 right
26b00 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73  -most leaf pages
26b10 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20  , just add.** a 
26b20 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 20  new page to the 
26b30 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
26b40 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20  and put the one 
26b50 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20  new entry in.** 
26b60 74 68 61 74 20 70 61 67 65 2e 20 20 54 68 69 73  that page.  This
26b70 20 6c 65 61 76 65 73 20 74 68 65 20 72 69 67 68   leaves the righ
26b80 74 20 73 69 64 65 20 6f 66 20 74 68 65 20 74 72  t side of the tr
26b90 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75  ee somewhat.** u
26ba0 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20  nbalanced.  But 
26bb0 6f 64 64 73 20 61 72 65 20 74 68 61 74 20 77 65  odds are that we
26bc0 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69   will be inserti
26bd0 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a  ng new entries.*
26be0 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f  * at the end soo
26bf0 6e 20 61 66 74 65 72 77 61 72 64 73 20 73 6f 20  n afterwards so 
26c00 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79  the nearly empty
26c10 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b   page will quick
26c20 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20  ly.** fill up.  
26c30 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a  On average..**.*
26c40 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20 6c  * pPage is the l
26c50 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20 69  eaf page which i
26c60 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
26c70 20 70 61 67 65 20 69 6e 20 74 68 65 20 74 72 65   page in the tre
26c80 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73  e..** pParent is
26c90 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50   its parent.  pP
26ca0 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 20  age must have a 
26cb0 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20  single overflow 
26cc0 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69  entry.** which i
26cd0 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74  s also the right
26ce0 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74  -most entry on t
26cf0 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
26d00 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71  ic int balance_q
26d10 75 69 63 6b 28 42 74 43 75 72 73 6f 72 20 2a 70  uick(BtCursor *p
26d20 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Cur){.  int rc;.
26d30 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20    MemPage *pNew 
26d40 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  = 0;.  Pgno pgno
26d50 4e 65 77 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c  New;.  u8 *pCell
26d60 3b 0a 20 20 75 31 36 20 73 7a 43 65 6c 6c 3b 0a  ;.  u16 szCell;.
26d70 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
26d80 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
26d90 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
26da0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
26db0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
26dc0 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  t = pCur->apPage
26dd0 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 3b  [pCur->iPage-1];
26de0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
26df0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
26e00 20 69 6e 74 20 70 61 72 65 6e 74 49 64 78 20 3d   int parentIdx =
26e10 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b   pParent->nCell;
26e20 20 20 20 2f 2a 20 70 50 61 72 65 6e 74 20 6e 65     /* pParent ne
26e30 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  w divider cell i
26e40 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 70 61  ndex */.  int pa
26e50 72 65 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20  rentSize;       
26e60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
26e70 69 7a 65 20 6f 66 20 6e 65 77 20 64 69 76 69 64  ize of new divid
26e80 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  er cell */.  u8 
26e90 70 61 72 65 6e 74 43 65 6c 6c 5b 36 34 5d 3b 20  parentCell[64]; 
26ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
26eb0 2a 20 53 70 61 63 65 20 66 6f 72 20 74 68 65 20  * Space for the 
26ec0 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c  new divider cell
26ed0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
26ee0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
26ef0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
26f00 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c  tex) );..  /* Al
26f10 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
26f20 65 2e 20 49 6e 73 65 72 74 20 74 68 65 20 6f 76  e. Insert the ov
26f30 65 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d  erflow cell from
26f40 20 70 50 61 67 65 0a 20 20 2a 2a 20 69 6e 74 6f   pPage.  ** into
26f50 20 69 74 2e 20 54 68 65 6e 20 72 65 6d 6f 76 65   it. Then remove
26f60 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
26f70 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 20  ll from pPage.. 
26f80 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63   */.  rc = alloc
26f90 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
26fa0 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65  , &pNew, &pgnoNe
26fb0 77 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  w, 0, 0);.  if( 
26fc0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
26fd0 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 50 61  .    pCell = pPa
26fe0 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65  ge->aOvfl[0].pCe
26ff0 6c 6c 3b 0a 20 20 20 20 73 7a 43 65 6c 6c 20 3d  ll;.    szCell =
27000 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
27010 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  ge, pCell);.    
27020 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
27030 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
27040 70 4e 65 77 2d 3e 70 44 62 50 61 67 65 29 20 29  pNew->pDbPage) )
27050 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70  ;.    zeroPage(p
27060 4e 65 77 2c 20 70 50 61 67 65 2d 3e 61 44 61 74  New, pPage->aDat
27070 61 5b 30 5d 29 3b 0a 20 20 20 20 61 73 73 65 6d  a[0]);.    assem
27080 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 31 2c  blePage(pNew, 1,
27090 20 26 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c   &pCell, &szCell
270a0 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f  );.    pPage->nO
270b0 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 0a  verflow = 0;.  .
270c0 20 20 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20      /* pPage is 
270d0 63 75 72 72 65 6e 74 6c 79 20 74 68 65 20 72 69  currently the ri
270e0 67 68 74 2d 63 68 69 6c 64 20 6f 66 20 70 50 61  ght-child of pPa
270f0 72 65 6e 74 2e 20 43 68 61 6e 67 65 20 74 68 69  rent. Change thi
27100 73 0a 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74  s.    ** so that
27110 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64   the right-child
27120 20 69 73 20 74 68 65 20 6e 65 77 20 70 61 67 65   is the new page
27130 20 61 6c 6c 6f 63 61 74 65 64 20 61 62 6f 76 65   allocated above
27140 20 61 6e 64 0a 20 20 20 20 2a 2a 20 70 50 61 67   and.    ** pPag
27150 65 20 69 73 20 74 68 65 20 6e 65 78 74 2d 74 6f  e is the next-to
27160 2d 72 69 67 68 74 20 63 68 69 6c 64 2e 20 0a 20  -right child. . 
27170 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 67 6e     **.    ** Ign
27180 6f 72 65 20 74 68 65 20 72 65 74 75 72 6e 20 76  ore the return v
27190 61 6c 75 65 20 6f 66 20 74 68 65 20 63 61 6c 6c  alue of the call
271a0 20 74 6f 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29   to fillInCell()
271b0 2e 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 0a 20  . fillInCell(). 
271c0 20 20 20 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 72     ** may only r
271d0 65 74 75 72 6e 20 6f 74 68 65 72 20 74 68 61 6e  eturn other than
271e0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 69 74   SQLITE_OK if it
271f0 20 69 73 20 72 65 71 75 69 72 65 64 20 74 6f 20   is required to 
27200 61 6c 6c 6f 63 61 74 65 0a 20 20 20 20 2a 2a 20  allocate.    ** 
27210 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72  one or more over
27220 66 6c 6f 77 20 70 61 67 65 73 2e 20 53 69 6e 63  flow pages. Sinc
27230 65 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74 61  e an internal ta
27240 62 6c 65 20 42 2d 54 72 65 65 20 63 65 6c 6c 20  ble B-Tree cell 
27250 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 65 76 65  .    ** may neve
27260 72 20 73 70 69 6c 6c 20 6f 76 65 72 20 6f 6e 74  r spill over ont
27270 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  o an overflow pa
27280 67 65 20 28 69 74 20 69 73 20 61 20 6d 61 78 69  ge (it is a maxi
27290 6d 75 6d 20 6f 66 20 0a 20 20 20 20 2a 2a 20 31  mum of .    ** 1
272a0 33 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 29  3 bytes in size)
272b0 2c 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 63  , it is not necc
272c0 65 73 73 61 72 79 20 74 6f 20 63 68 65 63 6b 20  essary to check 
272d0 74 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2e  the return code.
272e0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53  .    **.    ** S
272f0 69 6d 69 6c 61 72 6c 79 2c 20 74 68 65 20 69 6e  imilarly, the in
27300 73 65 72 74 43 65 6c 6c 28 29 20 66 75 6e 63 74  sertCell() funct
27310 69 6f 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20  ion cannot fail 
27320 69 66 20 74 68 65 20 70 61 67 65 0a 20 20 20 20  if the page.    
27330 2a 2a 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65  ** being inserte
27340 64 20 69 6e 74 6f 20 69 73 20 61 6c 72 65 61 64  d into is alread
27350 79 20 77 72 69 74 61 62 6c 65 20 61 6e 64 20 74  y writable and t
27360 68 65 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74  he cell does not
27370 20 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e   .    ** contain
27380 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 6f 69   an overflow poi
27390 6e 74 65 72 2e 20 53 6f 20 69 67 6e 6f 72 65 20  nter. So ignore 
273a0 74 68 69 73 20 72 65 74 75 72 6e 20 63 6f 64 65  this return code
273b0 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   too..    */.   
273c0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
273d0 6e 43 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 70  nCell>0 );.    p
273e0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
273f0 70 50 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43  pPage, pPage->nC
27400 65 6c 6c 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69  ell-1);.    sqli
27410 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
27420 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c  lPtr(pPage, pCel
27430 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 66  l, &info);.    f
27440 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e  illInCell(pParen
27450 74 2c 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20 30  t, parentCell, 0
27460 2c 20 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20  , info.nKey, 0, 
27470 30 2c 20 30 2c 20 26 70 61 72 65 6e 74 53 69 7a  0, 0, &parentSiz
27480 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
27490 70 61 72 65 6e 74 53 69 7a 65 3c 36 34 20 29 3b  parentSize<64 );
274a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
274b0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
274c0 61 62 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44  able(pParent->pD
274d0 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 69 6e  bPage) );.    in
274e0 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74  sertCell(pParent
274f0 2c 20 70 61 72 65 6e 74 49 64 78 2c 20 70 61 72  , parentIdx, par
27500 65 6e 74 43 65 6c 6c 2c 20 70 61 72 65 6e 74 53  entCell, parentS
27510 69 7a 65 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20  ize, 0, 4);.    
27520 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65  put4byte(findOve
27530 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e  rflowCell(pParen
27540 74 2c 70 61 72 65 6e 74 49 64 78 29 2c 20 70 50  t,parentIdx), pP
27550 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  age->pgno);.    
27560 70 75 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  put4byte(&pParen
27570 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
27580 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20  ->hdrOffset+8], 
27590 70 67 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20  pgnoNew);.  .   
275a0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
275b0 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
275c0 74 61 62 61 73 65 2c 20 75 70 64 61 74 65 20 74  tabase, update t
275d0 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20  he pointer map. 
275e0 20 20 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69     ** with entri
275f0 65 73 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70  es for the new p
27600 61 67 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69  age, and any poi
27610 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20  nter from the . 
27620 20 20 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68     ** cell on th
27630 65 20 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65  e page to an ove
27640 72 66 6c 6f 77 20 70 61 67 65 2e 0a 20 20 20 20  rflow page..    
27650 2a 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55 54  */.    if( ISAUT
27660 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
27670 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
27680 70 42 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54  pBt, pgnoNew, PT
27690 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72  RMAP_BTREE, pPar
276a0 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  ent->pgno);.    
276b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
276c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
276d0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66  c = ptrmapPutOvf
276e0 6c 28 70 4e 65 77 2c 20 30 29 3b 0a 20 20 20 20  l(pNew, 0);.    
276f0 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
27700 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 72 65  * Release the re
27710 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e  ference to the n
27720 65 77 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20  ew page. */.    
27730 72 65 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77  releasePage(pNew
27740 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20  );.  }..  /* At 
27750 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70  this point the p
27760 50 61 67 65 2d 3e 6e 46 72 65 65 20 76 61 72 69  Page->nFree vari
27770 61 62 6c 65 20 69 73 20 6e 6f 74 20 73 65 74 20  able is not set 
27780 63 6f 72 72 65 63 74 6c 79 20 77 69 74 68 0a 20  correctly with. 
27790 20 2a 2a 20 72 65 73 70 65 63 74 20 74 6f 20 74   ** respect to t
277a0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
277b0 65 20 70 61 67 65 20 28 62 65 63 61 75 73 65 20  e page (because 
277c0 69 74 20 77 61 73 20 73 65 74 20 74 6f 20 30 20  it was set to 0 
277d0 62 79 20 0a 20 20 2a 2a 20 69 6e 73 65 72 74 43  by .  ** insertC
277e0 65 6c 6c 29 2e 20 53 6f 20 63 61 6c 6c 20 73 71  ell). So call sq
277f0 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
27800 67 65 28 29 20 74 6f 20 6d 61 6b 65 20 73 75 72  ge() to make sur
27810 65 20 69 74 20 69 73 0a 20 20 2a 2a 20 63 6f 72  e it is.  ** cor
27820 72 65 63 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  rect..  **.  ** 
27830 54 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 64  This has to be d
27840 6f 6e 65 20 65 76 65 6e 20 69 66 20 61 6e 20 65  one even if an e
27850 72 72 6f 72 20 77 69 6c 6c 20 62 65 20 72 65 74  rror will be ret
27860 75 72 6e 65 64 2e 20 4e 6f 72 6d 61 6c 6c 79 2c  urned. Normally,
27870 20 69 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f   if.  ** an erro
27880 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20  r occurs during 
27890 74 72 65 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20  tree balancing, 
278a0 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
278b0 4d 65 6d 50 61 67 65 20 61 72 65 0a 20 20 2a 2a  MemPage are.  **
278c0 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74 2c 20   not important, 
278d0 61 73 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20  as they will be 
278e0 72 65 63 61 6c 63 75 6c 61 74 65 64 20 77 68 65  recalculated whe
278f0 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 72 6f  n the page is ro
27900 6c 6c 65 64 0a 20 20 2a 2a 20 62 61 63 6b 2e 20  lled.  ** back. 
27910 42 75 74 20 68 65 72 65 2c 20 69 6e 20 62 61 6c  But here, in bal
27920 61 6e 63 65 5f 71 75 69 63 6b 28 29 2c 20 69 74  ance_quick(), it
27930 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61   is possible tha
27940 74 20 70 50 61 67 65 20 68 61 73 20 0a 20 20 2a  t pPage has .  *
27950 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6d  * not yet been m
27960 61 72 6b 65 64 20 64 69 72 74 79 20 6f 72 20 77  arked dirty or w
27970 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
27980 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
27990 65 72 65 66 6f 72 65 0a 20 20 2a 2a 20 69 74 20  erefore.  ** it 
279a0 77 69 6c 6c 20 6e 6f 74 20 62 65 20 72 6f 6c 6c  will not be roll
279b0 65 64 20 62 61 63 6b 20 61 6e 64 20 73 6f 20 69  ed back and so i
279c0 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74  t is important t
279d0 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
279e0 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 64  .  ** the page d
279f0 61 74 61 20 61 6e 64 20 63 6f 6e 74 65 6e 74 73  ata and contents
27a00 20 6f 66 20 4d 65 6d 50 61 67 65 20 61 72 65 20   of MemPage are 
27a10 63 6f 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2f  consistent..  */
27a20 0a 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  .  pPage->isInit
27a30 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42   = 0;.  sqlite3B
27a40 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
27a50 67 65 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge);.  assert( p
27a60 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
27a70 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 65  =0 );..  /* If e
27a80 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65 20 73  verything else s
27a90 75 63 63 65 65 64 65 64 2c 20 62 61 6c 61 6e 63  ucceeded, balanc
27aa0 65 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67  e the parent pag
27ab0 65 2c 20 69 6e 20 0a 20 20 2a 2a 20 63 61 73 65  e, in .  ** case
27ac0 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65 6c   the divider cel
27ad0 6c 20 69 6e 73 65 72 74 65 64 20 63 61 75 73 65  l inserted cause
27ae0 64 20 69 74 20 74 6f 20 62 65 63 6f 6d 65 20 6f  d it to become o
27af0 76 65 72 66 75 6c 6c 2e 0a 20 20 2a 2f 0a 20 20  verfull..  */.  
27b00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
27b10 4b 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  K ){.    release
27b20 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
27b30 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a   pCur->iPage--;.
27b40 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
27b50 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 7d 0a 20  (pCur, 0);.  }. 
27b60 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
27b70 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
27b80 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45  MIT_QUICKBALANCE
27b90 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   */../*.** This 
27ba0 72 6f 75 74 69 6e 65 20 72 65 64 69 73 74 72 69  routine redistri
27bb0 62 75 74 65 73 20 43 65 6c 6c 73 20 6f 6e 20 70  butes Cells on p
27bc0 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e  Page and up to N
27bd0 4e 2a 32 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20  N*2 siblings.** 
27be0 6f 66 20 70 50 61 67 65 20 73 6f 20 74 68 61 74  of pPage so that
27bf0 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20   all pages have 
27c00 61 62 6f 75 74 20 74 68 65 20 73 61 6d 65 20 61  about the same a
27c10 6d 6f 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70  mount of free sp
27c20 61 63 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79 20  ace..** Usually 
27c30 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65  NN siblings on e
27c40 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 70 50  ither side of pP
27c50 61 67 65 20 69 73 20 75 73 65 64 20 69 6e 20 74  age is used in t
27c60 68 65 20 62 61 6c 61 6e 63 69 6e 67 2c 0a 2a 2a  he balancing,.**
27c70 20 74 68 6f 75 67 68 20 6d 6f 72 65 20 73 69 62   though more sib
27c80 6c 69 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65  lings might come
27c90 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 20 69   from one side i
27ca0 66 20 70 50 61 67 65 20 69 73 20 74 68 65 20 66  f pPage is the f
27cb0 69 72 73 74 0a 2a 2a 20 6f 72 20 6c 61 73 74 20  irst.** or last 
27cc0 63 68 69 6c 64 20 6f 66 20 69 74 73 20 70 61 72  child of its par
27cd0 65 6e 74 2e 20 20 49 66 20 70 50 61 67 65 20 68  ent.  If pPage h
27ce0 61 73 20 66 65 77 65 72 20 74 68 61 6e 20 32 2a  as fewer than 2*
27cf0 4e 4e 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 28  NN siblings.** (
27d00 73 6f 6d 65 74 68 69 6e 67 20 77 68 69 63 68 20  something which 
27d10 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20  can only happen 
27d20 69 66 20 70 50 61 67 65 20 69 73 20 74 68 65 20  if pPage is the 
27d30 72 6f 6f 74 20 70 61 67 65 20 6f 72 20 61 20 0a  root page or a .
27d40 2a 2a 20 63 68 69 6c 64 20 6f 66 20 72 6f 6f 74  ** child of root
27d50 29 20 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c  ) then all avail
27d60 61 62 6c 65 20 73 69 62 6c 69 6e 67 73 20 70 61  able siblings pa
27d70 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65  rticipate in the
27d80 20 62 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a   balancing..**.*
27d90 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * The number of 
27da0 73 69 62 6c 69 6e 67 73 20 6f 66 20 70 50 61 67  siblings of pPag
27db0 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65  e might be incre
27dc0 61 73 65 64 20 6f 72 20 64 65 63 72 65 61 73 65  ased or decrease
27dd0 64 20 62 79 20 6f 6e 65 20 6f 72 0a 2a 2a 20 74  d by one or.** t
27de0 77 6f 20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20  wo in an effort 
27df0 74 6f 20 6b 65 65 70 20 70 61 67 65 73 20 6e 65  to keep pages ne
27e00 61 72 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f  arly full but no
27e10 74 20 6f 76 65 72 20 66 75 6c 6c 2e 20 54 68 65  t over full. The
27e20 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73   root page.** is
27e30 20 73 70 65 63 69 61 6c 20 61 6e 64 20 69 73 20   special and is 
27e40 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 6e 65  allowed to be ne
27e50 61 72 6c 79 20 65 6d 70 74 79 2e 20 49 66 20 70  arly empty. If p
27e60 50 61 67 65 20 69 73 20 0a 2a 2a 20 74 68 65 20  Page is .** the 
27e70 72 6f 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20  root page, then 
27e80 74 68 65 20 64 65 70 74 68 20 6f 66 20 74 68 65  the depth of the
27e90 20 74 72 65 65 20 6d 69 67 68 74 20 62 65 20 69   tree might be i
27ea0 6e 63 72 65 61 73 65 64 0a 2a 2a 20 6f 72 20 64  ncreased.** or d
27eb0 65 63 72 65 61 73 65 64 20 62 79 20 6f 6e 65 2c  ecreased by one,
27ec0 20 61 73 20 6e 65 63 65 73 73 61 72 79 2c 20 74   as necessary, t
27ed0 6f 20 6b 65 65 70 20 74 68 65 20 72 6f 6f 74 20  o keep the root 
27ee0 70 61 67 65 20 66 72 6f 6d 20 62 65 69 6e 67 0a  page from being.
27ef0 2a 2a 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 63  ** overfull or c
27f00 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e  ompletely empty.
27f10 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74  .**.** Note that
27f20 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
27f30 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f  ne is called, so
27f40 6d 65 20 6f 66 20 74 68 65 20 43 65 6c 6c 73 20  me of the Cells 
27f50 6f 6e 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68  on pPage.** migh
27f60 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62  t not actually b
27f70 65 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67  e stored in pPag
27f80 65 2d 3e 61 44 61 74 61 5b 5d 2e 20 20 54 68 69  e->aData[].  Thi
27f90 73 20 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20  s can happen.** 
27fa0 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6f  if the page is o
27fb0 76 65 72 66 75 6c 6c 2e 20 20 50 61 72 74 20 6f  verfull.  Part o
27fc0 66 20 74 68 65 20 6a 6f 62 20 6f 66 20 74 68 69  f the job of thi
27fd0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 0a  s routine is to.
27fe0 2a 2a 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  ** make sure all
27ff0 20 43 65 6c 6c 73 20 66 6f 72 20 70 50 61 67 65   Cells for pPage
28000 20 6f 6e 63 65 20 61 67 61 69 6e 20 66 69 74 20   once again fit 
28010 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  in pPage->aData[
28020 5d 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20  ]..**.** In the 
28030 63 6f 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63  course of balanc
28040 69 6e 67 20 74 68 65 20 73 69 62 6c 69 6e 67 73  ing the siblings
28050 20 6f 66 20 70 50 61 67 65 2c 20 74 68 65 20 70   of pPage, the p
28060 61 72 65 6e 74 20 6f 66 20 70 50 61 67 65 0a 2a  arent of pPage.*
28070 2a 20 6d 69 67 68 74 20 62 65 63 6f 6d 65 20 6f  * might become o
28080 76 65 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72  verfull or under
28090 66 75 6c 6c 2e 20 20 49 66 20 74 68 61 74 20 68  full.  If that h
280a0 61 70 70 65 6e 73 2c 20 74 68 65 6e 20 74 68 69  appens, then thi
280b0 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20  s routine.** is 
280c0 63 61 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65  called recursive
280d0 6c 79 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74  ly on the parent
280e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20  ..**.** If this 
280f0 72 6f 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f  routine fails fo
28100 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74  r any reason, it
28110 20 6d 69 67 68 74 20 6c 65 61 76 65 20 74 68 65   might leave the
28120 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20   database.** in 
28130 61 20 63 6f 72 72 75 70 74 65 64 20 73 74 61 74  a corrupted stat
28140 65 2e 20 20 53 6f 20 69 66 20 74 68 69 73 20 72  e.  So if this r
28150 6f 75 74 69 6e 65 20 66 61 69 6c 73 2c 20 74 68  outine fails, th
28160 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c  e database shoul
28170 64 0a 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62  d.** be rolled b
28180 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ack..*/.static i
28190 6e 74 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f  nt balance_nonro
281a0 6f 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ot(BtCursor *pCu
281b0 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  r){.  MemPage *p
281c0 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
281d0 20 20 20 2f 2a 20 54 68 65 20 6f 76 65 72 20 6f     /* The over o
281e0 72 20 75 6e 64 65 72 66 75 6c 6c 20 70 61 67 65  r underfull page
281f0 20 74 6f 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 20   to balance */. 
28200 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
28210 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
28220 20 54 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70   The parent of p
28230 50 61 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72  Page */.  BtShar
28240 65 64 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20  ed *pBt;        
28250 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68         /* The wh
28260 6f 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ole database */.
28270 20 20 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b    int nCell = 0;
28280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28290 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c  * Number of cell
282a0 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f  s in apCell[] */
282b0 0a 20 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73  .  int nMaxCells
282c0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
282d0 2f 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a  /* Allocated siz
282e0 65 20 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43  e of apCell, szC
282f0 65 6c 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20  ell, aFrom. */. 
28300 20 69 6e 74 20 6e 4f 6c 64 20 3d 20 30 3b 20 20   int nOld = 0;  
28310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28320 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
28330 20 69 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20   in apOld[] */. 
28340 20 69 6e 74 20 6e 4e 65 77 20 3d 20 30 3b 20 20   int nNew = 0;  
28350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28360 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
28370 20 69 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20   in apNew[] */. 
28380 20 69 6e 74 20 6e 44 69 76 3b 20 20 20 20 20 20   int nDiv;      
28390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
283a0 20 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   Number of cells
283b0 20 69 6e 20 61 70 44 69 76 5b 5d 20 2a 2f 0a 20   in apDiv[] */. 
283c0 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20   int i, j, k;   
283d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
283e0 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
283f0 2f 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20  /.  int idx;    
28400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28410 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 70 50 61   /* Index of pPa
28420 67 65 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61  ge in pParent->a
28430 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  Cell[] */.  int 
28440 6e 78 44 69 76 3b 20 20 20 20 20 20 20 20 20 20  nxDiv;          
28450 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74           /* Next
28460 20 64 69 76 69 64 65 72 20 73 6c 6f 74 20 69 6e   divider slot in
28470 20 70 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b   pParent->aCell[
28480 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  ] */.  int rc;  
28490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
284a0 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72      /* The retur
284b0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
284c0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20  leafCorrection; 
284d0 20 20 20 20 20 20 20 20 20 2f 2a 20 34 20 69 66           /* 4 if
284e0 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61 66   pPage is a leaf
284f0 2e 20 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20  .  0 if not */. 
28500 20 69 6e 74 20 6c 65 61 66 44 61 74 61 3b 20 20   int leafData;  
28510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
28520 20 54 72 75 65 20 69 66 20 70 50 61 67 65 20 69   True if pPage i
28530 73 20 61 20 6c 65 61 66 20 6f 66 20 61 20 4c 45  s a leaf of a LE
28540 41 46 44 41 54 41 20 74 72 65 65 20 2a 2f 0a 20  AFDATA tree */. 
28550 20 69 6e 74 20 75 73 61 62 6c 65 53 70 61 63 65   int usableSpace
28560 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
28570 20 42 79 74 65 73 20 69 6e 20 70 50 61 67 65 20   Bytes in pPage 
28580 62 65 79 6f 6e 64 20 74 68 65 20 68 65 61 64 65  beyond the heade
28590 72 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 46  r */.  int pageF
285a0 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
285b0 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20      /* Value of 
285c0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20  pPage->aData[0] 
285d0 2a 2f 0a 20 20 69 6e 74 20 73 75 62 74 6f 74 61  */.  int subtota
285e0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
285f0 20 20 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66    /* Subtotal of
28600 20 62 79 74 65 73 20 69 6e 20 63 65 6c 6c 73 20   bytes in cells 
28610 6f 6e 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20  on one page */. 
28620 20 69 6e 74 20 69 53 70 61 63 65 31 20 3d 20 30   int iSpace1 = 0
28630 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
28640 20 46 69 72 73 74 20 75 6e 75 73 65 64 20 62 79   First unused by
28650 74 65 20 6f 66 20 61 53 70 61 63 65 31 5b 5d 20  te of aSpace1[] 
28660 2a 2f 0a 20 20 69 6e 74 20 69 53 70 61 63 65 32  */.  int iSpace2
28670 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
28680 20 20 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65    /* First unuse
28690 64 20 62 79 74 65 20 6f 66 20 61 53 70 61 63 65  d byte of aSpace
286a0 32 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53  2[] */.  int szS
286b0 63 72 61 74 63 68 3b 20 20 20 20 20 20 20 20 20  cratch;         
286c0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
286d0 20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20   scratch memory 
286e0 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d  requested */.  M
286f0 65 6d 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42  emPage *apOld[NB
28700 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70  ];          /* p
28710 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 74  Page and up to t
28720 77 6f 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20  wo siblings */. 
28730 20 50 67 6e 6f 20 70 67 6e 6f 4f 6c 64 5b 4e 42   Pgno pgnoOld[NB
28740 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ];            /*
28750 20 50 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f   Page numbers fo
28760 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 61  r each page in a
28770 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50  pOld[] */.  MemP
28780 61 67 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b  age *apCopy[NB];
28790 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72 69 76           /* Priv
287a0 61 74 65 20 63 6f 70 69 65 73 20 6f 66 20 61 70  ate copies of ap
287b0 4f 6c 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20  Old[] pages */. 
287c0 20 4d 65 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b   MemPage *apNew[
287d0 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a  NB+2];        /*
287e0 20 70 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f   pPage and up to
287f0 20 4e 42 20 73 69 62 6c 69 6e 67 73 20 61 66 74   NB siblings aft
28800 65 72 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a  er balancing */.
28810 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 5b 4e    Pgno pgnoNew[N
28820 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 2f  B+2];          /
28830 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 73 20 66  * Page numbers f
28840 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
28850 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 75 38 20  apNew[] */.  u8 
28860 2a 61 70 44 69 76 5b 4e 42 5d 3b 20 20 20 20 20  *apDiv[NB];     
28870 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76            /* Div
28880 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50  ider cells in pP
28890 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63  arent */.  int c
288a0 6e 74 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20  ntNew[NB+2];    
288b0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
288c0 20 69 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63   in aCell[] of c
288d0 65 6c 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70  ell after i-th p
288e0 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e  age */.  int szN
288f0 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20  ew[NB+2];       
28900 20 20 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65        /* Combine
28910 64 20 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20  d size of cells 
28920 70 6c 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61  place on i-th pa
28930 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43  ge */.  u8 **apC
28940 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ell = 0;        
28950 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c       /* All cell
28960 73 20 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64  s begin balanced
28970 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c   */.  u16 *szCel
28980 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
28990 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65     /* Local size
289a0 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e   of all cells in
289b0 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75   apCell[] */.  u
289c0 38 20 2a 61 43 6f 70 79 5b 4e 42 5d 3b 20 20 20  8 *aCopy[NB];   
289d0 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
289e0 6f 72 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20  or holding data 
289f0 6f 66 20 61 70 43 6f 70 79 5b 5d 20 2a 2f 0a 20  of apCopy[] */. 
28a00 20 75 38 20 2a 61 53 70 61 63 65 31 3b 20 20 20   u8 *aSpace1;   
28a10 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
28a20 20 66 6f 72 20 63 6f 70 69 65 73 20 6f 66 20 64   for copies of d
28a30 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20 62 65  ividers cells be
28a40 66 6f 72 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a  fore balance */.
28a50 20 20 75 38 20 2a 61 53 70 61 63 65 32 20 3d 20    u8 *aSpace2 = 
28a60 30 3b 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63  0;       /* Spac
28a70 65 20 66 6f 72 20 6f 76 65 72 66 6c 6f 77 20 64  e for overflow d
28a80 69 76 69 64 65 72 73 20 63 65 6c 6c 73 20 61 66  ividers cells af
28a90 74 65 72 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 20  ter balance */. 
28aa0 20 75 38 20 2a 61 46 72 6f 6d 20 3d 20 30 3b 0a   u8 *aFrom = 0;.
28ab0 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d  .  pPage = pCur-
28ac0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
28ad0 61 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  age];.  assert( 
28ae0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
28af0 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
28b00 75 74 65 78 29 20 29 3b 0a 20 20 56 56 41 5f 4f  utex) );.  VVA_O
28b10 4e 4c 59 28 20 70 43 75 72 2d 3e 70 61 67 65 73  NLY( pCur->pages
28b20 53 68 75 66 66 6c 65 64 20 3d 20 31 20 29 3b 0a  Shuffled = 1 );.
28b30 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 46 69 6e 64  .  /* .  ** Find
28b40 20 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65   the parent page
28b50 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
28b60 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29   pCur->iPage>0 )
28b70 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
28b80 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61  e->isInit );.  a
28b90 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
28ba0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
28bb0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 7c  Page->pDbPage) |
28bc0 7c 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  | pPage->nOverfl
28bd0 6f 77 3d 3d 31 20 29 3b 0a 20 20 70 42 74 20 3d  ow==1 );.  pBt =
28be0 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 70   pPage->pBt;.  p
28bf0 50 61 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e 61  Parent = pCur->a
28c00 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
28c10 65 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20  e-1];.  assert( 
28c20 70 50 61 72 65 6e 74 20 29 3b 0a 20 20 69 66 28  pParent );.  if(
28c30 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
28c40 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
28c50 69 74 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62  ite(pParent->pDb
28c60 50 61 67 65 29 29 20 29 7b 0a 20 20 20 20 67 6f  Page)) ){.    go
28c70 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
28c80 75 70 3b 0a 20 20 7d 0a 0a 20 20 54 52 41 43 45  up;.  }..  TRACE
28c90 28 28 22 42 41 4c 41 4e 43 45 3a 20 62 65 67 69  (("BALANCE: begi
28ca0 6e 20 70 61 67 65 20 25 64 20 63 68 69 6c 64 20  n page %d child 
28cb0 6f 66 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  of %d\n", pPage-
28cc0 3e 70 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e  >pgno, pParent->
28cd0 70 67 6e 6f 29 29 3b 0a 0a 23 69 66 6e 64 65 66  pgno));..#ifndef
28ce0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
28cf0 43 4b 42 41 4c 41 4e 43 45 0a 20 20 2f 2a 0a 20  CKBALANCE.  /*. 
28d00 20 2a 2a 20 41 20 73 70 65 63 69 61 6c 20 63 61   ** A special ca
28d10 73 65 3a 20 20 49 66 20 61 20 6e 65 77 20 65 6e  se:  If a new en
28d20 74 72 79 20 68 61 73 20 6a 75 73 74 20 62 65 65  try has just bee
28d30 6e 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20  n inserted into 
28d40 61 0a 20 20 2a 2a 20 74 61 62 6c 65 20 28 74 68  a.  ** table (th
28d50 61 74 20 69 73 2c 20 61 20 62 74 72 65 65 20 77  at is, a btree w
28d60 69 74 68 20 69 6e 74 65 67 65 72 20 6b 65 79 73  ith integer keys
28d70 20 61 6e 64 20 61 6c 6c 20 64 61 74 61 20 61 74   and all data at
28d80 20 74 68 65 20 6c 65 61 76 65 73 29 0a 20 20 2a   the leaves).  *
28d90 2a 20 61 6e 64 20 74 68 65 20 6e 65 77 20 65 6e  * and the new en
28da0 74 72 79 20 69 73 20 74 68 65 20 72 69 67 68 74  try is the right
28db0 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 6e 20 74  -most entry in t
28dc0 68 65 20 74 72 65 65 20 28 69 74 20 68 61 73 20  he tree (it has 
28dd0 74 68 65 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74  the.  ** largest
28de0 20 6b 65 79 29 20 74 68 65 6e 20 75 73 65 20 74   key) then use t
28df0 68 65 20 73 70 65 63 69 61 6c 20 62 61 6c 61 6e  he special balan
28e00 63 65 5f 71 75 69 63 6b 28 29 20 72 6f 75 74 69  ce_quick() routi
28e10 6e 65 20 66 6f 72 0a 20 20 2a 2a 20 62 61 6c 61  ne for.  ** bala
28e20 6e 63 69 6e 67 2e 20 20 62 61 6c 61 6e 63 65 5f  ncing.  balance_
28e30 71 75 69 63 6b 28 29 20 69 73 20 6d 75 63 68 20  quick() is much 
28e40 66 61 73 74 65 72 20 61 6e 64 20 72 65 73 75 6c  faster and resul
28e50 74 73 20 69 6e 20 61 20 74 69 67 68 74 65 72 0a  ts in a tighter.
28e60 20 20 2a 2a 20 70 61 63 6b 69 6e 67 20 6f 66 20    ** packing of 
28e70 64 61 74 61 20 69 6e 20 74 68 65 20 63 6f 6d 6d  data in the comm
28e80 6f 6e 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20  on case..  */.  
28e90 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20  if( pPage->leaf 
28ea0 26 26 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e  &&.      pPage->
28eb0 69 6e 74 4b 65 79 20 26 26 0a 20 20 20 20 20 20  intKey &&.      
28ec0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
28ed0 3d 3d 31 20 26 26 0a 20 20 20 20 20 20 70 50 61  ==1 &&.      pPa
28ee0 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78  ge->aOvfl[0].idx
28ef0 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26  ==pPage->nCell &
28f00 26 0a 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d  &.      pParent-
28f10 3e 70 67 6e 6f 21 3d 31 20 26 26 0a 20 20 20 20  >pgno!=1 &&.    
28f20 20 20 67 65 74 34 62 79 74 65 28 26 70 50 61 72    get4byte(&pPar
28f30 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65  ent->aData[pPare
28f40 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  nt->hdrOffset+8]
28f50 29 3d 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 0a 20  )==pPage->pgno. 
28f60 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
28f70 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b  pPage->intKey );
28f80 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54  .    /*.    ** T
28f90 4f 44 4f 3a 20 43 68 65 63 6b 20 74 68 65 20 73  ODO: Check the s
28fa0 69 62 6c 69 6e 67 73 20 74 6f 20 74 68 65 20 6c  iblings to the l
28fb0 65 66 74 20 6f 66 20 70 50 61 67 65 2e 20 49 74  eft of pPage. It
28fc0 20 6d 61 79 20 62 65 20 74 68 61 74 0a 20 20 20   may be that.   
28fd0 20 2a 2a 20 74 68 65 79 20 61 72 65 20 6e 6f 74   ** they are not
28fe0 20 66 75 6c 6c 20 61 6e 64 20 6e 6f 20 6e 65 77   full and no new
28ff0 20 70 61 67 65 20 69 73 20 72 65 71 75 69 72 65   page is require
29000 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65  d..    */.    re
29010 74 75 72 6e 20 62 61 6c 61 6e 63 65 5f 71 75 69  turn balance_qui
29020 63 6b 28 70 43 75 72 29 3b 0a 20 20 7d 0a 23 65  ck(pCur);.  }.#e
29030 6e 64 69 66 0a 0a 20 20 69 66 28 20 53 51 4c 49  ndif..  if( SQLI
29040 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c  TE_OK!=(rc = sql
29050 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
29060 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 20  Page->pDbPage)) 
29070 29 7b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61  ){.    goto bala
29080 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d  nce_cleanup;.  }
29090 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64  ..  /*.  ** Find
290a0 20 74 68 65 20 63 65 6c 6c 20 69 6e 20 74 68 65   the cell in the
290b0 20 70 61 72 65 6e 74 20 70 61 67 65 20 77 68 6f   parent page who
290c0 73 65 20 6c 65 66 74 20 63 68 69 6c 64 20 70 6f  se left child po
290d0 69 6e 74 73 20 62 61 63 6b 0a 20 20 2a 2a 20 74  ints back.  ** t
290e0 6f 20 70 50 61 67 65 2e 20 20 54 68 65 20 22 69  o pPage.  The "i
290f0 64 78 22 20 76 61 72 69 61 62 6c 65 20 69 73 20  dx" variable is 
29100 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61  the index of tha
29110 74 20 63 65 6c 6c 2e 20 20 49 66 20 70 50 61 67  t cell.  If pPag
29120 65 0a 20 20 2a 2a 20 69 73 20 74 68 65 20 72 69  e.  ** is the ri
29130 67 68 74 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66  ghtmost child of
29140 20 70 50 61 72 65 6e 74 20 74 68 65 6e 20 73 65   pParent then se
29150 74 20 69 64 78 20 74 6f 20 70 50 61 72 65 6e 74  t idx to pParent
29160 2d 3e 6e 43 65 6c 6c 20 0a 20 20 2a 2f 0a 20 20  ->nCell .  */.  
29170 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64  idx = pCur->aiId
29180 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d  x[pCur->iPage-1]
29190 3b 0a 20 20 61 73 73 65 72 74 50 61 72 65 6e 74  ;.  assertParent
291a0 49 6e 64 65 78 28 70 50 61 72 65 6e 74 2c 20 69  Index(pParent, i
291b0 64 78 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  dx, pPage->pgno)
291c0 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e  ;..  /*.  ** Fin
291d0 64 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20  d sibling pages 
291e0 74 6f 20 70 50 61 67 65 20 61 6e 64 20 74 68 65  to pPage and the
291f0 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e   cells in pParen
29200 74 20 74 68 61 74 20 64 69 76 69 64 65 0a 20 20  t that divide.  
29210 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67 73 2e  ** the siblings.
29220 20 20 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20    An attempt is 
29230 6d 61 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20  made to find NN 
29240 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74 68  siblings on eith
29250 65 72 0a 20 20 2a 2a 20 73 69 64 65 20 6f 66 20  er.  ** side of 
29260 70 50 61 67 65 2e 20 20 4d 6f 72 65 20 73 69 62  pPage.  More sib
29270 6c 69 6e 67 73 20 61 72 65 20 74 61 6b 65 6e 20  lings are taken 
29280 66 72 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68  from one side, h
29290 6f 77 65 76 65 72 2c 20 69 66 0a 20 20 2a 2a 20  owever, if.  ** 
292a0 70 50 61 67 65 20 74 68 65 72 65 20 61 72 65 20  pPage there are 
292b0 66 65 77 65 72 20 74 68 61 6e 20 4e 4e 20 73 69  fewer than NN si
292c0 62 6c 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74  blings on the ot
292d0 68 65 72 20 73 69 64 65 2e 20 20 49 66 20 70 50  her side.  If pP
292e0 61 72 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e  arent.  ** has N
292f0 42 20 6f 72 20 66 65 77 65 72 20 63 68 69 6c 64  B or fewer child
29300 72 65 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68 69  ren then all chi
29310 6c 64 72 65 6e 20 6f 66 20 70 50 61 72 65 6e 74  ldren of pParent
29320 20 61 72 65 20 74 61 6b 65 6e 2e 0a 20 20 2a 2f   are taken..  */
29330 0a 20 20 6e 78 44 69 76 20 3d 20 69 64 78 20 2d  .  nxDiv = idx -
29340 20 4e 4e 3b 0a 20 20 69 66 28 20 6e 78 44 69 76   NN;.  if( nxDiv
29350 20 2b 20 4e 42 20 3e 20 70 50 61 72 65 6e 74 2d   + NB > pParent-
29360 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 6e 78  >nCell ){.    nx
29370 44 69 76 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e  Div = pParent->n
29380 43 65 6c 6c 20 2d 20 4e 42 20 2b 20 31 3b 0a 20  Cell - NB + 1;. 
29390 20 7d 0a 20 20 69 66 28 20 6e 78 44 69 76 3c 30   }.  if( nxDiv<0
293a0 20 29 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20   ){.    nxDiv = 
293b0 30 3b 0a 20 20 7d 0a 20 20 6e 44 69 76 20 3d 20  0;.  }.  nDiv = 
293c0 30 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6b 3d  0;.  for(i=0, k=
293d0 6e 78 44 69 76 3b 20 69 3c 4e 42 3b 20 69 2b 2b  nxDiv; i<NB; i++
293e0 2c 20 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , k++){.    if( 
293f0 6b 3c 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c  k<pParent->nCell
29400 20 29 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b   ){.      apDiv[
29410 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  i] = findCell(pP
29420 61 72 65 6e 74 2c 20 6b 29 3b 0a 20 20 20 20 20  arent, k);.     
29430 20 6e 44 69 76 2b 2b 3b 0a 20 20 20 20 20 20 61   nDiv++;.      a
29440 73 73 65 72 74 28 20 21 70 50 61 72 65 6e 74 2d  ssert( !pParent-
29450 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 20 20 70  >leaf );.      p
29460 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34  gnoOld[i] = get4
29470 62 79 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a  byte(apDiv[i]);.
29480 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3d      }else if( k=
29490 3d 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20  =pParent->nCell 
294a0 29 7b 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64  ){.      pgnoOld
294b0 5b 69 5d 20 3d 20 67 65 74 34 62 79 74 65 28 26  [i] = get4byte(&
294c0 70 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70  pParent->aData[p
294d0 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65  Parent->hdrOffse
294e0 74 2b 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t+8]);.    }else
294f0 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  {.      break;. 
29500 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 67 65     }.    rc = ge
29510 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74  tAndInitPage(pBt
29520 2c 20 70 67 6e 6f 4f 6c 64 5b 69 5d 2c 20 26 61  , pgnoOld[i], &a
29530 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66  pOld[i]);.    if
29540 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61  ( rc ) goto bala
29550 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
29560 20 2f 2a 20 61 70 4f 6c 64 5b 69 5d 2d 3e 69 64   /* apOld[i]->id
29570 78 50 61 72 65 6e 74 20 3d 20 6b 3b 20 2a 2f 0a  xParent = k; */.
29580 20 20 20 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20      apCopy[i] = 
29590 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  0;.    assert( i
295a0 3d 3d 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 6e 4f  ==nOld );.    nO
295b0 6c 64 2b 2b 3b 0a 20 20 20 20 6e 4d 61 78 43 65  ld++;.    nMaxCe
295c0 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69  lls += 1+apOld[i
295d0 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69  ]->nCell+apOld[i
295e0 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  ]->nOverflow;.  
295f0 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61  }..  /* Make nMa
29600 78 43 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c  xCells a multipl
29610 65 20 6f 66 20 34 20 69 6e 20 6f 72 64 65 72 20  e of 4 in order 
29620 74 6f 20 70 72 65 73 65 72 76 65 20 38 2d 62 79  to preserve 8-by
29630 74 65 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e  te.  ** alignmen
29640 74 20 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73  t */.  nMaxCells
29650 20 3d 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20   = (nMaxCells + 
29660 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  3)&~3;..  /*.  *
29670 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
29680 20 66 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75   for memory stru
29690 63 74 75 72 65 73 0a 20 20 2a 2f 0a 20 20 73 7a  ctures.  */.  sz
296a0 53 63 72 61 74 63 68 20 3d 0a 20 20 20 20 20 20  Scratch =.      
296b0 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f   nMaxCells*sizeo
296c0 66 28 75 38 2a 29 20 20 20 20 20 20 20 20 20 20  f(u8*)          
296d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
296e0 61 70 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b  apCell */.     +
296f0 20 6e 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f   nMaxCells*sizeo
29700 66 28 75 31 36 29 20 20 20 20 20 20 20 20 20 20  f(u16)          
29710 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29720 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b  szCell */.     +
29730 20 28 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28   (ROUND8(sizeof(
29740 4d 65 6d 50 61 67 65 29 29 2b 70 42 74 2d 3e 70  MemPage))+pBt->p
29750 61 67 65 53 69 7a 65 29 2a 4e 42 20 20 2f 2a 20  ageSize)*NB  /* 
29760 61 43 6f 70 79 20 2a 2f 0a 20 20 20 20 20 2b 20  aCopy */.     + 
29770 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 20 20  pBt->pageSize   
29780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
297a0 53 70 61 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b  Space1 */.     +
297b0 20 28 49 53 41 55 54 4f 56 41 43 55 55 4d 20 3f   (ISAUTOVACUUM ?
297c0 20 6e 4d 61 78 43 65 6c 6c 73 20 3a 20 30 29 3b   nMaxCells : 0);
297d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
297e0 61 46 72 6f 6d 20 2a 2f 0a 20 20 61 70 43 65 6c  aFrom */.  apCel
297f0 6c 20 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74  l = sqlite3Scrat
29800 63 68 4d 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61  chMalloc( szScra
29810 74 63 68 20 29 3b 20 0a 20 20 69 66 28 20 61 70  tch ); .  if( ap
29820 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72  Cell==0 ){.    r
29830 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
29840 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e  ;.    goto balan
29850 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a  ce_cleanup;.  }.
29860 20 20 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a    szCell = (u16*
29870 29 26 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c  )&apCell[nMaxCel
29880 6c 73 5d 3b 0a 20 20 61 43 6f 70 79 5b 30 5d 20  ls];.  aCopy[0] 
29890 3d 20 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e  = (u8*)&szCell[n
298a0 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73  MaxCells];.  ass
298b0 65 72 74 28 20 28 28 61 43 6f 70 79 5b 30 5d 20  ert( ((aCopy[0] 
298c0 2d 20 28 75 38 2a 29 30 29 20 26 20 37 29 3d 3d  - (u8*)0) & 7)==
298d0 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61  0 ); /* 8-byte a
298e0 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65  lignment require
298f0 64 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20  d */.  for(i=1; 
29900 69 3c 4e 42 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i<NB; i++){.    
29910 61 43 6f 70 79 5b 69 5d 20 3d 20 26 61 43 6f 70  aCopy[i] = &aCop
29920 79 5b 69 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65  y[i-1][pBt->page
29930 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65  Size+ROUND8(size
29940 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20  of(MemPage))];. 
29950 20 20 20 61 73 73 65 72 74 28 20 28 28 61 43 6f     assert( ((aCo
29960 70 79 5b 69 5d 20 2d 20 28 75 38 2a 29 30 29 20  py[i] - (u8*)0) 
29970 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d  & 7)==0 ); /* 8-
29980 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72  byte alignment r
29990 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 7d 0a 20  equired */.  }. 
299a0 20 61 53 70 61 63 65 31 20 3d 20 26 61 43 6f 70   aSpace1 = &aCop
299b0 79 5b 4e 42 2d 31 5d 5b 70 42 74 2d 3e 70 61 67  y[NB-1][pBt->pag
299c0 65 53 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a  eSize+ROUND8(siz
299d0 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a  eof(MemPage))];.
299e0 20 20 61 73 73 65 72 74 28 20 28 28 61 53 70 61    assert( ((aSpa
299f0 63 65 31 20 2d 20 28 75 38 2a 29 30 29 20 26 20  ce1 - (u8*)0) & 
29a00 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79  7)==0 ); /* 8-by
29a10 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71  te alignment req
29a20 75 69 72 65 64 20 2a 2f 0a 20 20 69 66 28 20 49  uired */.  if( I
29a30 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20  SAUTOVACUUM ){. 
29a40 20 20 20 61 46 72 6f 6d 20 3d 20 26 61 53 70 61     aFrom = &aSpa
29a50 63 65 31 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ce1[pBt->pageSiz
29a60 65 5d 3b 0a 20 20 7d 0a 20 20 61 53 70 61 63 65  e];.  }.  aSpace
29a70 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d  2 = sqlite3PageM
29a80 61 6c 6c 6f 63 28 70 42 74 2d 3e 70 61 67 65 53  alloc(pBt->pageS
29a90 69 7a 65 29 3b 0a 20 20 69 66 28 20 61 53 70 61  ize);.  if( aSpa
29aa0 63 65 32 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  ce2==0 ){.    rc
29ab0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
29ac0 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63  .    goto balanc
29ad0 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20  e_cleanup;.  }. 
29ae0 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4d 61 6b 65   .  /*.  ** Make
29af0 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 63   copies of the c
29b00 6f 6e 74 65 6e 74 20 6f 66 20 70 50 61 67 65 20  ontent of pPage 
29b10 61 6e 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73  and its siblings
29b20 20 69 6e 74 6f 20 61 4f 6c 64 5b 5d 2e 0a 20 20   into aOld[]..  
29b30 2a 2a 20 54 68 65 20 72 65 73 74 20 6f 66 20 74  ** The rest of t
29b40 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c  his function wil
29b50 6c 20 75 73 65 20 64 61 74 61 20 66 72 6f 6d 20  l use data from 
29b60 74 68 65 20 63 6f 70 69 65 73 20 72 61 74 68 65  the copies rathe
29b70 72 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  r.  ** that the 
29b80 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 73  original pages s
29b90 69 6e 63 65 20 74 68 65 20 6f 72 69 67 69 6e 61  ince the origina
29ba0 6c 20 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20  l pages will be 
29bb0 69 6e 20 74 68 65 0a 20 20 2a 2a 20 70 72 6f 63  in the.  ** proc
29bc0 65 73 73 20 6f 66 20 62 65 69 6e 67 20 6f 76 65  ess of being ove
29bd0 72 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20  rwritten..  */. 
29be0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64   for(i=0; i<nOld
29bf0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50  ; i++){.    MemP
29c00 61 67 65 20 2a 70 20 3d 20 61 70 43 6f 70 79 5b  age *p = apCopy[
29c10 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 61  i] = (MemPage*)a
29c20 43 6f 70 79 5b 69 5d 3b 0a 20 20 20 20 6d 65 6d  Copy[i];.    mem
29c30 63 70 79 28 70 2c 20 61 70 4f 6c 64 5b 69 5d 2c  cpy(p, apOld[i],
29c40 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29   sizeof(MemPage)
29c50 29 3b 0a 20 20 20 20 70 2d 3e 61 44 61 74 61 20  );.    p->aData 
29c60 3d 20 28 76 6f 69 64 2a 29 26 70 5b 31 5d 3b 0a  = (void*)&p[1];.
29c70 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61 44      memcpy(p->aD
29c80 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61  ata, apOld[i]->a
29c90 44 61 74 61 2c 20 70 42 74 2d 3e 70 61 67 65 53  Data, pBt->pageS
29ca0 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  ize);.  }..  /*.
29cb0 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65    ** Load pointe
29cc0 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20  rs to all cells 
29cd0 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73  on sibling pages
29ce0 20 61 6e 64 20 74 68 65 20 64 69 76 69 64 65 72   and the divider
29cf0 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f   cells.  ** into
29d00 20 74 68 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c   the local apCel
29d10 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d 61 6b 65  l[] array.  Make
29d20 20 63 6f 70 69 65 73 20 6f 66 20 74 68 65 20 64   copies of the d
29d30 69 76 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a  ivider cells.  *
29d40 2a 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74  * into space obt
29d50 61 69 6e 65 64 20 66 6f 72 6d 20 61 53 70 61 63  ained form aSpac
29d60 65 31 5b 5d 20 61 6e 64 20 72 65 6d 6f 76 65 20  e1[] and remove 
29d70 74 68 65 20 74 68 65 20 64 69 76 69 64 65 72 20  the the divider 
29d80 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d 20  Cells.  ** from 
29d90 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20  pParent..  **.  
29da0 2a 2a 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e  ** If the siblin
29db0 67 73 20 61 72 65 20 6f 6e 20 6c 65 61 66 20 70  gs are on leaf p
29dc0 61 67 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63  ages, then the c
29dd0 68 69 6c 64 20 70 6f 69 6e 74 65 72 73 20 6f 66  hild pointers of
29de0 20 74 68 65 0a 20 20 2a 2a 20 64 69 76 69 64 65   the.  ** divide
29df0 72 20 63 65 6c 6c 73 20 61 72 65 20 73 74 72 69  r cells are stri
29e00 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63 65  pped from the ce
29e10 6c 6c 73 20 62 65 66 6f 72 65 20 74 68 65 79 20  lls before they 
29e20 61 72 65 20 63 6f 70 69 65 64 0a 20 20 2a 2a 20  are copied.  ** 
29e30 69 6e 74 6f 20 61 53 70 61 63 65 31 5b 5d 2e 20  into aSpace1[]. 
29e40 20 49 6e 20 74 68 69 73 20 77 61 79 2c 20 61 6c   In this way, al
29e50 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c  l cells in apCel
29e60 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f 75 74 0a  l[] are without.
29e70 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e 74    ** child point
29e80 65 72 73 2e 20 20 49 66 20 73 69 62 6c 69 6e 67  ers.  If sibling
29e90 73 20 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73  s are not leaves
29ea0 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c 20  , then all cell 
29eb0 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d  in.  ** apCell[]
29ec0 20 69 6e 63 6c 75 64 65 20 63 68 69 6c 64 20 70   include child p
29ed0 6f 69 6e 74 65 72 73 2e 20 20 45 69 74 68 65 72  ointers.  Either
29ee0 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20   way, all cells 
29ef0 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a  in apCell[].  **
29f00 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a   are alike..  **
29f10 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65 63  .  ** leafCorrec
29f20 74 69 6f 6e 3a 20 20 34 20 69 66 20 70 50 61 67  tion:  4 if pPag
29f30 65 20 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20  e is a leaf.  0 
29f40 69 66 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20  if pPage is not 
29f50 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20 20  a leaf..  **    
29f60 20 20 20 6c 65 61 66 44 61 74 61 3a 20 20 31 20     leafData:  1 
29f70 69 66 20 70 50 61 67 65 20 68 6f 6c 64 73 20 6b  if pPage holds k
29f80 65 79 2b 64 61 74 61 20 61 6e 64 20 70 50 61 72  ey+data and pPar
29f90 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b  ent holds only k
29fa0 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6e 43 65 6c  eys..  */.  nCel
29fb0 6c 20 3d 20 30 3b 0a 20 20 6c 65 61 66 43 6f 72  l = 0;.  leafCor
29fc0 72 65 63 74 69 6f 6e 20 3d 20 70 50 61 67 65 2d  rection = pPage-
29fd0 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44  >leaf*4;.  leafD
29fe0 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 68 61 73  ata = pPage->has
29ff0 44 61 74 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  Data;.  for(i=0;
2a000 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20   i<nOld; i++){. 
2a010 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64     MemPage *pOld
2a020 20 3d 20 61 70 43 6f 70 79 5b 69 5d 3b 0a 20 20   = apCopy[i];.  
2a030 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 70 4f    int limit = pO
2a040 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e  ld->nCell+pOld->
2a050 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 66  nOverflow;.    f
2a060 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b  or(j=0; j<limit;
2a070 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73   j++){.      ass
2a080 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43  ert( nCell<nMaxC
2a090 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 61 70  ells );.      ap
2a0a0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69  Cell[nCell] = fi
2a0b0 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
2a0c0 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20 73  Old, j);.      s
2a0d0 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63  zCell[nCell] = c
2a0e0 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c  ellSizePtr(pOld,
2a0f0 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b   apCell[nCell]);
2a100 0a 20 20 20 20 20 20 69 66 28 20 49 53 41 55 54  .      if( ISAUT
2a110 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
2a120 20 20 20 69 6e 74 20 61 3b 0a 20 20 20 20 20 20     int a;.      
2a130 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d    aFrom[nCell] =
2a140 20 28 75 38 29 69 3b 20 20 20 61 73 73 65 72 74   (u8)i;   assert
2a150 28 20 69 3e 3d 30 20 26 26 20 69 3c 36 20 29 3b  ( i>=0 && i<6 );
2a160 0a 20 20 20 20 20 20 20 20 66 6f 72 28 61 3d 30  .        for(a=0
2a170 3b 20 61 3c 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66  ; a<pOld->nOverf
2a180 6c 6f 77 3b 20 61 2b 2b 29 7b 0a 20 20 20 20 20  low; a++){.     
2a190 20 20 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 61       if( pOld->a
2a1a0 4f 76 66 6c 5b 61 5d 2e 70 43 65 6c 6c 3d 3d 61  Ovfl[a].pCell==a
2a1b0 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 29 7b 0a  pCell[nCell] ){.
2a1c0 20 20 20 20 20 20 20 20 20 20 20 20 61 46 72 6f              aFro
2a1d0 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46 3b  m[nCell] = 0xFF;
2a1e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
2a1f0 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ak;.          }.
2a200 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2a210 7d 0a 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b  }.      nCell++;
2a220 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69  .    }.    if( i
2a230 3c 6e 4f 6c 64 2d 31 20 29 7b 0a 20 20 20 20 20  <nOld-1 ){.     
2a240 20 75 31 36 20 73 7a 20 3d 20 63 65 6c 6c 53 69   u16 sz = cellSi
2a250 7a 65 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61  zePtr(pParent, a
2a260 70 44 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20  pDiv[i]);.      
2a270 69 66 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a  if( leafData ){.
2a280 20 20 20 20 20 20 20 20 2f 2a 20 57 69 74 68 20          /* With 
2a290 74 68 65 20 4c 45 41 46 44 41 54 41 20 66 6c 61  the LEAFDATA fla
2a2a0 67 2c 20 70 50 61 72 65 6e 74 20 63 65 6c 6c 73  g, pParent cells
2a2b0 20 68 6f 6c 64 20 6f 6e 6c 79 20 49 4e 54 4b 45   hold only INTKE
2a2c0 59 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  Ys that.        
2a2d0 2a 2a 20 61 72 65 20 64 75 70 6c 69 63 61 74 65  ** are duplicate
2a2e0 73 20 6f 66 20 6b 65 79 73 20 6f 6e 20 74 68 65  s of keys on the
2a2f0 20 63 68 69 6c 64 20 70 61 67 65 73 2e 20 20 57   child pages.  W
2a300 65 20 6e 65 65 64 20 74 6f 20 72 65 6d 6f 76 65  e need to remove
2a310 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
2a320 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 66 72  divider cells fr
2a330 6f 6d 20 70 50 61 72 65 6e 74 2c 20 62 75 74 20  om pParent, but 
2a340 74 68 65 20 64 69 76 69 64 65 72 73 20 63 65 6c  the dividers cel
2a350 6c 73 20 61 72 65 20 6e 6f 74 0a 20 20 20 20 20  ls are not.     
2a360 20 20 20 2a 2a 20 61 64 64 65 64 20 74 6f 20 61     ** added to a
2a370 70 43 65 6c 6c 5b 5d 20 62 65 63 61 75 73 65 20  pCell[] because 
2a380 74 68 65 79 20 61 72 65 20 64 75 70 6c 69 63 61  they are duplica
2a390 74 65 73 20 6f 66 20 63 68 69 6c 64 20 63 65 6c  tes of child cel
2a3a0 6c 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ls..        */. 
2a3b0 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28         dropCell(
2a3c0 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20  pParent, nxDiv, 
2a3d0 73 7a 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  sz);.      }else
2a3e0 7b 0a 20 20 20 20 20 20 20 20 75 38 20 2a 70 54  {.        u8 *pT
2a3f0 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73  emp;.        ass
2a400 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43  ert( nCell<nMaxC
2a410 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20  ells );.        
2a420 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
2a430 73 7a 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d  sz;.        pTem
2a440 70 20 3d 20 26 61 53 70 61 63 65 31 5b 69 53 70  p = &aSpace1[iSp
2a450 61 63 65 31 5d 3b 0a 20 20 20 20 20 20 20 20 69  ace1];.        i
2a460 53 70 61 63 65 31 20 2b 3d 20 73 7a 3b 0a 20 20  Space1 += sz;.  
2a470 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 7a        assert( sz
2a480 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f  <=pBt->pageSize/
2a490 34 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  4 );.        ass
2a4a0 65 72 74 28 20 69 53 70 61 63 65 31 3c 3d 70 42  ert( iSpace1<=pB
2a4b0 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  t->pageSize );. 
2a4c0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54         memcpy(pT
2a4d0 65 6d 70 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73  emp, apDiv[i], s
2a4e0 7a 29 3b 0a 20 20 20 20 20 20 20 20 61 70 43 65  z);.        apCe
2a4f0 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54 65 6d  ll[nCell] = pTem
2a500 70 2b 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  p+leafCorrection
2a510 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 53  ;.        if( IS
2a520 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
2a530 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43          aFrom[nC
2a540 65 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20  ell] = 0xFF;.   
2a550 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64       }.        d
2a560 72 6f 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  ropCell(pParent,
2a570 20 6e 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20   nxDiv, sz);.   
2a580 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61       assert( lea
2a590 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 7c  fCorrection==0 |
2a5a0 7c 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  | leafCorrection
2a5b0 3d 3d 34 20 29 3b 0a 20 20 20 20 20 20 20 20 73  ==4 );.        s
2a5c0 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 3d 20  zCell[nCell] -= 
2a5d0 28 75 31 36 29 6c 65 61 66 43 6f 72 72 65 63 74  (u16)leafCorrect
2a5e0 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ion;.        ass
2a5f0 65 72 74 28 20 67 65 74 34 62 79 74 65 28 70 54  ert( get4byte(pT
2a600 65 6d 70 29 3d 3d 70 67 6e 6f 4f 6c 64 5b 69 5d  emp)==pgnoOld[i]
2a610 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2a620 21 70 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20  !pOld->leaf ){. 
2a630 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
2a640 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d   leafCorrection=
2a650 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
2a660 2f 2a 20 54 68 65 20 72 69 67 68 74 20 70 6f 69  /* The right poi
2a670 6e 74 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c  nter of the chil
2a680 64 20 70 61 67 65 20 70 4f 6c 64 20 62 65 63 6f  d page pOld beco
2a690 6d 65 73 20 74 68 65 20 6c 65 66 74 0a 20 20 20  mes the left.   
2a6a0 20 20 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65         ** pointe
2a6b0 72 20 6f 66 20 74 68 65 20 64 69 76 69 64 65 72  r of the divider
2a6c0 20 63 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20   cell */.       
2a6d0 20 20 20 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c     memcpy(apCell
2a6e0 5b 6e 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e  [nCell], &pOld->
2a6f0 61 44 61 74 61 5b 70 4f 6c 64 2d 3e 68 64 72 4f  aData[pOld->hdrO
2a700 66 66 73 65 74 2b 38 5d 2c 20 34 29 3b 0a 20 20  ffset+8], 4);.  
2a710 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2a720 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
2a730 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34  eafCorrection==4
2a740 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66   );.          if
2a750 28 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c  ( szCell[nCell]<
2a760 34 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  4 ){.           
2a770 20 2f 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77   /* Do not allow
2a780 20 61 6e 79 20 63 65 6c 6c 73 20 73 6d 61 6c 6c   any cells small
2a790 65 72 20 74 68 61 6e 20 34 20 62 79 74 65 73 2e  er than 4 bytes.
2a7a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2a7b0 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20  szCell[nCell] = 
2a7c0 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  4;.          }. 
2a7d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a7e0 20 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20   nCell++;.      
2a7f0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
2a800 2a 0a 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75  *.  ** Figure ou
2a810 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  t the number of 
2a820 70 61 67 65 73 20 6e 65 65 64 65 64 20 74 6f 20  pages needed to 
2a830 68 6f 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20 63  hold all nCell c
2a840 65 6c 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72 65  ells..  ** Store
2a850 20 74 68 69 73 20 6e 75 6d 62 65 72 20 69 6e 20   this number in 
2a860 22 6b 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70 75  "k".  Also compu
2a870 74 65 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63 68  te szNew[] which
2a880 20 69 73 20 74 68 65 20 74 6f 74 61 6c 0a 20 20   is the total.  
2a890 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63  ** size of all c
2a8a0 65 6c 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74 68  ells on the i-th
2a8b0 20 70 61 67 65 20 61 6e 64 20 63 6e 74 4e 65 77   page and cntNew
2a8c0 5b 5d 20 77 68 69 63 68 20 69 73 20 74 68 65 20  [] which is the 
2a8d0 69 6e 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61 70  index.  ** in ap
2a8e0 43 65 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63 65  Cell[] of the ce
2a8f0 6c 6c 20 74 68 61 74 20 64 69 76 69 64 65 73 20  ll that divides 
2a900 70 61 67 65 20 69 20 66 72 6f 6d 20 70 61 67 65  page i from page
2a910 20 69 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e 74   i+1.  .  ** cnt
2a920 4e 65 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65 71  New[k] should eq
2a930 75 61 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a  ual nCell..  **.
2a940 20 20 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d 70    ** Values comp
2a950 75 74 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f  uted by this blo
2a960 63 6b 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ck:.  **.  **   
2a970 20 20 20 20 20 20 20 20 6b 3a 20 54 68 65 20 74          k: The t
2a980 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73  otal number of s
2a990 69 62 6c 69 6e 67 20 70 61 67 65 73 0a 20 20 2a  ibling pages.  *
2a9a0 2a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20 53  *    szNew[i]: S
2a9b0 70 61 63 65 64 20 75 73 65 64 20 6f 6e 20 74 68  paced used on th
2a9c0 65 20 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70  e i-th sibling p
2a9d0 61 67 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74 4e  age..  **   cntN
2a9e0 65 77 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e 20  ew[i]: Index in 
2a9f0 61 70 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43  apCell[] and szC
2aa00 65 6c 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66 69  ell[] for the fi
2aa10 72 73 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a  rst cell to.  **
2aa20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
2aa30 65 20 72 69 67 68 74 20 6f 66 20 74 68 65 20 69  e right of the i
2aa40 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65  -th sibling page
2aa50 2e 0a 20 20 2a 2a 20 75 73 61 62 6c 65 53 70 61  ..  ** usableSpa
2aa60 63 65 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79  ce: Number of by
2aa70 74 65 73 20 6f 66 20 73 70 61 63 65 20 61 76 61  tes of space ava
2aa80 69 6c 61 62 6c 65 20 6f 6e 20 65 61 63 68 20 73  ilable on each s
2aa90 69 62 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20  ibling..  ** .  
2aaa0 2a 2f 0a 20 20 75 73 61 62 6c 65 53 70 61 63 65  */.  usableSpace
2aab0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
2aac0 7a 65 20 2d 20 31 32 20 2b 20 6c 65 61 66 43 6f  ze - 12 + leafCo
2aad0 72 72 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72 28  rrection;.  for(
2aae0 73 75 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20  subtotal=k=i=0; 
2aaf0 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
2ab00 20 20 20 61 73 73 65 72 74 28 20 69 3c 6e 4d 61     assert( i<nMa
2ab10 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73 75  xCells );.    su
2ab20 62 74 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c  btotal += szCell
2ab30 5b 69 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66 28  [i] + 2;.    if(
2ab40 20 73 75 62 74 6f 74 61 6c 20 3e 20 75 73 61 62   subtotal > usab
2ab50 6c 65 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20  leSpace ){.     
2ab60 20 73 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74   szNew[k] = subt
2ab70 6f 74 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d  otal - szCell[i]
2ab80 3b 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 6b  ;.      cntNew[k
2ab90 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28  ] = i;.      if(
2aba0 20 6c 65 61 66 44 61 74 61 20 29 7b 20 69 2d 2d   leafData ){ i--
2abb0 3b 20 7d 0a 20 20 20 20 20 20 73 75 62 74 6f 74  ; }.      subtot
2abc0 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b 2b  al = 0;.      k+
2abd0 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  +;.    }.  }.  s
2abe0 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74  zNew[k] = subtot
2abf0 61 6c 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20  al;.  cntNew[k] 
2ac00 3d 20 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a  = nCell;.  k++;.
2ac10 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70  .  /*.  ** The p
2ac20 61 63 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64 20  acking computed 
2ac30 62 79 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  by the previous 
2ac40 62 6c 6f 63 6b 20 69 73 20 62 69 61 73 65 64 20  block is biased 
2ac50 74 6f 77 61 72 64 20 74 68 65 20 73 69 62 6c 69  toward the sibli
2ac60 6e 67 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ngs.  ** on the 
2ac70 6c 65 66 74 20 73 69 64 65 2e 20 20 54 68 65 20  left side.  The 
2ac80 6c 65 66 74 20 73 69 62 6c 69 6e 67 73 20 61 72  left siblings ar
2ac90 65 20 61 6c 77 61 79 73 20 6e 65 61 72 6c 79 20  e always nearly 
2aca0 66 75 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a  full, while the.
2acb0 20 20 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20    ** right-most 
2acc0 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65  sibling might be
2acd0 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 20   nearly empty.  
2ace0 54 68 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f  This block of co
2acf0 64 65 20 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a  de attempts.  **
2ad00 20 74 6f 20 61 64 6a 75 73 74 20 74 68 65 20 70   to adjust the p
2ad10 61 63 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e  acking of siblin
2ad20 67 73 20 74 6f 20 67 65 74 20 61 20 62 65 74 74  gs to get a bett
2ad30 65 72 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a  er balance..  **
2ad40 0a 20 20 2a 2a 20 54 68 69 73 20 61 64 6a 75 73  .  ** This adjus
2ad50 74 6d 65 6e 74 20 69 73 20 6d 6f 72 65 20 74 68  tment is more th
2ad60 61 6e 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69  an an optimizati
2ad70 6f 6e 2e 20 20 54 68 65 20 70 61 63 6b 69 6e 67  on.  The packing
2ad80 20 61 62 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a   above might.  *
2ad90 2a 20 62 65 20 73 6f 20 6f 75 74 20 6f 66 20 62  * be so out of b
2ada0 61 6c 61 6e 63 65 20 61 73 20 74 6f 20 62 65 20  alance as to be 
2adb0 69 6c 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65 78  illegal.  For ex
2adc0 61 6d 70 6c 65 2c 20 74 68 65 20 72 69 67 68 74  ample, the right
2add0 2d 6d 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69  -most.  ** sibli
2ade0 6e 67 20 6d 69 67 68 74 20 62 65 20 63 6f 6d 70  ng might be comp
2adf0 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 20 20 54  letely empty.  T
2ae00 68 69 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69  his adjustment i
2ae10 73 20 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a  s not optional..
2ae20 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31    */.  for(i=k-1
2ae30 3b 20 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20  ; i>0; i--){.   
2ae40 20 69 6e 74 20 73 7a 52 69 67 68 74 20 3d 20 73   int szRight = s
2ae50 7a 4e 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a  zNew[i];  /* Siz
2ae60 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20  e of sibling on 
2ae70 74 68 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20  the right */.   
2ae80 20 69 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a   int szLeft = sz
2ae90 4e 65 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a  New[i-1]; /* Siz
2aea0 65 20 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20  e of sibling on 
2aeb0 74 68 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20  the left */.    
2aec0 69 6e 74 20 72 3b 20 20 20 20 20 20 20 20 20 20  int r;          
2aed0 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20      /* Index of 
2aee0 72 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20  right-most cell 
2aef0 69 6e 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 20  in left sibling 
2af00 2a 2f 0a 20 20 20 20 69 6e 74 20 64 3b 20 20 20  */.    int d;   
2af10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2af20 64 65 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c  dex of first cel
2af30 6c 20 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66  l to the left of
2af40 20 72 69 67 68 74 20 73 69 62 6c 69 6e 67 20 2a   right sibling *
2af50 2f 0a 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e 65  /..    r = cntNe
2af60 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20  w[i-1] - 1;.    
2af70 64 20 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66  d = r + 1 - leaf
2af80 44 61 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74  Data;.    assert
2af90 28 20 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( d<nMaxCells );
2afa0 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 3c 6e  .    assert( r<n
2afb0 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20  MaxCells );.    
2afc0 77 68 69 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d  while( szRight==
2afd0 30 20 7c 7c 20 73 7a 52 69 67 68 74 2b 73 7a 43  0 || szRight+szC
2afe0 65 6c 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74  ell[d]+2<=szLeft
2aff0 2d 28 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20 29  -(szCell[r]+2) )
2b000 7b 0a 20 20 20 20 20 20 73 7a 52 69 67 68 74 20  {.      szRight 
2b010 2b 3d 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32  += szCell[d] + 2
2b020 3b 0a 20 20 20 20 20 20 73 7a 4c 65 66 74 20 2d  ;.      szLeft -
2b030 3d 20 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b  = szCell[r] + 2;
2b040 0a 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d  .      cntNew[i-
2b050 31 5d 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20  1]--;.      r = 
2b060 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b  cntNew[i-1] - 1;
2b070 0a 20 20 20 20 20 20 64 20 3d 20 72 20 2b 20 31  .      d = r + 1
2b080 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20   - leafData;.   
2b090 20 7d 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20   }.    szNew[i] 
2b0a0 3d 20 73 7a 52 69 67 68 74 3b 0a 20 20 20 20 73  = szRight;.    s
2b0b0 7a 4e 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65  zNew[i-1] = szLe
2b0c0 66 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69  ft;.  }..  /* Ei
2b0d0 74 68 65 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e  ther we found on
2b0e0 65 20 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20  e or more cells 
2b0f0 28 63 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f  (cntnew[0])>0) o
2b100 72 20 77 65 20 61 72 65 20 74 68 65 0a 20 20 2a  r we are the.  *
2b110 2a 20 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74  * a virtual root
2b120 20 70 61 67 65 2e 20 20 41 20 76 69 72 74 75 61   page.  A virtua
2b130 6c 20 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77  l root page is w
2b140 68 65 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f  hen the real roo
2b150 74 0a 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70  t.  ** page is p
2b160 61 67 65 20 31 20 61 6e 64 20 77 65 20 61 72 65  age 1 and we are
2b170 20 74 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20   the only child 
2b180 6f 66 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20  of that page..  
2b190 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74  */.  assert( cnt
2b1a0 4e 65 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61  New[0]>0 || (pPa
2b1b0 72 65 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26  rent->pgno==1 &&
2b1c0 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d   pParent->nCell=
2b1d0 3d 30 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a  =0) );..  /*.  *
2b1e0 2a 20 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77  * Allocate k new
2b1f0 20 70 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f   pages.  Reuse o
2b200 6c 64 20 70 61 67 65 73 20 77 68 65 72 65 20 70  ld pages where p
2b210 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  ossible..  */.  
2b220 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
2b230 67 6e 6f 3e 31 20 29 3b 0a 20 20 70 61 67 65 46  gno>1 );.  pageF
2b240 6c 61 67 73 20 3d 20 70 50 61 67 65 2d 3e 61 44  lags = pPage->aD
2b250 61 74 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d  ata[0];.  for(i=
2b260 30 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<k; i++){.  
2b270 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b    MemPage *pNew;
2b280 0a 20 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20  .    if( i<nOld 
2b290 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20  ){.      pNew = 
2b2a0 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64  apNew[i] = apOld
2b2b0 5b 69 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e  [i];.      pgnoN
2b2c0 65 77 5b 69 5d 20 3d 20 70 67 6e 6f 4f 6c 64 5b  ew[i] = pgnoOld[
2b2d0 69 5d 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b  i];.      apOld[
2b2e0 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  i] = 0;.      rc
2b2f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2b300 72 69 74 65 28 70 4e 65 77 2d 3e 70 44 62 50 61  rite(pNew->pDbPa
2b310 67 65 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b  ge);.      nNew+
2b320 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  +;.      if( rc 
2b330 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
2b340 6c 65 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73  leanup;.    }els
2b350 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
2b360 20 69 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 63   i>0 );.      rc
2b370 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
2b380 50 61 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c  Page(pBt, &pNew,
2b390 20 26 70 67 6e 6f 4e 65 77 5b 69 5d 2c 20 70 67   &pgnoNew[i], pg
2b3a0 6e 6f 4e 65 77 5b 69 2d 31 5d 2c 20 30 29 3b 0a  noNew[i-1], 0);.
2b3b0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67        if( rc ) g
2b3c0 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
2b3d0 6e 75 70 3b 0a 20 20 20 20 20 20 61 70 4e 65 77  nup;.      apNew
2b3e0 5b 69 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  [i] = pNew;.    
2b3f0 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 7d 0a    nNew++;.    }.
2b400 20 20 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61    }..  /* Free a
2b410 6e 79 20 6f 6c 64 20 70 61 67 65 73 20 74 68 61  ny old pages tha
2b420 74 20 77 65 72 65 20 6e 6f 74 20 72 65 75 73 65  t were not reuse
2b430 64 20 61 73 20 6e 65 77 20 70 61 67 65 73 2e 0a  d as new pages..
2b440 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3c    */.  while( i<
2b450 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 72 63 20 3d  nOld ){.    rc =
2b460 20 66 72 65 65 50 61 67 65 28 61 70 4f 6c 64 5b   freePage(apOld[
2b470 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  i]);.    if( rc 
2b480 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63  ) goto balance_c
2b490 6c 65 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c 65  leanup;.    rele
2b4a0 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d  asePage(apOld[i]
2b4b0 29 3b 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20  );.    apOld[i] 
2b4c0 3d 20 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20  = 0;.    i++;.  
2b4d0 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74  }..  /*.  ** Put
2b4e0 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 20 69   the new pages i
2b4f0 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65  n accending orde
2b500 72 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 74  r.  This helps t
2b510 6f 0a 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74 72  o.  ** keep entr
2b520 69 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20  ies in the disk 
2b530 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 73 6f  file in order so
2b540 20 74 68 61 74 20 61 20 73 63 61 6e 0a 20 20 2a   that a scan.  *
2b550 2a 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69  * of the table i
2b560 73 20 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20  s a linear scan 
2b570 74 68 72 6f 75 67 68 20 74 68 65 20 66 69 6c 65  through the file
2b580 2e 20 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e 20  .  That.  ** in 
2b590 74 75 72 6e 20 68 65 6c 70 73 20 74 68 65 20 6f  turn helps the o
2b5a0 70 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20  perating system 
2b5b0 74 6f 20 64 65 6c 69 76 65 72 20 70 61 67 65 73  to deliver pages
2b5c0 0a 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64  .  ** from the d
2b5d0 69 73 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c 79  isk more rapidly
2b5e0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f  ..  **.  ** An O
2b5f0 28 6e 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e 20  (n^2) insertion 
2b600 73 6f 72 74 20 61 6c 67 6f 72 69 74 68 6d 20 69  sort algorithm i
2b610 73 20 75 73 65 64 2c 20 62 75 74 20 73 69 6e 63  s used, but sinc
2b620 65 0a 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76 65  e.  ** n is neve
2b630 72 20 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20 28  r more than NB (
2b640 61 20 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e 74  a small constant
2b650 29 2c 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 20  ), that should. 
2b660 20 2a 2a 20 6e 6f 74 20 62 65 20 61 20 70 72 6f   ** not be a pro
2b670 62 6c 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  blem..  **.  ** 
2b680 57 68 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73  When NB==3, this
2b690 20 6f 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f   one optimizatio
2b6a0 6e 20 6d 61 6b 65 73 20 74 68 65 20 64 61 74 61  n makes the data
2b6b0 62 61 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74 20  base.  ** about 
2b6c0 32 35 25 20 66 61 73 74 65 72 20 66 6f 72 20 6c  25% faster for l
2b6d0 61 72 67 65 20 69 6e 73 65 72 74 69 6f 6e 73 20  arge insertions 
2b6e0 61 6e 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a 20  and deletions.. 
2b6f0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
2b700 3c 6b 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <k-1; i++){.    
2b710 69 6e 74 20 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e  int minV = pgnoN
2b720 65 77 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6d  ew[i];.    int m
2b730 69 6e 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72  inI = i;.    for
2b740 28 6a 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b  (j=i+1; j<k; j++
2b750 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e  ){.      if( pgn
2b760 6f 4e 65 77 5b 6a 5d 3c 28 75 6e 73 69 67 6e 65  oNew[j]<(unsigne
2b770 64 29 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20 20  d)minV ){.      
2b780 20 20 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20    minI = j;.    
2b790 20 20 20 20 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e      minV = pgnoN
2b7a0 65 77 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a 20  ew[j];.      }. 
2b7b0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e     }.    if( min
2b7c0 49 3e 69 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  I>i ){.      int
2b7d0 20 74 3b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67   t;.      MemPag
2b7e0 65 20 2a 70 54 3b 0a 20 20 20 20 20 20 74 20 3d  e *pT;.      t =
2b7f0 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20   pgnoNew[i];.   
2b800 20 20 20 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d     pT = apNew[i]
2b810 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b  ;.      pgnoNew[
2b820 69 5d 20 3d 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e  i] = pgnoNew[min
2b830 49 5d 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b  I];.      apNew[
2b840 69 5d 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d  i] = apNew[minI]
2b850 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b  ;.      pgnoNew[
2b860 6d 69 6e 49 5d 20 3d 20 74 3b 0a 20 20 20 20 20  minI] = t;.     
2b870 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70   apNew[minI] = p
2b880 54 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54  T;.    }.  }.  T
2b890 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
2b8a0 6f 6c 64 3a 20 25 64 20 25 64 20 25 64 20 20 6e  old: %d %d %d  n
2b8b0 65 77 3a 20 25 64 28 25 64 29 20 25 64 28 25 64  ew: %d(%d) %d(%d
2b8c0 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  ) %d(%d) %d(%d) 
2b8d0 25 64 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 70  %d(%d)\n",.    p
2b8e0 67 6e 6f 4f 6c 64 5b 30 5d 2c 20 0a 20 20 20 20  gnoOld[0], .    
2b8f0 6e 4f 6c 64 3e 3d 32 20 3f 20 70 67 6e 6f 4f 6c  nOld>=2 ? pgnoOl
2b900 64 5b 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4f  d[1] : 0,.    nO
2b910 6c 64 3e 3d 33 20 3f 20 70 67 6e 6f 4f 6c 64 5b  ld>=3 ? pgnoOld[
2b920 32 5d 20 3a 20 30 2c 0a 20 20 20 20 70 67 6e 6f  2] : 0,.    pgno
2b930 4e 65 77 5b 30 5d 2c 20 73 7a 4e 65 77 5b 30 5d  New[0], szNew[0]
2b940 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20  ,.    nNew>=2 ? 
2b950 70 67 6e 6f 4e 65 77 5b 31 5d 20 3a 20 30 2c 20  pgnoNew[1] : 0, 
2b960 6e 4e 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b  nNew>=2 ? szNew[
2b970 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77  1] : 0,.    nNew
2b980 3e 3d 33 20 3f 20 70 67 6e 6f 4e 65 77 5b 32 5d  >=3 ? pgnoNew[2]
2b990 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20   : 0, nNew>=3 ? 
2b9a0 73 7a 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20  szNew[2] : 0,.  
2b9b0 20 20 6e 4e 65 77 3e 3d 34 20 3f 20 70 67 6e 6f    nNew>=4 ? pgno
2b9c0 4e 65 77 5b 33 5d 20 3a 20 30 2c 20 6e 4e 65 77  New[3] : 0, nNew
2b9d0 3e 3d 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a  >=4 ? szNew[3] :
2b9e0 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20   0,.    nNew>=5 
2b9f0 3f 20 70 67 6e 6f 4e 65 77 5b 34 5d 20 3a 20 30  ? pgnoNew[4] : 0
2ba00 2c 20 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65  , nNew>=5 ? szNe
2ba10 77 5b 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 2f  w[4] : 0));..  /
2ba20 2a 0a 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69  *.  ** Evenly di
2ba30 73 74 72 69 62 75 74 65 20 74 68 65 20 64 61 74  stribute the dat
2ba40 61 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63  a in apCell[] ac
2ba50 72 6f 73 73 20 74 68 65 20 6e 65 77 20 70 61 67  ross the new pag
2ba60 65 73 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20  es..  ** Insert 
2ba70 64 69 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e  divider cells in
2ba80 74 6f 20 70 50 61 72 65 6e 74 20 61 73 20 6e 65  to pParent as ne
2ba90 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20  cessary..  */.  
2baa0 6a 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  j = 0;.  for(i=0
2bab0 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a  ; i<nNew; i++){.
2bac0 20 20 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20      /* Assemble 
2bad0 74 68 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20  the new sibling 
2bae0 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d  page. */.    Mem
2baf0 50 61 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e  Page *pNew = apN
2bb00 65 77 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72  ew[i];.    asser
2bb10 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( j<nMaxCells )
2bb20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
2bb30 65 77 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 4e 65  ew->pgno==pgnoNe
2bb40 77 5b 69 5d 20 29 3b 0a 20 20 20 20 7a 65 72 6f  w[i] );.    zero
2bb50 50 61 67 65 28 70 4e 65 77 2c 20 70 61 67 65 46  Page(pNew, pageF
2bb60 6c 61 67 73 29 3b 0a 20 20 20 20 61 73 73 65 6d  lags);.    assem
2bb70 62 6c 65 50 61 67 65 28 70 4e 65 77 2c 20 63 6e  blePage(pNew, cn
2bb80 74 4e 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65  tNew[i]-j, &apCe
2bb90 6c 6c 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a  ll[j], &szCell[j
2bba0 5d 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ]);.    assert( 
2bbb0 70 4e 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c  pNew->nCell>0 ||
2bbc0 20 28 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74   (nNew==1 && cnt
2bbd0 4e 65 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20  New[0]==0) );.  
2bbe0 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
2bbf0 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
2bc00 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
2bc10 69 73 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75  is an auto-vacuu
2bc20 6d 20 64 61 74 61 62 61 73 65 2c 20 75 70 64 61  m database, upda
2bc30 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  te the pointer m
2bc40 61 70 20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a  ap entries.    *
2bc50 2a 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20  * that point to 
2bc60 74 68 65 20 73 69 62 6c 69 6e 67 73 20 74 68 61  the siblings tha
2bc70 74 20 77 65 72 65 20 72 65 61 72 72 61 6e 67 65  t were rearrange
2bc80 64 2e 20 54 68 65 73 65 20 63 61 6e 20 62 65 3a  d. These can be:
2bc90 20 6c 65 66 74 0a 20 20 20 20 2a 2a 20 63 68 69   left.    ** chi
2bca0 6c 64 72 65 6e 20 6f 66 20 63 65 6c 6c 73 2c 20  ldren of cells, 
2bcb0 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
2bcc0 6f 66 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20  of the page, or 
2bcd0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 0a 20  overflow pages. 
2bce0 20 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f     ** pointed to
2bcf0 20 62 79 20 63 65 6c 6c 73 2e 0a 20 20 20 20 2a   by cells..    *
2bd00 2f 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f  /.    if( ISAUTO
2bd10 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20  VACUUM ){.      
2bd20 66 6f 72 28 6b 3d 6a 3b 20 6b 3c 63 6e 74 4e 65  for(k=j; k<cntNe
2bd30 77 5b 69 5d 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20  w[i]; k++){.    
2bd40 20 20 20 20 61 73 73 65 72 74 28 20 6b 3c 6e 4d      assert( k<nM
2bd50 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
2bd60 20 20 20 69 66 28 20 61 46 72 6f 6d 5b 6b 5d 3d     if( aFrom[k]=
2bd70 3d 30 78 46 46 20 7c 7c 20 61 70 43 6f 70 79 5b  =0xFF || apCopy[
2bd80 61 46 72 6f 6d 5b 6b 5d 5d 2d 3e 70 67 6e 6f 21  aFrom[k]]->pgno!
2bd90 3d 70 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20  =pNew->pgno ){. 
2bda0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74           rc = pt
2bdb0 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 4e 65 77  rmapPutOvfl(pNew
2bdc0 2c 20 6b 2d 6a 29 3b 0a 20 20 20 20 20 20 20 20  , k-j);.        
2bdd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2bde0 5f 4f 4b 20 26 26 20 6c 65 61 66 43 6f 72 72 65  _OK && leafCorre
2bdf0 63 74 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  ction==0 ){.    
2be00 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72          rc = ptr
2be10 6d 61 70 50 75 74 28 70 42 74 2c 20 67 65 74 34  mapPut(pBt, get4
2be20 62 79 74 65 28 61 70 43 65 6c 6c 5b 6b 5d 29 2c  byte(apCell[k]),
2be30 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70   PTRMAP_BTREE, p
2be40 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  New->pgno);.    
2be50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2be60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2be70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2be80 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
2be90 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20  cleanup;.       
2bea0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2beb0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
2bec0 20 20 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b    j = cntNew[i];
2bed0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
2bee0 73 69 62 6c 69 6e 67 20 70 61 67 65 20 61 73 73  sibling page ass
2bef0 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 77 61 73  embled above was
2bf00 20 6e 6f 74 20 74 68 65 20 72 69 67 68 74 2d 6d   not the right-m
2bf10 6f 73 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20  ost sibling,.   
2bf20 20 2a 2a 20 69 6e 73 65 72 74 20 61 20 64 69 76   ** insert a div
2bf30 69 64 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74  ider cell into t
2bf40 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
2bf50 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69      */.    if( i
2bf60 3c 6e 4e 65 77 2d 31 20 26 26 20 6a 3c 6e 43 65  <nNew-1 && j<nCe
2bf70 6c 6c 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a  ll ){.      u8 *
2bf80 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20  pCell;.      u8 
2bf90 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e  *pTemp;.      in
2bfa0 74 20 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73  t sz;..      ass
2bfb0 65 72 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73  ert( j<nMaxCells
2bfc0 20 29 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20   );.      pCell 
2bfd0 3d 20 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20  = apCell[j];.   
2bfe0 20 20 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a     sz = szCell[j
2bff0 5d 20 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69  ] + leafCorrecti
2c000 6f 6e 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20  on;.      pTemp 
2c010 3d 20 26 61 53 70 61 63 65 32 5b 69 53 70 61 63  = &aSpace2[iSpac
2c020 65 32 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21  e2];.      if( !
2c030 70 4e 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  pNew->leaf ){.  
2c040 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
2c050 65 77 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43  ew->aData[8], pC
2c060 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  ell, 4);.       
2c070 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
2c080 4d 20 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  M .         && (
2c090 61 46 72 6f 6d 5b 6a 5d 3d 3d 30 78 46 46 20 7c  aFrom[j]==0xFF |
2c0a0 7c 20 61 70 43 6f 70 79 5b 61 46 72 6f 6d 5b 6a  | apCopy[aFrom[j
2c0b0 5d 5d 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e  ]]->pgno!=pNew->
2c0c0 70 67 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 7b  pgno).        ){
2c0d0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2c0e0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 67  ptrmapPut(pBt, g
2c0f0 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20  et4byte(pCell), 
2c100 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e  PTRMAP_BTREE, pN
2c110 65 77 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  ew->pgno);.     
2c120 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2c130 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2c140 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e        goto balan
2c150 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
2c160 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c170 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
2c180 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20  ( leafData ){.  
2c190 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
2c1a0 74 72 65 65 20 69 73 20 61 20 6c 65 61 66 2d 64  tree is a leaf-d
2c1b0 61 74 61 20 74 72 65 65 2c 20 61 6e 64 20 74 68  ata tree, and th
2c1c0 65 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6c  e siblings are l
2c1d0 65 61 76 65 73 2c 20 0a 20 20 20 20 20 20 20 20  eaves, .        
2c1e0 2a 2a 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  ** then there is
2c1f0 20 6e 6f 20 64 69 76 69 64 65 72 20 63 65 6c 6c   no divider cell
2c200 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e   in apCell[]. In
2c210 73 74 65 61 64 2c 20 74 68 65 20 64 69 76 69 64  stead, the divid
2c220 65 72 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  er .        ** c
2c230 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
2c240 74 68 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20  the integer key 
2c250 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  for the right-mo
2c260 73 74 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20  st cell of .    
2c270 20 20 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69      ** the sibli
2c280 6e 67 2d 70 61 67 65 20 61 73 73 65 6d 62 6c 65  ng-page assemble
2c290 64 20 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20  d above only..  
2c2a0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2c2b0 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
2c2c0 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20          j--;.   
2c2d0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
2c2e0 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 4e  eParseCellPtr(pN
2c2f0 65 77 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26  ew, apCell[j], &
2c300 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70  info);.        p
2c310 43 65 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20  Cell = pTemp;.  
2c320 20 20 20 20 20 20 72 63 20 3d 20 66 69 6c 6c 49        rc = fillI
2c330 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70  nCell(pParent, p
2c340 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b  Cell, 0, info.nK
2c350 65 79 2c 20 30 2c 20 30 2c 20 30 2c 20 26 73 7a  ey, 0, 0, 0, &sz
2c360 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2c370 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2c380 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
2c390 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
2c3a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c3b0 20 20 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20    pTemp = 0;.   
2c3c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c3d0 20 20 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20    pCell -= 4;.  
2c3e0 20 20 20 20 20 20 2f 2a 20 4f 62 73 63 75 72 65        /* Obscure
2c3f0 20 63 61 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65   case for non-le
2c400 61 66 2d 64 61 74 61 20 74 72 65 65 73 3a 20 49  af-data trees: I
2c410 66 20 74 68 65 20 63 65 6c 6c 20 61 74 20 70 43  f the cell at pC
2c420 65 6c 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20  ell was.        
2c430 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 73 74  ** previously st
2c440 6f 72 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 6e  ored on a leaf n
2c450 6f 64 65 2c 20 61 6e 64 20 69 74 73 20 72 65 70  ode, and its rep
2c460 6f 72 74 65 64 20 73 69 7a 65 20 77 61 73 20 34  orted size was 4
2c470 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65  .        ** byte
2c480 73 2c 20 74 68 65 6e 20 69 74 20 6d 61 79 20 61  s, then it may a
2c490 63 74 75 61 6c 6c 79 20 62 65 20 73 6d 61 6c 6c  ctually be small
2c4a0 65 72 20 74 68 61 6e 20 74 68 69 73 20 0a 20 20  er than this .  
2c4b0 20 20 20 20 20 20 2a 2a 20 28 73 65 65 20 73 71        ** (see sq
2c4c0 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
2c4d0 65 6c 6c 50 74 72 28 29 2c 20 34 20 62 79 74 65  ellPtr(), 4 byte
2c4e0 73 20 69 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d  s is the minimum
2c4f0 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 20 20 20   size of.       
2c500 20 2a 2a 20 61 6e 79 20 63 65 6c 6c 29 2e 20 42   ** any cell). B
2c510 75 74 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61  ut it is importa
2c520 6e 74 20 74 6f 20 70 61 73 73 20 74 68 65 20 63  nt to pass the c
2c530 6f 72 72 65 63 74 20 73 69 7a 65 20 74 6f 20 0a  orrect size to .
2c540 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72          ** inser
2c550 74 43 65 6c 6c 28 29 2c 20 73 6f 20 72 65 70 61  tCell(), so repa
2c560 72 73 65 20 74 68 65 20 63 65 6c 6c 20 6e 6f 77  rse the cell now
2c570 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
2c580 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61       ** Note tha
2c590 74 20 74 68 69 73 20 63 61 6e 20 6e 65 76 65 72  t this can never
2c5a0 20 68 61 70 70 65 6e 20 69 6e 20 61 6e 20 53 51   happen in an SQ
2c5b0 4c 69 74 65 20 64 61 74 61 20 66 69 6c 65 2c 20  Lite data file, 
2c5c0 61 73 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a  as all.        *
2c5d0 2a 20 63 65 6c 6c 73 20 61 72 65 20 61 74 20 6c  * cells are at l
2c5e0 65 61 73 74 20 34 20 62 79 74 65 73 2e 20 49 74  east 4 bytes. It
2c5f0 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 6e   only happens in
2c600 20 62 2d 74 72 65 65 73 20 75 73 65 64 0a 20 20   b-trees used.  
2c610 20 20 20 20 20 20 2a 2a 20 74 6f 20 65 76 61 6c        ** to eval
2c620 75 61 74 65 20 22 49 4e 20 28 53 45 4c 45 43 54  uate "IN (SELECT
2c630 20 2e 2e 2e 29 22 20 61 6e 64 20 73 69 6d 69 6c   ...)" and simil
2c640 61 72 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20  ar clauses..    
2c650 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
2c660 66 28 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20  f( szCell[j]==4 
2c670 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
2c680 65 72 74 28 6c 65 61 66 43 6f 72 72 65 63 74 69  ert(leafCorrecti
2c690 6f 6e 3d 3d 34 29 3b 0a 20 20 20 20 20 20 20 20  on==4);.        
2c6a0 20 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50    sz = cellSizeP
2c6b0 74 72 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c  tr(pParent, pCel
2c6c0 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  l);.        }.  
2c6d0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 53 70 61      }.      iSpa
2c6e0 63 65 32 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20  ce2 += sz;.     
2c6f0 20 61 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74   assert( sz<=pBt
2c700 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20 29 3b 0a  ->pageSize/4 );.
2c710 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 53        assert( iS
2c720 70 61 63 65 32 3c 3d 70 42 74 2d 3e 70 61 67 65  pace2<=pBt->page
2c730 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 72 63  Size );.      rc
2c740 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50   = insertCell(pP
2c750 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43  arent, nxDiv, pC
2c760 65 6c 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20  ell, sz, pTemp, 
2c770 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  4);.      if( rc
2c780 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
2c790 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
2c7a0 75 70 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  up;.      assert
2c7b0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2c7c0 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e  writeable(pParen
2c7d0 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  t->pDbPage) );. 
2c7e0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 66 69       put4byte(fi
2c7f0 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
2c800 50 61 72 65 6e 74 2c 6e 78 44 69 76 29 2c 20 70  Parent,nxDiv), p
2c810 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20  New->pgno);..   
2c820 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
2c830 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
2c840 64 61 74 61 62 61 73 65 2c 20 61 6e 64 20 6e 6f  database, and no
2c850 74 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72  t a leaf-data tr
2c860 65 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ee,.      ** the
2c870 6e 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69  n update the poi
2c880 6e 74 65 72 20 6d 61 70 20 77 69 74 68 20 61 6e  nter map with an
2c890 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f   entry for the o
2c8a0 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20  verflow page.   
2c8b0 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 63     ** that the c
2c8c0 65 6c 6c 20 6a 75 73 74 20 69 6e 73 65 72 74 65  ell just inserte
2c8d0 64 20 70 6f 69 6e 74 73 20 74 6f 20 28 69 66 20  d points to (if 
2c8e0 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  any)..      */. 
2c8f0 20 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56       if( ISAUTOV
2c900 41 43 55 55 4d 20 26 26 20 21 6c 65 61 66 44 61  ACUUM && !leafDa
2c910 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ta ){.        rc
2c920 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c   = ptrmapPutOvfl
2c930 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 29  (pParent, nxDiv)
2c940 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
2c950 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2c960 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61           goto ba
2c970 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
2c980 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2c990 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20  .      j++;.    
2c9a0 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20 20 7d    nxDiv++;.    }
2c9b0 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
2c9c0 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
2c9d0 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73  ry for the new s
2c9e0 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a  ibling page. */.
2c9f0 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
2ca00 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 72 63  CUUM ){.      rc
2ca10 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
2ca20 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50 54  , pNew->pgno, PT
2ca30 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72  RMAP_BTREE, pPar
2ca40 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  ent->pgno);.    
2ca50 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2ca60 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
2ca70 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
2ca80 6e 75 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nup;.      }.   
2ca90 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
2caa0 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61   j==nCell );.  a
2cab0 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b  ssert( nOld>0 );
2cac0 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e  .  assert( nNew>
2cad0 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67 65  0 );.  if( (page
2cae0 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41 46  Flags & PTF_LEAF
2caf0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38 20 2a  )==0 ){.    u8 *
2cb00 7a 43 68 69 6c 64 20 3d 20 26 61 70 43 6f 70 79  zChild = &apCopy
2cb10 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b  [nOld-1]->aData[
2cb20 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  8];.    memcpy(&
2cb30 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61  apNew[nNew-1]->a
2cb40 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c  Data[8], zChild,
2cb50 20 34 29 3b 0a 20 20 20 20 69 66 28 20 49 53 41   4);.    if( ISA
2cb60 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
2cb70 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
2cb80 74 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  t(pBt, get4byte(
2cb90 7a 43 68 69 6c 64 29 2c 20 50 54 52 4d 41 50 5f  zChild), PTRMAP_
2cba0 42 54 52 45 45 2c 20 61 70 4e 65 77 5b 6e 4e 65  BTREE, apNew[nNe
2cbb0 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  w-1]->pgno);.   
2cbc0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2cbd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2cbe0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
2cbf0 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  anup;.      }.  
2cc00 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
2cc10 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
2cc20 77 72 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e  writeable(pParen
2cc30 74 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20  t->pDbPage) );. 
2cc40 20 69 66 28 20 6e 78 44 69 76 3d 3d 70 50 61 72   if( nxDiv==pPar
2cc50 65 6e 74 2d 3e 6e 43 65 6c 6c 2b 70 50 61 72 65  ent->nCell+pPare
2cc60 6e 74 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b  nt->nOverflow ){
2cc70 0a 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d 6f  .    /* Right-mo
2cc80 73 74 20 73 69 62 6c 69 6e 67 20 69 73 20 74 68  st sibling is th
2cc90 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69  e right-most chi
2cca0 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 20 2a 2f  ld of pParent */
2ccb0 0a 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70  .    put4byte(&p
2ccc0 50 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50  Parent->aData[pP
2ccd0 61 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74  arent->hdrOffset
2cce0 2b 38 5d 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65  +8], pgnoNew[nNe
2ccf0 77 2d 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  w-1]);.  }else{.
2cd00 20 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d 6f 73      /* Right-mos
2cd10 74 20 73 69 62 6c 69 6e 67 20 69 73 20 74 68 65  t sibling is the
2cd20 20 6c 65 66 74 20 63 68 69 6c 64 20 6f 66 20 74   left child of t
2cd30 68 65 20 66 69 72 73 74 20 65 6e 74 72 79 20 69  he first entry i
2cd40 6e 20 70 50 61 72 65 6e 74 0a 20 20 20 20 2a 2a  n pParent.    **
2cd50 20 70 61 73 74 20 74 68 65 20 72 69 67 68 74 2d   past the right-
2cd60 6d 6f 73 74 20 64 69 76 69 64 65 72 20 65 6e 74  most divider ent
2cd70 72 79 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79  ry */.    put4by
2cd80 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  te(findOverflowC
2cd90 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44  ell(pParent, nxD
2cda0 69 76 29 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65  iv), pgnoNew[nNe
2cdb0 77 2d 31 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  w-1]);.  }..  /*
2cdc0 0a 20 20 2a 2a 20 42 61 6c 61 6e 63 65 20 74 68  .  ** Balance th
2cdd0 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 20 20  e parent page.  
2cde0 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 63 75  Note that the cu
2cdf0 72 72 65 6e 74 20 70 61 67 65 20 28 70 50 61 67  rrent page (pPag
2ce00 65 29 20 6d 69 67 68 74 0a 20 20 2a 2a 20 68 61  e) might.  ** ha
2ce10 76 65 20 62 65 65 6e 20 61 64 64 65 64 20 74 6f  ve been added to
2ce20 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 73 6f   the freelist so
2ce30 20 69 74 20 6d 69 67 68 74 20 6e 6f 20 6c 6f 6e   it might no lon
2ce40 67 65 72 20 62 65 20 69 6e 69 74 69 61 6c 69 7a  ger be initializ
2ce50 65 64 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68 65  ed..  ** But the
2ce60 20 70 61 72 65 6e 74 20 70 61 67 65 20 77 69 6c   parent page wil
2ce70 6c 20 61 6c 77 61 79 73 20 62 65 20 69 6e 69 74  l always be init
2ce80 69 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20  ialized..  */.  
2ce90 61 73 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d  assert( pParent-
2cea0 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 73 71 6c  >isInit );.  sql
2ceb0 69 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28  ite3ScratchFree(
2cec0 61 70 43 65 6c 6c 29 3b 0a 20 20 61 70 43 65 6c  apCell);.  apCel
2ced0 6c 20 3d 20 30 3b 0a 20 20 54 52 41 43 45 28 28  l = 0;.  TRACE((
2cee0 22 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68  "BALANCE: finish
2cef0 65 64 20 77 69 74 68 20 25 64 3a 20 6f 6c 64 3d  ed with %d: old=
2cf00 25 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c 73 3d  %d new=%d cells=
2cf10 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
2cf20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 6e 4f   pPage->pgno, nO
2cf30 6c 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29  ld, nNew, nCell)
2cf40 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65  );.  pPage->nOve
2cf50 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 72 65 6c  rflow = 0;.  rel
2cf60 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
2cf70 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d  .  pCur->iPage--
2cf80 3b 0a 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65  ;.  rc = balance
2cf90 28 70 43 75 72 2c 20 30 29 3b 0a 20 20 0a 20 20  (pCur, 0);.  .  
2cfa0 2f 2a 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20  /*.  ** Cleanup 
2cfb0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
2cfc0 2e 0a 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63  ..  */.balance_c
2cfd0 6c 65 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65  leanup:.  sqlite
2cfe0 33 50 61 67 65 46 72 65 65 28 61 53 70 61 63 65  3PageFree(aSpace
2cff0 32 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 63 72  2);.  sqlite3Scr
2d000 61 74 63 68 46 72 65 65 28 61 70 43 65 6c 6c 29  atchFree(apCell)
2d010 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
2d020 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72  Old; i++){.    r
2d030 65 6c 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64  eleasePage(apOld
2d040 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  [i]);.  }.  for(
2d050 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b  i=0; i<nNew; i++
2d060 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  ){.    releasePa
2d070 67 65 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20  ge(apNew[i]);.  
2d080 7d 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65  }.  pCur->apPage
2d090 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e  [pCur->iPage]->n
2d0a0 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20  Overflow = 0;.. 
2d0b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2d0c0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2d0d0 65 20 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20  e is called for 
2d0e0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66  the root page of
2d0f0 20 61 20 62 74 72 65 65 20 77 68 65 6e 20 74 68   a btree when th
2d100 65 20 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 63  e root.** page c
2d110 6f 6e 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73  ontains no cells
2d120 2e 20 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70  .  This is an op
2d130 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 6d 61 6b  portunity to mak
2d140 65 20 74 68 65 20 74 72 65 65 0a 2a 2a 20 73 68  e the tree.** sh
2d150 61 6c 6c 6f 77 65 72 20 62 79 20 6f 6e 65 20 6c  allower by one l
2d160 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  evel..*/.static 
2d170 69 6e 74 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c  int balance_shal
2d180 6c 6f 77 65 72 28 42 74 43 75 72 73 6f 72 20 2a  lower(BtCursor *
2d190 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65  pCur){.  MemPage
2d1a0 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20   *pPage;        
2d1b0 20 20 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61        /* Root pa
2d1c0 67 65 20 6f 66 20 42 2d 54 72 65 65 20 2a 2f 0a  ge of B-Tree */.
2d1d0 20 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c    MemPage *pChil
2d1e0 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d;             /
2d1f0 2a 20 54 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64  * The only child
2d200 20 70 61 67 65 20 6f 66 20 70 50 61 67 65 20 2a   page of pPage *
2d210 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69  /.  Pgno pgnoChi
2d220 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
2d230 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
2d240 66 6f 72 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20  for pChild */.  
2d250 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2d260 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  OK;          /* 
2d270 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  Return code from
2d280 20 73 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a   subprocedures *
2d290 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
2d2a0 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
2d2b0 20 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20      /* The main 
2d2c0 42 54 72 65 65 20 73 74 72 75 63 74 75 72 65 20  BTree structure 
2d2d0 2a 2f 0a 20 20 69 6e 74 20 6d 78 43 65 6c 6c 50  */.  int mxCellP
2d2e0 65 72 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  erPage;         
2d2f0 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d    /* Maximum num
2d300 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 70 65 72  ber of cells per
2d310 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a   page */.  u8 **
2d320 61 70 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20  apCell;         
2d330 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63          /* All c
2d340 65 6c 6c 73 20 66 72 6f 6d 20 70 61 67 65 73 20  ells from pages 
2d350 62 65 69 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a  being balanced *
2d360 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b  /.  u16 *szCell;
2d370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d380 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f   /* Local size o
2d390 66 20 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 0a  f all cells */..
2d3a0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2d3b0 69 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20 70 50  iPage==0 );.  pP
2d3c0 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
2d3d0 67 65 5b 30 5d 3b 0a 0a 20 20 61 73 73 65 72 74  ge[0];..  assert
2d3e0 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ( pPage->nCell==
2d3f0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  0 );.  assert( s
2d400 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
2d410 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
2d420 74 65 78 29 20 29 3b 0a 20 20 70 42 74 20 3d 20  tex) );.  pBt = 
2d430 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 6d 78  pPage->pBt;.  mx
2d440 43 65 6c 6c 50 65 72 50 61 67 65 20 3d 20 4d 58  CellPerPage = MX
2d450 5f 43 45 4c 4c 28 70 42 74 29 3b 0a 20 20 61 70  _CELL(pBt);.  ap
2d460 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61  Cell = sqlite3Ma
2d470 6c 6c 6f 63 28 20 6d 78 43 65 6c 6c 50 65 72 50  lloc( mxCellPerP
2d480 61 67 65 2a 28 73 69 7a 65 6f 66 28 75 38 2a 29  age*(sizeof(u8*)
2d490 2b 73 69 7a 65 6f 66 28 75 31 36 29 29 20 29 3b  +sizeof(u16)) );
2d4a0 0a 20 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30  .  if( apCell==0
2d4b0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2d4c0 5f 4e 4f 4d 45 4d 3b 0a 20 20 73 7a 43 65 6c 6c  _NOMEM;.  szCell
2d4d0 20 3d 20 28 75 31 36 2a 29 26 61 70 43 65 6c 6c   = (u16*)&apCell
2d4e0 5b 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 5d 3b  [mxCellPerPage];
2d4f0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
2d500 61 66 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  af ){.    /* The
2d510 20 74 61 62 6c 65 20 69 73 20 63 6f 6d 70 6c 65   table is comple
2d520 74 65 6c 79 20 65 6d 70 74 79 20 2a 2f 0a 20 20  tely empty */.  
2d530 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
2d540 45 3a 20 65 6d 70 74 79 20 74 61 62 6c 65 20 25  E: empty table %
2d550 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e  d\n", pPage->pgn
2d560 6f 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  o));.  }else{.  
2d570 20 20 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61    /* The root pa
2d580 67 65 20 69 73 20 65 6d 70 74 79 20 62 75 74 20  ge is empty but 
2d590 68 61 73 20 6f 6e 65 20 63 68 69 6c 64 2e 20 20  has one child.  
2d5a0 54 72 61 6e 73 66 65 72 20 74 68 65 0a 20 20 20  Transfer the.   
2d5b0 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   ** information 
2d5c0 66 72 6f 6d 20 74 68 61 74 20 6f 6e 65 20 63 68  from that one ch
2d5d0 69 6c 64 20 69 6e 74 6f 20 74 68 65 20 72 6f 6f  ild into the roo
2d5e0 74 20 70 61 67 65 20 69 66 20 69 74 20 0a 20 20  t page if it .  
2d5f0 20 20 2a 2a 20 77 69 6c 6c 20 66 69 74 2e 20 20    ** will fit.  
2d600 54 68 69 73 20 72 65 64 75 63 65 73 20 74 68 65  This reduces the
2d610 20 64 65 70 74 68 20 6f 66 20 74 68 65 20 74 72   depth of the tr
2d620 65 65 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a  ee by one..    *
2d630 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
2d640 72 6f 6f 74 20 70 61 67 65 20 69 73 20 70 61 67  root page is pag
2d650 65 20 31 2c 20 69 74 20 68 61 73 20 6c 65 73 73  e 1, it has less
2d660 20 73 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65   space available
2d670 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 69 74 73   than.    ** its
2d680 20 63 68 69 6c 64 20 28 64 75 65 20 74 6f 20 74   child (due to t
2d690 68 65 20 31 30 30 20 62 79 74 65 20 68 65 61 64  he 100 byte head
2d6a0 65 72 20 74 68 61 74 20 6f 63 63 75 72 73 20 61  er that occurs a
2d6b0 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a  t the beginning.
2d6c0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 61      ** of the da
2d6d0 74 61 62 61 73 65 20 66 6c 65 29 2c 20 73 6f 20  tabase fle), so 
2d6e0 69 74 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20  it might not be 
2d6f0 61 62 6c 65 20 74 6f 20 68 6f 6c 64 20 61 6c 6c  able to hold all
2d700 20 6f 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20   of the .    ** 
2d710 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 75 72 72  information curr
2d720 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  ently contained 
2d730 69 6e 20 74 68 65 20 63 68 69 6c 64 2e 20 20 49  in the child.  I
2d740 66 20 74 68 69 73 20 69 73 20 74 68 65 20 0a 20  f this is the . 
2d750 20 20 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 6e     ** case, then
2d760 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 65 20 74   do not do the t
2d770 72 61 6e 73 66 65 72 2e 20 20 4c 65 61 76 65 20  ransfer.  Leave 
2d780 70 61 67 65 20 31 20 65 6d 70 74 79 20 65 78 63  page 1 empty exc
2d790 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74  ept.    ** for t
2d7a0 68 65 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72  he right-pointer
2d7b0 20 74 6f 20 74 68 65 20 63 68 69 6c 64 20 70 61   to the child pa
2d7c0 67 65 2e 20 20 54 68 65 20 63 68 69 6c 64 20 70  ge.  The child p
2d7d0 61 67 65 20 62 65 63 6f 6d 65 73 0a 20 20 20 20  age becomes.    
2d7e0 2a 2a 20 74 68 65 20 76 69 72 74 75 61 6c 20 72  ** the virtual r
2d7f0 6f 6f 74 20 6f 66 20 74 68 65 20 74 72 65 65 2e  oot of the tree.
2d800 0a 20 20 20 20 2a 2f 0a 20 20 20 20 56 56 41 5f  .    */.    VVA_
2d810 4f 4e 4c 59 28 20 70 43 75 72 2d 3e 70 61 67 65  ONLY( pCur->page
2d820 73 53 68 75 66 66 6c 65 64 20 3d 20 31 20 29 3b  sShuffled = 1 );
2d830 0a 20 20 20 20 70 67 6e 6f 43 68 69 6c 64 20 3d  .    pgnoChild =
2d840 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
2d850 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
2d860 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
2d870 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 43 68    assert( pgnoCh
2d880 69 6c 64 3e 30 20 29 3b 0a 20 20 20 20 61 73 73  ild>0 );.    ass
2d890 65 72 74 28 20 70 67 6e 6f 43 68 69 6c 64 3c 3d  ert( pgnoChild<=
2d8a0 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
2d8b0 50 61 67 65 2d 3e 70 42 74 29 20 29 3b 0a 20 20  Page->pBt) );.  
2d8c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
2d8d0 72 65 65 47 65 74 50 61 67 65 28 70 50 61 67 65  reeGetPage(pPage
2d8e0 2d 3e 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64  ->pBt, pgnoChild
2d8f0 2c 20 26 70 43 68 69 6c 64 2c 20 30 29 3b 0a 20  , &pChild, 0);. 
2d900 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2d910 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c   end_shallow_bal
2d920 61 6e 63 65 3b 0a 20 20 20 20 69 66 28 20 70 50  ance;.    if( pP
2d930 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a  age->pgno==1 ){.
2d940 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2d950 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65 28  e3BtreeInitPage(
2d960 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 69  pChild);.      i
2d970 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64  f( rc ) goto end
2d980 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65  _shallow_balance
2d990 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2d9a0 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  pChild->nOverflo
2d9b0 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  w==0 );.      if
2d9c0 28 20 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65 3e  ( pChild->nFree>
2d9d0 3d 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  =100 ){.        
2d9e0 2f 2a 20 54 68 65 20 63 68 69 6c 64 20 69 6e 66  /* The child inf
2d9f0 6f 72 6d 61 74 69 6f 6e 20 77 69 6c 6c 20 66 69  ormation will fi
2da00 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74 20 70 61  t on the root pa
2da10 67 65 2c 20 73 6f 20 64 6f 20 74 68 65 0a 20 20  ge, so do the.  
2da20 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 2a 2f        ** copy */
2da30 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
2da40 20 20 20 20 20 20 20 20 7a 65 72 6f 50 61 67 65          zeroPage
2da50 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e  (pPage, pChild->
2da60 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20  aData[0]);.     
2da70 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43     for(i=0; i<pC
2da80 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b  hild->nCell; i++
2da90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 43  ){.          apC
2daa0 65 6c 6c 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c  ell[i] = findCel
2dab0 6c 28 70 43 68 69 6c 64 2c 69 29 3b 0a 20 20 20  l(pChild,i);.   
2dac0 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 69 5d         szCell[i]
2dad0 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
2dae0 43 68 69 6c 64 2c 20 61 70 43 65 6c 6c 5b 69 5d  Child, apCell[i]
2daf0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2db00 20 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67       assemblePag
2db10 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d  e(pPage, pChild-
2db20 3e 6e 43 65 6c 6c 2c 20 61 70 43 65 6c 6c 2c 20  >nCell, apCell, 
2db30 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20  szCell);.       
2db40 20 2f 2a 20 43 6f 70 79 20 74 68 65 20 72 69 67   /* Copy the rig
2db50 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66 20 74 68  ht-pointer of th
2db60 65 20 63 68 69 6c 64 20 74 6f 20 74 68 65 20 70  e child to the p
2db70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20  arent. */.      
2db80 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2db90 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
2dba0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
2dbb0 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74  ) );.        put
2dbc0 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
2dbd0 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
2dbe0 66 73 65 74 2b 38 5d 2c 20 0a 20 20 20 20 20 20  fset+8], .      
2dbf0 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26        get4byte(&
2dc00 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 5b 70 43  pChild->aData[pC
2dc10 68 69 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b  hild->hdrOffset+
2dc20 38 5d 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63  8]));.        rc
2dc30 20 3d 20 66 72 65 65 50 61 67 65 28 70 43 68 69   = freePage(pChi
2dc40 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41  ld);.        TRA
2dc50 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 68  CE(("BALANCE: ch
2dc60 69 6c 64 20 25 64 20 74 72 61 6e 73 66 65 72 20  ild %d transfer 
2dc70 74 6f 20 70 61 67 65 20 31 5c 6e 22 2c 20 70 43  to page 1\n", pC
2dc80 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  hild->pgno));.  
2dc90 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2dca0 20 20 20 2f 2a 20 54 68 65 20 63 68 69 6c 64 20     /* The child 
2dcb0 68 61 73 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61  has more informa
2dcc0 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 66  tion that will f
2dcd0 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74 2e 0a  it on the root..
2dce0 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 74          ** The t
2dcf0 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 62  ree is already b
2dd00 61 6c 61 6e 63 65 64 2e 20 20 44 6f 20 6e 6f 74  alanced.  Do not
2dd10 68 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 20  hing. */.       
2dd20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45   TRACE(("BALANCE
2dd30 3a 20 63 68 69 6c 64 20 25 64 20 77 69 6c 6c 20  : child %d will 
2dd40 6e 6f 74 20 66 69 74 20 6f 6e 20 70 61 67 65 20  not fit on page 
2dd50 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67  1\n", pChild->pg
2dd60 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  no));.      }.  
2dd70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
2dd80 65 6d 63 70 79 28 70 50 61 67 65 2d 3e 61 44 61  emcpy(pPage->aDa
2dd90 74 61 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74  ta, pChild->aDat
2dda0 61 2c 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  a, pPage->pBt->u
2ddb0 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20  sableSize);.    
2ddc0 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20    pPage->isInit 
2ddd0 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  = 0;.      rc = 
2dde0 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
2ddf0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
2de00 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53     assert( rc==S
2de10 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
2de20 20 20 66 72 65 65 50 61 67 65 28 70 43 68 69 6c    freePage(pChil
2de30 64 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28  d);.      TRACE(
2de40 28 22 42 41 4c 41 4e 43 45 3a 20 74 72 61 6e 73  ("BALANCE: trans
2de50 66 65 72 20 63 68 69 6c 64 20 25 64 20 69 6e 74  fer child %d int
2de60 6f 20 72 6f 6f 74 20 25 64 5c 6e 22 2c 0a 20 20  o root %d\n",.  
2de70 20 20 20 20 20 20 20 20 20 20 20 20 70 43 68 69              pChi
2de80 6c 64 2d 3e 70 67 6e 6f 2c 20 70 50 61 67 65 2d  ld->pgno, pPage-
2de90 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20  >pgno));.    }. 
2dea0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2deb0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29  ->nOverflow==0 )
2dec0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
2ded0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
2dee0 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56  .    if( ISAUTOV
2def0 41 43 55 55 4d 20 26 26 20 72 63 3d 3d 53 51 4c  ACUUM && rc==SQL
2df00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2df10 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72  rc = setChildPtr
2df20 6d 61 70 73 28 70 50 61 67 65 29 3b 0a 20 20 20  maps(pPage);.   
2df30 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65   }.#endif.    re
2df40 6c 65 61 73 65 50 61 67 65 28 70 43 68 69 6c 64  leasePage(pChild
2df50 29 3b 0a 20 20 7d 0a 65 6e 64 5f 73 68 61 6c 6c  );.  }.end_shall
2df60 6f 77 5f 62 61 6c 61 6e 63 65 3a 0a 20 20 73 71  ow_balance:.  sq
2df70 6c 69 74 65 33 5f 66 72 65 65 28 61 70 43 65 6c  lite3_free(apCel
2df80 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  l);.  return rc;
2df90 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72  .}.../*.** The r
2dfa0 6f 6f 74 20 70 61 67 65 20 69 73 20 6f 76 65 72  oot page is over
2dfb0 66 75 6c 6c 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  full.**.** When 
2dfc0 74 68 69 73 20 68 61 70 70 65 6e 73 2c 20 43 72  this happens, Cr
2dfd0 65 61 74 65 20 61 20 6e 65 77 20 63 68 69 6c 64  eate a new child
2dfe0 20 70 61 67 65 20 61 6e 64 20 63 6f 70 79 20 74   page and copy t
2dff0 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  he.** contents o
2e000 66 20 74 68 65 20 72 6f 6f 74 20 69 6e 74 6f 20  f the root into 
2e010 74 68 65 20 63 68 69 6c 64 2e 20 20 54 68 65 6e  the child.  Then
2e020 20 6d 61 6b 65 20 74 68 65 20 72 6f 6f 74 0a 2a   make the root.*
2e030 2a 20 70 61 67 65 20 61 6e 20 65 6d 70 74 79 20  * page an empty 
2e040 70 61 67 65 20 77 69 74 68 20 72 69 67 68 74 43  page with rightC
2e050 68 69 6c 64 20 70 6f 69 6e 74 69 6e 67 20 74 6f  hild pointing to
2e060 20 74 68 65 20 6e 65 77 0a 2a 2a 20 63 68 69 6c   the new.** chil
2e070 64 2e 20 20 20 46 69 6e 61 6c 6c 79 2c 20 63 61  d.   Finally, ca
2e080 6c 6c 20 62 61 6c 61 6e 63 65 5f 69 6e 74 65 72  ll balance_inter
2e090 6e 61 6c 28 29 20 6f 6e 20 74 68 65 20 6e 65 77  nal() on the new
2e0a0 20 63 68 69 6c 64 0a 2a 2a 20 74 6f 20 63 61 75   child.** to cau
2e0b0 73 65 20 69 74 20 74 6f 20 73 70 6c 69 74 2e 0a  se it to split..
2e0c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61  */.static int ba
2e0d0 6c 61 6e 63 65 5f 64 65 65 70 65 72 28 42 74 43  lance_deeper(BtC
2e0e0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
2e0f0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
2e100 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61      /* Return va
2e110 6c 75 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63  lue from subproc
2e120 65 64 75 72 65 73 20 2a 2f 0a 20 20 4d 65 6d 50  edures */.  MemP
2e130 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20  age *pPage;     
2e140 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
2e150 65 20 72 6f 6f 74 20 70 61 67 65 20 2a 2f 0a 20  e root page */. 
2e160 20 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64   MemPage *pChild
2e170 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ;    /* Pointer 
2e180 74 6f 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70  to a new child p
2e190 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  age */.  Pgno pg
2e1a0 6e 6f 43 68 69 6c 64 3b 20 20 20 20 20 2f 2a 20  noChild;     /* 
2e1b0 50 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  Page number of t
2e1c0 68 65 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67  he new child pag
2e1d0 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20  e */.  BtShared 
2e1e0 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 2f 2a  *pBt;         /*
2e1f0 20 54 68 65 20 42 54 72 65 65 20 2a 2f 0a 20 20   The BTree */.  
2e200 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20  int usableSize; 
2e210 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20 75 73 61      /* Total usa
2e220 62 6c 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61  ble size of a pa
2e230 67 65 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61  ge */.  u8 *data
2e240 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ;           /* C
2e250 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
2e260 72 65 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 75  rent page */.  u
2e270 38 20 2a 63 64 61 74 61 3b 20 20 20 20 20 20 20  8 *cdata;       
2e280 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66     /* Content of
2e290 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20   the child page 
2e2a0 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20  */.  int hdr;   
2e2b0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73           /* Offs
2e2c0 65 74 20 74 6f 20 70 61 67 65 20 68 65 61 64 65  et to page heade
2e2d0 72 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 20  r in parent */. 
2e2e0 20 69 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20   int cbrk;      
2e2f0 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
2e300 6f 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69 72  o content of fir
2e310 73 74 20 63 65 6c 6c 20 69 6e 20 70 61 72 65 6e  st cell in paren
2e320 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  t */..  assert( 
2e330 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCur->iPage==0 )
2e340 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2e350 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 6e 4f 76  ->apPage[0]->nOv
2e360 65 72 66 6c 6f 77 3e 30 20 29 3b 0a 0a 20 20 56  erflow>0 );..  V
2e370 56 41 5f 4f 4e 4c 59 28 20 70 43 75 72 2d 3e 70  VA_ONLY( pCur->p
2e380 61 67 65 73 53 68 75 66 66 6c 65 64 20 3d 20 31  agesShuffled = 1
2e390 20 29 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43   );.  pPage = pC
2e3a0 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20  ur->apPage[0];. 
2e3b0 20 70 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42   pBt = pPage->pB
2e3c0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  t;.  assert( sql
2e3d0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2e3e0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
2e3f0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2e400 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2e410 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2e420 20 29 3b 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63   );.  rc = alloc
2e430 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
2e440 2c 20 26 70 43 68 69 6c 64 2c 20 26 70 67 6e 6f  , &pChild, &pgno
2e450 43 68 69 6c 64 2c 20 70 50 61 67 65 2d 3e 70 67  Child, pPage->pg
2e460 6e 6f 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  no, 0);.  if( rc
2e470 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2e480 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
2e490 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2e4a0 70 43 68 69 6c 64 2d 3e 70 44 62 50 61 67 65 29  pChild->pDbPage)
2e4b0 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   );.  usableSize
2e4c0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
2e4d0 7a 65 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61  ze;.  data = pPa
2e4e0 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72  ge->aData;.  hdr
2e4f0 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
2e500 73 65 74 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65  set;.  cbrk = ge
2e510 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
2e520 2b 35 5d 29 3b 0a 20 20 63 64 61 74 61 20 3d 20  +5]);.  cdata = 
2e530 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 3b 0a 20  pChild->aData;. 
2e540 20 6d 65 6d 63 70 79 28 63 64 61 74 61 2c 20 26   memcpy(cdata, &
2e550 64 61 74 61 5b 68 64 72 5d 2c 20 70 50 61 67 65  data[hdr], pPage
2e560 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70  ->cellOffset+2*p
2e570 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 68 64 72 29  Page->nCell-hdr)
2e580 3b 0a 20 20 6d 65 6d 63 70 79 28 26 63 64 61 74  ;.  memcpy(&cdat
2e590 61 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b 63  a[cbrk], &data[c
2e5a0 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65  brk], usableSize
2e5b0 2d 63 62 72 6b 29 3b 0a 0a 20 20 61 73 73 65 72  -cbrk);..  asser
2e5c0 74 28 20 70 43 68 69 6c 64 2d 3e 69 73 49 6e 69  t( pChild->isIni
2e5d0 74 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73  t==0 );.  rc = s
2e5e0 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50  qlite3BtreeInitP
2e5f0 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 69  age(pChild);.  i
2e600 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2e610 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 70   ){.    int nCop
2e620 79 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  y = pPage->nOver
2e630 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70 50 61 67  flow*sizeof(pPag
2e640 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 3b 0a 20 20  e->aOvfl[0]);.  
2e650 20 20 6d 65 6d 63 70 79 28 70 43 68 69 6c 64 2d    memcpy(pChild-
2e660 3e 61 4f 76 66 6c 2c 20 70 50 61 67 65 2d 3e 61  >aOvfl, pPage->a
2e670 4f 76 66 6c 2c 20 6e 43 6f 70 79 29 3b 0a 20 20  Ovfl, nCopy);.  
2e680 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66    pChild->nOverf
2e690 6c 6f 77 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76  low = pPage->nOv
2e6a0 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20  erflow;.    if( 
2e6b0 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  pChild->nOverflo
2e6c0 77 20 29 7b 0a 20 20 20 20 20 20 70 43 68 69 6c  w ){.      pChil
2e6d0 64 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20  d->nFree = 0;.  
2e6e0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
2e6f0 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70  pChild->nCell==p
2e700 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20  Page->nCell );. 
2e710 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2e720 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
2e730 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67  le(pPage->pDbPag
2e740 65 29 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61  e) );.    zeroPa
2e750 67 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64  ge(pPage, pChild
2e760 2d 3e 61 44 61 74 61 5b 30 5d 20 26 20 7e 50 54  ->aData[0] & ~PT
2e770 46 5f 4c 45 41 46 29 3b 0a 20 20 20 20 70 75 74  F_LEAF);.    put
2e780 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44  4byte(&pPage->aD
2e790 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66  ata[pPage->hdrOf
2e7a0 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 43 68 69  fset+8], pgnoChi
2e7b0 6c 64 29 3b 0a 20 20 20 20 54 52 41 43 45 28 28  ld);.    TRACE((
2e7c0 22 42 41 4c 41 4e 43 45 3a 20 63 6f 70 79 20 72  "BALANCE: copy r
2e7d0 6f 6f 74 20 25 64 20 69 6e 74 6f 20 25 64 5c 6e  oot %d into %d\n
2e7e0 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20  ", pPage->pgno, 
2e7f0 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a  pChild->pgno));.
2e800 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
2e810 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 72 63  CUUM ){.      rc
2e820 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
2e830 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20  , pChild->pgno, 
2e840 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50  PTRMAP_BTREE, pP
2e850 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e  age->pgno);.#ifn
2e860 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2e870 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
2e880 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2e890 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
2e8a0 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61   = setChildPtrma
2e8b0 70 73 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20  ps(pChild);.    
2e8c0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63    }.      if( rc
2e8d0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 68 69   ){.        pChi
2e8e0 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20  ld->nOverflow = 
2e8f0 30 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  0;.      }.#endi
2e900 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69  f.    }.  }..  i
2e910 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2e920 20 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69 50   ){.    pCur->iP
2e930 61 67 65 2b 2b 3b 0a 20 20 20 20 70 43 75 72 2d  age++;.    pCur-
2e940 3e 61 70 50 61 67 65 5b 31 5d 20 3d 20 70 43 68  >apPage[1] = pCh
2e950 69 6c 64 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61  ild;.    pCur->a
2e960 69 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 20  iIdx[0] = 0;.   
2e970 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f   rc = balance_no
2e980 6e 72 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d  nroot(pCur);.  }
2e990 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73  else{.    releas
2e9a0 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20  ePage(pChild);. 
2e9b0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
2e9c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61  .}../*.** The pa
2e9d0 67 65 20 74 68 61 74 20 70 43 75 72 20 63 75 72  ge that pCur cur
2e9e0 72 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f  rently points to
2e9f0 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 6d   has just been m
2ea00 6f 64 69 66 69 65 64 20 69 6e 0a 2a 2a 20 73 6f  odified in.** so
2ea10 6d 65 20 77 61 79 2e 20 54 68 69 73 20 66 75 6e  me way. This fun
2ea20 63 74 69 6f 6e 20 66 69 67 75 72 65 73 20 6f 75  ction figures ou
2ea30 74 20 69 66 20 74 68 69 73 20 6d 6f 64 69 66 69  t if this modifi
2ea40 63 61 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 65  cation means the
2ea50 0a 2a 2a 20 74 72 65 65 20 6e 65 65 64 73 20 74  .** tree needs t
2ea60 6f 20 62 65 20 62 61 6c 61 6e 63 65 64 2c 20 61  o be balanced, a
2ea70 6e 64 20 69 66 20 73 6f 20 63 61 6c 6c 73 20 74  nd if so calls t
2ea80 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 62  he appropriate b
2ea90 61 6c 61 6e 63 69 6e 67 20 0a 2a 2a 20 72 6f 75  alancing .** rou
2eaa0 74 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 50 61 72  tine..** .** Par
2eab0 61 6d 65 74 65 72 20 69 73 49 6e 73 65 72 74 20  ameter isInsert 
2eac0 69 73 20 74 72 75 65 20 69 66 20 61 20 6e 65 77  is true if a new
2ead0 20 63 65 6c 6c 20 77 61 73 20 6a 75 73 74 20 69   cell was just i
2eae0 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65  nserted into the
2eaf0 0a 2a 2a 20 70 61 67 65 2c 20 6f 72 20 66 61 6c  .** page, or fal
2eb00 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  se otherwise..*/
2eb10 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
2eb20 6e 63 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43  nce(BtCursor *pC
2eb30 75 72 2c 20 69 6e 74 20 69 73 49 6e 73 65 72 74  ur, int isInsert
2eb40 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2eb50 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61  LITE_OK;.  MemPa
2eb60 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72  ge *pPage = pCur
2eb70 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
2eb80 50 61 67 65 5d 3b 0a 0a 20 20 61 73 73 65 72 74  Page];..  assert
2eb90 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2eba0 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
2ebb0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
2ebc0 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20   pCur->iPage==0 
2ebd0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
2ebe0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
2ebf0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
2ec00 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2ec10 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e  E_OK && pPage->n
2ec20 4f 76 65 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20  Overflow>0 ){.  
2ec30 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65      rc = balance
2ec40 5f 64 65 65 70 65 72 28 70 43 75 72 29 3b 0a 20  _deeper(pCur);. 
2ec50 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75       assert( pCu
2ec60 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3d 3d 70 50  r->apPage[0]==pP
2ec70 61 67 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  age );.      ass
2ec80 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65  ert( pPage->nOve
2ec90 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 72 63 21 3d  rflow==0 || rc!=
2eca0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20  SQLITE_OK );.   
2ecb0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
2ecc0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
2ecd0 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20  e->nCell==0 ){. 
2ece0 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
2ecf0 65 5f 73 68 61 6c 6c 6f 77 65 72 28 70 43 75 72  e_shallower(pCur
2ed00 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
2ed10 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
2ed20 3d 3d 70 50 61 67 65 20 29 3b 0a 20 20 20 20 20  ==pPage );.     
2ed30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2ed40 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20  nOverflow==0 || 
2ed50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
2ed60 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
2ed70 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e      if( pPage->n
2ed80 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 0a 20  Overflow>0 || . 
2ed90 20 20 20 20 20 20 20 28 21 69 73 49 6e 73 65 72         (!isInser
2eda0 74 20 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65  t && pPage->nFre
2edb0 65 3e 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  e>pPage->pBt->us
2edc0 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29 20 29 7b  ableSize*2/3) ){
2edd0 0a 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61  .      rc = bala
2ede0 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70 43 75 72  nce_nonroot(pCur
2edf0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
2ee00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2ee10 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2ee20 63 68 65 63 6b 73 20 61 6c 6c 20 63 75 72 73 6f  checks all curso
2ee30 72 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f  rs that point to
2ee40 20 74 61 62 6c 65 20 70 67 6e 6f 52 6f 6f 74 2e   table pgnoRoot.
2ee50 0a 2a 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68  .** If any of th
2ee60 6f 73 65 20 63 75 72 73 6f 72 73 20 77 65 72 65  ose cursors were
2ee70 20 6f 70 65 6e 65 64 20 77 69 74 68 20 77 72 46   opened with wrF
2ee80 6c 61 67 3d 3d 30 20 69 6e 20 61 20 64 69 66 66  lag==0 in a diff
2ee90 65 72 65 6e 74 0a 2a 2a 20 64 61 74 61 62 61 73  erent.** databas
2eea0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 28 61 20  e connection (a 
2eeb0 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2eec0 69 6f 6e 20 74 68 61 74 20 73 68 61 72 65 73 20  ion that shares 
2eed0 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 63 61 63  the pager.** cac
2eee0 68 65 20 77 69 74 68 20 74 68 65 20 63 75 72 72  he with the curr
2eef0 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 20  ent connection) 
2ef00 61 6e 64 20 74 68 61 74 20 6f 74 68 65 72 20 63  and that other c
2ef10 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 69 73  onnection .** is
2ef20 20 6e 6f 74 20 69 6e 20 74 68 65 20 52 65 61 64   not in the Read
2ef30 55 6e 63 6f 6d 6d 6d 69 74 74 65 64 20 73 74 61  Uncommmitted sta
2ef40 74 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f  te, then this ro
2ef50 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 0a 2a  utine returns .*
2ef60 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e  * SQLITE_LOCKED.
2ef70 0a 2a 2a 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61  .**.** As well a
2ef80 73 20 63 75 72 73 6f 72 73 20 77 69 74 68 20 77  s cursors with w
2ef90 72 46 6c 61 67 3d 3d 30 2c 20 63 75 72 73 6f 72  rFlag==0, cursor
2efa0 73 20 77 69 74 68 20 0a 2a 2a 20 69 73 49 6e 63  s with .** isInc
2efb0 72 62 6c 6f 62 48 61 6e 64 6c 65 3d 3d 31 20 61  rblobHandle==1 a
2efc0 72 65 20 61 6c 73 6f 20 63 6f 6e 73 69 64 65 72  re also consider
2efd0 65 64 20 27 72 65 61 64 27 20 63 75 72 73 6f 72  ed 'read' cursor
2efe0 73 20 62 65 63 61 75 73 65 0a 2a 2a 20 69 6e 63  s because.** inc
2eff0 72 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75  remental blob cu
2f000 72 73 6f 72 73 20 61 72 65 20 75 73 65 64 20 66  rsors are used f
2f010 6f 72 20 62 6f 74 68 20 72 65 61 64 69 6e 67 20  or both reading 
2f020 61 6e 64 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a  and writing..**.
2f030 2a 2a 20 57 68 65 6e 20 70 67 6e 6f 52 6f 6f 74  ** When pgnoRoot
2f040 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67   is the root pag
2f050 65 20 6f 66 20 61 6e 20 69 6e 74 6b 65 79 20 74  e of an intkey t
2f060 61 62 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74  able, this funct
2f070 69 6f 6e 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 72  ion is also.** r
2f080 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 69  esponsible for i
2f090 6e 76 61 6c 69 64 61 74 69 6e 67 20 69 6e 63 72  nvalidating incr
2f0a0 65 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72  emental blob cur
2f0b0 73 6f 72 73 20 77 68 65 6e 20 74 68 65 20 74 61  sors when the ta
2f0c0 62 6c 65 20 72 6f 77 0a 2a 2a 20 6f 6e 20 77 68  ble row.** on wh
2f0d0 69 63 68 20 74 68 65 79 20 61 72 65 20 6f 70 65  ich they are ope
2f0e0 6e 65 64 20 69 73 20 64 65 6c 65 74 65 64 20 6f  ned is deleted o
2f0f0 72 20 6d 6f 64 69 66 69 65 64 2e 20 43 75 72 73  r modified. Curs
2f100 6f 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ors are invalida
2f110 74 65 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67  ted.** according
2f120 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   to the followin
2f130 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  g rules:.**.**  
2f140 20 31 29 20 57 68 65 6e 20 42 74 72 65 65 43 6c   1) When BtreeCl
2f150 65 61 72 54 61 62 6c 65 28 29 20 69 73 20 63 61  earTable() is ca
2f160 6c 6c 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65  lled to complete
2f170 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20 63 6f  ly delete the co
2f180 6e 74 65 6e 74 73 0a 2a 2a 20 20 20 20 20 20 6f  ntents.**      o
2f190 66 20 61 20 42 2d 54 72 65 65 20 74 61 62 6c 65  f a B-Tree table
2f1a0 2c 20 70 45 78 63 6c 75 64 65 20 69 73 20 73 65  , pExclude is se
2f1b0 74 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 70 61  t to zero and pa
2f1c0 72 61 6d 65 74 65 72 20 69 52 6f 77 20 69 73 20  rameter iRow is 
2f1d0 0a 2a 2a 20 20 20 20 20 20 73 65 74 20 74 6f 20  .**      set to 
2f1e0 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 69  non-zero. In thi
2f1f0 73 20 63 61 73 65 20 61 6c 6c 20 69 6e 63 72 65  s case all incre
2f200 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73  mental blob curs
2f210 6f 72 73 20 6f 70 65 6e 0a 2a 2a 20 20 20 20 20  ors open.**     
2f220 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 72 6f   on the table ro
2f230 6f 74 65 64 20 61 74 20 70 67 6e 6f 52 6f 6f 74  oted at pgnoRoot
2f240 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
2f250 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65  ..**.**   2) Whe
2f260 6e 20 42 74 72 65 65 49 6e 73 65 72 74 28 29 2c  n BtreeInsert(),
2f270 20 42 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f   BtreeDelete() o
2f280 72 20 42 74 72 65 65 50 75 74 44 61 74 61 28 29  r BtreePutData()
2f290 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 0a 2a   is called to .*
2f2a0 2a 20 20 20 20 20 20 6d 6f 64 69 66 79 20 61 20  *      modify a 
2f2b0 74 61 62 6c 65 20 72 6f 77 20 76 69 61 20 61 6e  table row via an
2f2c0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20   SQL statement, 
2f2d0 70 45 78 63 6c 75 64 65 20 69 73 20 73 65 74 20  pExclude is set 
2f2e0 74 6f 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20  to the .**      
2f2f0 77 72 69 74 65 20 63 75 72 73 6f 72 20 75 73 65  write cursor use
2f300 64 20 74 6f 20 64 6f 20 74 68 65 20 6d 6f 64 69  d to do the modi
2f310 66 69 63 61 74 69 6f 6e 20 61 6e 64 20 70 61 72  fication and par
2f320 61 6d 65 74 65 72 20 69 52 6f 77 20 69 73 20 73  ameter iRow is s
2f330 65 74 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68  et.**      to th
2f340 65 20 69 6e 74 65 67 65 72 20 72 6f 77 20 69 64  e integer row id
2f350 20 6f 66 20 74 68 65 20 42 2d 54 72 65 65 20 65   of the B-Tree e
2f360 6e 74 72 79 20 62 65 69 6e 67 20 6d 6f 64 69 66  ntry being modif
2f370 69 65 64 2e 20 55 6e 6c 65 73 73 0a 2a 2a 20 20  ied. Unless.**  
2f380 20 20 20 20 70 45 78 63 6c 75 64 65 20 69 73 20      pExclude is 
2f390 69 74 73 65 6c 66 20 61 6e 20 69 6e 63 72 65 6d  itself an increm
2f3a0 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f  ental blob curso
2f3b0 72 2c 20 74 68 65 6e 20 61 6c 6c 20 69 6e 63 72  r, then all incr
2f3c0 65 6d 65 6e 74 61 6c 0a 2a 2a 20 20 20 20 20 20  emental.**      
2f3d0 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65  blob cursors ope
2f3e0 6e 20 6f 6e 20 72 6f 77 20 69 52 6f 77 20 6f 66  n on row iRow of
2f3f0 20 74 68 65 20 42 2d 54 72 65 65 20 61 72 65 20   the B-Tree are 
2f400 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2a 0a  invalidated..**.
2f410 2a 2a 20 20 20 33 29 20 49 66 20 62 6f 74 68 20  **   3) If both 
2f420 70 45 78 63 6c 75 64 65 20 61 6e 64 20 69 52 6f  pExclude and iRo
2f430 77 20 61 72 65 20 73 65 74 20 74 6f 20 7a 65 72  w are set to zer
2f440 6f 2c 20 6e 6f 20 69 6e 63 72 65 6d 65 6e 74 61  o, no incrementa
2f450 6c 20 62 6c 6f 62 20 0a 2a 2a 20 20 20 20 20 20  l blob .**      
2f460 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e 76 61  cursors are inva
2f470 6c 69 64 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  lidated..*/.stat
2f480 69 63 20 69 6e 74 20 63 68 65 63 6b 46 6f 72 52  ic int checkForR
2f490 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 0a 20 20  eadConflicts(.  
2f4a0 42 74 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20  Btree *pBtree,  
2f4b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
2f4c0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
2f4d0 63 68 65 63 6b 20 2a 2f 0a 20 20 50 67 6e 6f 20  check */.  Pgno 
2f4e0 70 67 6e 6f 52 6f 6f 74 2c 20 20 20 20 20 20 20  pgnoRoot,       
2f4f0 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 72     /* Look for r
2f500 65 61 64 20 63 75 72 73 6f 72 73 20 6f 6e 20 74  ead cursors on t
2f510 68 69 73 20 62 74 72 65 65 20 2a 2f 0a 20 20 42  his btree */.  B
2f520 74 43 75 72 73 6f 72 20 2a 70 45 78 63 6c 75 64  tCursor *pExclud
2f530 65 2c 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65  e,     /* Ignore
2f540 20 74 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a   this cursor */.
2f550 20 20 69 36 34 20 69 52 6f 77 20 20 20 20 20 20    i64 iRow      
2f560 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2f570 20 72 6f 77 69 64 20 74 68 61 74 20 6d 69 67 68   rowid that migh
2f580 74 20 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f  t be changing */
2f590 0a 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  .){.  BtCursor *
2f5a0 70 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  p;.  BtShared *p
2f5b0 42 74 20 3d 20 70 42 74 72 65 65 2d 3e 70 42 74  Bt = pBtree->pBt
2f5c0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
2f5d0 3d 20 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20  = pBtree->db;.  
2f5e0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42  assert( sqlite3B
2f5f0 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70  treeHoldsMutex(p
2f600 42 74 72 65 65 29 20 29 3b 0a 20 20 66 6f 72 28  Btree) );.  for(
2f610 70 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20  p=pBt->pCursor; 
2f620 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a  p; p=p->pNext){.
2f630 20 20 20 20 69 66 28 20 70 3d 3d 70 45 78 63 6c      if( p==pExcl
2f640 75 64 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ude ) continue;.
2f650 20 20 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52      if( p->pgnoR
2f660 6f 6f 74 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 20  oot!=pgnoRoot ) 
2f670 63 6f 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65  continue;.#ifnde
2f680 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
2f690 43 52 42 4c 4f 42 0a 20 20 20 20 69 66 28 20 70  CRBLOB.    if( p
2f6a0 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  ->isIncrblobHand
2f6b0 6c 65 20 26 26 20 28 20 0a 20 20 20 20 20 20 20  le && ( .       
2f6c0 20 20 28 21 70 45 78 63 6c 75 64 65 20 26 26 20    (!pExclude && 
2f6d0 69 52 6f 77 29 0a 20 20 20 20 20 20 7c 7c 20 28  iRow).      || (
2f6e0 70 45 78 63 6c 75 64 65 20 26 26 20 21 70 45 78  pExclude && !pEx
2f6f0 63 6c 75 64 65 2d 3e 69 73 49 6e 63 72 62 6c 6f  clude->isIncrblo
2f700 62 48 61 6e 64 6c 65 20 26 26 20 70 2d 3e 69 6e  bHandle && p->in
2f710 66 6f 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 0a 20  fo.nKey==iRow). 
2f720 20 20 20 29 29 7b 0a 20 20 20 20 20 20 70 2d 3e     )){.      p->
2f730 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f  eState = CURSOR_
2f740 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 7d 0a 23  INVALID;.    }.#
2f750 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 70 2d  endif.    if( p-
2f760 3e 65 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f  >eState!=CURSOR_
2f770 56 41 4c 49 44 20 29 20 63 6f 6e 74 69 6e 75 65  VALID ) continue
2f780 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 77 72 46  ;.    if( p->wrF
2f790 6c 61 67 3d 3d 30 20 0a 23 69 66 6e 64 65 66 20  lag==0 .#ifndef 
2f7a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
2f7b0 42 4c 4f 42 0a 20 20 20 20 20 7c 7c 20 70 2d 3e  BLOB.     || p->
2f7c0 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
2f7d0 0a 23 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20  .#endif.    ){. 
2f7e0 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62       sqlite3 *db
2f7f0 4f 74 68 65 72 20 3d 20 70 2d 3e 70 42 74 72 65  Other = p->pBtre
2f800 65 2d 3e 64 62 3b 0a 20 20 20 20 20 20 61 73 73  e->db;.      ass
2f810 65 72 74 28 64 62 4f 74 68 65 72 29 3b 0a 20 20  ert(dbOther);.  
2f820 20 20 20 20 69 66 28 20 64 62 4f 74 68 65 72 21      if( dbOther!
2f830 3d 64 62 20 26 26 20 28 64 62 4f 74 68 65 72 2d  =db && (dbOther-
2f840 3e 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  >flags & SQLITE_
2f850 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29  ReadUncommitted)
2f860 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
2f870 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e  qlite3Connection
2f880 42 6c 6f 63 6b 65 64 28 64 62 2c 20 64 62 4f 74  Blocked(db, dbOt
2f890 68 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65  her);.        re
2f8a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  turn SQLITE_LOCK
2f8b0 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a  ED_SHAREDCACHE;.
2f8c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2f8d0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
2f8e0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
2f8f0 6e 73 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f  nsert a new reco
2f900 72 64 20 69 6e 74 6f 20 74 68 65 20 42 54 72 65  rd into the BTre
2f910 65 2e 20 20 54 68 65 20 6b 65 79 20 69 73 20 67  e.  The key is g
2f920 69 76 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b  iven by (pKey,nK
2f930 65 79 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ey).** and the d
2f940 61 74 61 20 69 73 20 67 69 76 65 6e 20 62 79 20  ata is given by 
2f950 28 70 44 61 74 61 2c 6e 44 61 74 61 29 2e 20 20  (pData,nData).  
2f960 54 68 65 20 63 75 72 73 6f 72 20 69 73 20 75 73  The cursor is us
2f970 65 64 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65  ed only to.** de
2f980 66 69 6e 65 20 77 68 61 74 20 74 61 62 6c 65 20  fine what table 
2f990 74 68 65 20 72 65 63 6f 72 64 20 73 68 6f 75 6c  the record shoul
2f9a0 64 20 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e  d be inserted in
2f9b0 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a  to.  The cursor.
2f9c0 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  ** is left point
2f9d0 69 6e 67 20 61 74 20 61 20 72 61 6e 64 6f 6d 20  ing at a random 
2f9e0 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  location..**.** 
2f9f0 46 6f 72 20 61 6e 20 49 4e 54 4b 45 59 20 74 61  For an INTKEY ta
2fa00 62 6c 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b  ble, only the nK
2fa10 65 79 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ey value of the 
2fa20 6b 65 79 20 69 73 20 75 73 65 64 2e 20 20 70 4b  key is used.  pK
2fa30 65 79 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64  ey is.** ignored
2fa40 2e 20 20 46 6f 72 20 61 20 5a 45 52 4f 44 41 54  .  For a ZERODAT
2fa50 41 20 74 61 62 6c 65 2c 20 74 68 65 20 70 44 61  A table, the pDa
2fa60 74 61 20 61 6e 64 20 6e 44 61 74 61 20 61 72 65  ta and nData are
2fa70 20 62 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a   both ignored..*
2fa80 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
2fa90 65 65 49 6e 73 65 72 74 28 0a 20 20 42 74 43 75  eeInsert(.  BtCu
2faa0 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20  rsor *pCur,     
2fab0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
2fac0 73 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74  sert data into t
2fad0 68 65 20 74 61 62 6c 65 20 6f 66 20 74 68 69 73  he table of this
2fae0 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e   cursor */.  con
2faf0 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69  st void *pKey, i
2fb00 36 34 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54  64 nKey,    /* T
2fb10 68 65 20 6b 65 79 20 6f 66 20 74 68 65 20 6e 65  he key of the ne
2fb20 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f  w record */.  co
2fb30 6e 73 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c  nst void *pData,
2fb40 20 69 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a 20   int nData,  /* 
2fb50 54 68 65 20 64 61 74 61 20 6f 66 20 74 68 65 20  The data of the 
2fb60 6e 65 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20  new record */.  
2fb70 69 6e 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20  int nZero,      
2fb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2fb90 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72  * Number of extr
2fba0 61 20 30 20 62 79 74 65 73 20 74 6f 20 61 70 70  a 0 bytes to app
2fbb0 65 6e 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20  end to data */. 
2fbc0 20 69 6e 74 20 61 70 70 65 6e 64 42 69 61 73 20   int appendBias 
2fbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fbe0 2f 2a 20 54 72 75 65 20 69 66 20 74 68 69 73 20  /* True if this 
2fbf0 69 73 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70  is likely an app
2fc00 65 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  end */.){.  int 
2fc10 72 63 3b 0a 20 20 69 6e 74 20 6c 6f 63 3b 0a 20  rc;.  int loc;. 
2fc20 20 69 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 69 6e   int szNew;.  in
2fc30 74 20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65  t idx;.  MemPage
2fc40 20 2a 70 50 61 67 65 3b 0a 20 20 42 74 72 65 65   *pPage;.  Btree
2fc50 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72   *p = pCur->pBtr
2fc60 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ee;.  BtShared *
2fc70 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
2fc80 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f  unsigned char *o
2fc90 6c 64 43 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e  ldCell;.  unsign
2fca0 65 64 20 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c  ed char *newCell
2fcb0 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28   = 0;..  assert(
2fcc0 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
2fcd0 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
2fce0 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e  ert( pBt->inTran
2fcf0 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57  saction==TRANS_W
2fd00 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74  RITE );.  assert
2fd10 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  ( !pBt->readOnly
2fd20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
2fd30 75 72 2d 3e 77 72 46 6c 61 67 20 29 3b 0a 20 20  ur->wrFlag );.  
2fd40 72 63 20 3d 20 63 68 65 63 6b 46 6f 72 52 65 61  rc = checkForRea
2fd50 64 43 6f 6e 66 6c 69 63 74 73 28 70 43 75 72 2d  dConflicts(pCur-
2fd60 3e 70 42 74 72 65 65 2c 20 70 43 75 72 2d 3e 70  >pBtree, pCur->p
2fd70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2c 20 6e  gnoRoot, pCur, n
2fd80 4b 65 79 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Key);.  if( rc )
2fd90 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20  {             . 
2fda0 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
2fdb0 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68  pCur points to h
2fdc0 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a  as a read lock *
2fdd0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  /.    assert( rc
2fde0 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f  ==SQLITE_LOCKED_
2fdf0 53 48 41 52 45 44 43 41 43 48 45 20 29 3b 0a 20  SHAREDCACHE );. 
2fe00 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2fe10 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53  }.  if( pCur->eS
2fe20 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55  tate==CURSOR_FAU
2fe30 4c 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  LT ){.    return
2fe40 20 70 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d   pCur->skip;.  }
2fe50 0a 0a 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20  ..  /* Save the 
2fe60 70 6f 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79  positions of any
2fe70 20 6f 74 68 65 72 20 63 75 72 73 6f 72 73 20 6f   other cursors o
2fe80 70 65 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c  pen on this tabl
2fe90 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74  e */.  sqlite3Bt
2fea0 72 65 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70  reeClearCursor(p
2feb0 43 75 72 29 3b 0a 20 20 69 66 28 20 0a 20 20 20  Cur);.  if( .   
2fec0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
2fed0 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
2fee0 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  (pBt, pCur->pgno
2fef0 52 6f 6f 74 2c 20 70 43 75 72 29 29 20 7c 7c 0a  Root, pCur)) ||.
2ff00 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28      SQLITE_OK!=(
2ff10 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2ff20 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 4b  eMoveto(pCur, pK
2ff30 65 79 2c 20 6e 4b 65 79 2c 20 61 70 70 65 6e 64  ey, nKey, append
2ff40 42 69 61 73 2c 20 26 6c 6f 63 29 29 0a 20 20 29  Bias, &loc)).  )
2ff50 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
2ff60 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20  .  }..  pPage = 
2ff70 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
2ff80 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73  r->iPage];.  ass
2ff90 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b  ert( pPage->intK
2ffa0 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b  ey || nKey>=0 );
2ffb0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2ffc0 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61 67 65  ->leaf || !pPage
2ffd0 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 54 52  ->intKey );.  TR
2ffe0 41 43 45 28 28 22 49 4e 53 45 52 54 3a 20 74 61  ACE(("INSERT: ta
2fff0 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c 64  ble=%d nkey=%lld
30000 20 6e 64 61 74 61 3d 25 64 20 70 61 67 65 3d 25   ndata=%d page=%
30010 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  d %s\n",.       
30020 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f     pCur->pgnoRoo
30030 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74 61 2c 20  t, nKey, nData, 
30040 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20  pPage->pgno,.   
30050 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30 20 3f 20         loc==0 ? 
30060 22 6f 76 65 72 77 72 69 74 65 22 20 3a 20 22 6e  "overwrite" : "n
30070 65 77 20 65 6e 74 72 79 22 29 29 3b 0a 20 20 61  ew entry"));.  a
30080 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
30090 49 6e 69 74 20 29 3b 0a 20 20 61 6c 6c 6f 63 61  Init );.  alloca
300a0 74 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29  teTempSpace(pBt)
300b0 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d 20 70 42  ;.  newCell = pB
300c0 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  t->pTmpSpace;.  
300d0 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d 30 20 29  if( newCell==0 )
300e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
300f0 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20 66 69 6c  OMEM;.  rc = fil
30100 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65 2c 20 6e  lInCell(pPage, n
30110 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b  ewCell, pKey, nK
30120 65 79 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61  ey, pData, nData
30130 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e 65 77 29  , nZero, &szNew)
30140 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74  ;.  if( rc ) got
30150 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20  o end_insert;.  
30160 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3d 3d 63  assert( szNew==c
30170 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
30180 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b 0a 20 20  , newCell) );.  
30190 61 73 73 65 72 74 28 20 73 7a 4e 65 77 3c 3d 4d  assert( szNew<=M
301a0 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
301b0 20 29 3b 0a 20 20 69 64 78 20 3d 20 70 43 75 72   );.  idx = pCur
301c0 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
301d0 61 67 65 5d 3b 0a 20 20 69 66 28 20 6c 6f 63 3d  age];.  if( loc=
301e0 3d 30 20 26 26 20 43 55 52 53 4f 52 5f 56 41 4c  =0 && CURSOR_VAL
301f0 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
30200 20 29 7b 0a 20 20 20 20 75 31 36 20 73 7a 4f 6c   ){.    u16 szOl
30210 64 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  d;.    assert( i
30220 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  dx<pPage->nCell 
30230 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
30240 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
30250 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
30260 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
30270 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65     goto end_inse
30280 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 6c  rt;.    }.    ol
30290 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c  dCell = findCell
302a0 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20  (pPage, idx);.  
302b0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
302c0 61 66 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  af ){.      memc
302d0 70 79 28 6e 65 77 43 65 6c 6c 2c 20 6f 6c 64 43  py(newCell, oldC
302e0 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 20  ell, 4);.    }. 
302f0 20 20 20 73 7a 4f 6c 64 20 3d 20 63 65 6c 6c 53     szOld = cellS
30300 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 6f 6c  izePtr(pPage, ol
30310 64 43 65 6c 6c 29 3b 0a 20 20 20 20 72 63 20 3d  dCell);.    rc =
30320 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65   clearCell(pPage
30330 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20  , oldCell);.    
30340 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e  if( rc ) goto en
30350 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20 20 72 63  d_insert;.    rc
30360 20 3d 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67   = dropCell(pPag
30370 65 2c 20 69 64 78 2c 20 73 7a 4f 6c 64 29 3b 0a  e, idx, szOld);.
30380 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
30390 54 45 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20  TE_OK ) {.      
303a0 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b  goto end_insert;
303b0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
303c0 66 28 20 6c 6f 63 3c 30 20 26 26 20 70 50 61 67  f( loc<0 && pPag
303d0 65 2d 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20  e->nCell>0 ){.  
303e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
303f0 3e 6c 65 61 66 20 29 3b 0a 20 20 20 20 69 64 78  >leaf );.    idx
30400 20 3d 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78   = ++pCur->aiIdx
30410 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
30420 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53     pCur->info.nS
30430 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75  ize = 0;.    pCu
30440 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30  r->validNKey = 0
30450 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
30460 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65  ssert( pPage->le
30470 61 66 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  af );.  }.  rc =
30480 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67   insertCell(pPag
30490 65 2c 20 69 64 78 2c 20 6e 65 77 43 65 6c 6c 2c  e, idx, newCell,
304a0 20 73 7a 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20   szNew, 0, 0);. 
304b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
304c0 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62  OK ){.    rc = b
304d0 61 6c 61 6e 63 65 28 70 43 75 72 2c 20 31 29 3b  alance(pCur, 1);
304e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 75 73 74 20  .  }..  /* Must 
304f0 6d 61 6b 65 20 73 75 72 65 20 6e 4f 76 65 72 66  make sure nOverf
30500 6c 6f 77 20 69 73 20 72 65 73 65 74 20 74 6f 20  low is reset to 
30510 7a 65 72 6f 20 65 76 65 6e 20 69 66 20 74 68 65  zero even if the
30520 20 62 61 6c 61 6e 63 65 28 29 0a 20 20 2a 2a 20   balance().  ** 
30530 66 61 69 6c 73 2e 20 20 49 6e 74 65 72 6e 61 6c  fails.  Internal
30540 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
30550 63 6f 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20  corruption will 
30560 72 65 73 75 6c 74 20 6f 74 68 65 72 77 69 73 65  result otherwise
30570 2e 20 2a 2f 0a 20 20 70 43 75 72 2d 3e 61 70 50  . */.  pCur->apP
30580 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
30590 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
305a0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
305b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76  TE_OK ){.    mov
305c0 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
305d0 20 7d 0a 65 6e 64 5f 69 6e 73 65 72 74 3a 0a 20   }.end_insert:. 
305e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
305f0 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
30600 65 6e 74 72 79 20 74 68 61 74 20 74 68 65 20 63  entry that the c
30610 75 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e  ursor is pointin
30620 67 20 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f  g to.  The curso
30630 72 0a 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69  r.** is left poi
30640 6e 74 69 6e 67 20 61 74 20 61 20 61 72 62 69 74  nting at a arbit
30650 72 61 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  rary location..*
30660 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
30670 65 65 44 65 6c 65 74 65 28 42 74 43 75 72 73 6f  eeDelete(BtCurso
30680 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50  r *pCur){.  MemP
30690 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75  age *pPage = pCu
306a0 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
306b0 69 50 61 67 65 5d 3b 0a 20 20 69 6e 74 20 69 64  iPage];.  int id
306c0 78 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  x;.  unsigned ch
306d0 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74  ar *pCell;.  int
306e0 20 72 63 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f   rc;.  Pgno pgno
306f0 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20 42 74 72  Child = 0;.  Btr
30700 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42  ee *p = pCur->pB
30710 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64  tree;.  BtShared
30720 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
30730 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
30740 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
30750 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
30760 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  Page->isInit );.
30770 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69    assert( pBt->i
30780 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
30790 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61  ANS_WRITE );.  a
307a0 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61  ssert( !pBt->rea
307b0 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28 20 70  dOnly );.  if( p
307c0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
307d0 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
307e0 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
307f0 69 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e 45  ip;.  }.  if( NE
30800 56 45 52 28 70 43 75 72 2d 3e 61 69 49 64 78 5b  VER(pCur->aiIdx[
30810 70 43 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50  pCur->iPage]>=pP
30820 61 67 65 2d 3e 6e 43 65 6c 6c 29 20 29 7b 0a 20  age->nCell) ){. 
30830 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
30840 5f 45 52 52 4f 52 3b 20 20 2f 2a 20 54 68 65 20  _ERROR;  /* The 
30850 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f  cursor is not po
30860 69 6e 74 69 6e 67 20 74 6f 20 61 6e 79 74 68 69  inting to anythi
30870 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65  ng */.  }.  asse
30880 72 74 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67  rt( pCur->wrFlag
30890 20 29 3b 0a 20 20 72 63 20 3d 20 63 68 65 63 6b   );.  rc = check
308a0 46 6f 72 52 65 61 64 43 6f 6e 66 6c 69 63 74 73  ForReadConflicts
308b0 28 70 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  (p, pCur->pgnoRo
308c0 6f 74 2c 20 70 43 75 72 2c 20 70 43 75 72 2d 3e  ot, pCur, pCur->
308d0 69 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 20 20 69 66  info.nKey);.  if
308e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
308f0 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 61  ){.    /* The ta
30900 62 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20  ble pCur points 
30910 74 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f  to has a read lo
30920 63 6b 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ck */.    assert
30930 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43  ( rc==SQLITE_LOC
30940 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 20  KED_SHAREDCACHE 
30950 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
30960 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74  ;.  }..  /* Rest
30970 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
30980 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cursor position 
30990 28 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20  (a no-op if the 
309a0 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e  cursor is not in
309b0 20 0a 20 20 2a 2a 20 43 55 52 53 4f 52 5f 52 45   .  ** CURSOR_RE
309c0 51 55 49 52 45 53 45 45 4b 20 73 74 61 74 65 29  QUIRESEEK state)
309d0 20 61 6e 64 20 73 61 76 65 20 74 68 65 20 70 6f   and save the po
309e0 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f  sitions of any o
309f0 74 68 65 72 20 63 75 72 73 6f 72 73 20 0a 20 20  ther cursors .  
30a00 2a 2a 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73  ** open on the s
30a10 61 6d 65 20 74 61 62 6c 65 2e 20 54 68 65 6e 20  ame table. Then 
30a20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65  call sqlite3Page
30a30 72 57 72 69 74 65 28 29 20 6f 6e 20 74 68 65 20  rWrite() on the 
30a40 70 61 67 65 0a 20 20 2a 2a 20 74 68 61 74 20 74  page.  ** that t
30a50 68 65 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65  he entry will be
30a60 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 2e 0a 20   deleted from.. 
30a70 20 2a 2f 0a 20 20 69 66 28 20 0a 20 20 20 20 28   */.  if( .    (
30a80 72 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73  rc = restoreCurs
30a90 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29  orPosition(pCur)
30aa0 29 21 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63 20  )!=0 ||.    (rc 
30ab0 3d 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73  = saveAllCursors
30ac0 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f  (pBt, pCur->pgno
30ad0 52 6f 6f 74 2c 20 70 43 75 72 29 29 21 3d 30 20  Root, pCur))!=0 
30ae0 7c 7c 0a 20 20 20 20 28 72 63 20 3d 20 73 71 6c  ||.    (rc = sql
30af0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
30b00 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21  Page->pDbPage))!
30b10 3d 30 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  =0.  ){.    retu
30b20 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rn rc;.  }..  /*
30b30 20 4c 6f 63 61 74 65 20 74 68 65 20 63 65 6c 6c   Locate the cell
30b40 20 77 69 74 68 69 6e 20 69 74 73 20 70 61 67 65   within its page
30b50 20 61 6e 64 20 6c 65 61 76 65 20 70 43 65 6c 6c   and leave pCell
30b60 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
30b70 0a 20 20 2a 2a 20 64 61 74 61 2e 20 54 68 65 20  .  ** data. The 
30b80 63 6c 65 61 72 43 65 6c 6c 28 29 20 63 61 6c 6c  clearCell() call
30b90 20 66 72 65 65 73 20 61 6e 79 20 6f 76 65 72 66   frees any overf
30ba0 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69  low pages associ
30bb0 61 74 65 64 20 77 69 74 68 20 74 68 65 0a 20 20  ated with the.  
30bc0 2a 2a 20 63 65 6c 6c 2e 20 54 68 65 20 63 65 6c  ** cell. The cel
30bd0 6c 20 69 74 73 65 6c 66 20 69 73 20 73 74 69 6c  l itself is stil
30be0 6c 20 69 6e 74 61 63 74 2e 0a 20 20 2a 2f 0a 20  l intact..  */. 
30bf0 20 69 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49   idx = pCur->aiI
30c00 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  dx[pCur->iPage];
30c10 0a 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43  .  pCell = findC
30c20 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 3b  ell(pPage, idx);
30c30 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
30c40 65 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 43  eaf ){.    pgnoC
30c50 68 69 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28  hild = get4byte(
30c60 70 43 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 63  pCell);.  }.  rc
30c70 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61   = clearCell(pPa
30c80 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 69 66  ge, pCell);.  if
30c90 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
30ca0 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66  rn rc;.  }..  if
30cb0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
30cc0 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  {.    /*.    ** 
30cd0 54 68 65 20 65 6e 74 72 79 20 77 65 20 61 72 65  The entry we are
30ce0 20 61 62 6f 75 74 20 74 6f 20 64 65 6c 65 74 65   about to delete
30cf0 20 69 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 73   is not a leaf s
30d00 6f 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 0a 20  o if we do not. 
30d10 20 20 20 2a 2a 20 64 6f 20 73 6f 6d 65 74 68 69     ** do somethi
30d20 6e 67 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65  ng we will leave
30d30 20 61 20 68 6f 6c 65 20 6f 6e 20 61 6e 20 69 6e   a hole on an in
30d40 74 65 72 6e 61 6c 20 70 61 67 65 2e 0a 20 20 20  ternal page..   
30d50 20 2a 2a 20 57 65 20 68 61 76 65 20 74 6f 20 66   ** We have to f
30d60 69 6c 6c 20 74 68 65 20 68 6f 6c 65 20 62 79 20  ill the hole by 
30d70 6d 6f 76 69 6e 67 20 69 6e 20 61 20 63 65 6c 6c  moving in a cell
30d80 20 66 72 6f 6d 20 61 20 6c 65 61 66 2e 20 20 54   from a leaf.  T
30d90 68 65 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20 43  he.    ** next C
30da0 65 6c 6c 20 61 66 74 65 72 20 74 68 65 20 6f 6e  ell after the on
30db0 65 20 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20  e to be deleted 
30dc0 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f  is guaranteed to
30dd0 20 65 78 69 73 74 20 61 6e 64 0a 20 20 20 20 2a   exist and.    *
30de0 2a 20 74 6f 20 62 65 20 61 20 6c 65 61 66 20 73  * to be a leaf s
30df0 6f 20 77 65 20 63 61 6e 20 75 73 65 20 69 74 2e  o we can use it.
30e00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 42 74 43 75  .    */.    BtCu
30e10 72 73 6f 72 20 6c 65 61 66 43 75 72 3b 0a 20 20  rsor leafCur;.  
30e20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4c 65 61 66    MemPage *pLeaf
30e30 50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 75  Page = 0;..    u
30e40 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4e  nsigned char *pN
30e50 65 78 74 3b 0a 20 20 20 20 69 6e 74 20 6e 6f 74  ext;.    int not
30e60 55 73 65 64 3b 0a 20 20 20 20 75 6e 73 69 67 6e  Used;.    unsign
30e70 65 64 20 63 68 61 72 20 2a 74 65 6d 70 43 65 6c  ed char *tempCel
30e80 6c 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  l = 0;.    asser
30e90 74 28 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65  t( !pPage->intKe
30ea0 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  y );.    sqlite3
30eb0 42 74 72 65 65 47 65 74 54 65 6d 70 43 75 72 73  BtreeGetTempCurs
30ec0 6f 72 28 70 43 75 72 2c 20 26 6c 65 61 66 43 75  or(pCur, &leafCu
30ed0 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  r);.    rc = sql
30ee0 69 74 65 33 42 74 72 65 65 4e 65 78 74 28 26 6c  ite3BtreeNext(&l
30ef0 65 61 66 43 75 72 2c 20 26 6e 6f 74 55 73 65 64  eafCur, &notUsed
30f00 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
30f10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
30f20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43 75    assert( leafCu
30f30 72 2e 61 69 49 64 78 5b 6c 65 61 66 43 75 72 2e  r.aiIdx[leafCur.
30f40 69 50 61 67 65 5d 3d 3d 30 20 29 3b 0a 20 20 20  iPage]==0 );.   
30f50 20 20 20 70 4c 65 61 66 50 61 67 65 20 3d 20 6c     pLeafPage = l
30f60 65 61 66 43 75 72 2e 61 70 50 61 67 65 5b 6c 65  eafCur.apPage[le
30f70 61 66 43 75 72 2e 69 50 61 67 65 5d 3b 0a 20 20  afCur.iPage];.  
30f80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
30f90 50 61 67 65 72 57 72 69 74 65 28 70 4c 65 61 66  PagerWrite(pLeaf
30fa0 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Page->pDbPage);.
30fb0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
30fc0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
30fd0 20 20 20 20 20 69 6e 74 20 6c 65 61 66 43 75 72       int leafCur
30fe0 73 6f 72 49 6e 76 61 6c 69 64 20 3d 20 30 3b 0a  sorInvalid = 0;.
30ff0 20 20 20 20 20 20 75 31 36 20 73 7a 4e 65 78 74        u16 szNext
31000 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  ;.      TRACE(("
31010 44 45 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25 64  DELETE: table=%d
31020 20 64 65 6c 65 74 65 20 69 6e 74 65 72 6e 61 6c   delete internal
31030 20 66 72 6f 6d 20 25 64 20 72 65 70 6c 61 63 65   from %d replace
31040 20 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22   from leaf %d\n"
31050 2c 0a 20 20 20 20 20 20 20 20 20 70 43 75 72 2d  ,.         pCur-
31060 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65  >pgnoRoot, pPage
31070 2d 3e 70 67 6e 6f 2c 20 70 4c 65 61 66 50 61 67  ->pgno, pLeafPag
31080 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  e->pgno));.     
31090 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c   dropCell(pPage,
310a0 20 69 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74   idx, cellSizePt
310b0 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29  r(pPage, pCell))
310c0 3b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20  ;.      pNext = 
310d0 66 69 6e 64 43 65 6c 6c 28 70 4c 65 61 66 50 61  findCell(pLeafPa
310e0 67 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 7a  ge, 0);.      sz
310f0 4e 65 78 74 20 3d 20 63 65 6c 6c 53 69 7a 65 50  Next = cellSizeP
31100 74 72 28 70 4c 65 61 66 50 61 67 65 2c 20 70 4e  tr(pLeafPage, pN
31110 65 78 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ext);.      asse
31120 72 74 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45  rt( MX_CELL_SIZE
31130 28 70 42 74 29 3e 3d 73 7a 4e 65 78 74 2b 34 20  (pBt)>=szNext+4 
31140 29 3b 0a 20 20 20 20 20 20 61 6c 6c 6f 63 61 74  );.      allocat
31150 65 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b  eTempSpace(pBt);
31160 0a 20 20 20 20 20 20 74 65 6d 70 43 65 6c 6c 20  .      tempCell 
31170 3d 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65  = pBt->pTmpSpace
31180 3b 0a 20 20 20 20 20 20 69 66 28 20 74 65 6d 70  ;.      if( temp
31190 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Cell==0 ){.     
311a0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
311b0 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
311c0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
311d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
311e0 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c   rc = insertCell
311f0 28 70 50 61 67 65 2c 20 69 64 78 2c 20 70 4e 65  (pPage, idx, pNe
31200 78 74 2d 34 2c 20 73 7a 4e 65 78 74 2b 34 2c 20  xt-4, szNext+4, 
31210 74 65 6d 70 43 65 6c 6c 2c 20 30 29 3b 0a 20 20  tempCell, 0);.  
31220 20 20 20 20 7d 0a 0a 0a 20 20 20 20 20 20 2f 2a      }...      /*
31230 20 54 68 65 20 22 69 66 22 20 73 74 61 74 65 6d   The "if" statem
31240 65 6e 74 20 69 6e 20 74 68 65 20 6e 65 78 74 20  ent in the next 
31250 63 6f 64 65 20 62 6c 6f 63 6b 20 69 73 20 63 72  code block is cr
31260 69 74 69 63 61 6c 2e 20 20 54 68 65 0a 20 20 20  itical.  The.   
31270 20 20 20 2a 2a 20 73 6c 69 67 68 74 65 73 74 20     ** slightest 
31280 65 72 72 6f 72 20 69 6e 20 74 68 61 74 20 73 74  error in that st
31290 61 74 65 6d 65 6e 74 20 77 6f 75 6c 64 20 61 6c  atement would al
312a0 6c 6f 77 20 53 51 4c 69 74 65 20 74 6f 20 6f 70  low SQLite to op
312b0 65 72 61 74 65 0a 20 20 20 20 20 20 2a 2a 20 63  erate.      ** c
312c0 6f 72 72 65 63 74 6c 79 20 6d 6f 73 74 20 6f 66  orrectly most of
312d0 20 74 68 65 20 74 69 6d 65 20 62 75 74 20 70 72   the time but pr
312e0 6f 64 75 63 65 20 76 65 72 79 20 72 61 72 65 20  oduce very rare 
312f0 66 61 69 6c 75 72 65 73 2e 20 20 54 6f 0a 20 20  failures.  To.  
31300 20 20 20 20 2a 2a 20 67 75 61 72 64 20 61 67 61      ** guard aga
31310 69 6e 73 74 20 74 68 69 73 2c 20 74 68 65 20 66  inst this, the f
31320 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 20  ollowing macros 
31330 68 65 6c 70 20 74 6f 20 76 65 72 69 66 79 20 74  help to verify t
31340 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  hat.      ** the
31350 20 22 69 66 22 20 73 74 61 74 65 6d 65 6e 74 20   "if" statement 
31360 69 73 20 77 65 6c 6c 20 74 65 73 74 65 64 2e 0a  is well tested..
31370 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74        */.      t
31380 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e  estcase( pPage->
31390 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20  nOverflow==0 && 
313a0 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c 70 42 74  pPage->nFree<pBt
313b0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33  ->usableSize*2/3
313c0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
313d0 20 20 20 26 26 20 70 4c 65 61 66 50 61 67 65 2d     && pLeafPage-
313e0 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74 20  >nFree+2+szNext 
313f0 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  > pBt->usableSiz
31400 65 2a 32 2f 33 20 29 3b 0a 20 20 20 20 20 20 74  e*2/3 );.      t
31410 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e  estcase( pPage->
31420 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20  nOverflow==0 && 
31430 70 50 61 67 65 2d 3e 6e 46 72 65 65 3d 3d 70 42  pPage->nFree==pB
31440 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f  t->usableSize*2/
31450 33 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  3 .             
31460 20 20 20 20 26 26 20 70 4c 65 61 66 50 61 67 65      && pLeafPage
31470 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74  ->nFree+2+szNext
31480 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   > pBt->usableSi
31490 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20 20 20 20  ze*2/3 );.      
314a0 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65 2d  testcase( pPage-
314b0 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26  >nOverflow==0 &&
314c0 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3d 3d 70   pPage->nFree==p
314d0 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32  Bt->usableSize*2
314e0 2f 33 2b 31 20 0a 20 20 20 20 20 20 20 20 20 20  /3+1 .          
314f0 20 20 20 20 20 20 20 26 26 20 70 4c 65 61 66 50         && pLeafP
31500 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e  age->nFree+2+szN
31510 65 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c  ext > pBt->usabl
31520 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20  eSize*2/3 );.   
31530 20 20 20 74 65 73 74 63 61 73 65 28 20 70 50 61     testcase( pPa
31540 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ge->nOverflow>0 
31550 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c  && pPage->nFree<
31560 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  =pBt->usableSize
31570 2a 32 2f 33 0a 20 20 20 20 20 20 20 20 20 20 20  *2/3.           
31580 20 20 20 20 20 20 26 26 20 70 4c 65 61 66 50 61        && pLeafPa
31590 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65  ge->nFree+2+szNe
315a0 78 74 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65  xt > pBt->usable
315b0 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20 20  Size*2/3 );.    
315c0 20 20 74 65 73 74 63 61 73 65 28 20 28 70 50 61    testcase( (pPa
315d0 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20  ge->nOverflow>0 
315e0 7c 7c 20 28 70 50 61 67 65 2d 3e 6e 46 72 65 65  || (pPage->nFree
315f0 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   > pBt->usableSi
31600 7a 65 2a 32 2f 33 29 29 0a 20 20 20 20 20 20 20  ze*2/3)).       
31610 20 20 20 20 20 20 20 20 20 20 26 26 20 70 4c 65            && pLe
31620 61 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b  afPage->nFree+2+
31630 73 7a 4e 65 78 74 20 3d 3d 20 70 42 74 2d 3e 75  szNext == pBt->u
31640 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b  sableSize*2/3 );
31650 0a 0a 0a 20 20 20 20 20 20 69 66 28 20 28 70 50  ...      if( (pP
31660 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30  age->nOverflow>0
31670 20 7c 7c 20 28 70 50 61 67 65 2d 3e 6e 46 72 65   || (pPage->nFre
31680 65 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  e > pBt->usableS
31690 69 7a 65 2a 32 2f 33 29 29 20 26 26 0a 20 20 20  ize*2/3)) &&.   
316a0 20 20 20 20 20 20 20 28 70 4c 65 61 66 50 61 67         (pLeafPag
316b0 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78  e->nFree+2+szNex
316c0 74 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  t > pBt->usableS
316d0 69 7a 65 2a 32 2f 33 29 0a 20 20 20 20 20 20 29  ize*2/3).      )
316e0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69  {.        /* Thi
316f0 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
31700 6e 20 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61  n if the interna
31710 6c 20 6e 6f 64 65 20 69 73 20 6e 6f 77 20 65 69  l node is now ei
31720 74 68 65 72 20 6f 76 65 72 66 6c 6f 77 69 6e 67  ther overflowing
31730 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 75  .        ** or u
31740 6e 64 65 72 66 75 6c 6c 20 61 6e 64 20 74 68 65  nderfull and the
31750 20 6c 65 61 66 20 6e 6f 64 65 20 77 69 6c 6c 20   leaf node will 
31760 62 65 20 75 6e 64 65 72 66 75 6c 6c 20 61 66 74  be underfull aft
31770 65 72 20 74 68 65 20 6a 75 73 74 20 63 65 6c 6c  er the just cell
31780 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70   .        ** cop
31790 69 65 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72  ied to the inter
317a0 6e 61 6c 20 6e 6f 64 65 20 69 73 20 64 65 6c 65  nal node is dele
317b0 74 65 64 20 66 72 6f 6d 20 69 74 2e 20 54 68 69  ted from it. Thi
317c0 73 20 69 73 20 61 20 73 70 65 63 69 61 6c 0a 20  s is a special. 
317d0 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 62         ** case b
317e0 65 63 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20  ecause the call 
317f0 74 6f 20 62 61 6c 61 6e 63 65 28 29 20 74 6f 20  to balance() to 
31800 63 6f 72 72 65 63 74 20 74 68 65 20 69 6e 74 65  correct the inte
31810 72 6e 61 6c 20 6e 6f 64 65 0a 20 20 20 20 20 20  rnal node.      
31820 20 20 2a 2a 20 6d 61 79 20 63 68 61 6e 67 65 20    ** may change 
31830 74 68 65 20 74 72 65 65 20 73 74 72 75 63 74 75  the tree structu
31840 72 65 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74  re and invalidat
31850 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
31860 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65  f.        ** the
31870 20 6c 65 61 66 43 75 72 2e 61 70 50 61 67 65 5b   leafCur.apPage[
31880 5d 20 61 6e 64 20 6c 65 61 66 43 75 72 2e 61 69  ] and leafCur.ai
31890 49 64 78 5b 5d 20 61 72 72 61 79 73 2c 20 77 68  Idx[] arrays, wh
318a0 69 63 68 20 77 69 6c 6c 20 62 65 0a 20 20 20 20  ich will be.    
318b0 20 20 20 20 2a 2a 20 75 73 65 64 20 62 79 20 74      ** used by t
318c0 68 65 20 62 61 6c 61 6e 63 65 28 29 20 72 65 71  he balance() req
318d0 75 69 72 65 64 20 74 6f 20 63 6f 72 72 65 63 74  uired to correct
318e0 20 74 68 65 20 75 6e 64 65 72 66 75 6c 6c 20 6c   the underfull l
318f0 65 61 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  eaf.        ** n
31900 6f 64 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ode..        **.
31910 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 66          ** The f
31920 6f 72 6d 75 6c 61 20 75 73 65 64 20 69 6e 20 74  ormula used in t
31930 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 62  he expression ab
31940 6f 76 65 20 61 72 65 20 62 61 73 65 64 20 6f 6e  ove are based on
31950 20 66 61 63 65 74 73 20 6f 66 0a 20 20 20 20 20   facets of.     
31960 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65     ** the SQLite
31970 20 66 69 6c 65 2d 66 6f 72 6d 61 74 20 74 68 61   file-format tha
31980 74 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20  t do not change 
31990 6f 76 65 72 20 74 69 6d 65 2e 0a 20 20 20 20 20  over time..     
319a0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 74 65     */.        te
319b0 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e  stcase( pPage->n
319c0 46 72 65 65 3d 3d 70 42 74 2d 3e 75 73 61 62 6c  Free==pBt->usabl
319d0 65 53 69 7a 65 2a 32 2f 33 2b 31 20 29 3b 0a 20  eSize*2/3+1 );. 
319e0 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
319f0 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72 65   pLeafPage->nFre
31a00 65 2b 32 2b 73 7a 4e 65 78 74 3d 3d 70 42 74 2d  e+2+szNext==pBt-
31a10 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 2b  >usableSize*2/3+
31a20 31 20 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 61  1 );.        lea
31a30 66 43 75 72 73 6f 72 49 6e 76 61 6c 69 64 20 3d  fCursorInvalid =
31a40 20 31 3b 0a 20 20 20 20 20 20 7d 20 20 20 20 20   1;.      }     
31a50 20 20 20 0a 0a 20 20 20 20 20 20 69 66 28 20 72     ..      if( r
31a60 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
31a70 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
31a80 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
31a90 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
31aa0 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20  DbPage) );.     
31ab0 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64     put4byte(find
31ac0 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61  OverflowCell(pPa
31ad0 67 65 2c 20 69 64 78 29 2c 20 70 67 6e 6f 43 68  ge, idx), pgnoCh
31ae0 69 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 56 56  ild);.        VV
31af0 41 5f 4f 4e 4c 59 28 20 70 43 75 72 2d 3e 70 61  A_ONLY( pCur->pa
31b00 67 65 73 53 68 75 66 66 6c 65 64 20 3d 20 30 20  gesShuffled = 0 
31b10 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
31b20 62 61 6c 61 6e 63 65 28 70 43 75 72 2c 20 30 29  balance(pCur, 0)
31b30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
31b40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
31b50 4f 4b 20 26 26 20 6c 65 61 66 43 75 72 73 6f 72  OK && leafCursor
31b60 49 6e 76 61 6c 69 64 20 29 7b 0a 20 20 20 20 20  Invalid ){.     
31b70 20 20 20 2f 2a 20 54 68 65 20 6c 65 61 66 2d 6e     /* The leaf-n
31b80 6f 64 65 20 69 73 20 6e 6f 77 20 75 6e 64 65 72  ode is now under
31b90 66 75 6c 6c 20 61 6e 64 20 73 6f 20 74 68 65 20  full and so the 
31ba0 74 72 65 65 20 6e 65 65 64 73 20 74 6f 20 62 65  tree needs to be
31bb0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 62   .        ** reb
31bc0 61 6c 61 6e 63 65 64 2e 20 48 6f 77 65 76 65 72  alanced. However
31bd0 2c 20 74 68 65 20 62 61 6c 61 6e 63 65 28 29 20  , the balance() 
31be0 6f 70 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65  operation on the
31bf0 20 69 6e 74 65 72 6e 61 6c 0a 20 20 20 20 20 20   internal.      
31c00 20 20 2a 2a 20 6e 6f 64 65 20 61 62 6f 76 65 20    ** node above 
31c10 6d 61 79 20 68 61 76 65 20 6d 6f 64 69 66 69 65  may have modifie
31c20 64 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  d the structure 
31c30 6f 66 20 74 68 65 20 42 2d 54 72 65 65 20 61 6e  of the B-Tree an
31c40 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20  d.        ** so 
31c50 74 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74  the current cont
31c60 65 6e 74 73 20 6f 66 20 6c 65 61 66 43 75 72 2e  ents of leafCur.
31c70 61 70 50 61 67 65 5b 5d 20 61 6e 64 20 6c 65 61  apPage[] and lea
31c80 66 43 75 72 2e 61 69 49 64 78 5b 5d 0a 20 20 20  fCur.aiIdx[].   
31c90 20 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20       ** may not 
31ca0 62 65 20 74 72 75 73 74 65 64 2e 0a 20 20 20 20  be trusted..    
31cb0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
31cc0 2a 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73  * It is not poss
31cd0 69 62 6c 65 20 74 6f 20 63 6f 70 79 20 74 68 65  ible to copy the
31ce0 20 61 6e 63 65 73 74 72 79 20 66 72 6f 6d 20 70   ancestry from p
31cf0 43 75 72 2c 20 61 73 20 74 68 65 20 73 61 6d 65  Cur, as the same
31d00 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 6c 61  .        ** bala
31d10 6e 63 65 28 29 20 63 61 6c 6c 20 68 61 73 20 69  nce() call has i
31d20 6e 76 61 6c 69 64 61 74 65 64 20 74 68 65 20 70  nvalidated the p
31d30 43 75 72 2d 3e 61 70 50 61 67 65 5b 5d 20 61 6e  Cur->apPage[] an
31d40 64 20 61 69 49 64 78 5b 5d 0a 20 20 20 20 20 20  d aiIdx[].      
31d50 20 20 2a 2a 20 61 72 72 61 79 73 2e 20 0a 20 20    ** arrays. .  
31d60 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
31d70 20 2a 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20   ** The call to 
31d80 73 61 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69  saveCursorPositi
31d90 6f 6e 28 29 20 62 65 6c 6f 77 20 69 6e 74 65 72  on() below inter
31da0 6e 61 6c 6c 79 20 73 61 76 65 73 20 74 68 65 20  nally saves the 
31db0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 20  .        ** key 
31dc0 74 68 61 74 20 6c 65 61 66 43 75 72 20 69 73 20  that leafCur is 
31dd0 63 75 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69  currently pointi
31de0 6e 67 20 74 6f 2e 20 43 75 72 72 65 6e 74 6c 79  ng to. Currently
31df0 2c 20 74 68 65 72 65 0a 20 20 20 20 20 20 20 20  , there.        
31e00 2a 2a 20 61 72 65 20 74 77 6f 20 63 6f 70 69 65  ** are two copie
31e10 73 20 6f 66 20 74 68 61 74 20 6b 65 79 20 69 6e  s of that key in
31e20 20 74 68 65 20 74 72 65 65 20 2d 20 6f 6e 65 20   the tree - one 
31e30 68 65 72 65 20 6f 6e 20 74 68 65 20 6c 65 61 66  here on the leaf
31e40 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65  .        ** page
31e50 20 61 6e 64 20 6f 6e 65 20 6f 6e 20 73 6f 6d 65   and one on some
31e60 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69   internal node i
31e70 6e 20 74 68 65 20 74 72 65 65 2e 20 54 68 65 20  n the tree. The 
31e80 63 6f 70 79 20 6f 6e 0a 20 20 20 20 20 20 20 20  copy on.        
31e90 2a 2a 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65  ** the leaf node
31ea0 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 6e   is always the n
31eb0 65 78 74 20 6b 65 79 20 69 6e 20 74 72 65 65 2d  ext key in tree-
31ec0 6f 72 64 65 72 20 61 66 74 65 72 20 74 68 65 20  order after the 
31ed0 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 79  .        ** copy
31ee0 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c   on the internal
31ef0 20 6e 6f 64 65 2e 20 53 6f 2c 20 74 68 65 20 63   node. So, the c
31f00 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74  all to sqlite3Bt
31f10 72 65 65 4e 65 78 74 28 29 0a 20 20 20 20 20 20  reeNext().      
31f20 20 20 2a 2a 20 63 61 6c 6c 73 20 72 65 73 74 6f    ** calls resto
31f30 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
31f40 28 29 20 74 6f 20 70 6f 69 6e 74 20 74 68 65 20  () to point the 
31f50 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 63 6f  cursor to the co
31f60 70 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  py.        ** st
31f70 6f 72 65 64 20 6f 6e 20 74 68 65 20 69 6e 74 65  ored on the inte
31f80 72 6e 61 6c 20 6e 6f 64 65 2c 20 74 68 65 6e 20  rnal node, then 
31f90 61 64 76 61 6e 63 65 73 20 74 6f 20 74 68 65 20  advances to the 
31fa0 6e 65 78 74 20 65 6e 74 72 79 2c 0a 20 20 20 20  next entry,.    
31fb0 20 20 20 20 2a 2a 20 77 68 69 63 68 20 68 61 70      ** which hap
31fc0 70 65 6e 73 20 74 6f 20 62 65 20 74 68 65 20 63  pens to be the c
31fd0 6f 70 79 20 6f 66 20 74 68 65 20 6b 65 79 20 6f  opy of the key o
31fe0 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e  n the internal n
31ff0 6f 64 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  ode..        ** 
32000 4e 65 74 20 65 66 66 65 63 74 3a 20 6c 65 61 66  Net effect: leaf
32010 43 75 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  Cur is pointing 
32020 62 61 63 6b 20 74 6f 20 74 68 65 20 64 75 70 6c  back to the dupl
32030 69 63 61 74 65 20 63 65 6c 6c 0a 20 20 20 20 20  icate cell.     
32040 20 20 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 73     ** that needs
32050 20 74 6f 20 62 65 20 72 65 6d 6f 76 65 64 2c 20   to be removed, 
32060 61 6e 64 20 74 68 65 20 6c 65 61 66 43 75 72 2e  and the leafCur.
32070 61 70 50 61 67 65 5b 5d 20 61 6e 64 0a 20 20 20  apPage[] and.   
32080 20 20 20 20 20 2a 2a 20 6c 65 61 66 43 75 72 2e       ** leafCur.
32090 61 69 49 64 78 5b 5d 20 61 72 72 61 79 73 20 61  aiIdx[] arrays a
320a0 72 65 20 63 6f 72 72 65 63 74 2e 0a 20 20 20 20  re correct..    
320b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 56      */.        V
320c0 56 41 5f 4f 4e 4c 59 28 20 50 67 6e 6f 20 6c 65  VA_ONLY( Pgno le
320d0 61 66 50 67 6e 6f 20 3d 20 70 4c 65 61 66 50 61  afPgno = pLeafPa
320e0 67 65 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 20 20  ge->pgno );.    
320f0 20 20 20 20 72 63 20 3d 20 73 61 76 65 43 75 72      rc = saveCur
32100 73 6f 72 50 6f 73 69 74 69 6f 6e 28 26 6c 65 61  sorPosition(&lea
32110 66 43 75 72 29 3b 0a 20 20 20 20 20 20 20 20 69  fCur);.        i
32120 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
32130 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
32140 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e   = sqlite3BtreeN
32150 65 78 74 28 26 6c 65 61 66 43 75 72 2c 20 26 6e  ext(&leafCur, &n
32160 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 20 20 20  otUsed);.       
32170 20 7d 0a 20 20 20 20 20 20 20 20 70 4c 65 61 66   }.        pLeaf
32180 50 61 67 65 20 3d 20 6c 65 61 66 43 75 72 2e 61  Page = leafCur.a
32190 70 50 61 67 65 5b 6c 65 61 66 43 75 72 2e 69 50  pPage[leafCur.iP
321a0 61 67 65 5d 3b 0a 20 20 20 20 20 20 20 20 61 73  age];.        as
321b0 73 65 72 74 28 20 70 4c 65 61 66 50 61 67 65 2d  sert( pLeafPage-
321c0 3e 70 67 6e 6f 3d 3d 6c 65 61 66 50 67 6e 6f 20  >pgno==leafPgno 
321d0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
321e0 74 28 20 6c 65 61 66 43 75 72 2e 61 69 49 64 78  t( leafCur.aiIdx
321f0 5b 6c 65 61 66 43 75 72 2e 69 50 61 67 65 5d 3d  [leafCur.iPage]=
32200 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  =0 );.      }.. 
32210 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f       if( SQLITE_
32220 4f 4b 3d 3d 72 63 0a 20 20 20 20 20 20 20 26 26  OK==rc.       &&
32230 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20   SQLITE_OK==(rc 
32240 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
32250 69 74 65 28 70 4c 65 61 66 50 61 67 65 2d 3e 70  ite(pLeafPage->p
32260 44 62 50 61 67 65 29 29 20 0a 20 20 20 20 20 20  DbPage)) .      
32270 29 7b 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43  ){.        dropC
32280 65 6c 6c 28 70 4c 65 61 66 50 61 67 65 2c 20 30  ell(pLeafPage, 0
32290 2c 20 73 7a 4e 65 78 74 29 3b 0a 20 20 20 20 20  , szNext);.     
322a0 20 20 20 56 56 41 5f 4f 4e 4c 59 28 20 6c 65 61     VVA_ONLY( lea
322b0 66 43 75 72 2e 70 61 67 65 73 53 68 75 66 66 6c  fCur.pagesShuffl
322c0 65 64 20 3d 20 30 20 29 3b 0a 20 20 20 20 20 20  ed = 0 );.      
322d0 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 26    rc = balance(&
322e0 6c 65 61 66 43 75 72 2c 20 30 29 3b 0a 20 20 20  leafCur, 0);.   
322f0 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61       assert( lea
32300 66 43 75 72 73 6f 72 49 6e 76 61 6c 69 64 20 7c  fCursorInvalid |
32310 7c 20 21 6c 65 61 66 43 75 72 2e 70 61 67 65 73  | !leafCur.pages
32320 53 68 75 66 66 6c 65 64 0a 20 20 20 20 20 20 20  Shuffled.       
32330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32340 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 21              || !
32350 70 43 75 72 2d 3e 70 61 67 65 73 53 68 75 66 66  pCur->pagesShuff
32360 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  led );.      }. 
32370 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
32380 42 74 72 65 65 52 65 6c 65 61 73 65 54 65 6d 70  BtreeReleaseTemp
32390 43 75 72 73 6f 72 28 26 6c 65 61 66 43 75 72 29  Cursor(&leafCur)
323a0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54  ;.  }else{.    T
323b0 52 41 43 45 28 28 22 44 45 4c 45 54 45 3a 20 74  RACE(("DELETE: t
323c0 61 62 6c 65 3d 25 64 20 64 65 6c 65 74 65 20 66  able=%d delete f
323d0 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a  rom leaf %d\n",.
323e0 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e         pCur->pgn
323f0 6f 52 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67  oRoot, pPage->pg
32400 6e 6f 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 64  no));.    rc = d
32410 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  ropCell(pPage, i
32420 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  dx, cellSizePtr(
32430 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a  pPage, pCell));.
32440 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
32450 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
32460 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72  c = balance(pCur
32470 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  , 0);.    }.  }.
32480 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
32490 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54  _OK ){.    moveT
324a0 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d  oRoot(pCur);.  }
324b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
324c0 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
324d0 6e 65 77 20 42 54 72 65 65 20 74 61 62 6c 65 2e  new BTree table.
324e0 20 20 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69    Write into *pi
324f0 54 61 62 6c 65 20 74 68 65 20 70 61 67 65 0a 2a  Table the page.*
32500 2a 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  * number for the
32510 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68   root page of th
32520 65 20 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a  e new table..**.
32530 2a 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20 74  ** The type of t
32540 79 70 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65  ype is determine
32550 64 20 62 79 20 74 68 65 20 66 6c 61 67 73 20 70  d by the flags p
32560 61 72 61 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20  arameter.  Only 
32570 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67  the.** following
32580 20 76 61 6c 75 65 73 20 6f 66 20 66 6c 61 67 73   values of flags
32590 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69   are currently i
325a0 6e 20 75 73 65 2e 20 20 4f 74 68 65 72 20 76 61  n use.  Other va
325b0 6c 75 65 73 20 66 6f 72 0a 2a 2a 20 66 6c 61 67  lues for.** flag
325c0 73 20 6d 69 67 68 74 20 6e 6f 74 20 77 6f 72 6b  s might not work
325d0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 42 54 52 45  :.**.**     BTRE
325e0 45 5f 49 4e 54 4b 45 59 7c 42 54 52 45 45 5f 4c  E_INTKEY|BTREE_L
325f0 45 41 46 44 41 54 41 20 20 20 20 20 55 73 65 64  EAFDATA     Used
32600 20 66 6f 72 20 53 51 4c 20 74 61 62 6c 65 73 20   for SQL tables 
32610 77 69 74 68 20 72 6f 77 69 64 20 6b 65 79 73 0a  with rowid keys.
32620 2a 2a 20 20 20 20 20 42 54 52 45 45 5f 5a 45 52  **     BTREE_ZER
32630 4f 44 41 54 41 20 20 20 20 20 20 20 20 20 20 20  ODATA           
32640 20 20 20 20 20 20 20 55 73 65 64 20 66 6f 72 20         Used for 
32650 53 51 4c 20 69 6e 64 69 63 65 73 0a 2a 2f 0a 73  SQL indices.*/.s
32660 74 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 43  tatic int btreeC
32670 72 65 61 74 65 54 61 62 6c 65 28 42 74 72 65 65  reateTable(Btree
32680 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c   *p, int *piTabl
32690 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
326a0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
326b0 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61   p->pBt;.  MemPa
326c0 67 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 50 67 6e  ge *pRoot;.  Pgn
326d0 6f 20 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e  o pgnoRoot;.  in
326e0 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
326f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
32700 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
32710 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
32720 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
32730 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
32740 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f  ert( !pBt->readO
32750 6e 6c 79 20 29 3b 0a 0a 23 69 66 64 65 66 20 53  nly );..#ifdef S
32760 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
32770 41 43 55 55 4d 0a 20 20 72 63 20 3d 20 61 6c 6c  ACUUM.  rc = all
32780 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
32790 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e  Bt, &pRoot, &pgn
327a0 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20  oRoot, 1, 0);.  
327b0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65  if( rc ){.    re
327c0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6c  turn rc;.  }.#el
327d0 73 65 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75  se.  if( pBt->au
327e0 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
327f0 50 67 6e 6f 20 70 67 6e 6f 4d 6f 76 65 3b 20 20  Pgno pgnoMove;  
32800 20 20 20 20 2f 2a 20 4d 6f 76 65 20 61 20 70 61      /* Move a pa
32810 67 65 20 68 65 72 65 20 74 6f 20 6d 61 6b 65 20  ge here to make 
32820 72 6f 6f 6d 20 66 6f 72 20 74 68 65 20 72 6f 6f  room for the roo
32830 74 2d 70 61 67 65 20 2a 2f 0a 20 20 20 20 4d 65  t-page */.    Me
32840 6d 50 61 67 65 20 2a 70 50 61 67 65 4d 6f 76 65  mPage *pPageMove
32850 3b 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f  ; /* The page to
32860 20 6d 6f 76 65 20 74 6f 2e 20 2a 2f 0a 0a 20 20   move to. */..  
32870 20 20 2f 2a 20 43 72 65 61 74 69 6e 67 20 61 20    /* Creating a 
32880 6e 65 77 20 74 61 62 6c 65 20 6d 61 79 20 70 72  new table may pr
32890 6f 62 61 62 6c 79 20 72 65 71 75 69 72 65 20 6d  obably require m
328a0 6f 76 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e  oving an existin
328b0 67 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  g database.    *
328c0 2a 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66  * to make room f
328d0 6f 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  or the new table
328e0 73 20 72 6f 6f 74 20 70 61 67 65 2e 20 49 6e 20  s root page. In 
328f0 63 61 73 65 20 74 68 69 73 20 70 61 67 65 20 74  case this page t
32900 75 72 6e 73 0a 20 20 20 20 2a 2a 20 6f 75 74 20  urns.    ** out 
32910 74 6f 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f  to be an overflo
32920 77 20 70 61 67 65 2c 20 64 65 6c 65 74 65 20 61  w page, delete a
32930 6c 6c 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ll overflow page
32940 2d 6d 61 70 20 63 61 63 68 65 73 0a 20 20 20 20  -map caches.    
32950 2a 2a 20 68 65 6c 64 20 62 79 20 6f 70 65 6e 20  ** held by open 
32960 63 75 72 73 6f 72 73 2e 0a 20 20 20 20 2a 2f 0a  cursors..    */.
32970 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c      invalidateAl
32980 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
32990 42 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  Bt);..    /* Rea
329a0 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d  d the value of m
329b0 65 74 61 5b 33 5d 20 66 72 6f 6d 20 74 68 65 20  eta[3] from the 
329c0 64 61 74 61 62 61 73 65 20 74 6f 20 64 65 74 65  database to dete
329d0 72 6d 69 6e 65 20 77 68 65 72 65 20 74 68 65 0a  rmine where the.
329e0 20 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65      ** root page
329f0 20 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c   of the new tabl
32a00 65 20 73 68 6f 75 6c 64 20 67 6f 2e 20 6d 65 74  e should go. met
32a10 61 5b 33 5d 20 69 73 20 74 68 65 20 6c 61 72 67  a[3] is the larg
32a20 65 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20  est root-page.  
32a30 20 20 2a 2a 20 63 72 65 61 74 65 64 20 73 6f 20    ** created so 
32a40 66 61 72 2c 20 73 6f 20 74 68 65 20 6e 65 77 20  far, so the new 
32a50 72 6f 6f 74 2d 70 61 67 65 20 69 73 20 28 6d 65  root-page is (me
32a60 74 61 5b 33 5d 2b 31 29 2e 0a 20 20 20 20 2a 2f  ta[3]+1)..    */
32a70 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
32a80 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 70 2c  3BtreeGetMeta(p,
32a90 20 34 2c 20 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a   4, &pgnoRoot);.
32aa0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
32ab0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
32ac0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
32ad0 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a      pgnoRoot++;.
32ae0 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20  .    /* The new 
32af0 72 6f 6f 74 2d 70 61 67 65 20 6d 61 79 20 6e 6f  root-page may no
32b00 74 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f  t be allocated o
32b10 6e 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  n a pointer-map 
32b20 70 61 67 65 2c 20 6f 72 20 74 68 65 0a 20 20 20  page, or the.   
32b30 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45   ** PENDING_BYTE
32b40 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
32b50 20 20 77 68 69 6c 65 28 20 70 67 6e 6f 52 6f 6f    while( pgnoRoo
32b60 74 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f  t==PTRMAP_PAGENO
32b70 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 29 20  (pBt, pgnoRoot) 
32b80 7c 7c 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 52  ||.        pgnoR
32b90 6f 6f 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  oot==PENDING_BYT
32ba0 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
32bb0 20 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b       pgnoRoot++;
32bc0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
32bd0 74 28 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20 29  t( pgnoRoot>=3 )
32be0 3b 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61  ;..    /* Alloca
32bf0 74 65 20 61 20 70 61 67 65 2e 20 54 68 65 20 70  te a page. The p
32c00 61 67 65 20 74 68 61 74 20 63 75 72 72 65 6e 74  age that current
32c10 6c 79 20 72 65 73 69 64 65 73 20 61 74 20 70 67  ly resides at pg
32c20 6e 6f 52 6f 6f 74 20 77 69 6c 6c 0a 20 20 20 20  noRoot will.    
32c30 2a 2a 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 74  ** be moved to t
32c40 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67  he allocated pag
32c50 65 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61 6c  e (unless the al
32c60 6c 6f 63 61 74 65 64 20 70 61 67 65 20 68 61 70  located page hap
32c70 70 65 6e 73 0a 20 20 20 20 2a 2a 20 74 6f 20 72  pens.    ** to r
32c80 65 73 69 64 65 20 61 74 20 70 67 6e 6f 52 6f 6f  eside at pgnoRoo
32c90 74 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  t)..    */.    r
32ca0 63 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65  c = allocateBtre
32cb0 65 50 61 67 65 28 70 42 74 2c 20 26 70 50 61 67  ePage(pBt, &pPag
32cc0 65 4d 6f 76 65 2c 20 26 70 67 6e 6f 4d 6f 76 65  eMove, &pgnoMove
32cd0 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 0a  , pgnoRoot, 1);.
32ce0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
32cf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
32d00 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
32d10 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 4d 6f 76  .    if( pgnoMov
32d20 65 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20  e!=pgnoRoot ){. 
32d30 20 20 20 20 20 2f 2a 20 70 67 6e 6f 52 6f 6f 74       /* pgnoRoot
32d40 20 69 73 20 74 68 65 20 70 61 67 65 20 74 68 61   is the page tha
32d50 74 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66  t will be used f
32d60 6f 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65  or the root-page
32d70 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65   of.      ** the
32d80 20 6e 65 77 20 74 61 62 6c 65 20 28 61 73 73 75   new table (assu
32d90 6d 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 64 69  ming an error di
32da0 64 20 6e 6f 74 20 6f 63 63 75 72 29 2e 20 42 75  d not occur). Bu
32db0 74 20 77 65 20 77 65 72 65 0a 20 20 20 20 20 20  t we were.      
32dc0 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 67 6e  ** allocated pgn
32dd0 6f 4d 6f 76 65 2e 20 49 66 20 72 65 71 75 69 72  oMove. If requir
32de0 65 64 20 28 69 2e 65 2e 20 69 66 20 69 74 20 77  ed (i.e. if it w
32df0 61 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64  as not allocated
32e00 0a 20 20 20 20 20 20 2a 2a 20 62 79 20 65 78 74  .      ** by ext
32e10 65 6e 64 69 6e 67 20 74 68 65 20 66 69 6c 65 29  ending the file)
32e20 2c 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  , the current pa
32e30 67 65 20 61 74 20 70 6f 73 69 74 69 6f 6e 20 70  ge at position p
32e40 67 6e 6f 4d 6f 76 65 0a 20 20 20 20 20 20 2a 2a  gnoMove.      **
32e50 20 69 73 20 61 6c 72 65 61 64 79 20 6a 6f 75 72   is already jour
32e60 6e 61 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a  naled..      */.
32e70 20 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a        u8 eType;.
32e80 20 20 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50        Pgno iPtrP
32e90 61 67 65 3b 0a 0a 20 20 20 20 20 20 72 65 6c 65  age;..      rele
32ea0 61 73 65 50 61 67 65 28 70 50 61 67 65 4d 6f 76  asePage(pPageMov
32eb0 65 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 6f  e);..      /* Mo
32ec0 76 65 20 74 68 65 20 70 61 67 65 20 63 75 72 72  ve the page curr
32ed0 65 6e 74 6c 79 20 61 74 20 70 67 6e 6f 52 6f 6f  ently at pgnoRoo
32ee0 74 20 74 6f 20 70 67 6e 6f 4d 6f 76 65 2e 20 2a  t to pgnoMove. *
32ef0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
32f00 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
32f10 28 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20  (pBt, pgnoRoot, 
32f20 26 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20  &pRoot, 0);.    
32f30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
32f40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
32f50 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
32f60 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72  }.      rc = ptr
32f70 6d 61 70 47 65 74 28 70 42 74 2c 20 70 67 6e 6f  mapGet(pBt, pgno
32f80 52 6f 6f 74 2c 20 26 65 54 79 70 65 2c 20 26 69  Root, &eType, &i
32f90 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20  PtrPage);.      
32fa0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
32fb0 4b 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d  K || eType==PTRM
32fc0 41 50 5f 52 4f 4f 54 50 41 47 45 20 7c 7c 20 65  AP_ROOTPAGE || e
32fd0 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45  Type==PTRMAP_FRE
32fe0 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20  EPAGE ){.       
32ff0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
33000 6f 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ot);.        ret
33010 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
33020 20 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54        assert( eT
33030 79 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54  ype!=PTRMAP_ROOT
33040 50 41 47 45 20 29 3b 0a 20 20 20 20 20 20 61 73  PAGE );.      as
33050 73 65 72 74 28 20 65 54 79 70 65 21 3d 50 54 52  sert( eType!=PTR
33060 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 3b 0a  MAP_FREEPAGE );.
33070 20 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63        rc = reloc
33080 61 74 65 50 61 67 65 28 70 42 74 2c 20 70 52 6f  atePage(pBt, pRo
33090 6f 74 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  ot, eType, iPtrP
330a0 61 67 65 2c 20 70 67 6e 6f 4d 6f 76 65 2c 20 30  age, pgnoMove, 0
330b0 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65  );.      release
330c0 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 0a 20 20  Page(pRoot);..  
330d0 20 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 74 68      /* Obtain th
330e0 65 20 70 61 67 65 20 61 74 20 70 67 6e 6f 52 6f  e page at pgnoRo
330f0 6f 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ot */.      if( 
33100 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
33110 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
33120 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
33130 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
33140 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
33150 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74  pgnoRoot, &pRoot
33160 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
33170 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
33180 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
33190 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
331a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
331b0 67 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e  gerWrite(pRoot->
331c0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
331d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
331e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  K ){.        rel
331f0 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b  easePage(pRoot);
33200 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
33210 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
33220 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 6f  }else{.      pRo
33230 6f 74 20 3d 20 70 50 61 67 65 4d 6f 76 65 3b 0a  ot = pPageMove;.
33240 20 20 20 20 7d 20 0a 0a 20 20 20 20 2f 2a 20 55      } ..    /* U
33250 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65  pdate the pointe
33260 72 2d 6d 61 70 20 61 6e 64 20 6d 65 74 61 2d 64  r-map and meta-d
33270 61 74 61 20 77 69 74 68 20 74 68 65 20 6e 65 77  ata with the new
33280 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65   root-page numbe
33290 72 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70  r. */.    rc = p
332a0 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67  trmapPut(pBt, pg
332b0 6e 6f 52 6f 6f 74 2c 20 50 54 52 4d 41 50 5f 52  noRoot, PTRMAP_R
332c0 4f 4f 54 50 41 47 45 2c 20 30 29 3b 0a 20 20 20  OOTPAGE, 0);.   
332d0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
332e0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
332f0 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ot);.      retur
33300 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
33310 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
33320 65 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34  eUpdateMeta(p, 4
33330 2c 20 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20  , pgnoRoot);.   
33340 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
33350 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f   releasePage(pRo
33360 6f 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ot);.      retur
33370 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d  n rc;.    }..  }
33380 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 61  else{.    rc = a
33390 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65  llocateBtreePage
333a0 28 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70  (pBt, &pRoot, &p
333b0 67 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a  gnoRoot, 1, 0);.
333c0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
333d0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64  urn rc;.  }.#end
333e0 69 66 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  if.  assert( sql
333f0 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
33400 61 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50  able(pRoot->pDbP
33410 61 67 65 29 20 29 3b 0a 20 20 7a 65 72 6f 50 61  age) );.  zeroPa
33420 67 65 28 70 52 6f 6f 74 2c 20 66 6c 61 67 73 20  ge(pRoot, flags 
33430 7c 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 73  | PTF_LEAF);.  s
33440 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
33450 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29  (pRoot->pDbPage)
33460 3b 0a 20 20 2a 70 69 54 61 62 6c 65 20 3d 20 28  ;.  *piTable = (
33470 69 6e 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20  int)pgnoRoot;.  
33480 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
33490 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  ;.}.int sqlite3B
334a0 74 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28  treeCreateTable(
334b0 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70  Btree *p, int *p
334c0 69 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67  iTable, int flag
334d0 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  s){.  int rc;.  
334e0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
334f0 72 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e  r(p);.  p->pBt->
33500 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63  db = p->db;.  rc
33510 20 3d 20 62 74 72 65 65 43 72 65 61 74 65 54 61   = btreeCreateTa
33520 62 6c 65 28 70 2c 20 70 69 54 61 62 6c 65 2c 20  ble(p, piTable, 
33530 66 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65  flags);.  sqlite
33540 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
33550 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
33560 2f 2a 0a 2a 2a 20 45 72 61 73 65 20 74 68 65 20  /*.** Erase the 
33570 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20 70  given database p
33580 61 67 65 20 61 6e 64 20 61 6c 6c 20 69 74 73 20  age and all its 
33590 63 68 69 6c 64 72 65 6e 2e 20 20 52 65 74 75 72  children.  Retur
335a0 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 74 6f  n.** the page to
335b0 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
335c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65  /.static int cle
335d0 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28 0a  arDatabasePage(.
335e0 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c    BtShared *pBt,
335f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
33600 65 20 42 54 72 65 65 20 74 68 61 74 20 63 6f 6e  e BTree that con
33610 74 61 69 6e 73 20 74 68 65 20 74 61 62 6c 65 20  tains the table 
33620 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  */.  Pgno pgno, 
33630 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
33640 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 6c 65  ge number to cle
33650 61 72 20 2a 2f 0a 20 20 69 6e 74 20 66 72 65 65  ar */.  int free
33660 50 61 67 65 46 6c 61 67 2c 20 20 20 20 20 2f 2a  PageFlag,     /*
33670 20 44 65 61 6c 6c 6f 63 61 74 65 20 70 61 67 65   Deallocate page
33680 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e   if true */.  in
33690 74 20 2a 70 6e 43 68 61 6e 67 65 0a 29 7b 0a 20  t *pnChange.){. 
336a0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
336b0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
336c0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
336d0 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a  pCell;.  int i;.
336e0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
336f0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
33700 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
33710 66 28 20 70 67 6e 6f 3e 70 61 67 65 72 50 61 67  f( pgno>pagerPag
33720 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20  ecount(pBt) ){. 
33730 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
33740 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
33750 20 7d 0a 0a 20 20 72 63 20 3d 20 67 65 74 41 6e   }..  rc = getAn
33760 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70  dInitPage(pBt, p
33770 67 6e 6f 2c 20 26 70 50 61 67 65 29 3b 0a 20 20  gno, &pPage);.  
33780 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c  if( rc ) goto cl
33790 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65 5f  eardatabasepage_
337a0 6f 75 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  out;.  for(i=0; 
337b0 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
337c0 69 2b 2b 29 7b 0a 20 20 20 20 70 43 65 6c 6c 20  i++){.    pCell 
337d0 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65  = findCell(pPage
337e0 2c 20 69 29 3b 0a 20 20 20 20 69 66 28 20 21 70  , i);.    if( !p
337f0 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
33800 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61      rc = clearDa
33810 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c 20  tabasePage(pBt, 
33820 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c  get4byte(pCell),
33830 20 31 2c 20 70 6e 43 68 61 6e 67 65 29 3b 0a 20   1, pnChange);. 
33840 20 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f       if( rc ) go
33850 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65  to cleardatabase
33860 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  page_out;.    }.
33870 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65      rc = clearCe
33880 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29  ll(pPage, pCell)
33890 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
338a0 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73  oto cleardatabas
338b0 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20  epage_out;.  }. 
338c0 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
338d0 66 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c  f ){.    rc = cl
338e0 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28  earDatabasePage(
338f0 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 26 70  pBt, get4byte(&p
33900 50 61 67 65 2d 3e 61 44 61 74 61 5b 38 5d 29 2c  Page->aData[8]),
33910 20 31 2c 20 70 6e 43 68 61 6e 67 65 29 3b 0a 20   1, pnChange);. 
33920 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
33930 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61   cleardatabasepa
33940 67 65 5f 6f 75 74 3b 0a 20 20 7d 65 6c 73 65 20  ge_out;.  }else 
33950 69 66 28 20 70 6e 43 68 61 6e 67 65 20 29 7b 0a  if( pnChange ){.
33960 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
33970 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20  e->intKey );.   
33980 20 2a 70 6e 43 68 61 6e 67 65 20 2b 3d 20 70 50   *pnChange += pP
33990 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 7d 0a  age->nCell;.  }.
339a0 20 20 69 66 28 20 66 72 65 65 50 61 67 65 46 6c    if( freePageFl
339b0 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  ag ){.    rc = f
339c0 72 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  reePage(pPage);.
339d0 20 20 7d 65 6c 73 65 20 69 66 28 20 28 72 63 20    }else if( (rc 
339e0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
339f0 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
33a00 67 65 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a  ge))==0 ){.    z
33a10 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70  eroPage(pPage, p
33a20 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 7c  Page->aData[0] |
33a30 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 7d 0a   PTF_LEAF);.  }.
33a40 0a 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61  .cleardatabasepa
33a50 67 65 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73  ge_out:.  releas
33a60 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
33a70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
33a80 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69  .** Delete all i
33a90 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20  nformation from 
33aa0 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69  a single table i
33ab0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
33ac0 20 69 54 61 62 6c 65 20 69 73 0a 2a 2a 20 74 68   iTable is.** th
33ad0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
33ae0 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
33af0 20 74 61 62 6c 65 2e 20 20 41 66 74 65 72 20 74   table.  After t
33b00 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
33b10 72 6e 73 2c 0a 2a 2a 20 74 68 65 20 72 6f 6f 74  rns,.** the root
33b20 20 70 61 67 65 20 69 73 20 65 6d 70 74 79 2c 20   page is empty, 
33b30 62 75 74 20 73 74 69 6c 6c 20 65 78 69 73 74 73  but still exists
33b40 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
33b50 74 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 77  tine will fail w
33b60 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  ith SQLITE_LOCKE
33b70 44 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  D if there are a
33b80 6e 79 20 6f 70 65 6e 0a 2a 2a 20 72 65 61 64 20  ny open.** read 
33b90 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74  cursors on the t
33ba0 61 62 6c 65 2e 20 20 4f 70 65 6e 20 77 72 69 74  able.  Open writ
33bb0 65 20 63 75 72 73 6f 72 73 20 61 72 65 20 6d 6f  e cursors are mo
33bc0 76 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 72 6f  ved to the.** ro
33bd0 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  ot of the table.
33be0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 6e 43 68 61 6e  .**.** If pnChan
33bf0 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  ge is not NULL, 
33c00 74 68 65 6e 20 74 61 62 6c 65 20 69 54 61 62 6c  then table iTabl
33c10 65 20 6d 75 73 74 20 62 65 20 61 6e 20 69 6e 74  e must be an int
33c20 6b 65 79 20 74 61 62 6c 65 2e 20 54 68 65 0a 2a  key table. The.*
33c30 2a 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  * integer value 
33c40 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 6e  pointed to by pn
33c50 43 68 61 6e 67 65 20 69 73 20 69 6e 63 72 65 6d  Change is increm
33c60 65 6e 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d  ented by the num
33c70 62 65 72 20 6f 66 0a 2a 2a 20 65 6e 74 72 69 65  ber of.** entrie
33c80 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a  s in the table..
33c90 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
33ca0 72 65 65 43 6c 65 61 72 54 61 62 6c 65 28 42 74  reeClearTable(Bt
33cb0 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62  ree *p, int iTab
33cc0 6c 65 2c 20 69 6e 74 20 2a 70 6e 43 68 61 6e 67  le, int *pnChang
33cd0 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
33ce0 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
33cf0 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  p->pBt;.  sqlite
33d00 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
33d10 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64    pBt->db = p->d
33d20 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  b;.  assert( p->
33d30 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57  inTrans==TRANS_W
33d40 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20 28 72  RITE );.  if( (r
33d50 63 20 3d 20 63 68 65 63 6b 46 6f 72 52 65 61 64  c = checkForRead
33d60 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61  Conflicts(p, iTa
33d70 62 6c 65 2c 20 30 2c 20 31 29 29 21 3d 53 51 4c  ble, 0, 1))!=SQL
33d80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
33d90 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 2a   nothing to do *
33da0 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 53 51  /.  }else if( SQ
33db0 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73  LITE_OK!=(rc = s
33dc0 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42  aveAllCursors(pB
33dd0 74 2c 20 69 54 61 62 6c 65 2c 20 30 29 29 20 29  t, iTable, 0)) )
33de0 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74 68 69 6e 67  {.    /* nothing
33df0 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73   to do */.  }els
33e00 65 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61  e{.    rc = clea
33e10 72 44 61 74 61 62 61 73 65 50 61 67 65 28 70 42  rDatabasePage(pB
33e20 74 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c  t, (Pgno)iTable,
33e30 20 30 2c 20 70 6e 43 68 61 6e 67 65 29 3b 0a 20   0, pnChange);. 
33e40 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
33e50 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
33e60 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
33e70 20 45 72 61 73 65 20 61 6c 6c 20 69 6e 66 6f 72   Erase all infor
33e80 6d 61 74 69 6f 6e 20 69 6e 20 61 20 74 61 62 6c  mation in a tabl
33e90 65 20 61 6e 64 20 61 64 64 20 74 68 65 20 72 6f  e and add the ro
33ea0 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ot of the table 
33eb0 74 6f 0a 2a 2a 20 74 68 65 20 66 72 65 65 6c 69  to.** the freeli
33ec0 73 74 2e 20 20 45 78 63 65 70 74 2c 20 74 68 65  st.  Except, the
33ed0 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 70 72 69   root of the pri
33ee0 6e 63 69 70 6c 65 20 74 61 62 6c 65 20 28 74 68  nciple table (th
33ef0 65 20 6f 6e 65 20 6f 6e 0a 2a 2a 20 70 61 67 65  e one on.** page
33f00 20 31 29 20 69 73 20 6e 65 76 65 72 20 61 64 64   1) is never add
33f10 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
33f20 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  st..**.** This r
33f30 6f 75 74 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c  outine will fail
33f40 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43   with SQLITE_LOC
33f50 4b 45 44 20 69 66 20 74 68 65 72 65 20 61 72 65  KED if there are
33f60 20 61 6e 79 20 6f 70 65 6e 0a 2a 2a 20 63 75 72   any open.** cur
33f70 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61 62 6c  sors on the tabl
33f80 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 41 55 54 4f  e..**.** If AUTO
33f90 56 41 43 55 55 4d 20 69 73 20 65 6e 61 62 6c 65  VACUUM is enable
33fa0 64 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 61  d and the page a
33fb0 74 20 69 54 61 62 6c 65 20 69 73 20 6e 6f 74 20  t iTable is not 
33fc0 74 68 65 20 6c 61 73 74 0a 2a 2a 20 72 6f 6f 74  the last.** root
33fd0 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
33fe0 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
33ff0 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70   the last root p
34000 61 67 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 64  age .** in the d
34010 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
34020 6d 6f 76 65 64 20 69 6e 74 6f 20 74 68 65 20 73  moved into the s
34030 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63  lot formerly occ
34040 75 70 69 65 64 20 62 79 0a 2a 2a 20 69 54 61 62  upied by.** iTab
34050 6c 65 20 61 6e 64 20 74 68 61 74 20 6c 61 73 74  le and that last
34060 20 73 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f   slot formerly o
34070 63 63 75 70 69 65 64 20 62 79 20 74 68 65 20 6c  ccupied by the l
34080 61 73 74 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a  ast root page.**
34090 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
340a0 20 66 72 65 65 6c 69 73 74 20 69 6e 73 74 65 61   freelist instea
340b0 64 20 6f 66 20 69 54 61 62 6c 65 2e 20 20 49 6e  d of iTable.  In
340c0 20 74 68 69 73 20 73 61 79 2c 20 61 6c 6c 0a 2a   this say, all.*
340d0 2a 20 72 6f 6f 74 20 70 61 67 65 73 20 61 72 65  * root pages are
340e0 20 6b 65 70 74 20 61 74 20 74 68 65 20 62 65 67   kept at the beg
340f0 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61  inning of the da
34100 74 61 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69  tabase file, whi
34110 63 68 0a 2a 2a 20 69 73 20 6e 65 63 65 73 73 61  ch.** is necessa
34120 72 79 20 66 6f 72 20 41 55 54 4f 56 41 43 55 55  ry for AUTOVACUU
34130 4d 20 74 6f 20 77 6f 72 6b 20 72 69 67 68 74 2e  M to work right.
34140 20 20 2a 70 69 4d 6f 76 65 64 20 69 73 20 73 65    *piMoved is se
34150 74 20 74 6f 20 74 68 65 20 0a 2a 2a 20 70 61 67  t to the .** pag
34160 65 20 6e 75 6d 62 65 72 20 74 68 61 74 20 75 73  e number that us
34170 65 64 20 74 6f 20 62 65 20 74 68 65 20 6c 61 73  ed to be the las
34180 74 20 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74  t root page in t
34190 68 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a 2a  he file before.*
341a0 2a 20 74 68 65 20 6d 6f 76 65 2e 20 20 49 66 20  * the move.  If 
341b0 6e 6f 20 70 61 67 65 20 67 65 74 73 20 6d 6f 76  no page gets mov
341c0 65 64 2c 20 2a 70 69 4d 6f 76 65 64 20 69 73 20  ed, *piMoved is 
341d0 73 65 74 20 74 6f 20 30 2e 0a 2a 2a 20 54 68 65  set to 0..** The
341e0 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20   last root page 
341f0 69 73 20 72 65 63 6f 72 64 65 64 20 69 6e 20 6d  is recorded in m
34200 65 74 61 5b 33 5d 20 61 6e 64 20 74 68 65 20 76  eta[3] and the v
34210 61 6c 75 65 20 6f 66 0a 2a 2a 20 6d 65 74 61 5b  alue of.** meta[
34220 33 5d 20 69 73 20 75 70 64 61 74 65 64 20 62 79  3] is updated by
34230 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 2e   this procedure.
34240 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
34250 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28 42 74  treeDropTable(Bt
34260 72 65 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61  ree *p, Pgno iTa
34270 62 6c 65 2c 20 69 6e 74 20 2a 70 69 4d 6f 76 65  ble, int *piMove
34280 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  d){.  int rc;.  
34290 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
342a0 20 30 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a   0;.  BtShared *
342b0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
342c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
342d0 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
342e0 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
342f0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
34300 53 5f 57 52 49 54 45 20 29 3b 0a 0a 20 20 2f 2a  S_WRITE );..  /*
34310 20 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74   It is illegal t
34320 6f 20 64 72 6f 70 20 61 20 74 61 62 6c 65 20 69  o drop a table i
34330 66 20 61 6e 79 20 63 75 72 73 6f 72 73 20 61 72  f any cursors ar
34340 65 20 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 20 20  e open on the.  
34350 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 69  ** database. Thi
34360 73 20 69 73 20 62 65 63 61 75 73 65 20 69 6e 20  s is because in 
34370 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65  auto-vacuum mode
34380 20 74 68 65 20 62 61 63 6b 65 6e 64 20 6d 61 79   the backend may
34390 0a 20 20 2a 2a 20 6e 65 65 64 20 74 6f 20 6d 6f  .  ** need to mo
343a0 76 65 20 61 6e 6f 74 68 65 72 20 72 6f 6f 74 2d  ve another root-
343b0 70 61 67 65 20 74 6f 20 66 69 6c 6c 20 61 20 67  page to fill a g
343c0 61 70 20 6c 65 66 74 20 62 79 20 74 68 65 20 64  ap left by the d
343d0 65 6c 65 74 65 64 0a 20 20 2a 2a 20 72 6f 6f 74  eleted.  ** root
343e0 20 70 61 67 65 2e 20 49 66 20 61 6e 20 6f 70 65   page. If an ope
343f0 6e 20 63 75 72 73 6f 72 20 77 61 73 20 75 73 69  n cursor was usi
34400 6e 67 20 74 68 69 73 20 70 61 67 65 20 61 20 70  ng this page a p
34410 72 6f 62 6c 65 6d 20 77 6f 75 6c 64 20 0a 20 20  roblem would .  
34420 2a 2a 20 6f 63 63 75 72 2e 0a 20 20 2a 2f 0a 20  ** occur..  */. 
34430 20 69 66 28 20 70 42 74 2d 3e 70 43 75 72 73 6f   if( pBt->pCurso
34440 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
34450 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65  ConnectionBlocke
34460 64 28 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 43  d(p->db, pBt->pC
34470 75 72 73 6f 72 2d 3e 70 42 74 72 65 65 2d 3e 64  ursor->pBtree->d
34480 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  b);.    return S
34490 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41  QLITE_LOCKED_SHA
344a0 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
344b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
344c0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 28  eeGetPage(pBt, (
344d0 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 26 70 50  Pgno)iTable, &pP
344e0 61 67 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  age, 0);.  if( r
344f0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
34500 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
34510 65 65 43 6c 65 61 72 54 61 62 6c 65 28 70 2c 20  eeClearTable(p, 
34520 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 69 66  iTable, 0);.  if
34530 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 6c 65  ( rc ){.    rele
34540 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
34550 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
34560 20 7d 0a 0a 20 20 2a 70 69 4d 6f 76 65 64 20 3d   }..  *piMoved =
34570 20 30 3b 0a 0a 20 20 69 66 28 20 69 54 61 62 6c   0;..  if( iTabl
34580 65 3e 31 20 29 7b 0a 23 69 66 64 65 66 20 53 51  e>1 ){.#ifdef SQ
34590 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
345a0 43 55 55 4d 0a 20 20 20 20 72 63 20 3d 20 66 72  CUUM.    rc = fr
345b0 65 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  eePage(pPage);. 
345c0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
345d0 50 61 67 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20  Page);.#else.   
345e0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
345f0 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 50 67  cuum ){.      Pg
34600 6e 6f 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a  no maxRootPgno;.
34610 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
34620 65 33 42 74 72 65 65 47 65 74 4d 65 74 61 28 70  e3BtreeGetMeta(p
34630 2c 20 34 2c 20 26 6d 61 78 52 6f 6f 74 50 67 6e  , 4, &maxRootPgn
34640 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
34650 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
34660 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
34670 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
34680 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
34690 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
346a0 20 69 54 61 62 6c 65 3d 3d 6d 61 78 52 6f 6f 74   iTable==maxRoot
346b0 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20  Pgno ){.        
346c0 2f 2a 20 49 66 20 74 68 65 20 74 61 62 6c 65 20  /* If the table 
346d0 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20 69 73  being dropped is
346e0 20 74 68 65 20 74 61 62 6c 65 20 77 69 74 68 20   the table with 
346f0 74 68 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74  the largest root
34700 2d 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a  -page.        **
34710 20 6e 75 6d 62 65 72 20 69 6e 20 74 68 65 20 64   number in the d
34720 61 74 61 62 61 73 65 2c 20 70 75 74 20 74 68 65  atabase, put the
34730 20 72 6f 6f 74 20 70 61 67 65 20 6f 6e 20 74 68   root page on th
34740 65 20 66 72 65 65 20 6c 69 73 74 2e 20 0a 20 20  e free list. .  
34750 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
34760 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70   rc = freePage(p
34770 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Page);.        r
34780 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67 65  eleasePage(pPage
34790 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
347a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
347b0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
347c0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
347d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
347e0 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
347f0 20 62 65 69 6e 67 20 64 72 6f 70 70 65 64 20 64   being dropped d
34800 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 68 65  oes not have the
34810 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61   largest root-pa
34820 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  ge.        ** nu
34830 6d 62 65 72 20 69 6e 20 74 68 65 20 64 61 74 61  mber in the data
34840 62 61 73 65 2e 20 53 6f 20 6d 6f 76 65 20 74 68  base. So move th
34850 65 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  e page that does
34860 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 20   into the .     
34870 20 20 20 2a 2a 20 67 61 70 20 6c 65 66 74 20 62     ** gap left b
34880 79 20 74 68 65 20 64 65 6c 65 74 65 64 20 72 6f  y the deleted ro
34890 6f 74 2d 70 61 67 65 2e 0a 20 20 20 20 20 20 20  ot-page..       
348a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 4d 65 6d 50   */.        MemP
348b0 61 67 65 20 2a 70 4d 6f 76 65 3b 0a 20 20 20 20  age *pMove;.    
348c0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
348d0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
348e0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
348f0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 6d 61  eGetPage(pBt, ma
34900 78 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76  xRootPgno, &pMov
34910 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  e, 0);.        i
34920 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
34930 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
34940 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
34950 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20   }.        rc = 
34960 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74  relocatePage(pBt
34970 2c 20 70 4d 6f 76 65 2c 20 50 54 52 4d 41 50 5f  , pMove, PTRMAP_
34980 52 4f 4f 54 50 41 47 45 2c 20 30 2c 20 69 54 61  ROOTPAGE, 0, iTa
34990 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ble, 0);.       
349a0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4d 6f   releasePage(pMo
349b0 76 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ve);.        if(
349c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
349d0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
349e0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
349f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
34a00 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67  lite3BtreeGetPag
34a10 65 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67  e(pBt, maxRootPg
34a20 6e 6f 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a  no, &pMove, 0);.
34a30 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
34a40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34a50 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
34a60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
34a70 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
34a80 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20  e(pMove);.      
34a90 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 4d    releasePage(pM
34aa0 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ove);.        if
34ab0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
34ac0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
34ad0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
34ae0 7d 0a 20 20 20 20 20 20 20 20 2a 70 69 4d 6f 76  }.        *piMov
34af0 65 64 20 3d 20 6d 61 78 52 6f 6f 74 50 67 6e 6f  ed = maxRootPgno
34b00 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
34b10 20 2f 2a 20 53 65 74 20 74 68 65 20 6e 65 77 20   /* Set the new 
34b20 27 6d 61 78 2d 72 6f 6f 74 2d 70 61 67 65 27 20  'max-root-page' 
34b30 76 61 6c 75 65 20 69 6e 20 74 68 65 20 64 61 74  value in the dat
34b40 61 62 61 73 65 20 68 65 61 64 65 72 2e 20 54 68  abase header. Th
34b50 69 73 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74  is.      ** is t
34b60 68 65 20 6f 6c 64 20 76 61 6c 75 65 20 6c 65 73  he old value les
34b70 73 20 6f 6e 65 2c 20 6c 65 73 73 20 6f 6e 65 20  s one, less one 
34b80 6d 6f 72 65 20 69 66 20 74 68 61 74 20 68 61 70  more if that hap
34b90 70 65 6e 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a  pens to.      **
34ba0 20 62 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20   be a root-page 
34bb0 6e 75 6d 62 65 72 2c 20 6c 65 73 73 20 6f 6e 65  number, less one
34bc0 20 61 67 61 69 6e 20 69 66 20 74 68 61 74 20 69   again if that i
34bd0 73 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 50  s the.      ** P
34be0 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
34bf0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
34c00 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a   maxRootPgno--;.
34c10 20 20 20 20 20 20 69 66 28 20 6d 61 78 52 6f 6f        if( maxRoo
34c20 74 50 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42  tPgno==PENDING_B
34c30 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
34c40 0a 20 20 20 20 20 20 20 20 6d 61 78 52 6f 6f 74  .        maxRoot
34c50 50 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a  Pgno--;.      }.
34c60 20 20 20 20 20 20 69 66 28 20 6d 61 78 52 6f 6f        if( maxRoo
34c70 74 50 67 6e 6f 3d 3d 50 54 52 4d 41 50 5f 50 41  tPgno==PTRMAP_PA
34c80 47 45 4e 4f 28 70 42 74 2c 20 6d 61 78 52 6f 6f  GENO(pBt, maxRoo
34c90 74 50 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20  tPgno) ){.      
34ca0 20 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b    maxRootPgno--;
34cb0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
34cc0 73 73 65 72 74 28 20 6d 61 78 52 6f 6f 74 50 67  ssert( maxRootPg
34cd0 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  no!=PENDING_BYTE
34ce0 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 20  _PAGE(pBt) );.. 
34cf0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
34d00 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61  3BtreeUpdateMeta
34d10 28 70 2c 20 34 2c 20 6d 61 78 52 6f 6f 74 50 67  (p, 4, maxRootPg
34d20 6e 6f 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  no);.    }else{.
34d30 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50        rc = freeP
34d40 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
34d50 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
34d60 61 67 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  age);.    }.#end
34d70 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
34d80 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 42 74 72  /* If sqlite3Btr
34d90 65 65 44 72 6f 70 54 61 62 6c 65 20 77 61 73 20  eeDropTable was 
34da0 63 61 6c 6c 65 64 20 6f 6e 20 70 61 67 65 20 31  called on page 1
34db0 2e 20 2a 2f 0a 20 20 20 20 7a 65 72 6f 50 61 67  . */.    zeroPag
34dc0 65 28 70 50 61 67 65 2c 20 50 54 46 5f 49 4e 54  e(pPage, PTF_INT
34dd0 4b 45 59 7c 50 54 46 5f 4c 45 41 46 20 29 3b 0a  KEY|PTF_LEAF );.
34de0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
34df0 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pPage);.  }.  re
34e00 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 69 6e 74  turn rc;  .}.int
34e10 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f   sqlite3BtreeDro
34e20 70 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c  pTable(Btree *p,
34e30 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74   int iTable, int
34e40 20 2a 70 69 4d 6f 76 65 64 29 7b 0a 20 20 69 6e   *piMoved){.  in
34e50 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42  t rc;.  sqlite3B
34e60 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
34e70 70 2d 3e 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  p->pBt->db = p->
34e80 64 62 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65  db;.  rc = btree
34e90 44 72 6f 70 54 61 62 6c 65 28 70 2c 20 69 54 61  DropTable(p, iTa
34ea0 62 6c 65 2c 20 70 69 4d 6f 76 65 64 29 3b 0a 20  ble, piMoved);. 
34eb0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
34ec0 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
34ed0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc;.}.../*.** Re
34ee0 61 64 20 74 68 65 20 6d 65 74 61 2d 69 6e 66 6f  ad the meta-info
34ef0 72 6d 61 74 69 6f 6e 20 6f 75 74 20 6f 66 20 61  rmation out of a
34f00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
34f10 20 4d 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20 74   Meta[0].** is t
34f20 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65  he number of fre
34f30 65 20 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c  e pages currentl
34f40 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  y in the databas
34f50 65 2e 20 20 4d 65 74 61 5b 31 5d 0a 2a 2a 20 74  e.  Meta[1].** t
34f60 68 72 6f 75 67 68 20 6d 65 74 61 5b 31 35 5d 20  hrough meta[15] 
34f70 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 66 6f  are available fo
34f80 72 20 75 73 65 20 62 79 20 68 69 67 68 65 72 20  r use by higher 
34f90 6c 61 79 65 72 73 2e 20 20 4d 65 74 61 5b 30 5d  layers.  Meta[0]
34fa0 0a 2a 2a 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  .** is read-only
34fb0 2c 20 74 68 65 20 6f 74 68 65 72 73 20 61 72 65  , the others are
34fc0 20 72 65 61 64 2f 77 72 69 74 65 2e 0a 2a 2a 20   read/write..** 
34fd0 0a 2a 2a 20 54 68 65 20 73 63 68 65 6d 61 20 6c  .** The schema l
34fe0 61 79 65 72 20 6e 75 6d 62 65 72 73 20 6d 65 74  ayer numbers met
34ff0 61 20 76 61 6c 75 65 73 20 64 69 66 66 65 72 65  a values differe
35000 6e 74 6c 79 2e 20 20 41 74 20 74 68 65 20 73 63  ntly.  At the sc
35010 68 65 6d 61 0a 2a 2a 20 6c 61 79 65 72 20 28 61  hema.** layer (a
35020 6e 64 20 74 68 65 20 53 65 74 43 6f 6f 6b 69 65  nd the SetCookie
35030 20 61 6e 64 20 52 65 61 64 43 6f 6f 6b 69 65 20   and ReadCookie 
35040 6f 70 63 6f 64 65 73 29 20 74 68 65 20 6e 75 6d  opcodes) the num
35050 62 65 72 20 6f 66 0a 2a 2a 20 66 72 65 65 20 70  ber of.** free p
35060 61 67 65 73 20 69 73 20 6e 6f 74 20 76 69 73 69  ages is not visi
35070 62 6c 65 2e 20 20 53 6f 20 43 6f 6f 6b 69 65 5b  ble.  So Cookie[
35080 30 5d 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  0] is the same a
35090 73 20 4d 65 74 61 5b 31 5d 2e 0a 2a 2f 0a 69 6e  s Meta[1]..*/.in
350a0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
350b0 74 4d 65 74 61 28 42 74 72 65 65 20 2a 70 2c 20  tMeta(Btree *p, 
350c0 69 6e 74 20 69 64 78 2c 20 75 33 32 20 2a 70 4d  int idx, u32 *pM
350d0 65 74 61 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  eta){.  DbPage *
350e0 70 44 62 50 61 67 65 20 3d 20 30 3b 0a 20 20 69  pDbPage = 0;.  i
350f0 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65  nt rc;.  unsigne
35100 64 20 63 68 61 72 20 2a 70 50 31 3b 0a 20 20 42  d char *pP1;.  B
35110 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
35120 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65  ->pBt;..  sqlite
35130 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a  3BtreeEnter(p);.
35140 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64    pBt->db = p->d
35150 62 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 69 6e 67  b;..  /* Reading
35160 20 61 20 6d 65 74 61 2d 64 61 74 61 20 76 61 6c   a meta-data val
35170 75 65 20 72 65 71 75 69 72 65 73 20 61 20 72 65  ue requires a re
35180 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20  ad-lock on page 
35190 31 20 28 61 6e 64 20 68 65 6e 63 65 0a 20 20 2a  1 (and hence.  *
351a0 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73  * the sqlite_mas
351b0 74 65 72 20 74 61 62 6c 65 2e 20 57 65 20 67 72  ter table. We gr
351c0 61 62 20 74 68 69 73 20 6c 6f 63 6b 20 72 65 67  ab this lock reg
351d0 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68  ardless of wheth
351e0 65 72 20 6f 72 0a 20 20 2a 2a 20 6e 6f 74 20 74  er or.  ** not t
351f0 68 65 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e  he SQLITE_ReadUn
35200 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69  committed flag i
35210 73 20 73 65 74 20 28 74 68 65 20 74 61 62 6c 65  s set (the table
35220 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67 65 0a   rooted at page.
35230 20 20 2a 2a 20 31 20 69 73 20 74 72 65 61 74 65    ** 1 is treate
35240 64 20 61 73 20 61 20 73 70 65 63 69 61 6c 20 63  d as a special c
35250 61 73 65 20 62 79 20 71 75 65 72 79 53 68 61 72  ase by queryShar
35260 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b  edCacheTableLock
35270 28 29 0a 20 20 2a 2a 20 61 6e 64 20 73 65 74 53  ().  ** and setS
35280 68 61 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c  haredCacheTableL
35290 6f 63 6b 28 29 29 2e 0a 20 20 2a 2f 0a 20 20 72  ock())..  */.  r
352a0 63 20 3d 20 71 75 65 72 79 53 68 61 72 65 64 43  c = querySharedC
352b0 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
352c0 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a   1, READ_LOCK);.
352d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
352e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
352f0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b  e3BtreeLeave(p);
35300 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
35310 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 69    }..  assert( i
35320 64 78 3e 3d 30 20 26 26 20 69 64 78 3c 3d 31 35  dx>=0 && idx<=15
35330 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70   );.  if( pBt->p
35340 50 61 67 65 31 20 29 7b 0a 20 20 20 20 2f 2a 20  Page1 ){.    /* 
35350 54 68 65 20 62 2d 74 72 65 65 20 69 73 20 61 6c  The b-tree is al
35360 72 65 61 64 79 20 68 6f 6c 64 69 6e 67 20 61 20  ready holding a 
35370 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
35380 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61 62  e 1 of the datab
35390 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e  ase.    ** file.
353a0 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
353b0 65 20 72 65 71 75 69 72 65 64 20 6d 65 74 61 2d  e required meta-
353c0 64 61 74 61 20 76 61 6c 75 65 20 63 61 6e 20 62  data value can b
353d0 65 20 72 65 61 64 20 64 69 72 65 63 74 6c 79 0a  e read directly.
353e0 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20      ** from the 
353f0 70 61 67 65 20 64 61 74 61 20 6f 66 20 74 68 69  page data of thi
35400 73 20 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69  s reference. Thi
35410 73 20 69 73 20 73 6c 69 67 68 74 6c 79 20 66 61  s is slightly fa
35420 73 74 65 72 20 74 68 61 6e 0a 20 20 20 20 2a 2a  ster than.    **
35430 20 72 65 71 75 65 73 74 69 6e 67 20 61 20 6e 65   requesting a ne
35440 77 20 72 65 66 65 72 65 6e 63 65 20 66 72 6f 6d  w reference from
35450 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
35460 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 31  ..    */.    pP1
35470 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61   = (unsigned cha
35480 72 20 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d  r *)pBt->pPage1-
35490 3e 61 44 61 74 61 3b 0a 20 20 7d 65 6c 73 65 7b  >aData;.  }else{
354a0 0a 20 20 20 20 2f 2a 20 54 68 65 20 62 2d 74 72  .    /* The b-tr
354b0 65 65 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  ee does not have
354c0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
354d0 70 61 67 65 20 31 20 6f 66 20 74 68 65 20 64 61  page 1 of the da
354e0 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
354f0 20 2a 2a 20 4f 62 74 61 69 6e 20 6f 6e 65 20 66   ** Obtain one f
35500 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61  rom the pager la
35510 79 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  yer..    */.    
35520 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
35530 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72  rGet(pBt->pPager
35540 2c 20 31 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  , 1, &pDbPage);.
35550 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
35560 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
35570 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
35580 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
35590 0a 20 20 20 20 70 50 31 20 3d 20 28 75 6e 73 69  .    pP1 = (unsi
355a0 67 6e 65 64 20 63 68 61 72 20 2a 29 73 71 6c 69  gned char *)sqli
355b0 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
355c0 70 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  pDbPage);.  }.  
355d0 2a 70 4d 65 74 61 20 3d 20 67 65 74 34 62 79 74  *pMeta = get4byt
355e0 65 28 26 70 50 31 5b 33 36 20 2b 20 69 64 78 2a  e(&pP1[36 + idx*
355f0 34 5d 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  4]);..  /* If th
35600 65 20 62 2d 74 72 65 65 20 69 73 20 6e 6f 74 20  e b-tree is not 
35610 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65  holding a refere
35620 6e 63 65 20 74 6f 20 70 61 67 65 20 31 2c 20 74  nce to page 1, t
35630 68 65 6e 20 6f 6e 65 20 77 61 73 20 0a 20 20 2a  hen one was .  *
35640 2a 20 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d  * requested from
35650 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65 72   the pager layer
35660 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 62 6c   in the above bl
35670 6f 63 6b 2e 20 52 65 6c 65 61 73 65 20 69 74 20  ock. Release it 
35680 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  now..  */.  if( 
35690 21 70 42 74 2d 3e 70 50 61 67 65 31 20 29 7b 0a  !pBt->pPage1 ){.
356a0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
356b0 55 6e 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a  Unref(pDbPage);.
356c0 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 75 74    }..  /* If aut
356d0 6f 76 61 63 75 75 6d 65 64 20 69 73 20 64 69 73  ovacuumed is dis
356e0 61 62 6c 65 64 20 69 6e 20 74 68 69 73 20 62 75  abled in this bu
356f0 69 6c 64 20 62 75 74 20 77 65 20 61 72 65 20 74  ild but we are t
35700 72 79 69 6e 67 20 74 6f 20 0a 20 20 2a 2a 20 61  rying to .  ** a
35710 63 63 65 73 73 20 61 6e 20 61 75 74 6f 76 61 63  ccess an autovac
35720 75 75 6d 65 64 20 64 61 74 61 62 61 73 65 2c 20  uumed database, 
35730 74 68 65 6e 20 6d 61 6b 65 20 74 68 65 20 64 61  then make the da
35740 74 61 62 61 73 65 20 72 65 61 64 6f 6e 6c 79 2e  tabase readonly.
35750 20 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51   .  */.#ifdef SQ
35760 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
35770 43 55 55 4d 0a 20 20 69 66 28 20 69 64 78 3d 3d  CUUM.  if( idx==
35780 34 20 26 26 20 2a 70 4d 65 74 61 3e 30 20 29 20  4 && *pMeta>0 ) 
35790 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20  pBt->readOnly = 
357a0 31 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  1;.#endif..  /* 
357b0 47 72 61 62 20 74 68 65 20 72 65 61 64 2d 6c 6f  Grab the read-lo
357c0 63 6b 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f  ck on page 1. */
357d0 0a 20 20 72 63 20 3d 20 73 65 74 53 68 61 72 65  .  rc = setShare
357e0 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28  dCacheTableLock(
357f0 70 2c 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29  p, 1, READ_LOCK)
35800 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
35810 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
35820 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
35830 57 72 69 74 65 20 6d 65 74 61 2d 69 6e 66 6f 72  Write meta-infor
35840 6d 61 74 69 6f 6e 20 62 61 63 6b 20 69 6e 74 6f  mation back into
35850 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
35860 4d 65 74 61 5b 30 5d 20 69 73 0a 2a 2a 20 72 65  Meta[0] is.** re
35870 61 64 2d 6f 6e 6c 79 20 61 6e 64 20 6d 61 79 20  ad-only and may 
35880 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 2e 0a  not be written..
35890 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
358a0 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 42 74  reeUpdateMeta(Bt
358b0 72 65 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c  ree *p, int idx,
358c0 20 75 33 32 20 69 4d 65 74 61 29 7b 0a 20 20 42   u32 iMeta){.  B
358d0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
358e0 2d 3e 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65  ->pBt;.  unsigne
358f0 64 20 63 68 61 72 20 2a 70 50 31 3b 0a 20 20 69  d char *pP1;.  i
35900 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
35910 20 69 64 78 3e 3d 31 20 26 26 20 69 64 78 3c 3d   idx>=1 && idx<=
35920 31 35 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  15 );.  sqlite3B
35930 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
35940 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
35950 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
35960 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
35970 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TE );.  assert( 
35980 70 42 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29  pBt->pPage1!=0 )
35990 3b 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70  ;.  pP1 = pBt->p
359a0 50 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20  Page1->aData;.  
359b0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
359c0 72 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67  rWrite(pBt->pPag
359d0 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
359e0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
359f0 4b 20 29 7b 0a 20 20 20 20 70 75 74 34 62 79 74  K ){.    put4byt
35a00 65 28 26 70 50 31 5b 33 36 20 2b 20 69 64 78 2a  e(&pP1[36 + idx*
35a10 34 5d 2c 20 69 4d 65 74 61 29 3b 0a 23 69 66 6e  4], iMeta);.#ifn
35a20 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
35a30 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
35a40 66 28 20 69 64 78 3d 3d 37 20 29 7b 0a 20 20 20  f( idx==7 ){.   
35a50 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
35a60 61 75 74 6f 56 61 63 75 75 6d 20 7c 7c 20 69 4d  autoVacuum || iM
35a70 65 74 61 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  eta==0 );.      
35a80 61 73 73 65 72 74 28 20 69 4d 65 74 61 3d 3d 30  assert( iMeta==0
35a90 20 7c 7c 20 69 4d 65 74 61 3d 3d 31 20 29 3b 0a   || iMeta==1 );.
35aa0 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56        pBt->incrV
35ab0 61 63 75 75 6d 20 3d 20 28 75 38 29 69 4d 65 74  acuum = (u8)iMet
35ac0 61 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  a;.    }.#endif.
35ad0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72    }.  sqlite3Btr
35ae0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
35af0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
35b00 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 6c 61  * Return the fla
35b10 67 20 62 79 74 65 20 61 74 20 74 68 65 20 62 65  g byte at the be
35b20 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 70  ginning of the p
35b30 61 67 65 20 74 68 61 74 20 74 68 65 20 63 75 72  age that the cur
35b40 73 6f 72 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e  sor.** is curren
35b50 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e  tly pointing to.
35b60 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
35b70 74 72 65 65 46 6c 61 67 73 28 42 74 43 75 72 73  treeFlags(BtCurs
35b80 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20  or *pCur){.  /* 
35b90 54 4f 44 4f 3a 20 57 68 61 74 20 61 62 6f 75 74  TODO: What about
35ba0 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53   CURSOR_REQUIRES
35bb0 45 45 4b 20 73 74 61 74 65 3f 20 50 72 6f 62 61  EEK state? Proba
35bc0 62 6c 79 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c  bly need to call
35bd0 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 43 75 72  .  ** restoreCur
35be0 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 68 65  sorPosition() he
35bf0 72 65 2e 0a 20 20 2a 2f 0a 20 20 4d 65 6d 50 61  re..  */.  MemPa
35c00 67 65 20 2a 70 50 61 67 65 3b 0a 20 20 72 65 73  ge *pPage;.  res
35c10 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
35c20 6f 6e 28 70 43 75 72 29 3b 0a 20 20 70 50 61 67  on(pCur);.  pPag
35c30 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
35c40 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
35c50 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
35c60 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
35c70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
35c80 67 65 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ge!=0 );.  asser
35c90 74 28 20 70 50 61 67 65 2d 3e 70 42 74 3d 3d 70  t( pPage->pBt==p
35ca0 43 75 72 2d 3e 70 42 74 20 29 3b 0a 20 20 72 65  Cur->pBt );.  re
35cb0 74 75 72 6e 20 70 50 61 67 65 2d 3e 61 44 61 74  turn pPage->aDat
35cc0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
35cd0 65 74 5d 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  et];.}..#ifndef 
35ce0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45  SQLITE_OMIT_BTRE
35cf0 45 43 4f 55 4e 54 0a 2f 2a 0a 2a 2a 20 54 68 65  ECOUNT./*.** The
35d00 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2c   first argument,
35d10 20 70 43 75 72 2c 20 69 73 20 61 20 63 75 72 73   pCur, is a curs
35d20 6f 72 20 6f 70 65 6e 65 64 20 6f 6e 20 73 6f 6d  or opened on som
35d30 65 20 62 2d 74 72 65 65 2e 20 43 6f 75 6e 74 20  e b-tree. Count 
35d40 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  the.** number of
35d50 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
35d60 62 2d 74 72 65 65 20 61 6e 64 20 77 72 69 74 65  b-tree and write
35d70 20 74 68 65 20 72 65 73 75 6c 74 20 74 6f 20 2a   the result to *
35d80 70 6e 45 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 53  pnEntry..**.** S
35d90 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
35da0 72 6e 65 64 20 69 66 20 74 68 65 20 6f 70 65 72  rned if the oper
35db0 61 74 69 6f 6e 20 69 73 20 73 75 63 63 65 73 73  ation is success
35dc0 66 75 6c 6c 79 20 65 78 65 63 75 74 65 64 2e 20  fully executed. 
35dd0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69  .** Otherwise, i
35de0 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e  f an error is en
35df0 63 6f 75 6e 74 65 72 65 64 20 28 69 2e 65 2e 20  countered (i.e. 
35e00 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 72 20 64  an IO error or d
35e10 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75  atabase.** corru
35e20 70 74 69 6f 6e 29 20 61 6e 20 53 51 4c 69 74 65  ption) an SQLite
35e30 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
35e40 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
35e50 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 75 6e  sqlite3BtreeCoun
35e60 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
35e70 2c 20 69 36 34 20 2a 70 6e 45 6e 74 72 79 29 7b  , i64 *pnEntry){
35e80 0a 20 20 69 36 34 20 6e 45 6e 74 72 79 20 3d 20  .  i64 nEntry = 
35e90 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
35ea0 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
35eb0 20 74 6f 20 72 65 74 75 72 6e 20 69 6e 20 2a 70   to return in *p
35ec0 6e 45 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20  nEntry */.  int 
35ed0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
35ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ef0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
35f00 2a 2f 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  */.  rc = moveTo
35f10 52 6f 6f 74 28 70 43 75 72 29 3b 0a 0a 20 20 2f  Root(pCur);..  /
35f20 2a 20 55 6e 6c 65 73 73 20 61 6e 20 65 72 72 6f  * Unless an erro
35f30 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 66 6f  r occurs, the fo
35f40 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e  llowing loop run
35f50 73 20 6f 6e 65 20 69 74 65 72 61 74 69 6f 6e 20  s one iteration 
35f60 66 6f 72 20 65 61 63 68 0a 20 20 2a 2a 20 70 61  for each.  ** pa
35f70 67 65 20 69 6e 20 74 68 65 20 42 2d 54 72 65 65  ge in the B-Tree
35f80 20 73 74 72 75 63 74 75 72 65 20 28 6e 6f 74 20   structure (not 
35f90 69 6e 63 6c 75 64 69 6e 67 20 6f 76 65 72 66 6c  including overfl
35fa0 6f 77 20 70 61 67 65 73 29 2e 20 0a 20 20 2a 2f  ow pages). .  */
35fb0 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
35fc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
35fd0 6e 74 20 69 49 64 78 3b 20 20 20 20 20 20 20 20  nt iIdx;        
35fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ff0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 68    /* Index of ch
36000 69 6c 64 20 6e 6f 64 65 20 69 6e 20 70 61 72 65  ild node in pare
36010 6e 74 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67  nt */.    MemPag
36020 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20  e *pPage;       
36030 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
36040 43 75 72 72 65 6e 74 20 70 61 67 65 20 6f 66 20  Current page of 
36050 74 68 65 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20  the b-tree */.. 
36060 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
36070 20 61 20 6c 65 61 66 20 70 61 67 65 20 6f 72 20   a leaf page or 
36080 74 68 65 20 74 72 65 65 20 69 73 20 6e 6f 74 20  the tree is not 
36090 61 6e 20 69 6e 74 2d 6b 65 79 20 74 72 65 65 2c  an int-key tree,
360a0 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68   then .    ** th
360b0 69 73 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  is page contains
360c0 20 63 6f 75 6e 74 61 62 6c 65 20 65 6e 74 72 69   countable entri
360d0 65 73 2e 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  es. Increment th
360e0 65 20 65 6e 74 72 79 20 63 6f 75 6e 74 65 72 0a  e entry counter.
360f0 20 20 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67      ** according
36100 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  ly..    */.    p
36110 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
36120 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
36130 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 2d  ;.    if( pPage-
36140 3e 6c 65 61 66 20 7c 7c 20 21 70 50 61 67 65 2d  >leaf || !pPage-
36150 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20  >intKey ){.     
36160 20 6e 45 6e 74 72 79 20 2b 3d 20 70 50 61 67 65   nEntry += pPage
36170 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 7d 0a 0a  ->nCell;.    }..
36180 20 20 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20      /* pPage is 
36190 61 20 6c 65 61 66 20 6e 6f 64 65 2e 20 54 68 69  a leaf node. Thi
361a0 73 20 6c 6f 6f 70 20 6e 61 76 69 67 61 74 65 73  s loop navigates
361b0 20 74 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74   the cursor so t
361c0 68 61 74 20 69 74 20 0a 20 20 20 20 2a 2a 20 70  hat it .    ** p
361d0 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72  oints to the fir
361e0 73 74 20 69 6e 74 65 72 69 6f 72 20 63 65 6c 6c  st interior cell
361f0 20 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20   that it points 
36200 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66  to the parent of
36210 0a 20 20 20 20 2a 2a 20 74 68 65 20 6e 65 78 74  .    ** the next
36220 20 70 61 67 65 20 69 6e 20 74 68 65 20 74 72 65   page in the tre
36230 65 20 74 68 61 74 20 68 61 73 20 6e 6f 74 20 79  e that has not y
36240 65 74 20 62 65 65 6e 20 76 69 73 69 74 65 64 2e  et been visited.
36250 20 54 68 65 0a 20 20 20 20 2a 2a 20 70 43 75 72   The.    ** pCur
36260 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
36270 61 67 65 5d 20 76 61 6c 75 65 20 69 73 20 73 65  age] value is se
36280 74 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  t to the index o
36290 66 20 74 68 65 20 70 61 72 65 6e 74 20 63 65 6c  f the parent cel
362a0 6c 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20  l.    ** of the 
362b0 70 61 67 65 2c 20 6f 72 20 74 6f 20 74 68 65 20  page, or to the 
362c0 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  number of cells 
362d0 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20 74  in the page if t
362e0 68 65 20 6e 65 78 74 20 70 61 67 65 0a 20 20 20  he next page.   
362f0 20 2a 2a 20 74 6f 20 76 69 73 69 74 20 69 73 20   ** to visit is 
36300 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20  the right-child 
36310 6f 66 20 69 74 73 20 70 61 72 65 6e 74 2e 0a 20  of its parent.. 
36320 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
36330 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65  all pages in the
36340 20 74 72 65 65 20 68 61 76 65 20 62 65 65 6e 20   tree have been 
36350 76 69 73 69 74 65 64 2c 20 72 65 74 75 72 6e 20  visited, return 
36360 53 51 4c 49 54 45 5f 4f 4b 20 74 6f 20 74 68 65  SQLITE_OK to the
36370 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 2e 0a  .    ** caller..
36380 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
36390 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
363a0 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20      do {.       
363b0 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
363c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
363d0 20 2f 2a 20 41 6c 6c 20 70 61 67 65 73 20 6f 66   /* All pages of
363e0 20 74 68 65 20 62 2d 74 72 65 65 20 68 61 76 65   the b-tree have
363f0 20 62 65 65 6e 20 76 69 73 69 74 65 64 2e 20 52   been visited. R
36400 65 74 75 72 6e 20 73 75 63 63 65 73 73 66 75 6c  eturn successful
36410 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ly. */.         
36420 20 2a 70 6e 45 6e 74 72 79 20 3d 20 6e 45 6e 74   *pnEntry = nEnt
36430 72 79 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  ry;.          re
36440 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
36450 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36460 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f    sqlite3BtreeMo
36470 76 65 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29  veToParent(pCur)
36480 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65 20 28  ;.      }while (
36490 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
364a0 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 43 75 72 2d  r->iPage]>=pCur-
364b0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
364c0 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a  age]->nCell );..
364d0 20 20 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64        pCur->aiId
364e0 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2b 2b  x[pCur->iPage]++
364f0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 20 3d 20  ;.      pPage = 
36500 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
36510 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d  r->iPage];.    }
36520 0a 0a 20 20 20 20 2f 2a 20 44 65 73 63 65 6e 64  ..    /* Descend
36530 20 74 6f 20 74 68 65 20 63 68 69 6c 64 20 6e 6f   to the child no
36540 64 65 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74  de of the cell t
36550 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 63  hat the cursor c
36560 75 72 72 65 6e 74 6c 79 20 0a 20 20 20 20 2a 2a  urrently .    **
36570 20 70 6f 69 6e 74 73 20 61 74 2e 20 54 68 69 73   points at. This
36580 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68   is the right-ch
36590 69 6c 64 20 69 66 20 28 69 49 64 78 3d 3d 70 50  ild if (iIdx==pP
365a0 61 67 65 2d 3e 6e 43 65 6c 6c 29 2e 0a 20 20 20  age->nCell)..   
365b0 20 2a 2f 0a 20 20 20 20 69 49 64 78 20 3d 20 70   */.    iIdx = p
365c0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
365d0 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28  >iPage];.    if(
365e0 20 69 49 64 78 3d 3d 70 50 61 67 65 2d 3e 6e 43   iIdx==pPage->nC
365f0 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ell ){.      rc 
36600 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
36610 75 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50  ur, get4byte(&pP
36620 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
36630 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29  ->hdrOffset+8]))
36640 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
36650 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68     rc = moveToCh
36660 69 6c 64 28 70 43 75 72 2c 20 67 65 74 34 62 79  ild(pCur, get4by
36670 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
36680 65 2c 20 69 49 64 78 29 29 29 3b 0a 20 20 20 20  e, iIdx)));.    
36690 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 20 65  }.  }..  /* An e
366a0 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65  rror has occurre
366b0 64 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  d. Return an err
366c0 6f 72 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 72 65  or code. */.  re
366d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
366e0 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
366f0 74 68 65 20 70 61 67 65 72 20 61 73 73 6f 63 69  the pager associ
36700 61 74 65 64 20 77 69 74 68 20 61 20 42 54 72 65  ated with a BTre
36710 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
36720 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20   is used for.** 
36730 74 65 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75  testing and debu
36740 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 50  gging only..*/.P
36750 61 67 65 72 20 2a 73 71 6c 69 74 65 33 42 74 72  ager *sqlite3Btr
36760 65 65 50 61 67 65 72 28 42 74 72 65 65 20 2a 70  eePager(Btree *p
36770 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  ){.  return p->p
36780 42 74 2d 3e 70 50 61 67 65 72 3b 0a 7d 0a 0a 23  Bt->pPager;.}..#
36790 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
367a0 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45  IT_INTEGRITY_CHE
367b0 43 4b 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20  CK./*.** Append 
367c0 61 20 6d 65 73 73 61 67 65 20 74 6f 20 74 68 65  a message to the
367d0 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73   error message s
367e0 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  tring..*/.static
367f0 20 76 6f 69 64 20 63 68 65 63 6b 41 70 70 65 6e   void checkAppen
36800 64 4d 73 67 28 0a 20 20 49 6e 74 65 67 72 69 74  dMsg(.  Integrit
36810 79 43 6b 20 2a 70 43 68 65 63 6b 2c 0a 20 20 63  yCk *pCheck,.  c
36820 68 61 72 20 2a 7a 4d 73 67 31 2c 0a 20 20 63 6f  har *zMsg1,.  co
36830 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
36840 74 2c 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 76 61  t,.  ....){.  va
36850 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20  _list ap;.  if( 
36860 21 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20 29  !pCheck->mxErr )
36870 20 72 65 74 75 72 6e 3b 0a 20 20 70 43 68 65 63   return;.  pChec
36880 6b 2d 3e 6d 78 45 72 72 2d 2d 3b 0a 20 20 70 43  k->mxErr--;.  pC
36890 68 65 63 6b 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  heck->nErr++;.  
368a0 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
368b0 72 6d 61 74 29 3b 0a 20 20 69 66 28 20 70 43 68  rmat);.  if( pCh
368c0 65 63 6b 2d 3e 65 72 72 4d 73 67 2e 6e 43 68 61  eck->errMsg.nCha
368d0 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
368e0 53 74 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26  StrAccumAppend(&
368f0 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2c 20  pCheck->errMsg, 
36900 22 5c 6e 22 2c 20 31 29 3b 0a 20 20 7d 0a 20 20  "\n", 1);.  }.  
36910 69 66 28 20 7a 4d 73 67 31 20 29 7b 0a 20 20 20  if( zMsg1 ){.   
36920 20 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d   sqlite3StrAccum
36930 41 70 70 65 6e 64 28 26 70 43 68 65 63 6b 2d 3e  Append(&pCheck->
36940 65 72 72 4d 73 67 2c 20 7a 4d 73 67 31 2c 20 2d  errMsg, zMsg1, -
36950 31 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  1);.  }.  sqlite
36960 33 56 58 50 72 69 6e 74 66 28 26 70 43 68 65 63  3VXPrintf(&pChec
36970 6b 2d 3e 65 72 72 4d 73 67 2c 20 31 2c 20 7a 46  k->errMsg, 1, zF
36980 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61  ormat, ap);.  va
36990 5f 65 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20  _end(ap);.  if( 
369a0 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2e 6d  pCheck->errMsg.m
369b0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
369c0 20 20 20 70 43 68 65 63 6b 2d 3e 6d 61 6c 6c 6f     pCheck->mallo
369d0 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d  cFailed = 1;.  }
369e0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
369f0 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
36a00 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66  TY_CHECK */..#if
36a10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
36a20 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
36a30 0a 2f 2a 0a 2a 2a 20 41 64 64 20 31 20 74 6f 20  ./*.** Add 1 to 
36a40 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
36a50 75 6e 74 20 66 6f 72 20 70 61 67 65 20 69 50 61  unt for page iPa
36a60 67 65 2e 20 20 49 66 20 74 68 69 73 20 69 73 20  ge.  If this is 
36a70 74 68 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 72 65  the second.** re
36a80 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70  ference to the p
36a90 61 67 65 2c 20 61 64 64 20 61 6e 20 65 72 72 6f  age, add an erro
36aa0 72 20 6d 65 73 73 61 67 65 20 74 6f 20 70 43 68  r message to pCh
36ab0 65 63 6b 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a  eck->zErrMsg..**
36ac0 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
36ad0 72 65 20 61 72 65 20 32 20 6f 72 65 20 6d 6f 72  re are 2 ore mor
36ae0 65 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  e references to 
36af0 74 68 65 20 70 61 67 65 20 61 6e 64 20 30 20 69  the page and 0 i
36b00 66 0a 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20  f.** if this is 
36b10 74 68 65 20 66 69 72 73 74 20 72 65 66 65 72 65  the first refere
36b20 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 2e  nce to the page.
36b30 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 63 68 65 63  .**.** Also chec
36b40 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  k that the page 
36b50 6e 75 6d 62 65 72 20 69 73 20 69 6e 20 62 6f 75  number is in bou
36b60 6e 64 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nds..*/.static i
36b70 6e 74 20 63 68 65 63 6b 52 65 66 28 49 6e 74 65  nt checkRef(Inte
36b80 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c  grityCk *pCheck,
36b90 20 50 67 6e 6f 20 69 50 61 67 65 2c 20 63 68 61   Pgno iPage, cha
36ba0 72 20 2a 7a 43 6f 6e 74 65 78 74 29 7b 0a 20 20  r *zContext){.  
36bb0 69 66 28 20 69 50 61 67 65 3d 3d 30 20 29 20 72  if( iPage==0 ) r
36bc0 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 69  eturn 1;.  if( i
36bd0 50 61 67 65 3e 70 43 68 65 63 6b 2d 3e 6e 50 61  Page>pCheck->nPa
36be0 67 65 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41  ge ){.    checkA
36bf0 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
36c00 20 7a 43 6f 6e 74 65 78 74 2c 20 22 69 6e 76 61   zContext, "inva
36c10 6c 69 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20  lid page number 
36c20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20  %d", iPage);.   
36c30 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
36c40 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 61 6e 52   if( pCheck->anR
36c50 65 66 5b 69 50 61 67 65 5d 3d 3d 31 20 29 7b 0a  ef[iPage]==1 ){.
36c60 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
36c70 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
36c80 65 78 74 2c 20 22 32 6e 64 20 72 65 66 65 72 65  ext, "2nd refere
36c90 6e 63 65 20 74 6f 20 70 61 67 65 20 25 64 22 2c  nce to page %d",
36ca0 20 69 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74   iPage);.    ret
36cb0 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 1;.  }.  ret
36cc0 75 72 6e 20 20 28 70 43 68 65 63 6b 2d 3e 61 6e  urn  (pCheck->an
36cd0 52 65 66 5b 69 50 61 67 65 5d 2b 2b 29 3e 31 3b  Ref[iPage]++)>1;
36ce0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
36cf0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
36d00 55 4d 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  UM./*.** Check t
36d10 68 61 74 20 74 68 65 20 65 6e 74 72 79 20 69 6e  hat the entry in
36d20 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70   the pointer-map
36d30 20 66 6f 72 20 70 61 67 65 20 69 43 68 69 6c 64   for page iChild
36d40 20 6d 61 70 73 20 74 6f 20 0a 2a 2a 20 70 61 67   maps to .** pag
36d50 65 20 69 50 61 72 65 6e 74 2c 20 70 6f 69 6e 74  e iParent, point
36d60 65 72 20 74 79 70 65 20 70 74 72 54 79 70 65 2e  er type ptrType.
36d70 20 49 66 20 6e 6f 74 2c 20 61 70 70 65 6e 64 20   If not, append 
36d80 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
36d90 0a 2a 2a 20 74 6f 20 70 43 68 65 63 6b 2e 0a 2a  .** to pCheck..*
36da0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 68  /.static void ch
36db0 65 63 6b 50 74 72 6d 61 70 28 0a 20 20 49 6e 74  eckPtrmap(.  Int
36dc0 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b  egrityCk *pCheck
36dd0 2c 20 20 20 2f 2a 20 49 6e 74 65 67 72 69 74 79  ,   /* Integrity
36de0 20 63 68 65 63 6b 20 63 6f 6e 74 65 78 74 20 2a   check context *
36df0 2f 0a 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c  /.  Pgno iChild,
36e00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
36e10 69 6c 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ild page number 
36e20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20  */.  u8 eType,  
36e30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
36e40 78 70 65 63 74 65 64 20 70 6f 69 6e 74 65 72 20  xpected pointer 
36e50 6d 61 70 20 74 79 70 65 20 2a 2f 0a 20 20 50 67  map type */.  Pg
36e60 6e 6f 20 69 50 61 72 65 6e 74 2c 20 20 20 20 20  no iParent,     
36e70 20 20 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64       /* Expected
36e80 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 72   pointer map par
36e90 65 6e 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20  ent page number 
36ea0 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74  */.  char *zCont
36eb0 65 78 74 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ext         /* C
36ec0 6f 6e 74 65 78 74 20 64 65 73 63 72 69 70 74 69  ontext descripti
36ed0 6f 6e 20 28 75 73 65 64 20 66 6f 72 20 65 72 72  on (used for err
36ee0 6f 72 20 6d 73 67 29 20 2a 2f 0a 29 7b 0a 20 20  or msg) */.){.  
36ef0 69 6e 74 20 72 63 3b 0a 20 20 75 38 20 65 50 74  int rc;.  u8 ePt
36f00 72 6d 61 70 54 79 70 65 3b 0a 20 20 50 67 6e 6f  rmapType;.  Pgno
36f10 20 69 50 74 72 6d 61 70 50 61 72 65 6e 74 3b 0a   iPtrmapParent;.
36f20 0a 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65  .  rc = ptrmapGe
36f30 74 28 70 43 68 65 63 6b 2d 3e 70 42 74 2c 20 69  t(pCheck->pBt, i
36f40 43 68 69 6c 64 2c 20 26 65 50 74 72 6d 61 70 54  Child, &ePtrmapT
36f50 79 70 65 2c 20 26 69 50 74 72 6d 61 70 50 61 72  ype, &iPtrmapPar
36f60 65 6e 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ent);.  if( rc!=
36f70 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
36f80 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
36f90 4e 4f 4d 45 4d 20 29 20 70 43 68 65 63 6b 2d 3e  NOMEM ) pCheck->
36fa0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31  mallocFailed = 1
36fb0 3b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e  ;.    checkAppen
36fc0 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
36fd0 6e 74 65 78 74 2c 20 22 46 61 69 6c 65 64 20 74  ntext, "Failed t
36fe0 6f 20 72 65 61 64 20 70 74 72 6d 61 70 20 6b 65  o read ptrmap ke
36ff0 79 3d 25 64 22 2c 20 69 43 68 69 6c 64 29 3b 0a  y=%d", iChild);.
37000 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
37010 0a 20 20 69 66 28 20 65 50 74 72 6d 61 70 54 79  .  if( ePtrmapTy
37020 70 65 21 3d 65 54 79 70 65 20 7c 7c 20 69 50 74  pe!=eType || iPt
37030 72 6d 61 70 50 61 72 65 6e 74 21 3d 69 50 61 72  rmapParent!=iPar
37040 65 6e 74 20 29 7b 0a 20 20 20 20 63 68 65 63 6b  ent ){.    check
37050 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
37060 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20  , zContext, .   
37070 20 20 20 22 42 61 64 20 70 74 72 20 6d 61 70 20     "Bad ptr map 
37080 65 6e 74 72 79 20 6b 65 79 3d 25 64 20 65 78 70  entry key=%d exp
37090 65 63 74 65 64 3d 28 25 64 2c 25 64 29 20 67 6f  ected=(%d,%d) go
370a0 74 3d 28 25 64 2c 25 64 29 22 2c 20 0a 20 20 20  t=(%d,%d)", .   
370b0 20 20 20 69 43 68 69 6c 64 2c 20 65 54 79 70 65     iChild, eType
370c0 2c 20 69 50 61 72 65 6e 74 2c 20 65 50 74 72 6d  , iParent, ePtrm
370d0 61 70 54 79 70 65 2c 20 69 50 74 72 6d 61 70 50  apType, iPtrmapP
370e0 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65  arent);.  }.}.#e
370f0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ndif../*.** Chec
37100 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20  k the integrity 
37110 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
37120 6f 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f  or of an overflo
37130 77 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2a 20  w page list..** 
37140 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
37150 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
37160 6f 6e 20 74 68 65 20 6c 69 73 74 20 69 73 20 4e  on the list is N
37170 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
37180 20 63 68 65 63 6b 4c 69 73 74 28 0a 20 20 49 6e   checkList(.  In
37190 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63  tegrityCk *pChec
371a0 6b 2c 20 20 2f 2a 20 49 6e 74 65 67 72 69 74 79  k,  /* Integrity
371b0 20 63 68 65 63 6b 69 6e 67 20 63 6f 6e 74 65 78   checking contex
371c0 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 46 72 65  t */.  int isFre
371d0 65 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  eList,       /* 
371e0 54 72 75 65 20 66 6f 72 20 61 20 66 72 65 65 6c  True for a freel
371f0 69 73 74 2e 20 20 46 61 6c 73 65 20 66 6f 72 20  ist.  False for 
37200 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6c 69  overflow page li
37210 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67  st */.  int iPag
37220 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
37230 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   Page number for
37240 20 66 69 72 73 74 20 70 61 67 65 20 69 6e 20 74   first page in t
37250 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  he list */.  int
37260 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   N,             
37270 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20 6e     /* Expected n
37280 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
37290 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20  n the list */.  
372a0 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20  char *zContext  
372b0 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
372c0 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61   for error messa
372d0 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ges */.){.  int 
372e0 69 3b 0a 20 20 69 6e 74 20 65 78 70 65 63 74 65  i;.  int expecte
372f0 64 20 3d 20 4e 3b 0a 20 20 69 6e 74 20 69 46 69  d = N;.  int iFi
37300 72 73 74 20 3d 20 69 50 61 67 65 3b 0a 20 20 77  rst = iPage;.  w
37310 68 69 6c 65 28 20 4e 2d 2d 20 3e 20 30 20 26 26  hile( N-- > 0 &&
37320 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20 29   pCheck->mxErr )
37330 7b 0a 20 20 20 20 44 62 50 61 67 65 20 2a 70 4f  {.    DbPage *pO
37340 76 66 6c 50 61 67 65 3b 0a 20 20 20 20 75 6e 73  vflPage;.    uns
37350 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4f 76 66  igned char *pOvf
37360 6c 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 69  lData;.    if( i
37370 50 61 67 65 3c 31 20 29 7b 0a 20 20 20 20 20 20  Page<1 ){.      
37380 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
37390 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
373a0 0a 20 20 20 20 20 20 20 20 20 22 25 64 20 6f 66  .         "%d of
373b0 20 25 64 20 70 61 67 65 73 20 6d 69 73 73 69 6e   %d pages missin
373c0 67 20 66 72 6f 6d 20 6f 76 65 72 66 6c 6f 77 20  g from overflow 
373d0 6c 69 73 74 20 73 74 61 72 74 69 6e 67 20 61 74  list starting at
373e0 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %d",.          
373f0 4e 2b 31 2c 20 65 78 70 65 63 74 65 64 2c 20 69  N+1, expected, i
37400 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 62 72  First);.      br
37410 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
37420 66 28 20 63 68 65 63 6b 52 65 66 28 70 43 68 65  f( checkRef(pChe
37430 63 6b 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74  ck, iPage, zCont
37440 65 78 74 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  ext) ) break;.  
37450 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
37460 65 72 47 65 74 28 70 43 68 65 63 6b 2d 3e 70 50  erGet(pCheck->pP
37470 61 67 65 72 2c 20 28 50 67 6e 6f 29 69 50 61 67  ager, (Pgno)iPag
37480 65 2c 20 26 70 4f 76 66 6c 50 61 67 65 29 20 29  e, &pOvflPage) )
37490 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70  {.      checkApp
374a0 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a  endMsg(pCheck, z
374b0 43 6f 6e 74 65 78 74 2c 20 22 66 61 69 6c 65 64  Context, "failed
374c0 20 74 6f 20 67 65 74 20 70 61 67 65 20 25 64 22   to get page %d"
374d0 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , iPage);.      
374e0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
374f0 20 70 4f 76 66 6c 44 61 74 61 20 3d 20 28 75 6e   pOvflData = (un
37500 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 73 71  signed char *)sq
37510 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
37520 61 28 70 4f 76 66 6c 50 61 67 65 29 3b 0a 20 20  a(pOvflPage);.  
37530 20 20 69 66 28 20 69 73 46 72 65 65 4c 69 73 74    if( isFreeList
37540 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20   ){.      int n 
37550 3d 20 67 65 74 34 62 79 74 65 28 26 70 4f 76 66  = get4byte(&pOvf
37560 6c 44 61 74 61 5b 34 5d 29 3b 0a 23 69 66 6e 64  lData[4]);.#ifnd
37570 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
37580 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
37590 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d  if( pCheck->pBt-
375a0 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
375b0 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d         checkPtrm
375c0 61 70 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65  ap(pCheck, iPage
375d0 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  , PTRMAP_FREEPAG
375e0 45 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  E, 0, zContext);
375f0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
37600 20 20 20 20 20 20 69 66 28 20 6e 3e 70 43 68 65        if( n>pChe
37610 63 6b 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ck->pBt->usableS
37620 69 7a 65 2f 34 2d 32 20 29 7b 0a 20 20 20 20 20  ize/4-2 ){.     
37630 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
37640 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
37650 78 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 22  xt,.           "
37660 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20 63 6f  freelist leaf co
37670 75 6e 74 20 74 6f 6f 20 62 69 67 20 6f 6e 20 70  unt too big on p
37680 61 67 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b  age %d", iPage);
37690 0a 20 20 20 20 20 20 20 20 4e 2d 2d 3b 0a 20 20  .        N--;.  
376a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
376b0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b     for(i=0; i<n;
376c0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
376d0 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 20   Pgno iFreePage 
376e0 3d 20 67 65 74 34 62 79 74 65 28 26 70 4f 76 66  = get4byte(&pOvf
376f0 6c 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 23  lData[8+i*4]);.#
37700 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
37710 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
37720 20 20 20 20 20 20 20 20 69 66 28 20 70 43 68 65          if( pChe
37730 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  ck->pBt->autoVac
37740 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  uum ){.         
37750 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70     checkPtrmap(p
37760 43 68 65 63 6b 2c 20 69 46 72 65 65 50 61 67 65  Check, iFreePage
37770 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  , PTRMAP_FREEPAG
37780 45 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  E, 0, zContext);
37790 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  .          }.#en
377a0 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 63 68  dif.          ch
377b0 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69  eckRef(pCheck, i
377c0 46 72 65 65 50 61 67 65 2c 20 7a 43 6f 6e 74 65  FreePage, zConte
377d0 78 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xt);.        }. 
377e0 20 20 20 20 20 20 20 4e 20 2d 3d 20 6e 3b 0a 20         N -= n;. 
377f0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66       }.    }.#if
37800 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
37810 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
37820 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
37830 66 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  f this database 
37840 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61  supports auto-va
37850 63 75 75 6d 20 61 6e 64 20 69 50 61 67 65 20 69  cuum and iPage i
37860 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 20  s not the last. 
37870 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
37880 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 6c 69  this overflow li
37890 73 74 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74  st, check that t
378a0 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
378b0 6e 74 72 79 20 66 6f 72 0a 20 20 20 20 20 20 2a  ntry for.      *
378c0 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
378d0 70 61 67 65 20 6d 61 74 63 68 65 73 20 69 50 61  page matches iPa
378e0 67 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ge..      */.   
378f0 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70     if( pCheck->p
37900 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
37910 26 20 4e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  & N>0 ){.       
37920 20 69 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f   i = get4byte(pO
37930 76 66 6c 44 61 74 61 29 3b 0a 20 20 20 20 20 20  vflData);.      
37940 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43    checkPtrmap(pC
37950 68 65 63 6b 2c 20 69 2c 20 50 54 52 4d 41 50 5f  heck, i, PTRMAP_
37960 4f 56 45 52 46 4c 4f 57 32 2c 20 69 50 61 67 65  OVERFLOW2, iPage
37970 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  , zContext);.   
37980 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
37990 66 0a 20 20 20 20 69 50 61 67 65 20 3d 20 67 65  f.    iPage = ge
379a0 74 34 62 79 74 65 28 70 4f 76 66 6c 44 61 74 61  t4byte(pOvflData
379b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
379c0 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 50 61  gerUnref(pOvflPa
379d0 67 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ge);.  }.}.#endi
379e0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
379f0 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
37a00 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
37a10 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
37a20 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 44  TY_CHECK./*.** D
37a30 6f 20 76 61 72 69 6f 75 73 20 73 61 6e 69 74 79  o various sanity
37a40 20 63 68 65 63 6b 73 20 6f 6e 20 61 20 73 69 6e   checks on a sin
37a50 67 6c 65 20 70 61 67 65 20 6f 66 20 61 20 74 72  gle page of a tr
37a60 65 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  ee.  Return.** t
37a70 68 65 20 74 72 65 65 20 64 65 70 74 68 2e 20 20  he tree depth.  
37a80 52 6f 6f 74 20 70 61 67 65 73 20 72 65 74 75 72  Root pages retur
37a90 6e 20 30 2e 20 20 50 61 72 65 6e 74 73 20 6f 66  n 0.  Parents of
37aa0 20 72 6f 6f 74 20 70 61 67 65 73 0a 2a 2a 20 72   root pages.** r
37ab0 65 74 75 72 6e 20 31 2c 20 61 6e 64 20 73 6f 20  eturn 1, and so 
37ac0 66 6f 72 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  forth..** .** Th
37ad0 65 73 65 20 63 68 65 63 6b 73 20 61 72 65 20 64  ese checks are d
37ae0 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  one:.**.**      
37af0 31 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  1.  Make sure th
37b00 61 74 20 63 65 6c 6c 73 20 61 6e 64 20 66 72 65  at cells and fre
37b10 65 62 6c 6f 63 6b 73 20 64 6f 20 6e 6f 74 20 6f  eblocks do not o
37b20 76 65 72 6c 61 70 0a 2a 2a 20 20 20 20 20 20 20  verlap.**       
37b30 20 20 20 62 75 74 20 63 6f 6d 62 69 6e 65 20 74     but combine t
37b40 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 63 6f 76  o completely cov
37b50 65 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20  er the page..** 
37b60 20 4e 4f 20 20 32 2e 20 20 4d 61 6b 65 20 73 75   NO  2.  Make su
37b70 72 65 20 63 65 6c 6c 20 6b 65 79 73 20 61 72 65  re cell keys are
37b80 20 69 6e 20 6f 72 64 65 72 2e 0a 2a 2a 20 20 4e   in order..**  N
37b90 4f 20 20 33 2e 20 20 4d 61 6b 65 20 73 75 72 65  O  3.  Make sure
37ba0 20 6e 6f 20 6b 65 79 20 69 73 20 6c 65 73 73 20   no key is less 
37bb0 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
37bc0 20 7a 4c 6f 77 65 72 42 6f 75 6e 64 2e 0a 2a 2a   zLowerBound..**
37bd0 20 20 4e 4f 20 20 34 2e 20 20 4d 61 6b 65 20 73    NO  4.  Make s
37be0 75 72 65 20 6e 6f 20 6b 65 79 20 69 73 20 67 72  ure no key is gr
37bf0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
37c00 75 61 6c 20 74 6f 20 7a 55 70 70 65 72 42 6f 75  ual to zUpperBou
37c10 6e 64 2e 0a 2a 2a 20 20 20 20 20 20 35 2e 20 20  nd..**      5.  
37c20 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72  Check the integr
37c30 69 74 79 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20  ity of overflow 
37c40 70 61 67 65 73 2e 0a 2a 2a 20 20 20 20 20 20 36  pages..**      6
37c50 2e 20 20 52 65 63 75 72 73 69 76 65 6c 79 20 63  .  Recursively c
37c60 61 6c 6c 20 63 68 65 63 6b 54 72 65 65 50 61 67  all checkTreePag
37c70 65 20 6f 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65  e on all childre
37c80 6e 2e 0a 2a 2a 20 20 20 20 20 20 37 2e 20 20 56  n..**      7.  V
37c90 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 64  erify that the d
37ca0 65 70 74 68 20 6f 66 20 61 6c 6c 20 63 68 69 6c  epth of all chil
37cb0 64 72 65 6e 20 69 73 20 74 68 65 20 73 61 6d 65  dren is the same
37cc0 2e 0a 2a 2a 20 20 20 20 20 20 38 2e 20 20 4d 61  ..**      8.  Ma
37cd0 6b 65 20 73 75 72 65 20 74 68 69 73 20 70 61 67  ke sure this pag
37ce0 65 20 69 73 20 61 74 20 6c 65 61 73 74 20 33 33  e is at least 33
37cf0 25 20 66 75 6c 6c 20 6f 72 20 65 6c 73 65 20 69  % full or else i
37d00 74 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  t is.**         
37d10 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
37d20 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   tree..*/.static
37d30 20 69 6e 74 20 63 68 65 63 6b 54 72 65 65 50 61   int checkTreePa
37d40 67 65 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43  ge(.  IntegrityC
37d50 6b 20 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20 43  k *pCheck,  /* C
37d60 6f 6e 74 65 78 74 20 66 6f 72 20 74 68 65 20 73  ontext for the s
37d70 61 6e 69 74 79 20 63 68 65 63 6b 20 2a 2f 0a 20  anity check */. 
37d80 20 69 6e 74 20 69 50 61 67 65 2c 20 20 20 20 20   int iPage,     
37d90 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
37da0 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
37db0 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
37dc0 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f 6e  char *zParentCon
37dd0 74 65 78 74 20 20 2f 2a 20 50 61 72 65 6e 74 20  text  /* Parent 
37de0 63 6f 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20  context */.){.  
37df0 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
37e00 20 20 69 6e 74 20 69 2c 20 72 63 2c 20 64 65 70    int i, rc, dep
37e10 74 68 2c 20 64 32 2c 20 70 67 6e 6f 2c 20 63 6e  th, d2, pgno, cn
37e20 74 3b 0a 20 20 69 6e 74 20 68 64 72 2c 20 63 65  t;.  int hdr, ce
37e30 6c 6c 53 74 61 72 74 3b 0a 20 20 69 6e 74 20 6e  llStart;.  int n
37e40 43 65 6c 6c 3b 0a 20 20 75 38 20 2a 64 61 74 61  Cell;.  u8 *data
37e50 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
37e60 74 3b 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53  t;.  int usableS
37e70 69 7a 65 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6e  ize;.  char zCon
37e80 74 65 78 74 5b 31 30 30 5d 3b 0a 20 20 63 68 61  text[100];.  cha
37e90 72 20 2a 68 69 74 20 3d 20 30 3b 0a 0a 20 20 73  r *hit = 0;..  s
37ea0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
37eb0 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29  sizeof(zContext)
37ec0 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22 50 61 67  , zContext, "Pag
37ed0 65 20 25 64 3a 20 22 2c 20 69 50 61 67 65 29 3b  e %d: ", iPage);
37ee0 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61  ..  /* Check tha
37ef0 74 20 74 68 65 20 70 61 67 65 20 65 78 69 73 74  t the page exist
37f00 73 0a 20 20 2a 2f 0a 20 20 70 42 74 20 3d 20 70  s.  */.  pBt = p
37f10 43 68 65 63 6b 2d 3e 70 42 74 3b 0a 20 20 75 73  Check->pBt;.  us
37f20 61 62 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e  ableSize = pBt->
37f30 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 66  usableSize;.  if
37f40 28 20 69 50 61 67 65 3d 3d 30 20 29 20 72 65 74  ( iPage==0 ) ret
37f50 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 63 68 65  urn 0;.  if( che
37f60 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69 50  ckRef(pCheck, iP
37f70 61 67 65 2c 20 7a 50 61 72 65 6e 74 43 6f 6e 74  age, zParentCont
37f80 65 78 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ext) ) return 0;
37f90 0a 20 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c  .  if( (rc = sql
37fa0 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
37fb0 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 50 61 67  (pBt, (Pgno)iPag
37fc0 65 2c 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d  e, &pPage, 0))!=
37fd0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d  0 ){.    if( rc=
37fe0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20  =SQLITE_NOMEM ) 
37ff0 70 43 68 65 63 6b 2d 3e 6d 61 6c 6c 6f 63 46 61  pCheck->mallocFa
38000 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 63 68  iled = 1;.    ch
38010 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
38020 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20  eck, zContext,. 
38030 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f        "unable to
38040 20 67 65 74 20 74 68 65 20 70 61 67 65 2e 20 65   get the page. e
38050 72 72 6f 72 20 63 6f 64 65 3d 25 64 22 2c 20 72  rror code=%d", r
38060 63 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  c);.    return 0
38070 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 72 63 20  ;.  }.  if( (rc 
38080 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
38090 69 74 50 61 67 65 28 70 50 61 67 65 29 29 21 3d  itPage(pPage))!=
380a0 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
380b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52   rc==SQLITE_CORR
380c0 55 50 54 20 29 3b 20 20 2f 2a 20 54 68 65 20 6f  UPT );  /* The o
380d0 6e 6c 79 20 70 6f 73 73 69 62 6c 65 20 65 72 72  nly possible err
380e0 6f 72 20 66 72 6f 6d 20 49 6e 69 74 50 61 67 65  or from InitPage
380f0 20 2a 2f 0a 20 20 20 20 63 68 65 63 6b 41 70 70   */.    checkApp
38100 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a  endMsg(pCheck, z
38110 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20  Context, .      
38120 20 20 20 20 20 20 20 20 20 20 20 20 20 22 73 71               "sq
38130 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
38140 67 65 28 29 20 72 65 74 75 72 6e 73 20 65 72 72  ge() returns err
38150 6f 72 20 63 6f 64 65 20 25 64 22 2c 20 72 63 29  or code %d", rc)
38160 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67  ;.    releasePag
38170 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65  e(pPage);.    re
38180 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
38190 2a 20 43 68 65 63 6b 20 6f 75 74 20 61 6c 6c 20  * Check out all 
381a0 74 68 65 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a  the cells..  */.
381b0 20 20 64 65 70 74 68 20 3d 20 30 3b 0a 20 20 66    depth = 0;.  f
381c0 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d  or(i=0; i<pPage-
381d0 3e 6e 43 65 6c 6c 20 26 26 20 70 43 68 65 63 6b  >nCell && pCheck
381e0 2d 3e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a 20  ->mxErr; i++){. 
381f0 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20     u8 *pCell;.  
38200 20 20 75 33 32 20 73 7a 3b 0a 20 20 20 20 43 65    u32 sz;.    Ce
38210 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20  llInfo info;..  
38220 20 20 2f 2a 20 43 68 65 63 6b 20 70 61 79 6c 6f    /* Check paylo
38230 61 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  ad overflow page
38240 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  s.    */.    sql
38250 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
38260 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20  zeof(zContext), 
38270 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20  zContext,.      
38280 20 20 20 20 20 20 20 22 4f 6e 20 74 72 65 65 20         "On tree 
38290 70 61 67 65 20 25 64 20 63 65 6c 6c 20 25 64 3a  page %d cell %d:
382a0 20 22 2c 20 69 50 61 67 65 2c 20 69 29 3b 0a 20   ", iPage, i);. 
382b0 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43     pCell = findC
382c0 65 6c 6c 28 70 50 61 67 65 2c 69 29 3b 0a 20 20  ell(pPage,i);.  
382d0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61    sqlite3BtreePa
382e0 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65  rseCellPtr(pPage
382f0 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b  , pCell, &info);
38300 0a 20 20 20 20 73 7a 20 3d 20 69 6e 66 6f 2e 6e  .    sz = info.n
38310 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 21 70  Data;.    if( !p
38320 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 20 73  Page->intKey ) s
38330 7a 20 2b 3d 20 28 69 6e 74 29 69 6e 66 6f 2e 6e  z += (int)info.n
38340 4b 65 79 3b 0a 20 20 20 20 61 73 73 65 72 74 28  Key;.    assert(
38350 20 73 7a 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f   sz==info.nPaylo
38360 61 64 20 29 3b 0a 20 20 20 20 69 66 28 20 73 7a  ad );.    if( sz
38370 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
38380 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20        int nPage 
38390 3d 20 28 73 7a 20 2d 20 69 6e 66 6f 2e 6e 4c 6f  = (sz - info.nLo
383a0 63 61 6c 20 2b 20 75 73 61 62 6c 65 53 69 7a 65  cal + usableSize
383b0 20 2d 20 35 29 2f 28 75 73 61 62 6c 65 53 69 7a   - 5)/(usableSiz
383c0 65 20 2d 20 34 29 3b 0a 20 20 20 20 20 20 50 67  e - 4);.      Pg
383d0 6e 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65  no pgnoOvfl = ge
383e0 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e  t4byte(&pCell[in
383f0 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a  fo.iOverflow]);.
38400 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
38410 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
38420 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 61 75       if( pBt->au
38430 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20  toVacuum ){.    
38440 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28      checkPtrmap(
38450 70 43 68 65 63 6b 2c 20 70 67 6e 6f 4f 76 66 6c  pChec