/ Hex Artifact Content
Login

Artifact 081e1aac3ce4c79c5ed628a1fec533857d175eea:


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 35 20 32 30 30 39 2f 30  c,v 1.575 2009/0
0190: 33 2f 31 38 20 31 30 3a 33 33 3a 30 31 20 64 61  3/18 10:33:01 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 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
da20: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
da30: 62 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 61  bytes of space a
da40: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76 65  t the end of eve
da50: 72 79 20 70 61 67 65 20 74 68 61 74 0a 2a 2a 20  ry page that.** 
da60: 61 72 65 20 69 6e 74 65 6e 74 75 61 6c 6c 79 20  are intentually 
da70: 6c 65 66 74 20 75 6e 75 73 65 64 2e 20 20 54 68  left unused.  Th
da80: 69 73 20 69 73 20 74 68 65 20 22 72 65 73 65 72  is is the "reser
da90: 76 65 64 22 20 73 70 61 63 65 20 74 68 61 74 20  ved" space that 
daa0: 69 73 0a 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20  is.** sometimes 
dab0: 75 73 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f  used by extensio
dac0: 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ns..*/.int sqlit
dad0: 65 33 42 74 72 65 65 47 65 74 52 65 73 65 72 76  e3BtreeGetReserv
dae0: 65 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69  e(Btree *p){.  i
daf0: 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33 42  nt n;.  sqlite3B
db00: 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
db10: 6e 20 3d 20 70 2d 3e 70 42 74 2d 3e 70 61 67 65  n = p->pBt->page
db20: 53 69 7a 65 20 2d 20 70 2d 3e 70 42 74 2d 3e 75  Size - p->pBt->u
db30: 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20 73 71 6c  sableSize;.  sql
db40: 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
db50: 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  );.  return n;.}
db60: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
db70: 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
db80: 6e 74 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  nt for a databas
db90: 65 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70  e if mxPage is p
dba0: 6f 73 69 74 69 76 65 2e 0a 2a 2a 20 4e 6f 20 63  ositive..** No c
dbb0: 68 61 6e 67 65 73 20 61 72 65 20 6d 61 64 65 20  hanges are made 
dbc0: 69 66 20 6d 78 50 61 67 65 20 69 73 20 30 20 6f  if mxPage is 0 o
dbd0: 72 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 20 52  r negative..** R
dbe0: 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
dbf0: 20 76 61 6c 75 65 20 6f 66 20 6d 78 50 61 67 65   value of mxPage
dc00: 2c 20 72 65 74 75 72 6e 20 74 68 65 20 6d 61 78  , return the max
dc10: 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e  imum page count.
dc20: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
dc30: 74 72 65 65 4d 61 78 50 61 67 65 43 6f 75 6e 74  treeMaxPageCount
dc40: 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d  (Btree *p, int m
dc50: 78 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 3b  xPage){.  int n;
dc60: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
dc70: 6e 74 65 72 28 70 29 3b 0a 20 20 6e 20 3d 20 73  nter(p);.  n = s
dc80: 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78 50 61  qlite3PagerMaxPa
dc90: 67 65 43 6f 75 6e 74 28 70 2d 3e 70 42 74 2d 3e  geCount(p->pBt->
dca0: 70 50 61 67 65 72 2c 20 6d 78 50 61 67 65 29 3b  pPager, mxPage);
dcb0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
dcc0: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
dcd0: 6e 20 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n n;.}.#endif /*
dce0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
dcf0: 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
dd00: 4d 41 53 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  MAS) || !defined
dd10: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43  (SQLITE_OMIT_VAC
dd20: 55 55 4d 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  UUM) */../*.** C
dd30: 68 61 6e 67 65 20 74 68 65 20 27 61 75 74 6f 2d  hange the 'auto-
dd40: 76 61 63 75 75 6d 27 20 70 72 6f 70 65 72 74 79  vacuum' property
dd50: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
dd60: 2e 20 49 66 20 74 68 65 20 27 61 75 74 6f 56 61  . If the 'autoVa
dd70: 63 75 75 6d 27 0a 2a 2a 20 70 61 72 61 6d 65 74  cuum'.** paramet
dd80: 65 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  er is non-zero, 
dd90: 74 68 65 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d  then auto-vacuum
dda0: 20 6d 6f 64 65 20 69 73 20 65 6e 61 62 6c 65 64   mode is enabled
ddb0: 2e 20 49 66 20 7a 65 72 6f 2c 20 69 74 0a 2a 2a  . If zero, it.**
ddc0: 20 69 73 20 64 69 73 61 62 6c 65 64 2e 20 54 68   is disabled. Th
ddd0: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
dde0: 66 6f 72 20 74 68 65 20 61 75 74 6f 2d 76 61 63  for the auto-vac
ddf0: 75 75 6d 20 70 72 6f 70 65 72 74 79 20 69 73 20  uum property is 
de00: 0a 2a 2a 20 64 65 74 65 72 6d 69 6e 65 64 20 62  .** determined b
de10: 79 20 74 68 65 20 53 51 4c 49 54 45 5f 44 45 46  y the SQLITE_DEF
de20: 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55 4d 20  AULT_AUTOVACUUM 
de30: 6d 61 63 72 6f 2e 0a 2a 2f 0a 69 6e 74 20 73 71  macro..*/.int sq
de40: 6c 69 74 65 33 42 74 72 65 65 53 65 74 41 75 74  lite3BtreeSetAut
de50: 6f 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70  oVacuum(Btree *p
de60: 2c 20 69 6e 74 20 61 75 74 6f 56 61 63 75 75 6d  , int autoVacuum
de70: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
de80: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
de90: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
dea0: 5f 52 45 41 44 4f 4e 4c 59 3b 0a 23 65 6c 73 65  _READONLY;.#else
deb0: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
dec0: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 69 6e 74   = p->pBt;.  int
ded0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
dee0: 0a 20 20 75 38 20 61 76 20 3d 20 28 75 38 29 61  .  u8 av = (u8)a
def0: 75 74 6f 56 61 63 75 75 6d 3b 0a 0a 20 20 73 71  utoVacuum;..  sq
df00: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
df10: 70 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70  p);.  if( pBt->p
df20: 61 67 65 53 69 7a 65 46 69 78 65 64 20 26 26 20  ageSizeFixed && 
df30: 28 61 76 20 3f 31 3a 30 29 21 3d 70 42 74 2d 3e  (av ?1:0)!=pBt->
df40: 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
df50: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
df60: 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73 65 7b  ADONLY;.  }else{
df70: 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
df80: 63 75 75 6d 20 3d 20 61 76 20 3f 31 3a 30 3b 0a  cuum = av ?1:0;.
df90: 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
dfa0: 75 75 6d 20 3d 20 61 76 3d 3d 32 20 3f 31 3a 30  uum = av==2 ?1:0
dfb0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
dfc0: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
dfd0: 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
dfe0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  f.}../*.** Retur
dff0: 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  n the value of t
e000: 68 65 20 27 61 75 74 6f 2d 76 61 63 75 75 6d 27  he 'auto-vacuum'
e010: 20 70 72 6f 70 65 72 74 79 2e 20 49 66 20 61 75   property. If au
e020: 74 6f 2d 76 61 63 75 75 6d 20 69 73 20 0a 2a 2a  to-vacuum is .**
e030: 20 65 6e 61 62 6c 65 64 20 31 20 69 73 20 72 65   enabled 1 is re
e040: 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
e050: 65 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  e 0..*/.int sqli
e060: 74 65 33 42 74 72 65 65 47 65 74 41 75 74 6f 56  te3BtreeGetAutoV
e070: 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29 7b  acuum(Btree *p){
e080: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
e090: 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
e0a0: 20 72 65 74 75 72 6e 20 42 54 52 45 45 5f 41 55   return BTREE_AU
e0b0: 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3b 0a 23  TOVACUUM_NONE;.#
e0c0: 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 0a 20  else.  int rc;. 
e0d0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
e0e0: 65 72 28 70 29 3b 0a 20 20 72 63 20 3d 20 28 0a  er(p);.  rc = (.
e0f0: 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 61 75      (!p->pBt->au
e100: 74 6f 56 61 63 75 75 6d 29 3f 42 54 52 45 45 5f  toVacuum)?BTREE_
e110: 41 55 54 4f 56 41 43 55 55 4d 5f 4e 4f 4e 45 3a  AUTOVACUUM_NONE:
e120: 0a 20 20 20 20 28 21 70 2d 3e 70 42 74 2d 3e 69  .    (!p->pBt->i
e130: 6e 63 72 56 61 63 75 75 6d 29 3f 42 54 52 45 45  ncrVacuum)?BTREE
e140: 5f 41 55 54 4f 56 41 43 55 55 4d 5f 46 55 4c 4c  _AUTOVACUUM_FULL
e150: 3a 0a 20 20 20 20 42 54 52 45 45 5f 41 55 54 4f  :.    BTREE_AUTO
e160: 56 41 43 55 55 4d 5f 49 4e 43 52 0a 20 20 29 3b  VACUUM_INCR.  );
e170: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
e180: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
e190: 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  n rc;.#endif.}..
e1a0: 0a 2f 2a 0a 2a 2a 20 47 65 74 20 61 20 72 65 66  ./*.** Get a ref
e1b0: 65 72 65 6e 63 65 20 74 6f 20 70 50 61 67 65 31  erence to pPage1
e1c0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
e1d0: 20 66 69 6c 65 2e 20 20 54 68 69 73 20 77 69 6c   file.  This wil
e1e0: 6c 0a 2a 2a 20 61 6c 73 6f 20 61 63 71 75 69 72  l.** also acquir
e1f0: 65 20 61 20 72 65 61 64 6c 6f 63 6b 20 6f 6e 20  e a readlock on 
e200: 74 68 61 74 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  that file..**.**
e210: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
e220: 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73  turned on succes
e230: 73 2e 20 20 49 66 20 74 68 65 20 66 69 6c 65 20  s.  If the file 
e240: 69 73 20 6e 6f 74 20 61 0a 2a 2a 20 77 65 6c 6c  is not a.** well
e250: 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
e260: 20 66 69 6c 65 2c 20 74 68 65 6e 20 53 51 4c 49   file, then SQLI
e270: 54 45 5f 43 4f 52 52 55 50 54 20 69 73 20 72 65  TE_CORRUPT is re
e280: 74 75 72 6e 65 64 2e 0a 2a 2a 20 53 51 4c 49 54  turned..** SQLIT
e290: 45 5f 42 55 53 59 20 69 73 20 72 65 74 75 72 6e  E_BUSY is return
e2a0: 65 64 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ed if the databa
e2b0: 73 65 20 69 73 20 6c 6f 63 6b 65 64 2e 20 20 53  se is locked.  S
e2c0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69  QLITE_NOMEM.** i
e2d0: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 77 65  s returned if we
e2e0: 20 72 75 6e 20 6f 75 74 20 6f 66 20 6d 65 6d 6f   run out of memo
e2f0: 72 79 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ry. .*/.static i
e300: 6e 74 20 6c 6f 63 6b 42 74 72 65 65 28 42 74 53  nt lockBtree(BtS
e310: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
e320: 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
e330: 20 2a 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20   *pPage1;.  int 
e340: 6e 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  nPage;..  assert
e350: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
e360: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
e370: 20 29 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70   );.  if( pBt->p
e380: 50 61 67 65 31 20 29 20 72 65 74 75 72 6e 20 53  Page1 ) return S
e390: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 72 63 20 3d  QLITE_OK;.  rc =
e3a0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
e3b0: 50 61 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50  Page(pBt, 1, &pP
e3c0: 61 67 65 31 2c 20 30 29 3b 0a 20 20 69 66 28 20  age1, 0);.  if( 
e3d0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
e3e0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
e3f0: 20 44 6f 20 73 6f 6d 65 20 63 68 65 63 6b 69 6e   Do some checkin
e400: 67 20 74 6f 20 68 65 6c 70 20 69 6e 73 75 72 65  g to help insure
e410: 20 74 68 65 20 66 69 6c 65 20 77 65 20 6f 70 65   the file we ope
e420: 6e 65 64 20 72 65 61 6c 6c 79 20 69 73 0a 20 20  ned really is.  
e430: 2a 2a 20 61 20 76 61 6c 69 64 20 64 61 74 61 62  ** a valid datab
e440: 61 73 65 20 66 69 6c 65 2e 20 0a 20 20 2a 2f 0a  ase file. .  */.
e450: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
e460: 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
e470: 2d 3e 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65  ->pPager, &nPage
e480: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
e490: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
e4a0: 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
e4b0: 69 6c 65 64 3b 0a 20 20 7d 65 6c 73 65 20 69 66  iled;.  }else if
e4c0: 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20  ( nPage>0 ){.   
e4d0: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 0a 20   int pageSize;. 
e4e0: 20 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a     int usableSiz
e4f0: 65 3b 0a 20 20 20 20 75 38 20 2a 70 61 67 65 31  e;.    u8 *page1
e500: 20 3d 20 70 50 61 67 65 31 2d 3e 61 44 61 74 61   = pPage1->aData
e510: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
e520: 45 5f 4e 4f 54 41 44 42 3b 0a 20 20 20 20 69 66  E_NOTADB;.    if
e530: 28 20 6d 65 6d 63 6d 70 28 70 61 67 65 31 2c 20  ( memcmp(page1, 
e540: 7a 4d 61 67 69 63 48 65 61 64 65 72 2c 20 31 36  zMagicHeader, 16
e550: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f  )!=0 ){.      go
e560: 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61  to page1_init_fa
e570: 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20  iled;.    }.    
e580: 69 66 28 20 70 61 67 65 31 5b 31 38 5d 3e 31 20  if( page1[18]>1 
e590: 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 72 65  ){.      pBt->re
e5a0: 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 20 20 20 20  adOnly = 1;.    
e5b0: 7d 0a 20 20 20 20 69 66 28 20 70 61 67 65 31 5b  }.    if( page1[
e5c0: 31 39 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 67  19]>1 ){.      g
e5d0: 6f 74 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66  oto page1_init_f
e5e0: 61 69 6c 65 64 3b 0a 20 20 20 20 7d 0a 0a 20 20  ailed;.    }..  
e5f0: 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d    /* The maximum
e600: 20 65 6d 62 65 64 64 65 64 20 66 72 61 63 74 69   embedded fracti
e610: 6f 6e 20 6d 75 73 74 20 62 65 20 65 78 61 63 74  on must be exact
e620: 6c 79 20 32 35 25 2e 20 20 41 6e 64 20 74 68 65  ly 25%.  And the
e630: 20 6d 69 6e 69 6d 75 6d 0a 20 20 20 20 2a 2a 20   minimum.    ** 
e640: 65 6d 62 65 64 64 65 64 20 66 72 61 63 74 69 6f  embedded fractio
e650: 6e 20 6d 75 73 74 20 62 65 20 31 32 2e 35 25 20  n must be 12.5% 
e660: 66 6f 72 20 62 6f 74 68 20 6c 65 61 66 2d 64 61  for both leaf-da
e670: 74 61 20 61 6e 64 20 6e 6f 6e 2d 6c 65 61 66 2d  ta and non-leaf-
e680: 64 61 74 61 2e 0a 20 20 20 20 2a 2a 20 54 68 65  data..    ** The
e690: 20 6f 72 69 67 69 6e 61 6c 20 64 65 73 69 67 6e   original design
e6a0: 20 61 6c 6c 6f 77 65 64 20 74 68 65 73 65 20 61   allowed these a
e6b0: 6d 6f 75 6e 74 73 20 74 6f 20 76 61 72 79 2c 20  mounts to vary, 
e6c0: 62 75 74 20 61 73 20 6f 66 0a 20 20 20 20 2a 2a  but as of.    **
e6d0: 20 76 65 72 73 69 6f 6e 20 33 2e 36 2e 30 2c 20   version 3.6.0, 
e6e0: 77 65 20 72 65 71 75 69 72 65 20 74 68 65 6d 20  we require them 
e6f0: 74 6f 20 62 65 20 66 69 78 65 64 2e 0a 20 20 20  to be fixed..   
e700: 20 2a 2f 0a 20 20 20 20 69 66 28 20 6d 65 6d 63   */.    if( memc
e710: 6d 70 28 26 70 61 67 65 31 5b 32 31 5d 2c 20 22  mp(&page1[21], "
e720: 5c 31 30 30 5c 30 34 30 5c 30 34 30 22 2c 33 29  \100\040\040",3)
e730: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  !=0 ){.      got
e740: 6f 20 70 61 67 65 31 5f 69 6e 69 74 5f 66 61 69  o page1_init_fai
e750: 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  led;.    }.    p
e760: 61 67 65 53 69 7a 65 20 3d 20 67 65 74 32 62 79  ageSize = get2by
e770: 74 65 28 26 70 61 67 65 31 5b 31 36 5d 29 3b 0a  te(&page1[16]);.
e780: 20 20 20 20 69 66 28 20 28 28 70 61 67 65 53 69      if( ((pageSi
e790: 7a 65 2d 31 29 26 70 61 67 65 53 69 7a 65 29 21  ze-1)&pageSize)!
e7a0: 3d 30 20 7c 7c 20 70 61 67 65 53 69 7a 65 3c 35  =0 || pageSize<5
e7b0: 31 32 20 7c 7c 0a 20 20 20 20 20 20 20 20 28 53  12 ||.        (S
e7c0: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
e7d0: 49 5a 45 3c 33 32 37 36 38 20 26 26 20 70 61 67  IZE<32768 && pag
e7e0: 65 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58  eSize>SQLITE_MAX
e7f0: 5f 50 41 47 45 5f 53 49 5a 45 29 0a 20 20 20 20  _PAGE_SIZE).    
e800: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
e810: 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
e820: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
e830: 74 28 20 28 70 61 67 65 53 69 7a 65 20 26 20 37  t( (pageSize & 7
e840: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 75 73 61 62  )==0 );.    usab
e850: 6c 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  leSize = pageSiz
e860: 65 20 2d 20 70 61 67 65 31 5b 32 30 5d 3b 0a 20  e - page1[20];. 
e870: 20 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 21     if( pageSize!
e880: 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 29  =pBt->pageSize )
e890: 7b 0a 20 20 20 20 20 20 2f 2a 20 41 66 74 65 72  {.      /* After
e8a0: 20 72 65 61 64 69 6e 67 20 74 68 65 20 66 69 72   reading the fir
e8b0: 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64  st page of the d
e8c0: 61 74 61 62 61 73 65 20 61 73 73 75 6d 69 6e 67  atabase assuming
e8d0: 20 61 20 70 61 67 65 20 73 69 7a 65 0a 20 20 20   a page size.   
e8e0: 20 20 20 2a 2a 20 6f 66 20 42 74 53 68 61 72 65     ** of BtShare
e8f0: 64 2e 70 61 67 65 53 69 7a 65 2c 20 77 65 20 68  d.pageSize, we h
e900: 61 76 65 20 64 69 73 63 6f 76 65 72 65 64 20 74  ave discovered t
e910: 68 61 74 20 74 68 65 20 70 61 67 65 2d 73 69 7a  hat the page-siz
e920: 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 63  e is.      ** ac
e930: 74 75 61 6c 6c 79 20 70 61 67 65 53 69 7a 65 2e  tually pageSize.
e940: 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
e950: 62 61 73 65 2c 20 6c 65 61 76 65 20 70 42 74 2d  base, leave pBt-
e960: 3e 70 50 61 67 65 31 20 61 74 0a 20 20 20 20 20  >pPage1 at.     
e970: 20 2a 2a 20 7a 65 72 6f 20 61 6e 64 20 72 65 74   ** zero and ret
e980: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 54  urn SQLITE_OK. T
e990: 68 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 63  he caller will c
e9a0: 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  all this functio
e9b0: 6e 0a 20 20 20 20 20 20 2a 2a 20 61 67 61 69 6e  n.      ** again
e9c0: 20 77 69 74 68 20 74 68 65 20 63 6f 72 72 65 63   with the correc
e9d0: 74 20 70 61 67 65 2d 73 69 7a 65 2e 0a 20 20 20  t page-size..   
e9e0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 6c 65     */.      rele
e9f0: 61 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b  asePage(pPage1);
ea00: 0a 20 20 20 20 20 20 70 42 74 2d 3e 75 73 61 62  .      pBt->usab
ea10: 6c 65 53 69 7a 65 20 3d 20 28 75 31 36 29 75 73  leSize = (u16)us
ea20: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  ableSize;.      
ea30: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
ea40: 28 75 31 36 29 70 61 67 65 53 69 7a 65 3b 0a 20  (u16)pageSize;. 
ea50: 20 20 20 20 20 66 72 65 65 54 65 6d 70 53 70 61       freeTempSpa
ea60: 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20 73  ce(pBt);.      s
ea70: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
ea80: 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67  gesize(pBt->pPag
ea90: 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69  er, &pBt->pageSi
eaa0: 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ze);.      retur
eab0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
eac0: 20 7d 0a 20 20 20 20 69 66 28 20 75 73 61 62 6c   }.    if( usabl
ead0: 65 53 69 7a 65 3c 35 30 30 20 29 7b 0a 20 20 20  eSize<500 ){.   
eae0: 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69 6e     goto page1_in
eaf0: 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 7d  it_failed;.    }
eb00: 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69  .    pBt->pageSi
eb10: 7a 65 20 3d 20 28 75 31 36 29 70 61 67 65 53 69  ze = (u16)pageSi
eb20: 7a 65 3b 0a 20 20 20 20 70 42 74 2d 3e 75 73 61  ze;.    pBt->usa
eb30: 62 6c 65 53 69 7a 65 20 3d 20 28 75 31 36 29 75  bleSize = (u16)u
eb40: 73 61 62 6c 65 53 69 7a 65 3b 0a 23 69 66 6e 64  sableSize;.#ifnd
eb50: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
eb60: 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42  UTOVACUUM.    pB
eb70: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 3d 20  t->autoVacuum = 
eb80: 28 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31  (get4byte(&page1
eb90: 5b 33 36 20 2b 20 34 2a 34 5d 29 3f 31 3a 30 29  [36 + 4*4])?1:0)
eba0: 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56  ;.    pBt->incrV
ebb0: 61 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74  acuum = (get4byt
ebc0: 65 28 26 70 61 67 65 31 5b 33 36 20 2b 20 37 2a  e(&page1[36 + 7*
ebd0: 34 5d 29 3f 31 3a 30 29 3b 0a 23 65 6e 64 69 66  4])?1:0);.#endif
ebe0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 6d 61 78 4c 6f  .  }..  /* maxLo
ebf0: 63 61 6c 20 69 73 20 74 68 65 20 6d 61 78 69 6d  cal is the maxim
ec00: 75 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79  um amount of pay
ec10: 6c 6f 61 64 20 74 6f 20 73 74 6f 72 65 20 6c 6f  load to store lo
ec20: 63 61 6c 6c 79 20 66 6f 72 0a 20 20 2a 2a 20 61  cally for.  ** a
ec30: 20 63 65 6c 6c 2e 20 20 4d 61 6b 65 20 73 75 72   cell.  Make sur
ec40: 65 20 69 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  e it is small en
ec50: 6f 75 67 68 20 73 6f 20 74 68 61 74 20 61 74 20  ough so that at 
ec60: 6c 65 61 73 74 20 6d 69 6e 46 61 6e 6f 75 74 0a  least minFanout.
ec70: 20 20 2a 2a 20 63 65 6c 6c 73 20 63 61 6e 20 77    ** cells can w
ec80: 69 6c 6c 20 66 69 74 20 6f 6e 20 6f 6e 65 20 70  ill fit on one p
ec90: 61 67 65 2e 20 20 57 65 20 61 73 73 75 6d 65 20  age.  We assume 
eca0: 61 20 31 30 2d 62 79 74 65 20 70 61 67 65 20 68  a 10-byte page h
ecb0: 65 61 64 65 72 2e 0a 20 20 2a 2a 20 42 65 73 69  eader..  ** Besi
ecc0: 64 65 73 20 74 68 65 20 70 61 79 6c 6f 61 64 2c  des the payload,
ecd0: 20 74 68 65 20 63 65 6c 6c 20 6d 75 73 74 20 73   the cell must s
ece0: 74 6f 72 65 3a 0a 20 20 2a 2a 20 20 20 20 20 32  tore:.  **     2
ecf0: 2d 62 79 74 65 20 70 6f 69 6e 74 65 72 20 74 6f  -byte pointer to
ed00: 20 74 68 65 20 63 65 6c 6c 0a 20 20 2a 2a 20 20   the cell.  **  
ed10: 20 20 20 34 2d 62 79 74 65 20 63 68 69 6c 64 20     4-byte child 
ed20: 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20 20 20 20  pointer.  **    
ed30: 20 39 2d 62 79 74 65 20 6e 4b 65 79 20 76 61 6c   9-byte nKey val
ed40: 75 65 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79  ue.  **     4-by
ed50: 74 65 20 6e 44 61 74 61 20 76 61 6c 75 65 0a 20  te nData value. 
ed60: 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65 20 6f   **     4-byte o
ed70: 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f 69  verflow page poi
ed80: 6e 74 65 72 0a 20 20 2a 2a 20 53 6f 20 61 20 63  nter.  ** So a c
ed90: 65 6c 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ell consists of 
eda0: 61 20 32 2d 62 79 74 65 20 70 6f 69 6e 65 72 2c  a 2-byte poiner,
edb0: 20 61 20 68 65 61 64 65 72 20 77 68 69 63 68 20   a header which 
edc0: 69 73 20 61 73 20 6d 75 63 68 20 61 73 0a 20 20  is as much as.  
edd0: 2a 2a 20 31 37 20 62 79 74 65 73 20 6c 6f 6e 67  ** 17 bytes long
ede0: 2c 20 30 20 74 6f 20 4e 20 62 79 74 65 73 20 6f  , 0 to N bytes o
edf0: 66 20 70 61 79 6c 6f 61 64 2c 20 61 6e 64 20 61  f payload, and a
ee00: 6e 20 6f 70 74 69 6f 6e 61 6c 20 34 20 62 79 74  n optional 4 byt
ee10: 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 2a 2a 20  e overflow.  ** 
ee20: 70 61 67 65 20 70 6f 69 6e 74 65 72 2e 0a 20 20  page pointer..  
ee30: 2a 2f 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 6f 63  */.  pBt->maxLoc
ee40: 61 6c 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c  al = (pBt->usabl
ee50: 65 53 69 7a 65 2d 31 32 29 2a 36 34 2f 32 35 35  eSize-12)*64/255
ee60: 20 2d 20 32 33 3b 0a 20 20 70 42 74 2d 3e 6d 69   - 23;.  pBt->mi
ee70: 6e 4c 6f 63 61 6c 20 3d 20 28 70 42 74 2d 3e 75  nLocal = (pBt->u
ee80: 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33 32  sableSize-12)*32
ee90: 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 70 42 74  /255 - 23;.  pBt
eea0: 2d 3e 6d 61 78 4c 65 61 66 20 3d 20 70 42 74 2d  ->maxLeaf = pBt-
eeb0: 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20 33 35  >usableSize - 35
eec0: 3b 0a 20 20 70 42 74 2d 3e 6d 69 6e 4c 65 61 66  ;.  pBt->minLeaf
eed0: 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c 65 53   = (pBt->usableS
eee0: 69 7a 65 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d  ize-12)*32/255 -
eef0: 20 32 33 3b 0a 20 20 61 73 73 65 72 74 28 20 70   23;.  assert( p
ef00: 42 74 2d 3e 6d 61 78 4c 65 61 66 20 2b 20 32 33  Bt->maxLeaf + 23
ef10: 20 3c 3d 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45   <= MX_CELL_SIZE
ef20: 28 70 42 74 29 20 29 3b 0a 20 20 70 42 74 2d 3e  (pBt) );.  pBt->
ef30: 70 50 61 67 65 31 20 3d 20 70 50 61 67 65 31 3b  pPage1 = pPage1;
ef40: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
ef50: 5f 4f 4b 3b 0a 0a 70 61 67 65 31 5f 69 6e 69 74  _OK;..page1_init
ef60: 5f 66 61 69 6c 65 64 3a 0a 20 20 72 65 6c 65 61  _failed:.  relea
ef70: 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
ef80: 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
ef90: 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
efa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
efb0: 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65  utine works like
efc0: 20 6c 6f 63 6b 42 74 72 65 65 28 29 20 65 78 63   lockBtree() exc
efd0: 65 70 74 20 74 68 61 74 20 69 74 20 61 6c 73 6f  ept that it also
efe0: 20 69 6e 76 6f 6b 65 73 20 74 68 65 0a 2a 2a 20   invokes the.** 
eff0: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66  busy callback if
f000: 20 74 68 65 72 65 20 69 73 20 6c 6f 63 6b 20 63   there is lock c
f010: 6f 6e 74 65 6e 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ontention..*/.st
f020: 61 74 69 63 20 69 6e 74 20 6c 6f 63 6b 42 74 72  atic int lockBtr
f030: 65 65 57 69 74 68 52 65 74 72 79 28 42 74 72 65  eeWithRetry(Btre
f040: 65 20 2a 70 52 65 66 29 7b 0a 20 20 69 6e 74 20  e *pRef){.  int 
f050: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
f060: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
f070: 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
f080: 78 28 70 52 65 66 29 20 29 3b 0a 20 20 69 66 28  x(pRef) );.  if(
f090: 20 70 52 65 66 2d 3e 69 6e 54 72 61 6e 73 3d 3d   pRef->inTrans==
f0a0: 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20  TRANS_NONE ){.  
f0b0: 20 20 75 38 20 69 6e 54 72 61 6e 73 61 63 74 69    u8 inTransacti
f0c0: 6f 6e 20 3d 20 70 52 65 66 2d 3e 70 42 74 2d 3e  on = pRef->pBt->
f0d0: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20  inTransaction;. 
f0e0: 20 20 20 62 74 72 65 65 49 6e 74 65 67 72 69 74     btreeIntegrit
f0f0: 79 28 70 52 65 66 29 3b 0a 20 20 20 20 72 63 20  y(pRef);.    rc 
f100: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 42 65  = sqlite3BtreeBe
f110: 67 69 6e 54 72 61 6e 73 28 70 52 65 66 2c 20 30  ginTrans(pRef, 0
f120: 29 3b 0a 20 20 20 20 70 52 65 66 2d 3e 70 42 74  );.    pRef->pBt
f130: 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  ->inTransaction 
f140: 3d 20 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3b  = inTransaction;
f150: 0a 20 20 20 20 70 52 65 66 2d 3e 69 6e 54 72 61  .    pRef->inTra
f160: 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  ns = TRANS_NONE;
f170: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
f180: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f190: 70 52 65 66 2d 3e 70 42 74 2d 3e 6e 54 72 61 6e  pRef->pBt->nTran
f1a0: 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 7d  saction--;.    }
f1b0: 0a 20 20 20 20 62 74 72 65 65 49 6e 74 65 67 72  .    btreeIntegr
f1c0: 69 74 79 28 70 52 65 66 29 3b 0a 20 20 7d 0a 20  ity(pRef);.  }. 
f1d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 20 20   return rc;.}.  
f1e0: 20 20 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 49 66 20       ../*.** If 
f1f0: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74  there are no out
f200: 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f 72 73  standing cursors
f210: 20 61 6e 64 20 77 65 20 61 72 65 20 6e 6f 74 20   and we are not 
f220: 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 0a 2a 2a  in the middle.**
f230: 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
f240: 6e 20 62 75 74 20 74 68 65 72 65 20 69 73 20 61  n but there is a
f250: 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
f260: 65 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e  e database, then
f270: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
f280: 20 75 6e 72 65 66 73 20 74 68 65 20 66 69 72 73   unrefs the firs
f290: 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61  t page of the da
f2a0: 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 69 63  tabase file whic
f2b0: 68 20 0a 2a 2a 20 68 61 73 20 74 68 65 20 65 66  h .** has the ef
f2c0: 66 65 63 74 20 6f 66 20 72 65 6c 65 61 73 69 6e  fect of releasin
f2d0: 67 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  g the read lock.
f2e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20  .**.** If there 
f2f0: 61 72 65 20 61 6e 79 20 6f 75 74 73 74 61 6e 64  are any outstand
f300: 69 6e 67 20 63 75 72 73 6f 72 73 2c 20 74 68 69  ing cursors, thi
f310: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e  s routine is a n
f320: 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  o-op..**.** If t
f330: 68 65 72 65 20 69 73 20 61 20 74 72 61 6e 73 61  here is a transa
f340: 63 74 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73  ction in progres
f350: 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  s, this routine 
f360: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73  is a no-op..*/.s
f370: 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 6f 63  tatic void unloc
f380: 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 42  kBtreeIfUnused(B
f390: 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
f3a0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
f3b0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
f3c0: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
f3d0: 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
f3e0: 69 6f 6e 3d 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20  ion==TRANS_NONE 
f3f0: 26 26 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 3d  && pBt->pCursor=
f400: 3d 30 20 26 26 20 70 42 74 2d 3e 70 50 61 67 65  =0 && pBt->pPage
f410: 31 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  1!=0 ){.    if( 
f420: 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
f430: 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
f440: 29 3e 3d 31 20 29 7b 0a 20 20 20 20 20 20 61 73  )>=1 ){.      as
f450: 73 65 72 74 28 20 70 42 74 2d 3e 70 50 61 67 65  sert( pBt->pPage
f460: 31 2d 3e 61 44 61 74 61 20 29 3b 0a 23 69 66 20  1->aData );.#if 
f470: 30 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  0.      if( pBt-
f480: 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3d 3d  >pPage1->aData==
f490: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d  0 ){.        Mem
f4a0: 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 42  Page *pPage = pB
f4b0: 74 2d 3e 70 50 61 67 65 31 3b 0a 20 20 20 20 20  t->pPage1;.     
f4c0: 20 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20     pPage->aData 
f4d0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
f4e0: 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70 44 62  tData(pPage->pDb
f4f0: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 70  Page);.        p
f500: 50 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b  Page->pBt = pBt;
f510: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d 3e  .        pPage->
f520: 70 67 6e 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20  pgno = 1;.      
f530: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  }.#endif.      r
f540: 65 6c 65 61 73 65 50 61 67 65 28 70 42 74 2d 3e  eleasePage(pBt->
f550: 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20  pPage1);.    }. 
f560: 20 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d     pBt->pPage1 =
f570: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
f580: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 64 61   Create a new da
f590: 74 61 62 61 73 65 20 62 79 20 69 6e 69 74 69 61  tabase by initia
f5a0: 6c 69 7a 69 6e 67 20 74 68 65 20 66 69 72 73 74  lizing the first
f5b0: 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20   page of the.** 
f5c0: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
f5d0: 69 6e 74 20 6e 65 77 44 61 74 61 62 61 73 65 28  int newDatabase(
f5e0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a  BtShared *pBt){.
f5f0: 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 31 3b 0a    MemPage *pP1;.
f600: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
f610: 2a 64 61 74 61 3b 0a 20 20 69 6e 74 20 72 63 3b  *data;.  int rc;
f620: 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a 0a 20  .  int nPage;.. 
f630: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
f640: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
f650: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
f660: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
f670: 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
f680: 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
f690: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
f6a0: 4b 20 7c 7c 20 6e 50 61 67 65 3e 30 20 29 7b 0a  K || nPage>0 ){.
f6b0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
f6c0: 20 7d 0a 20 20 70 50 31 20 3d 20 70 42 74 2d 3e   }.  pP1 = pBt->
f6d0: 70 50 61 67 65 31 3b 0a 20 20 61 73 73 65 72 74  pPage1;.  assert
f6e0: 28 20 70 50 31 21 3d 30 20 29 3b 0a 20 20 64 61  ( pP1!=0 );.  da
f6f0: 74 61 20 3d 20 70 50 31 2d 3e 61 44 61 74 61 3b  ta = pP1->aData;
f700: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
f710: 61 67 65 72 57 72 69 74 65 28 70 50 31 2d 3e 70  agerWrite(pP1->p
f720: 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  DbPage);.  if( r
f730: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
f740: 20 6d 65 6d 63 70 79 28 64 61 74 61 2c 20 7a 4d   memcpy(data, zM
f750: 61 67 69 63 48 65 61 64 65 72 2c 20 73 69 7a 65  agicHeader, size
f760: 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72 29  of(zMagicHeader)
f770: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  );.  assert( siz
f780: 65 6f 66 28 7a 4d 61 67 69 63 48 65 61 64 65 72  eof(zMagicHeader
f790: 29 3d 3d 31 36 20 29 3b 0a 20 20 70 75 74 32 62  )==16 );.  put2b
f7a0: 79 74 65 28 26 64 61 74 61 5b 31 36 5d 2c 20 70  yte(&data[16], p
f7b0: 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
f7c0: 20 64 61 74 61 5b 31 38 5d 20 3d 20 31 3b 0a 20   data[18] = 1;. 
f7d0: 20 64 61 74 61 5b 31 39 5d 20 3d 20 31 3b 0a 20   data[19] = 1;. 
f7e0: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 75 73   assert( pBt->us
f7f0: 61 62 6c 65 53 69 7a 65 3c 3d 70 42 74 2d 3e 70  ableSize<=pBt->p
f800: 61 67 65 53 69 7a 65 20 26 26 20 70 42 74 2d 3e  ageSize && pBt->
f810: 75 73 61 62 6c 65 53 69 7a 65 2b 32 35 35 3e 3d  usableSize+255>=
f820: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  pBt->pageSize);.
f830: 20 20 64 61 74 61 5b 32 30 5d 20 3d 20 28 75 38    data[20] = (u8
f840: 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  )(pBt->pageSize 
f850: 2d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  - pBt->usableSiz
f860: 65 29 3b 0a 20 20 64 61 74 61 5b 32 31 5d 20 3d  e);.  data[21] =
f870: 20 36 34 3b 0a 20 20 64 61 74 61 5b 32 32 5d 20   64;.  data[22] 
f880: 3d 20 33 32 3b 0a 20 20 64 61 74 61 5b 32 33 5d  = 32;.  data[23]
f890: 20 3d 20 33 32 3b 0a 20 20 6d 65 6d 73 65 74 28   = 32;.  memset(
f8a0: 26 64 61 74 61 5b 32 34 5d 2c 20 30 2c 20 31 30  &data[24], 0, 10
f8b0: 30 2d 32 34 29 3b 0a 20 20 7a 65 72 6f 50 61 67  0-24);.  zeroPag
f8c0: 65 28 70 50 31 2c 20 50 54 46 5f 49 4e 54 4b 45  e(pP1, PTF_INTKE
f8d0: 59 7c 50 54 46 5f 4c 45 41 46 7c 50 54 46 5f 4c  Y|PTF_LEAF|PTF_L
f8e0: 45 41 46 44 41 54 41 20 29 3b 0a 20 20 70 42 74  EAFDATA );.  pBt
f8f0: 2d 3e 70 61 67 65 53 69 7a 65 46 69 78 65 64 20  ->pageSizeFixed 
f900: 3d 20 31 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 1;.#ifndef SQL
f910: 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
f920: 55 55 4d 0a 20 20 61 73 73 65 72 74 28 20 70 42  UUM.  assert( pB
f930: 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 3d 3d 31  t->autoVacuum==1
f940: 20 7c 7c 20 70 42 74 2d 3e 61 75 74 6f 56 61 63   || pBt->autoVac
f950: 75 75 6d 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  uum==0 );.  asse
f960: 72 74 28 20 70 42 74 2d 3e 69 6e 63 72 56 61 63  rt( pBt->incrVac
f970: 75 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 69  uum==1 || pBt->i
f980: 6e 63 72 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a  ncrVacuum==0 );.
f990: 20 20 70 75 74 34 62 79 74 65 28 26 64 61 74 61    put4byte(&data
f9a0: 5b 33 36 20 2b 20 34 2a 34 5d 2c 20 70 42 74 2d  [36 + 4*4], pBt-
f9b0: 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20 20  >autoVacuum);.  
f9c0: 70 75 74 34 62 79 74 65 28 26 64 61 74 61 5b 33  put4byte(&data[3
f9d0: 36 20 2b 20 37 2a 34 5d 2c 20 70 42 74 2d 3e 69  6 + 7*4], pBt->i
f9e0: 6e 63 72 56 61 63 75 75 6d 29 3b 0a 23 65 6e 64  ncrVacuum);.#end
f9f0: 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
fa00: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
fa10: 41 74 74 65 6d 70 74 20 74 6f 20 73 74 61 72 74  Attempt to start
fa20: 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
fa30: 6f 6e 2e 20 41 20 77 72 69 74 65 2d 74 72 61 6e  on. A write-tran
fa40: 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 73 74  saction.** is st
fa50: 61 72 74 65 64 20 69 66 20 74 68 65 20 73 65 63  arted if the sec
fa60: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
fa70: 6e 6f 6e 7a 65 72 6f 2c 20 6f 74 68 65 72 77 69  nonzero, otherwi
fa80: 73 65 20 61 20 72 65 61 64 2d 0a 2a 2a 20 74 72  se a read-.** tr
fa90: 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 74  ansaction.  If t
faa0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
fab0: 6e 74 20 69 73 20 32 20 6f 72 20 6d 6f 72 65 20  nt is 2 or more 
fac0: 61 6e 64 20 65 78 63 6c 75 73 69 76 65 0a 2a 2a  and exclusive.**
fad0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
fae0: 73 74 61 72 74 65 64 2c 20 6d 65 61 6e 69 6e 67  started, meaning
faf0: 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20 70   that no other p
fb00: 72 6f 63 65 73 73 20 69 73 20 61 6c 6c 6f 77 65  rocess is allowe
fb10: 64 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74  d.** to access t
fb20: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 41 20  he database.  A 
fb30: 70 72 65 65 78 69 73 74 69 6e 67 20 74 72 61 6e  preexisting tran
fb40: 73 61 63 74 69 6f 6e 20 6d 61 79 20 6e 6f 74 20  saction may not 
fb50: 62 65 0a 2a 2a 20 75 70 67 72 61 64 65 64 20 74  be.** upgraded t
fb60: 6f 20 65 78 63 6c 75 73 69 76 65 20 62 79 20 63  o exclusive by c
fb70: 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75 74  alling this rout
fb80: 69 6e 65 20 61 20 73 65 63 6f 6e 64 20 74 69 6d  ine a second tim
fb90: 65 20 2d 20 74 68 65 0a 2a 2a 20 65 78 63 6c 75  e - the.** exclu
fba0: 73 69 76 69 74 79 20 66 6c 61 67 20 6f 6e 6c 79  sivity flag only
fbb0: 20 77 6f 72 6b 73 20 66 6f 72 20 61 20 6e 65 77   works for a new
fbc0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
fbd0: 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74 72 61 6e  .** A write-tran
fbe0: 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
fbf0: 73 74 61 72 74 65 64 20 62 65 66 6f 72 65 20 61  started before a
fc00: 74 74 65 6d 70 74 69 6e 67 20 61 6e 79 20 0a 2a  ttempting any .*
fc10: 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  * changes to the
fc20: 20 64 61 74 61 62 61 73 65 2e 20 20 4e 6f 6e 65   database.  None
fc30: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
fc40: 67 20 72 6f 75 74 69 6e 65 73 20 0a 2a 2a 20 77  g routines .** w
fc50: 69 6c 6c 20 77 6f 72 6b 20 75 6e 6c 65 73 73 20  ill work unless 
fc60: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
fc70: 20 73 74 61 72 74 65 64 20 66 69 72 73 74 3a 0a   started first:.
fc80: 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74  **.**      sqlit
fc90: 65 33 42 74 72 65 65 43 72 65 61 74 65 54 61 62  e3BtreeCreateTab
fca0: 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  le().**      sql
fcb0: 69 74 65 33 42 74 72 65 65 43 72 65 61 74 65 49  ite3BtreeCreateI
fcc0: 6e 64 65 78 28 29 0a 2a 2a 20 20 20 20 20 20 73  ndex().**      s
fcd0: 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
fce0: 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
fcf0: 73 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70  sqlite3BtreeDrop
fd00: 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20 20 20  Table().**      
fd10: 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 73 65  sqlite3BtreeInse
fd20: 72 74 28 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c  rt().**      sql
fd30: 69 74 65 33 42 74 72 65 65 44 65 6c 65 74 65 28  ite3BtreeDelete(
fd40: 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
fd50: 33 42 74 72 65 65 55 70 64 61 74 65 4d 65 74 61  3BtreeUpdateMeta
fd60: 28 29 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 69  ().**.** If an i
fd70: 6e 69 74 69 61 6c 20 61 74 74 65 6d 70 74 20 74  nitial attempt t
fd80: 6f 20 61 63 71 75 69 72 65 20 74 68 65 20 6c 6f  o acquire the lo
fd90: 63 6b 20 66 61 69 6c 73 20 62 65 63 61 75 73 65  ck fails because
fda0: 20 6f 66 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74   of lock content
fdb0: 69 6f 6e 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64  ion.** and the d
fdc0: 61 74 61 62 61 73 65 20 77 61 73 20 70 72 65 76  atabase was prev
fdd0: 69 6f 75 73 6c 79 20 75 6e 6c 6f 63 6b 65 64 2c  iously unlocked,
fde0: 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 65   then invoke the
fdf0: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 0a 2a 2a   busy handler.**
fe00: 20 69 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65   if there is one
fe10: 2e 20 20 42 75 74 20 69 66 20 74 68 65 72 65 20  .  But if there 
fe20: 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 61  was previously a
fe30: 20 72 65 61 64 2d 6c 6f 63 6b 2c 20 64 6f 20 6e   read-lock, do n
fe40: 6f 74 0a 2a 2a 20 69 6e 76 6f 6b 65 20 74 68 65  ot.** invoke the
fe50: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2d 20   busy handler - 
fe60: 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
fe70: 54 45 5f 42 55 53 59 2e 20 20 53 51 4c 49 54 45  TE_BUSY.  SQLITE
fe80: 5f 42 55 53 59 20 69 73 20 0a 2a 2a 20 72 65 74  _BUSY is .** ret
fe90: 75 72 6e 65 64 20 77 68 65 6e 20 74 68 65 72 65  urned when there
fea0: 20 69 73 20 61 6c 72 65 61 64 79 20 61 20 72 65   is already a re
feb0: 61 64 2d 6c 6f 63 6b 20 69 6e 20 6f 72 64 65 72  ad-lock in order
fec0: 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 61 64   to avoid a dead
fed0: 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 75 70 70  lock..**.** Supp
fee0: 6f 73 65 20 74 68 65 72 65 20 61 72 65 20 74 77  ose there are tw
fef0: 6f 20 70 72 6f 63 65 73 73 65 73 20 41 20 61 6e  o processes A an
ff00: 64 20 42 2e 20 20 41 20 68 61 73 20 61 20 72 65  d B.  A has a re
ff10: 61 64 20 6c 6f 63 6b 20 61 6e 64 20 42 20 68 61  ad lock and B ha
ff20: 73 0a 2a 2a 20 61 20 72 65 73 65 72 76 65 64 20  s.** a reserved 
ff30: 6c 6f 63 6b 2e 20 20 42 20 74 72 69 65 73 20 74  lock.  B tries t
ff40: 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 65 78 63  o promote to exc
ff50: 6c 75 73 69 76 65 20 62 75 74 20 69 73 20 62 6c  lusive but is bl
ff60: 6f 63 6b 65 64 20 62 65 63 61 75 73 65 0a 2a 2a  ocked because.**
ff70: 20 6f 66 20 41 27 73 20 72 65 61 64 20 6c 6f 63   of A's read loc
ff80: 6b 2e 20 20 41 20 74 72 69 65 73 20 74 6f 20 70  k.  A tries to p
ff90: 72 6f 6d 6f 74 65 20 74 6f 20 72 65 73 65 72 76  romote to reserv
ffa0: 65 64 20 62 75 74 20 69 73 20 62 6c 6f 63 6b 65  ed but is blocke
ffb0: 64 20 62 79 20 42 2e 0a 2a 2a 20 4f 6e 65 20 6f  d by B..** One o
ffc0: 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74  r the other of t
ffd0: 68 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73  he two processes
ffe0: 20 6d 75 73 74 20 67 69 76 65 20 77 61 79 20 6f   must give way o
fff0: 72 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a  r there can be.*
10000 2a 20 6e 6f 20 70 72 6f 67 72 65 73 73 2e 20 20  * no progress.  
10010 42 79 20 72 65 74 75 72 6e 69 6e 67 20 53 51 4c  By returning SQL
10020 49 54 45 5f 42 55 53 59 20 61 6e 64 20 6e 6f 74  ITE_BUSY and not
10030 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 62 75   invoking the bu
10040 73 79 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 77  sy callback.** w
10050 68 65 6e 20 41 20 61 6c 72 65 61 64 79 20 68 61  hen A already ha
10060 73 20 61 20 72 65 61 64 20 6c 6f 63 6b 2c 20 77  s a read lock, w
10070 65 20 65 6e 63 6f 75 72 61 67 65 20 41 20 74 6f  e encourage A to
10080 20 67 69 76 65 20 75 70 20 61 6e 64 20 6c 65 74   give up and let
10090 20 42 0a 2a 2a 20 70 72 6f 63 65 65 64 2e 0a 2a   B.** proceed..*
100a0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
100b0 65 65 42 65 67 69 6e 54 72 61 6e 73 28 42 74 72  eeBeginTrans(Btr
100c0 65 65 20 2a 70 2c 20 69 6e 74 20 77 72 66 6c 61  ee *p, int wrfla
100d0 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 70  g){.  sqlite3 *p
100e0 42 6c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42 74 53  Block = 0;.  BtS
100f0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
10100 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pBt;.  int rc = 
10110 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71  SQLITE_OK;..  sq
10120 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
10130 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20  p);.  pBt->db = 
10140 70 2d 3e 64 62 3b 0a 20 20 62 74 72 65 65 49 6e  p->db;.  btreeIn
10150 74 65 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f  tegrity(p);..  /
10160 2a 20 49 66 20 74 68 65 20 62 74 72 65 65 20 69  * If the btree i
10170 73 20 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77  s already in a w
10180 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
10190 2c 20 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20  , or it.  ** is 
101a0 61 6c 72 65 61 64 79 20 69 6e 20 61 20 72 65 61  already in a rea
101b0 64 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  d-transaction an
101c0 64 20 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63  d a read-transac
101d0 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71  tion.  ** is req
101e0 75 65 73 74 65 64 2c 20 74 68 69 73 20 69 73 20  uested, this is 
101f0 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20  a no-op..  */.  
10200 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
10210 54 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28  TRANS_WRITE || (
10220 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
10230 53 5f 52 45 41 44 20 26 26 20 21 77 72 66 6c 61  S_READ && !wrfla
10240 67 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74  g) ){.    goto t
10250 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a  rans_begun;.  }.
10260 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e  .  /* Write tran
10270 73 61 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74  sactions are not
10280 20 70 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72   possible on a r
10290 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73  ead-only databas
102a0 65 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e  e */.  if( pBt->
102b0 72 65 61 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c  readOnly && wrfl
102c0 61 67 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  ag ){.    rc = S
102d0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
102e0 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
102f0 65 67 75 6e 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  egun;.  }..#ifnd
10300 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  ef SQLITE_OMIT_S
10310 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a  HARED_CACHE.  /*
10320 20 49 66 20 61 6e 6f 74 68 65 72 20 64 61 74 61   If another data
10330 62 61 73 65 20 68 61 6e 64 6c 65 20 68 61 73 20  base handle has 
10340 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 20 61  already opened a
10350 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74 69   write transacti
10360 6f 6e 20 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73  on .  ** on this
10370 20 73 68 61 72 65 64 2d 62 74 72 65 65 20 73 74   shared-btree st
10380 72 75 63 74 75 72 65 20 61 6e 64 20 61 20 73 65  ructure and a se
10390 63 6f 6e 64 20 77 72 69 74 65 20 74 72 61 6e 73  cond write trans
103a0 61 63 74 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72  action is.  ** r
103b0 65 71 75 65 73 74 65 64 2c 20 72 65 74 75 72 6e  equested, return
103c0 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a   SQLITE_LOCKED..
103d0 20 20 2a 2f 0a 20 20 69 66 28 20 28 77 72 66 6c    */.  if( (wrfl
103e0 61 67 20 26 26 20 70 42 74 2d 3e 69 6e 54 72 61  ag && pBt->inTra
103f0 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
10400 57 52 49 54 45 29 20 7c 7c 20 70 42 74 2d 3e 69  WRITE) || pBt->i
10410 73 50 65 6e 64 69 6e 67 20 29 7b 0a 20 20 20 20  sPending ){.    
10420 70 42 6c 6f 63 6b 20 3d 20 70 42 74 2d 3e 70 57  pBlock = pBt->pW
10430 72 69 74 65 72 2d 3e 64 62 3b 0a 20 20 7d 65 6c  riter->db;.  }el
10440 73 65 20 69 66 28 20 77 72 66 6c 61 67 3e 31 20  se if( wrflag>1 
10450 29 7b 0a 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70  ){.    BtLock *p
10460 49 74 65 72 3b 0a 20 20 20 20 66 6f 72 28 70 49  Iter;.    for(pI
10470 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b 20  ter=pBt->pLock; 
10480 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49 74  pIter; pIter=pIt
10490 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  er->pNext){.    
104a0 20 20 69 66 28 20 70 49 74 65 72 2d 3e 70 42 74    if( pIter->pBt
104b0 72 65 65 21 3d 70 20 29 7b 0a 20 20 20 20 20 20  ree!=p ){.      
104c0 20 20 70 42 6c 6f 63 6b 20 3d 20 70 49 74 65 72    pBlock = pIter
104d0 2d 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20  ->pBtree->db;.  
104e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
104f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
10500 20 69 66 28 20 70 42 6c 6f 63 6b 20 29 7b 0a 20   if( pBlock ){. 
10510 20 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63     sqlite3Connec
10520 74 69 6f 6e 42 6c 6f 63 6b 65 64 28 70 2d 3e 64  tionBlocked(p->d
10530 62 2c 20 70 42 6c 6f 63 6b 29 3b 0a 20 20 20 20  b, pBlock);.    
10540 72 63 20 3d 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  rc = SQLITE_LOCK
10550 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a  ED_SHAREDCACHE;.
10560 20 20 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62      goto trans_b
10570 65 67 75 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  egun;.  }.#endif
10580 0a 0a 20 20 64 6f 20 7b 0a 20 20 20 20 69 66 28  ..  do {.    if(
10590 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30 20   pBt->pPage1==0 
105a0 29 7b 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20  ){.      do{.   
105b0 20 20 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74       rc = lockBt
105c0 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ree(pBt);.      
105d0 7d 77 68 69 6c 65 28 20 70 42 74 2d 3e 70 50 61  }while( pBt->pPa
105e0 67 65 31 3d 3d 30 20 26 26 20 72 63 3d 3d 53 51  ge1==0 && rc==SQ
105f0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 7d  LITE_OK );.    }
10600 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
10610 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
10620 67 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  g ){.      if( p
10630 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  Bt->readOnly ){.
10640 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
10650 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
10660 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
10670 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
10680 61 67 65 72 42 65 67 69 6e 28 70 42 74 2d 3e 70  agerBegin(pBt->p
10690 50 61 67 65 72 2c 20 77 72 66 6c 61 67 3e 31 29  Pager, wrflag>1)
106a0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
106b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
106c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 6e 65           rc = ne
106d0 77 44 61 74 61 62 61 73 65 28 70 42 74 29 3b 0a  wDatabase(pBt);.
106e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
106f0 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 69  }.    }.  .    i
10700 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10710 20 29 7b 0a 20 20 20 20 20 20 75 6e 6c 6f 63 6b   ){.      unlock
10720 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
10730 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77 68 69  t);.    }.  }whi
10740 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
10750 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e 54 72  USY && pBt->inTr
10760 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53  ansaction==TRANS
10770 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20 20 20  _NONE &&.       
10780 20 20 20 62 74 72 65 65 49 6e 76 6f 6b 65 42 75     btreeInvokeBu
10790 73 79 48 61 6e 64 6c 65 72 28 70 42 74 29 20 29  syHandler(pBt) )
107a0 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
107b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
107c0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
107d0 41 4e 53 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20  ANS_NONE ){.    
107e0 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74    pBt->nTransact
107f0 69 6f 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ion++;.    }.   
10800 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 28 77   p->inTrans = (w
10810 72 66 6c 61 67 3f 54 52 41 4e 53 5f 57 52 49 54  rflag?TRANS_WRIT
10820 45 3a 54 52 41 4e 53 5f 52 45 41 44 29 3b 0a 20  E:TRANS_READ);. 
10830 20 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e     if( p->inTran
10840 73 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  s>pBt->inTransac
10850 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 70 42  tion ){.      pB
10860 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
10870 20 3d 20 70 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20   = p->inTrans;. 
10880 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
10890 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
108a0 43 41 43 48 45 0a 20 20 20 20 69 66 28 20 77 72  CACHE.    if( wr
108b0 66 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 61 73  flag ){.      as
108c0 73 65 72 74 28 20 21 70 42 74 2d 3e 70 57 72 69  sert( !pBt->pWri
108d0 74 65 72 20 29 3b 0a 20 20 20 20 20 20 70 42 74  ter );.      pBt
108e0 2d 3e 70 57 72 69 74 65 72 20 3d 20 70 3b 0a 20  ->pWriter = p;. 
108f0 20 20 20 20 20 70 42 74 2d 3e 69 73 45 78 63 6c       pBt->isExcl
10900 75 73 69 76 65 20 3d 20 28 77 72 66 6c 61 67 3e  usive = (wrflag>
10910 31 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  1);.    }.#endif
10920 0a 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67  .  }...trans_beg
10930 75 6e 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  un:.  if( rc==SQ
10940 4c 49 54 45 5f 4f 4b 20 26 26 20 77 72 66 6c 61  LITE_OK && wrfla
10950 67 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73  g ){.    /* This
10960 20 63 61 6c 6c 20 6d 61 6b 65 73 20 73 75 72 65   call makes sure
10970 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
10980 68 61 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  has the correct 
10990 6e 75 6d 62 65 72 20 6f 66 0a 20 20 20 20 2a 2a  number of.    **
109a0 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
109b0 2e 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20  . If the second 
109c0 70 61 72 61 6d 65 74 65 72 20 69 73 20 67 72 65  parameter is gre
109d0 61 74 65 72 20 74 68 61 6e 20 30 20 61 6e 64 0a  ater than 0 and.
109e0 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a      ** the sub-j
109f0 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 61 6c  ournal is not al
10a00 72 65 61 64 79 20 6f 70 65 6e 2c 20 74 68 65 6e  ready open, then
10a10 20 69 74 20 77 69 6c 6c 20 62 65 20 6f 70 65 6e   it will be open
10a20 65 64 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f 0a  ed here..    */.
10a30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10a40 50 61 67 65 72 4f 70 65 6e 53 61 76 65 70 6f 69  PagerOpenSavepoi
10a50 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
10a60 70 2d 3e 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e  p->db->nSavepoin
10a70 74 29 3b 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65  t);.  }..  btree
10a80 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a 20 20  Integrity(p);.  
10a90 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
10aa0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
10ab0 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
10ac0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
10ad0 43 55 55 4d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  CUUM../*.** Set 
10ae0 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  the pointer-map 
10af0 65 6e 74 72 69 65 73 20 66 6f 72 20 61 6c 6c 20  entries for all 
10b00 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 61 67 65  children of page
10b10 20 70 50 61 67 65 2e 20 41 6c 73 6f 2c 20 69 66   pPage. Also, if
10b20 0a 2a 2a 20 70 50 61 67 65 20 63 6f 6e 74 61 69  .** pPage contai
10b30 6e 73 20 63 65 6c 6c 73 20 74 68 61 74 20 70 6f  ns cells that po
10b40 69 6e 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20  int to overflow 
10b50 70 61 67 65 73 2c 20 73 65 74 20 74 68 65 20 70  pages, set the p
10b60 6f 69 6e 74 65 72 0a 2a 2a 20 6d 61 70 20 65 6e  ointer.** map en
10b70 74 72 69 65 73 20 66 6f 72 20 74 68 65 20 6f 76  tries for the ov
10b80 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73 20  erflow pages as 
10b90 77 65 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  well..*/.static 
10ba0 69 6e 74 20 73 65 74 43 68 69 6c 64 50 74 72 6d  int setChildPtrm
10bb0 61 70 73 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  aps(MemPage *pPa
10bc0 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
10bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10be0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75            /* Cou
10bf0 6e 74 65 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  nter variable */
10c00 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 20 20 20  .  int nCell;   
10c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
10c30 6f 66 20 63 65 6c 6c 73 20 69 6e 20 70 61 67 65  of cells in page
10c40 20 70 50 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20   pPage */.  int 
10c50 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
10c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10c70 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
10c80 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
10c90 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
10ca0 20 75 38 20 69 73 49 6e 69 74 4f 72 69 67 20 3d   u8 isInitOrig =
10cb0 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b 0a   pPage->isInit;.
10cc0 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
10cd0 61 67 65 2d 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73  age->pgno;..  as
10ce0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
10cf0 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e  tex_held(pPage->
10d00 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
10d10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
10d20 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
10d30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
10d40 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
10d50 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  to set_child_ptr
10d60 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  maps_out;.  }.  
10d70 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e 6e  nCell = pPage->n
10d80 43 65 6c 6c 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  Cell;..  for(i=0
10d90 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
10da0 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d  .    u8 *pCell =
10db0 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
10dc0 20 69 29 3b 0a 0a 20 20 20 20 72 63 20 3d 20 70   i);..    rc = p
10dd0 74 72 6d 61 70 50 75 74 4f 76 66 6c 50 74 72 28  trmapPutOvflPtr(
10de0 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20  pPage, pCell);. 
10df0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
10e00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
10e10 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f 70 74 72  to set_child_ptr
10e20 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  maps_out;.    }.
10e30 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
10e40 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 50  >leaf ){.      P
10e50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f 20 3d 20  gno childPgno = 
10e60 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b  get4byte(pCell);
10e70 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
10e80 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c 64  apPut(pBt, child
10e90 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  Pgno, PTRMAP_BTR
10ea0 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20  EE, pgno);.     
10eb0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10ec0 4f 4b 20 29 20 67 6f 74 6f 20 73 65 74 5f 63 68  OK ) goto set_ch
10ed0 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f 75 74 3b  ild_ptrmaps_out;
10ee0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
10ef0 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29  ( !pPage->leaf )
10f00 7b 0a 20 20 20 20 50 67 6e 6f 20 63 68 69 6c 64  {.    Pgno child
10f10 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
10f20 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
10f30 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
10f40 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 74 72  ]);.    rc = ptr
10f50 6d 61 70 50 75 74 28 70 42 74 2c 20 63 68 69 6c  mapPut(pBt, chil
10f60 64 50 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54  dPgno, PTRMAP_BT
10f70 52 45 45 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  REE, pgno);.  }.
10f80 0a 73 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61  .set_child_ptrma
10f90 70 73 5f 6f 75 74 3a 0a 20 20 70 50 61 67 65 2d  ps_out:.  pPage-
10fa0 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e 69 74  >isInit = isInit
10fb0 4f 72 69 67 3b 0a 20 20 72 65 74 75 72 6e 20 72  Orig;.  return r
10fc0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65  c;.}../*.** Some
10fd0 77 68 65 72 65 20 6f 6e 20 70 50 61 67 65 2c 20  where on pPage, 
10fe0 77 68 69 63 68 20 69 73 20 67 75 61 72 65 6e 74  which is guarent
10ff0 65 65 64 20 74 6f 20 62 65 20 61 20 62 74 72 65  eed to be a btre
11000 65 20 70 61 67 65 2c 20 6e 6f 74 20 61 6e 20 6f  e page, not an o
11010 76 65 72 66 6c 6f 77 0a 2a 2a 20 70 61 67 65 2c  verflow.** page,
11020 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
11030 20 70 61 67 65 20 69 46 72 6f 6d 2e 20 4d 6f 64   page iFrom. Mod
11040 69 66 79 20 74 68 69 73 20 70 6f 69 6e 74 65 72  ify this pointer
11050 20 73 6f 20 74 68 61 74 20 69 74 20 70 6f 69 6e   so that it poin
11060 74 73 20 74 6f 0a 2a 2a 20 69 54 6f 2e 20 50 61  ts to.** iTo. Pa
11070 72 61 6d 65 74 65 72 20 65 54 79 70 65 20 64 65  rameter eType de
11080 73 63 72 69 62 65 73 20 74 68 65 20 74 79 70 65  scribes the type
11090 20 6f 66 20 70 6f 69 6e 74 65 72 20 74 6f 20 62   of pointer to b
110a0 65 20 6d 6f 64 69 66 69 65 64 2c 20 61 73 20 0a  e modified, as .
110b0 2a 2a 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  ** follows:.**.*
110c0 2a 20 50 54 52 4d 41 50 5f 42 54 52 45 45 3a 20  * PTRMAP_BTREE: 
110d0 20 20 20 20 70 50 61 67 65 20 69 73 20 61 20 62      pPage is a b
110e0 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70  tree-page. The p
110f0 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74  ointer points at
11100 20 61 20 63 68 69 6c 64 20 0a 2a 2a 20 20 20 20   a child .**    
11110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
11120 61 67 65 20 6f 66 20 70 50 61 67 65 2e 0a 2a 2a  age of pPage..**
11130 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
11140 4c 4f 57 31 3a 20 70 50 61 67 65 20 69 73 20 61  LOW1: pPage is a
11150 20 62 74 72 65 65 2d 70 61 67 65 2e 20 54 68 65   btree-page. The
11160 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74 73 20   pointer points 
11170 61 74 20 61 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a  at an overflow.*
11180 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
11190 20 20 20 20 70 61 67 65 20 70 6f 69 6e 74 65 64      page pointed
111a0 20 74 6f 20 62 79 20 6f 6e 65 20 6f 66 20 74 68   to by one of th
111b0 65 20 63 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65  e cells on pPage
111c0 2e 0a 2a 2a 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f  ..**.** PTRMAP_O
111d0 56 45 52 46 4c 4f 57 32 3a 20 70 50 61 67 65 20  VERFLOW2: pPage 
111e0 69 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 2d 70  is an overflow-p
111f0 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  age. The pointer
11200 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6e   points at the n
11210 65 78 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ext.**          
11220 20 20 20 20 20 20 20 20 20 6f 76 65 72 66 6c 6f           overflo
11230 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 6c 69  w page in the li
11240 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  st..*/.static in
11250 74 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69 6e  t modifyPagePoin
11260 74 65 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  ter(MemPage *pPa
11270 67 65 2c 20 50 67 6e 6f 20 69 46 72 6f 6d 2c 20  ge, Pgno iFrom, 
11280 50 67 6e 6f 20 69 54 6f 2c 20 75 38 20 65 54 79  Pgno iTo, u8 eTy
11290 70 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73  pe){.  assert( s
112a0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
112b0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
112c0 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tex) );.  assert
112d0 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  ( sqlite3PagerIs
112e0 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
112f0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69  >pDbPage) );.  i
11300 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
11310 5f 4f 56 45 52 46 4c 4f 57 32 20 29 7b 0a 20 20  _OVERFLOW2 ){.  
11320 20 20 2f 2a 20 54 68 65 20 70 6f 69 6e 74 65 72    /* The pointer
11330 20 69 73 20 61 6c 77 61 79 73 20 74 68 65 20 66   is always the f
11340 69 72 73 74 20 34 20 62 79 74 65 73 20 6f 66 20  irst 4 bytes of 
11350 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 69 73  the page in this
11360 20 63 61 73 65 2e 20 20 2a 2f 0a 20 20 20 20 69   case.  */.    i
11370 66 28 20 67 65 74 34 62 79 74 65 28 70 50 61 67  f( get4byte(pPag
11380 65 2d 3e 61 44 61 74 61 29 21 3d 69 46 72 6f 6d  e->aData)!=iFrom
11390 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
113a0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
113b0 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  BKPT;.    }.    
113c0 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
113d0 61 44 61 74 61 2c 20 69 54 6f 29 3b 0a 20 20 7d  aData, iTo);.  }
113e0 65 6c 73 65 7b 0a 20 20 20 20 75 38 20 69 73 49  else{.    u8 isI
113f0 6e 69 74 4f 72 69 67 20 3d 20 70 50 61 67 65 2d  nitOrig = pPage-
11400 3e 69 73 49 6e 69 74 3b 0a 20 20 20 20 69 6e 74  >isInit;.    int
11410 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 43 65 6c   i;.    int nCel
11420 6c 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 42  l;..    sqlite3B
11430 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 50 61  treeInitPage(pPa
11440 67 65 29 3b 0a 20 20 20 20 6e 43 65 6c 6c 20 3d  ge);.    nCell =
11450 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 0a 0a   pPage->nCell;..
11460 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
11470 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
11480 20 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69    u8 *pCell = fi
11490 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29  ndCell(pPage, i)
114a0 3b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70  ;.      if( eTyp
114b0 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c  e==PTRMAP_OVERFL
114c0 4f 57 31 20 29 7b 0a 20 20 20 20 20 20 20 20 43  OW1 ){.        C
114d0 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
114e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
114f0 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
11500 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
11510 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  fo);.        if(
11520 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 20   info.iOverflow 
11530 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
11540 20 69 46 72 6f 6d 3d 3d 67 65 74 34 62 79 74 65   iFrom==get4byte
11550 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
11560 65 72 66 6c 6f 77 5d 29 20 29 7b 0a 20 20 20 20  erflow]) ){.    
11570 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
11580 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76  (&pCell[info.iOv
11590 65 72 66 6c 6f 77 5d 2c 20 69 54 6f 29 3b 0a 20  erflow], iTo);. 
115a0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
115b0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
115c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
115d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
115e0 20 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29   get4byte(pCell)
115f0 3d 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  ==iFrom ){.     
11600 20 20 20 20 20 70 75 74 34 62 79 74 65 28 70 43       put4byte(pC
11610 65 6c 6c 2c 20 69 54 6f 29 3b 0a 20 20 20 20 20  ell, iTo);.     
11620 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
11630 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
11640 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 69    }.  .    if( i
11650 3d 3d 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20  ==nCell ){.     
11660 20 69 66 28 20 65 54 79 70 65 21 3d 50 54 52 4d   if( eType!=PTRM
11670 41 50 5f 42 54 52 45 45 20 7c 7c 20 0a 20 20 20  AP_BTREE || .   
11680 20 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28         get4byte(
11690 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
116a0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
116b0 5d 29 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20  ])!=iFrom ){.   
116c0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
116d0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
116e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
116f0 75 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  ut4byte(&pPage->
11700 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
11710 4f 66 66 73 65 74 2b 38 5d 2c 20 69 54 6f 29 3b  Offset+8], iTo);
11720 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67  .    }..    pPag
11730 65 2d 3e 69 73 49 6e 69 74 20 3d 20 69 73 49 6e  e->isInit = isIn
11740 69 74 4f 72 69 67 3b 0a 20 20 7d 0a 20 20 72 65  itOrig;.  }.  re
11750 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
11760 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74  }.../*.** Move t
11770 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  he open database
11780 20 70 61 67 65 20 70 44 62 50 61 67 65 20 74 6f   page pDbPage to
11790 20 6c 6f 63 61 74 69 6f 6e 20 69 46 72 65 65 50   location iFreeP
117a0 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 64  age in the .** d
117b0 61 74 61 62 61 73 65 2e 20 54 68 65 20 70 44 62  atabase. The pDb
117c0 50 61 67 65 20 72 65 66 65 72 65 6e 63 65 20 72  Page reference r
117d0 65 6d 61 69 6e 73 20 76 61 6c 69 64 2e 0a 2a 2f  emains valid..*/
117e0 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 6c 6f  .static int relo
117f0 63 61 74 65 50 61 67 65 28 0a 20 20 42 74 53 68  catePage(.  BtSh
11800 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20 20 20  ared *pBt,      
11810 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 2a 2f       /* Btree */
11820 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 44 62 50  .  MemPage *pDbP
11830 61 67 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f  age,        /* O
11840 70 65 6e 20 70 61 67 65 20 74 6f 20 6d 6f 76 65  pen page to move
11850 20 2a 2f 0a 20 20 75 38 20 65 54 79 70 65 2c 20   */.  u8 eType, 
11860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11870 2a 20 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 74  * Pointer map 't
11880 79 70 65 27 20 65 6e 74 72 79 20 66 6f 72 20 70  ype' entry for p
11890 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  DbPage */.  Pgno
118a0 20 69 50 74 72 50 61 67 65 2c 20 20 20 20 20 20   iPtrPage,      
118b0 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
118c0 6d 61 70 20 27 70 61 67 65 2d 6e 6f 27 20 65 6e  map 'page-no' en
118d0 74 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20  try for pDbPage 
118e0 2a 2f 0a 20 20 50 67 6e 6f 20 69 46 72 65 65 50  */.  Pgno iFreeP
118f0 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  age,          /*
11900 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 74 6f   The location to
11910 20 6d 6f 76 65 20 70 44 62 50 61 67 65 20 74 6f   move pDbPage to
11920 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 6d   */.  int isComm
11930 69 74 0a 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20  it.){.  MemPage 
11940 2a 70 50 74 72 50 61 67 65 3b 20 20 20 2f 2a 20  *pPtrPage;   /* 
11950 54 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f  The page that co
11960 6e 74 61 69 6e 73 20 61 20 70 6f 69 6e 74 65 72  ntains a pointer
11970 20 74 6f 20 70 44 62 50 61 67 65 20 2a 2f 0a 20   to pDbPage */. 
11980 20 50 67 6e 6f 20 69 44 62 50 61 67 65 20 3d 20   Pgno iDbPage = 
11990 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 3b 0a 20  pDbPage->pgno;. 
119a0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
119b0 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pBt->pPager;.  
119c0 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
119d0 74 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  t( eType==PTRMAP
119e0 5f 4f 56 45 52 46 4c 4f 57 32 20 7c 7c 20 65 54  _OVERFLOW2 || eT
119f0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52  ype==PTRMAP_OVER
11a00 46 4c 4f 57 31 20 7c 7c 20 0a 20 20 20 20 20 20  FLOW1 || .      
11a10 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 42 54  eType==PTRMAP_BT
11a20 52 45 45 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54  REE || eType==PT
11a30 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 3b  RMAP_ROOTPAGE );
11a40 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
11a50 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
11a60 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
11a70 73 73 65 72 74 28 20 70 44 62 50 61 67 65 2d 3e  ssert( pDbPage->
11a80 70 42 74 3d 3d 70 42 74 20 29 3b 0a 0a 20 20 2f  pBt==pBt );..  /
11a90 2a 20 4d 6f 76 65 20 70 61 67 65 20 69 44 62 50  * Move page iDbP
11aa0 61 67 65 20 66 72 6f 6d 20 69 74 73 20 63 75 72  age from its cur
11ab0 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 74 6f  rent location to
11ac0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 46 72   page number iFr
11ad0 65 65 50 61 67 65 20 2a 2f 0a 20 20 54 52 41 43  eePage */.  TRAC
11ae0 45 28 28 22 41 55 54 4f 56 41 43 55 55 4d 3a 20  E(("AUTOVACUUM: 
11af0 4d 6f 76 69 6e 67 20 25 64 20 74 6f 20 66 72 65  Moving %d to fre
11b00 65 20 70 61 67 65 20 25 64 20 28 70 74 72 20 70  e page %d (ptr p
11b10 61 67 65 20 25 64 20 74 79 70 65 20 25 64 29 5c  age %d type %d)\
11b20 6e 22 2c 20 0a 20 20 20 20 20 20 69 44 62 50 61  n", .      iDbPa
11b30 67 65 2c 20 69 46 72 65 65 50 61 67 65 2c 20 69  ge, iFreePage, i
11b40 50 74 72 50 61 67 65 2c 20 65 54 79 70 65 29 29  PtrPage, eType))
11b50 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
11b60 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 70 50  PagerMovepage(pP
11b70 61 67 65 72 2c 20 70 44 62 50 61 67 65 2d 3e 70  ager, pDbPage->p
11b80 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
11b90 65 2c 20 69 73 43 6f 6d 6d 69 74 29 3b 0a 20 20  e, isCommit);.  
11ba0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
11bb0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
11bc0 72 63 3b 0a 20 20 7d 0a 20 20 70 44 62 50 61 67  rc;.  }.  pDbPag
11bd0 65 2d 3e 70 67 6e 6f 20 3d 20 69 46 72 65 65 50  e->pgno = iFreeP
11be0 61 67 65 3b 0a 0a 20 20 2f 2a 20 49 66 20 70 44  age;..  /* If pD
11bf0 62 50 61 67 65 20 77 61 73 20 61 20 62 74 72 65  bPage was a btre
11c00 65 2d 70 61 67 65 2c 20 74 68 65 6e 20 69 74 20  e-page, then it 
11c10 6d 61 79 20 68 61 76 65 20 63 68 69 6c 64 20 70  may have child p
11c20 61 67 65 73 20 61 6e 64 2f 6f 72 20 63 65 6c 6c  ages and/or cell
11c30 73 0a 20 20 2a 2a 20 74 68 61 74 20 70 6f 69 6e  s.  ** that poin
11c40 74 20 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  t to overflow pa
11c50 67 65 73 2e 20 54 68 65 20 70 6f 69 6e 74 65 72  ges. The pointer
11c60 20 6d 61 70 20 65 6e 74 72 69 65 73 20 66 6f 72   map entries for
11c70 20 61 6c 6c 20 74 68 65 73 65 0a 20 20 2a 2a 20   all these.  ** 
11c80 70 61 67 65 73 20 6e 65 65 64 20 74 6f 20 62 65  pages need to be
11c90 20 63 68 61 6e 67 65 64 2e 0a 20 20 2a 2a 0a 20   changed..  **. 
11ca0 20 2a 2a 20 49 66 20 70 44 62 50 61 67 65 20 69   ** If pDbPage i
11cb0 73 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  s an overflow pa
11cc0 67 65 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ge, then the fir
11cd0 73 74 20 34 20 62 79 74 65 73 20 6d 61 79 20 73  st 4 bytes may s
11ce0 74 6f 72 65 20 61 0a 20 20 2a 2a 20 70 6f 69 6e  tore a.  ** poin
11cf0 74 65 72 20 74 6f 20 61 20 73 75 62 73 65 71 75  ter to a subsequ
11d00 65 6e 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ent overflow pag
11d10 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68  e. If this is th
11d20 65 20 63 61 73 65 2c 20 74 68 65 6e 0a 20 20 2a  e case, then.  *
11d30 2a 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61  * the pointer ma
11d40 70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70  p needs to be up
11d50 64 61 74 65 64 20 66 6f 72 20 74 68 65 20 73 75  dated for the su
11d60 62 73 65 71 75 65 6e 74 20 6f 76 65 72 66 6c 6f  bsequent overflo
11d70 77 20 70 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69  w page..  */.  i
11d80 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
11d90 5f 42 54 52 45 45 20 7c 7c 20 65 54 79 70 65 3d  _BTREE || eType=
11da0 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45  =PTRMAP_ROOTPAGE
11db0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 74   ){.    rc = set
11dc0 43 68 69 6c 64 50 74 72 6d 61 70 73 28 70 44 62  ChildPtrmaps(pDb
11dd0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
11de0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
11df0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
11e00 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
11e10 20 20 20 20 50 67 6e 6f 20 6e 65 78 74 4f 76 66      Pgno nextOvf
11e20 6c 20 3d 20 67 65 74 34 62 79 74 65 28 70 44 62  l = get4byte(pDb
11e30 50 61 67 65 2d 3e 61 44 61 74 61 29 3b 0a 20 20  Page->aData);.  
11e40 20 20 69 66 28 20 6e 65 78 74 4f 76 66 6c 21 3d    if( nextOvfl!=
11e50 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
11e60 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 6e  ptrmapPut(pBt, n
11e70 65 78 74 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  extOvfl, PTRMAP_
11e80 4f 56 45 52 46 4c 4f 57 32 2c 20 69 46 72 65 65  OVERFLOW2, iFree
11e90 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
11ea0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11eb0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
11ec0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
11ed0 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 78   }.  }..  /* Fix
11ee0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 6f   the database po
11ef0 69 6e 74 65 72 20 6f 6e 20 70 61 67 65 20 69 50  inter on page iP
11f00 74 72 50 61 67 65 20 74 68 61 74 20 70 6f 69 6e  trPage that poin
11f10 74 65 64 20 61 74 20 69 44 62 50 61 67 65 20 73  ted at iDbPage s
11f20 6f 0a 20 20 2a 2a 20 74 68 61 74 20 69 74 20 70  o.  ** that it p
11f30 6f 69 6e 74 73 20 61 74 20 69 46 72 65 65 50 61  oints at iFreePa
11f40 67 65 2e 20 41 6c 73 6f 20 66 69 78 20 74 68 65  ge. Also fix the
11f50 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
11f60 72 79 20 66 6f 72 0a 20 20 2a 2a 20 69 50 74 72  ry for.  ** iPtr
11f70 50 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  Page..  */.  if(
11f80 20 65 54 79 70 65 21 3d 50 54 52 4d 41 50 5f 52   eType!=PTRMAP_R
11f90 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20 72  OOTPAGE ){.    r
11fa0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
11fb0 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 50 74  GetPage(pBt, iPt
11fc0 72 50 61 67 65 2c 20 26 70 50 74 72 50 61 67 65  rPage, &pPtrPage
11fd0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
11fe0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11ff0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
12000 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
12010 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
12020 28 70 50 74 72 50 61 67 65 2d 3e 70 44 62 50 61  (pPtrPage->pDbPa
12030 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  ge);.    if( rc!
12040 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12050 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
12060 70 50 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20  pPtrPage);.     
12070 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
12080 7d 0a 20 20 20 20 72 63 20 3d 20 6d 6f 64 69 66  }.    rc = modif
12090 79 50 61 67 65 50 6f 69 6e 74 65 72 28 70 50 74  yPagePointer(pPt
120a0 72 50 61 67 65 2c 20 69 44 62 50 61 67 65 2c 20  rPage, iDbPage, 
120b0 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70 65  iFreePage, eType
120c0 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  );.    releasePa
120d0 67 65 28 70 50 74 72 50 61 67 65 29 3b 0a 20 20  ge(pPtrPage);.  
120e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
120f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
12100 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c  = ptrmapPut(pBt,
12110 20 69 46 72 65 65 50 61 67 65 2c 20 65 54 79 70   iFreePage, eTyp
12120 65 2c 20 69 50 74 72 50 61 67 65 29 3b 0a 20 20  e, iPtrPage);.  
12130 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
12140 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61   rc;.}../* Forwa
12150 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 72  rd declaration r
12160 65 71 75 69 72 65 64 20 62 79 20 69 6e 63 72 56  equired by incrV
12170 61 63 75 75 6d 53 74 65 70 28 29 2e 20 2a 2f 0a  acuumStep(). */.
12180 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63  static int alloc
12190 61 74 65 42 74 72 65 65 50 61 67 65 28 42 74 53  ateBtreePage(BtS
121a0 68 61 72 65 64 20 2a 2c 20 4d 65 6d 50 61 67 65  hared *, MemPage
121b0 20 2a 2a 2c 20 50 67 6e 6f 20 2a 2c 20 50 67 6e   **, Pgno *, Pgn
121c0 6f 2c 20 75 38 29 3b 0a 0a 2f 2a 0a 2a 2a 20 50  o, u8);../*.** P
121d0 65 72 66 6f 72 6d 20 61 20 73 69 6e 67 6c 65 20  erform a single 
121e0 73 74 65 70 20 6f 66 20 61 6e 20 69 6e 63 72 65  step of an incre
121f0 6d 65 6e 74 61 6c 2d 76 61 63 75 75 6d 2e 20 49  mental-vacuum. I
12200 66 20 73 75 63 63 65 73 73 66 75 6c 2c 0a 2a 2a  f successful,.**
12210 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
12220 4b 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  K. If there is n
12230 6f 20 77 6f 72 6b 20 74 6f 20 64 6f 20 28 61 6e  o work to do (an
12240 64 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 0a 2a  d therefore no.*
12250 2a 20 70 6f 69 6e 74 20 69 6e 20 63 61 6c 6c 69  * point in calli
12260 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
12270 20 61 67 61 69 6e 29 2c 20 72 65 74 75 72 6e 20   again), return 
12280 53 51 4c 49 54 45 5f 44 4f 4e 45 2e 0a 2a 2a 0a  SQLITE_DONE..**.
12290 2a 2a 20 4d 6f 72 65 20 73 70 65 63 69 66 69 63  ** More specific
122a0 6c 79 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  ly, this functio
122b0 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 72 65  n attempts to re
122c0 2d 6f 72 67 61 6e 69 7a 65 20 74 68 65 20 0a 2a  -organize the .*
122d0 2a 20 64 61 74 61 62 61 73 65 20 73 6f 20 74 68  * database so th
122e0 61 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  at the last page
122f0 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63 75 72   of the file cur
12300 72 65 6e 74 6c 79 20 69 6e 20 75 73 65 0a 2a 2a  rently in use.**
12310 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 69 6e   is no longer in
12320 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74   use..**.** If t
12330 68 65 20 6e 46 69 6e 20 70 61 72 61 6d 65 74 65  he nFin paramete
12340 72 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  r is non-zero, t
12350 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
12360 6e 20 61 73 73 75 6d 65 73 0a 2a 2a 20 74 68 61  n assumes.** tha
12370 74 20 74 68 65 20 63 61 6c 6c 65 72 20 77 69 6c  t the caller wil
12380 6c 20 6b 65 65 70 20 63 61 6c 6c 69 6e 67 20 69  l keep calling i
12390 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28 29 20  ncrVacuumStep() 
123a0 75 6e 74 69 6c 0a 2a 2a 20 69 74 20 72 65 74 75  until.** it retu
123b0 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rns SQLITE_DONE 
123c0 6f 72 20 61 6e 20 65 72 72 6f 72 2c 20 61 6e 64  or an error, and
123d0 20 74 68 61 74 20 6e 46 69 6e 20 69 73 20 74 68   that nFin is th
123e0 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 70  e.** number of p
123f0 61 67 65 73 20 74 68 65 20 64 61 74 61 62 61 73  ages the databas
12400 65 20 66 69 6c 65 20 77 69 6c 6c 20 63 6f 6e 74  e file will cont
12410 61 69 6e 20 61 66 74 65 72 20 74 68 69 73 20 0a  ain after this .
12420 2a 2a 20 70 72 6f 63 65 73 73 20 69 73 20 63 6f  ** process is co
12430 6d 70 6c 65 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  mplete..*/.stati
12440 63 20 69 6e 74 20 69 6e 63 72 56 61 63 75 75 6d  c int incrVacuum
12450 53 74 65 70 28 42 74 53 68 61 72 65 64 20 2a 70  Step(BtShared *p
12460 42 74 2c 20 50 67 6e 6f 20 6e 46 69 6e 2c 20 50  Bt, Pgno nFin, P
12470 67 6e 6f 20 69 4c 61 73 74 50 67 29 7b 0a 20 20  gno iLastPg){.  
12480 50 67 6e 6f 20 6e 46 72 65 65 4c 69 73 74 3b 20  Pgno nFreeList; 
12490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
124a0 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 69  ber of pages sti
124b0 6c 6c 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c  ll on the free-l
124c0 69 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ist */..  assert
124d0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
124e0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
124f0 20 29 3b 0a 0a 20 20 69 66 28 20 21 50 54 52 4d   );..  if( !PTRM
12500 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20 69  AP_ISPAGE(pBt, i
12510 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61 73 74  LastPg) && iLast
12520 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  Pg!=PENDING_BYTE
12530 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
12540 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 75 38    int rc;.    u8
12550 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67 6e 6f   eType;.    Pgno
12560 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20 20 20   iPtrPage;..    
12570 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65 74 34  nFreeList = get4
12580 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65  byte(&pBt->pPage
12590 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a 20  1->aData[36]);. 
125a0 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69 73 74     if( nFreeList
125b0 3d 3d 30 20 7c 7c 20 6e 46 69 6e 3d 3d 69 4c 61  ==0 || nFin==iLa
125c0 73 74 50 67 20 29 7b 0a 20 20 20 20 20 20 72 65  stPg ){.      re
125d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
125e0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 20  ;.    }..    rc 
125f0 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c  = ptrmapGet(pBt,
12600 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79 70 65   iLastPg, &eType
12610 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a 20 20  , &iPtrPage);.  
12620 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
12630 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
12640 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
12650 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52    if( eType==PTR
12660 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29 7b 0a  MAP_ROOTPAGE ){.
12670 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
12680 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
12690 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
126a0 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46   eType==PTRMAP_F
126b0 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20 20  REEPAGE ){.     
126c0 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29 7b 0a   if( nFin==0 ){.
126d0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76          /* Remov
126e0 65 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  e the page from 
126f0 74 68 65 20 66 69 6c 65 73 20 66 72 65 65 2d 6c  the files free-l
12700 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e 6f 74  ist. This is not
12710 20 72 65 71 75 69 72 65 64 0a 20 20 20 20 20 20   required.      
12720 20 20 2a 2a 20 69 66 20 6e 46 69 6e 20 69 73 20    ** if nFin is 
12730 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 61  non-zero. In tha
12740 74 20 63 61 73 65 2c 20 74 68 65 20 66 72 65 65  t case, the free
12750 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a 20 20  -list will be.  
12760 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63 61 74        ** truncat
12770 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74 65 72  ed to zero after
12780 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
12790 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20 64 6f  eturns, so it do
127a0 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20 20 2a  esn't .        *
127b0 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74 20 73  * matter if it s
127c0 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 73 6f  till contains so
127d0 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74 72 69  me garbage entri
127e0 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  es..        */. 
127f0 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46 72 65         Pgno iFre
12800 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d 65 6d  ePg;.        Mem
12810 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
12820 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
12830 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
12840 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
12850 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67 2c 20  reePg, iLastPg, 
12860 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
12870 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
12880 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
12890 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
128a0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
128b0 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74 50 67  iFreePg==iLastPg
128c0 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   );.        rele
128d0 61 73 65 50 61 67 65 28 70 46 72 65 65 50 67 29  asePage(pFreePg)
128e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
128f0 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50 67 6e  else {.      Pgn
12900 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20 20 20  o iFreePg;      
12910 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20         /* Index 
12920 6f 66 20 66 72 65 65 20 70 61 67 65 20 74 6f 20  of free page to 
12930 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74 6f 20  move pLastPg to 
12940 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65  */.      MemPage
12950 20 2a 70 4c 61 73 74 50 67 3b 0a 0a 20 20 20 20   *pLastPg;..    
12960 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
12970 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20  reeGetPage(pBt, 
12980 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73 74 50  iLastPg, &pLastP
12990 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  g, 0);.      if(
129a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
129b0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
129c0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20   rc;.      }..  
129d0 20 20 20 20 2f 2a 20 49 66 20 6e 46 69 6e 20 69      /* If nFin i
129e0 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c 6f 6f  s zero, this loo
129f0 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79 20 6f  p runs exactly o
12a00 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70 4c 61  nce and page pLa
12a10 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20 69 73  stPg.      ** is
12a20 20 73 77 61 70 70 65 64 20 77 69 74 68 20 74 68   swapped with th
12a30 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67  e first free pag
12a40 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74 68 65  e pulled off the
12a50 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20 20 20   free list..    
12a60 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 4f 6e    **.      ** On
12a70 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e 64 2c   the other hand,
12a80 20 69 66 20 6e 46 69 6e 20 69 73 20 67 72 65 61   if nFin is grea
12a90 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c 20 74  ter than zero, t
12aa0 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20 20 2a  hen keep.      *
12ab0 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69 6c 20  * looping until 
12ac0 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f 63 61  a free-page loca
12ad0 74 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 66  ted within the f
12ae0 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65 73 0a  irst nFin pages.
12af0 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
12b00 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e 0a 20  file is found.. 
12b10 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 64 6f       */.      do
12b20 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61   {.        MemPa
12b30 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20 20 20  ge *pFreePg;.   
12b40 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
12b50 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
12b60 20 26 70 46 72 65 65 50 67 2c 20 26 69 46 72 65   &pFreePg, &iFre
12b70 65 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ePg, 0, 0);.    
12b80 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12b90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
12ba0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
12bb0 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20 20 20  LastPg);.       
12bc0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12bd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12be0 72 65 6c 65 61 73 65 50 61 67 65 28 70 46 72 65  releasePage(pFre
12bf0 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77 68 69  ePg);.      }whi
12c00 6c 65 28 20 6e 46 69 6e 21 3d 30 20 26 26 20 69  le( nFin!=0 && i
12c10 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b 0a 20  FreePg>nFin );. 
12c20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 46 72       assert( iFr
12c30 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29 3b 0a  eePg<iLastPg );.
12c40 20 20 20 20 20 20 0a 20 20 20 20 20 20 72 63 20        .      rc 
12c50 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
12c60 69 74 65 28 70 4c 61 73 74 50 67 2d 3e 70 44 62  ite(pLastPg->pDb
12c70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28  Page);.      if(
12c80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
12c90 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  {.        rc = r
12ca0 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c  elocatePage(pBt,
12cb0 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70 65 2c   pLastPg, eType,
12cc0 20 69 50 74 72 50 61 67 65 2c 20 69 46 72 65 65   iPtrPage, iFree
12cd0 50 67 2c 20 6e 46 69 6e 21 3d 30 29 3b 0a 20 20  Pg, nFin!=0);.  
12ce0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65      }.      rele
12cf0 61 73 65 50 61 67 65 28 70 4c 61 73 74 50 67 29  asePage(pLastPg)
12d00 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
12d10 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12d20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
12d30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12d40 7d 0a 0a 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30  }..  if( nFin==0
12d50 20 29 7b 0a 20 20 20 20 69 4c 61 73 74 50 67 2d   ){.    iLastPg-
12d60 2d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 69 4c  -;.    while( iL
12d70 61 73 74 50 67 3d 3d 50 45 4e 44 49 4e 47 5f 42  astPg==PENDING_B
12d80 59 54 45 5f 50 41 47 45 28 70 42 74 29 7c 7c 50  YTE_PAGE(pBt)||P
12d90 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74  TRMAP_ISPAGE(pBt
12da0 2c 20 69 4c 61 73 74 50 67 29 20 29 7b 0a 20 20  , iLastPg) ){.  
12db0 20 20 20 20 69 4c 61 73 74 50 67 2d 2d 3b 0a 20      iLastPg--;. 
12dc0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
12dd0 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
12de0 67 65 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  ge(pBt->pPager, 
12df0 69 4c 61 73 74 50 67 29 3b 0a 20 20 7d 0a 20 20  iLastPg);.  }.  
12e00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
12e10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69  ;.}../*.** A wri
12e20 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d  te-transaction m
12e30 75 73 74 20 62 65 20 6f 70 65 6e 65 64 20 62 65  ust be opened be
12e40 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69  fore calling thi
12e50 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49  s function..** I
12e60 74 20 70 65 72 66 6f 72 6d 73 20 61 20 73 69 6e  t performs a sin
12e70 67 6c 65 20 75 6e 69 74 20 6f 66 20 77 6f 72 6b  gle unit of work
12e80 20 74 6f 77 61 72 64 73 20 61 6e 20 69 6e 63 72   towards an incr
12e90 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2e 0a  emental vacuum..
12ea0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 63  **.** If the inc
12eb0 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
12ec0 69 73 20 66 69 6e 69 73 68 65 64 20 61 66 74 65  is finished afte
12ed0 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  r this function 
12ee0 68 61 73 20 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49  has run,.** SQLI
12ef0 54 45 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72  TE_DONE is retur
12f00 6e 65 64 2e 20 49 66 20 69 74 20 69 73 20 6e 6f  ned. If it is no
12f10 74 20 66 69 6e 69 73 68 65 64 2c 20 62 75 74 20  t finished, but 
12f20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  no error occurre
12f30 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  d,.** SQLITE_OK 
12f40 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68  is returned. Oth
12f50 65 72 77 69 73 65 20 61 6e 20 53 51 4c 69 74 65  erwise an SQLite
12f60 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 0a 2a 2f   error code. .*/
12f70 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
12f80 65 49 6e 63 72 56 61 63 75 75 6d 28 42 74 72 65  eIncrVacuum(Btre
12f90 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
12fa0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
12fb0 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71   = p->pBt;..  sq
12fc0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
12fd0 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20  p);.  pBt->db = 
12fe0 70 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  p->db;.  assert(
12ff0 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74   pBt->inTransact
13000 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ion==TRANS_WRITE
13010 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
13020 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20  TRANS_WRITE );. 
13030 20 69 66 28 20 21 70 42 74 2d 3e 61 75 74 6f 56   if( !pBt->autoV
13040 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  acuum ){.    rc 
13050 3d 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  = SQLITE_DONE;. 
13060 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 76 61   }else{.    inva
13070 6c 69 64 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f  lidateAllOverflo
13080 77 43 61 63 68 65 28 70 42 74 29 3b 0a 20 20 20  wCache(pBt);.   
13090 20 72 63 20 3d 20 69 6e 63 72 56 61 63 75 75 6d   rc = incrVacuum
130a0 53 74 65 70 28 70 42 74 2c 20 30 2c 20 70 61 67  Step(pBt, 0, pag
130b0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  erPagecount(pBt)
130c0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
130d0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
130e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
130f0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
13100 65 20 69 73 20 63 61 6c 6c 65 64 20 70 72 69 6f  e is called prio
13110 72 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  r to sqlite3Page
13120 72 43 6f 6d 6d 69 74 20 77 68 65 6e 20 61 20 74  rCommit when a t
13130 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 69 73  ransaction.** is
13140 20 63 6f 6d 6d 69 74 65 64 20 66 6f 72 20 61 6e   commited for an
13150 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
13160 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  abase..**.** If 
13170 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
13180 75 72 6e 65 64 2c 20 74 68 65 6e 20 2a 70 6e 54  urned, then *pnT
13190 72 75 6e 63 20 69 73 20 73 65 74 20 74 6f 20 74  runc is set to t
131a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
131b0 65 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  es.** the databa
131c0 73 65 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62  se file should b
131d0 65 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 64  e truncated to d
131e0 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74  uring the commit
131f0 20 70 72 6f 63 65 73 73 2e 20 0a 2a 2a 20 69 2e   process. .** i.
13200 65 2e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  e. the database 
13210 68 61 73 20 62 65 65 6e 20 72 65 6f 72 67 61 6e  has been reorgan
13220 69 7a 65 64 20 73 6f 20 74 68 61 74 20 6f 6e 6c  ized so that onl
13230 79 20 74 68 65 20 66 69 72 73 74 20 2a 70 6e 54  y the first *pnT
13240 72 75 6e 63 0a 2a 2a 20 70 61 67 65 73 20 61 72  runc.** pages ar
13250 65 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61  e in use..*/.sta
13260 74 69 63 20 69 6e 74 20 61 75 74 6f 56 61 63 75  tic int autoVacu
13270 75 6d 43 6f 6d 6d 69 74 28 42 74 53 68 61 72 65  umCommit(BtShare
13280 64 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72  d *pBt){.  int r
13290 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
132a0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
132b0 20 70 42 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pBt->pPager;.  
132c0 56 56 41 5f 4f 4e 4c 59 28 20 69 6e 74 20 6e 52  VVA_ONLY( int nR
132d0 65 66 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  ef = sqlite3Page
132e0 72 52 65 66 63 6f 75 6e 74 28 70 50 61 67 65 72  rRefcount(pPager
132f0 29 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ) );..  assert( 
13300 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
13310 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
13320 3b 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c  ;.  invalidateAl
13330 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70  lOverflowCache(p
13340 42 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42  Bt);.  assert(pB
13350 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a  t->autoVacuum);.
13360 20 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72    if( !pBt->incr
13370 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67  Vacuum ){.    Pg
13380 6e 6f 20 6e 46 69 6e 3b 0a 20 20 20 20 50 67 6e  no nFin;.    Pgn
13390 6f 20 6e 46 72 65 65 3b 0a 20 20 20 20 50 67 6e  o nFree;.    Pgn
133a0 6f 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 50  o nPtrmap;.    P
133b0 67 6e 6f 20 69 46 72 65 65 3b 0a 20 20 20 20 63  gno iFree;.    c
133c0 6f 6e 73 74 20 69 6e 74 20 70 67 73 7a 20 3d 20  onst int pgsz = 
133d0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  pBt->pageSize;. 
133e0 20 20 20 50 67 6e 6f 20 6e 4f 72 69 67 20 3d 20     Pgno nOrig = 
133f0 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
13400 42 74 29 3b 0a 0a 20 20 20 20 69 66 28 20 50 54  Bt);..    if( PT
13410 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
13420 20 6e 4f 72 69 67 29 20 29 7b 0a 20 20 20 20 20   nOrig) ){.     
13430 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
13440 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
13450 20 7d 0a 20 20 20 20 69 66 28 20 6e 4f 72 69 67   }.    if( nOrig
13460 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  ==PENDING_BYTE_P
13470 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20  AGE(pBt) ){.    
13480 20 20 6e 4f 72 69 67 2d 2d 3b 0a 20 20 20 20 7d    nOrig--;.    }
13490 0a 20 20 20 20 6e 46 72 65 65 20 3d 20 67 65 74  .    nFree = get
134a0 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67  4byte(&pBt->pPag
134b0 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b 0a  e1->aData[36]);.
134c0 20 20 20 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e      nPtrmap = (n
134d0 46 72 65 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41  Free-nOrig+PTRMA
134e0 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f  P_PAGENO(pBt, nO
134f0 72 69 67 29 2b 70 67 73 7a 2f 35 29 2f 28 70 67  rig)+pgsz/5)/(pg
13500 73 7a 2f 35 29 3b 0a 20 20 20 20 6e 46 69 6e 20  sz/5);.    nFin 
13510 3d 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20  = nOrig - nFree 
13520 2d 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 69  - nPtrmap;.    i
13530 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e 47  f( nOrig>PENDING
13540 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
13550 26 26 20 6e 46 69 6e 3c 3d 50 45 4e 44 49 4e 47  && nFin<=PENDING
13560 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
13570 29 7b 0a 20 20 20 20 20 20 6e 46 69 6e 2d 2d 3b  ){.      nFin--;
13580 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
13590 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28  ( PTRMAP_ISPAGE(
135a0 70 42 74 2c 20 6e 46 69 6e 29 20 7c 7c 20 6e 46  pBt, nFin) || nF
135b0 69 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  in==PENDING_BYTE
135c0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
135d0 20 20 20 20 6e 46 69 6e 2d 2d 3b 0a 20 20 20 20      nFin--;.    
135e0 7d 0a 0a 20 20 20 20 66 6f 72 28 69 46 72 65 65  }..    for(iFree
135f0 3d 6e 4f 72 69 67 3b 20 69 46 72 65 65 3e 6e 46  =nOrig; iFree>nF
13600 69 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  in && rc==SQLITE
13610 5f 4f 4b 3b 20 69 46 72 65 65 2d 2d 29 7b 0a 20  _OK; iFree--){. 
13620 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56 61       rc = incrVa
13630 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e 46  cuumStep(pBt, nF
13640 69 6e 2c 20 69 46 72 65 65 29 3b 0a 20 20 20 20  in, iFree);.    
13650 7d 0a 20 20 20 20 69 66 28 20 28 72 63 3d 3d 53  }.    if( (rc==S
13660 51 4c 49 54 45 5f 44 4f 4e 45 20 7c 7c 20 72 63  QLITE_DONE || rc
13670 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 26 26 20  ==SQLITE_OK) && 
13680 6e 46 72 65 65 3e 30 20 29 7b 0a 20 20 20 20 20  nFree>0 ){.     
13690 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
136a0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
136b0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 42  te3PagerWrite(pB
136c0 74 2d 3e 70 50 61 67 65 31 2d 3e 70 44 62 50 61  t->pPage1->pDbPa
136d0 67 65 29 3b 0a 20 20 20 20 20 20 70 75 74 34 62  ge);.      put4b
136e0 79 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31  yte(&pBt->pPage1
136f0 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b  ->aData[32], 0);
13700 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
13710 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
13720 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20 20  ata[36], 0);.   
13730 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 54     sqlite3PagerT
13740 72 75 6e 63 61 74 65 49 6d 61 67 65 28 70 42 74  runcateImage(pBt
13750 2d 3e 70 50 61 67 65 72 2c 20 6e 46 69 6e 29 3b  ->pPager, nFin);
13760 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
13770 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
13780 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
13790 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  erRollback(pPage
137a0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  r);.    }.  }.. 
137b0 20 61 73 73 65 72 74 28 20 6e 52 65 66 3d 3d 73   assert( nRef==s
137c0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
137d0 75 6e 74 28 70 50 61 67 65 72 29 20 29 3b 0a 20  unt(pPager) );. 
137e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
137f0 65 6e 64 69 66 20 2f 2a 20 69 66 6e 64 65 66 20  endif /* ifndef 
13800 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
13810 56 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  VACUUM */../*.**
13820 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f   This routine do
13830 65 73 20 74 68 65 20 66 69 72 73 74 20 70 68 61  es the first pha
13840 73 65 20 6f 66 20 61 20 74 77 6f 2d 70 68 61 73  se of a two-phas
13850 65 20 63 6f 6d 6d 69 74 2e 20 20 54 68 69 73 20  e commit.  This 
13860 72 6f 75 74 69 6e 65 0a 2a 2a 20 63 61 75 73 65  routine.** cause
13870 73 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  s a rollback jou
13880 72 6e 61 6c 20 74 6f 20 62 65 20 63 72 65 61 74  rnal to be creat
13890 65 64 20 28 69 66 20 69 74 20 64 6f 65 73 20 6e  ed (if it does n
138a0 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  ot already exist
138b0 29 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74  ).** and populat
138c0 65 64 20 77 69 74 68 20 65 6e 6f 75 67 68 20 69  ed with enough i
138d0 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68  nformation so th
138e0 61 74 20 69 66 20 61 20 70 6f 77 65 72 20 6c 6f  at if a power lo
138f0 73 73 20 6f 63 63 75 72 73 0a 2a 2a 20 74 68 65  ss occurs.** the
13900 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
13910 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
13920 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74 65 20   original state 
13930 62 79 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 0a  by playing back.
13940 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  ** the journal. 
13950 20 54 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e   Then the conten
13960 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ts of the journa
13970 6c 20 61 72 65 20 66 6c 75 73 68 65 64 20 6f 75  l are flushed ou
13980 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64 69 73 6b  t to.** the disk
13990 2e 20 20 41 66 74 65 72 20 74 68 65 20 6a 6f 75  .  After the jou
139a0 72 6e 61 6c 20 69 73 20 73 61 66 65 6c 79 20 6f  rnal is safely o
139b0 6e 20 6f 78 69 64 65 2c 20 74 68 65 20 63 68 61  n oxide, the cha
139c0 6e 67 65 73 20 74 6f 20 74 68 65 0a 2a 2a 20 64  nges to the.** d
139d0 61 74 61 62 61 73 65 20 61 72 65 20 77 72 69 74  atabase are writ
139e0 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 64 61 74  ten into the dat
139f0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 66  abase file and f
13a00 6c 75 73 68 65 64 20 74 6f 20 6f 78 69 64 65 2e  lushed to oxide.
13a10 0a 2a 2a 20 41 74 20 74 68 65 20 65 6e 64 20 6f  .** At the end o
13a20 66 20 74 68 69 73 20 63 61 6c 6c 2c 20 74 68 65  f this call, the
13a30 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
13a40 6c 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 6f  l still exists o
13a50 6e 20 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e  n the.** disk an
13a60 64 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 68  d we are still h
13a70 6f 6c 64 69 6e 67 20 61 6c 6c 20 6c 6f 63 6b 73  olding all locks
13a80 2c 20 73 6f 20 74 68 65 20 74 72 61 6e 73 61 63  , so the transac
13a90 74 69 6f 6e 20 68 61 73 20 6e 6f 74 0a 2a 2a 20  tion has not.** 
13aa0 63 6f 6d 6d 69 74 74 65 64 2e 20 20 53 65 65 20  committed.  See 
13ab0 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 6d 6d  sqlite3BtreeComm
13ac0 69 74 28 29 20 66 6f 72 20 74 68 65 20 73 65 63  it() for the sec
13ad0 6f 6e 64 20 70 68 61 73 65 20 6f 66 20 74 68 65  ond phase of the
13ae0 0a 2a 2a 20 63 6f 6d 6d 69 74 20 70 72 6f 63 65  .** commit proce
13af0 73 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  ss..**.** This c
13b00 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  all is a no-op i
13b10 66 20 6e 6f 20 77 72 69 74 65 2d 74 72 61 6e 73  f no write-trans
13b20 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e  action is curren
13b30 74 6c 79 20 61 63 74 69 76 65 20 6f 6e 20 70 42  tly active on pB
13b40 74 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  t..**.** Otherwi
13b50 73 65 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74  se, sync the dat
13b60 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
13b70 68 65 20 62 74 72 65 65 20 70 42 74 2e 20 7a 4d  he btree pBt. zM
13b80 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 0a  aster points to.
13b90 2a 2a 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ** the name of a
13ba0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
13bb0 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64  file that should
13bc0 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
13bd0 20 74 68 65 0a 2a 2a 20 69 6e 64 69 76 69 64 75   the.** individu
13be0 61 6c 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  al journal file,
13bf0 20 6f 72 20 69 73 20 4e 55 4c 4c 2c 20 69 6e 64   or is NULL, ind
13c00 69 63 61 74 69 6e 67 20 6e 6f 20 6d 61 73 74 65  icating no maste
13c10 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a  r journal file .
13c20 2a 2a 20 28 73 69 6e 67 6c 65 20 64 61 74 61 62  ** (single datab
13c30 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
13c40 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
13c50 73 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  s is called, the
13c60 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
13c70 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 68  should already h
13c80 61 76 65 20 62 65 65 6e 0a 2a 2a 20 63 72 65 61  ave been.** crea
13c90 74 65 64 2c 20 70 6f 70 75 6c 61 74 65 64 20 77  ted, populated w
13ca0 69 74 68 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ith this journal
13cb0 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 73 79 6e   pointer and syn
13cc0 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a  ced to disk..**.
13cd0 2a 2a 20 4f 6e 63 65 20 74 68 69 73 20 69 73 20  ** Once this is 
13ce0 72 6f 75 74 69 6e 65 20 68 61 73 20 72 65 74 75  routine has retu
13cf0 72 6e 65 64 2c 20 74 68 65 20 6f 6e 6c 79 20 74  rned, the only t
13d00 68 69 6e 67 20 72 65 71 75 69 72 65 64 20 74 6f  hing required to
13d10 20 63 6f 6d 6d 69 74 0a 2a 2a 20 74 68 65 20 77   commit.** the w
13d20 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e  rite-transaction
13d30 20 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61   for this databa
13d40 73 65 20 66 69 6c 65 20 69 73 20 74 6f 20 64 65  se file is to de
13d50 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
13d60 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
13d70 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
13d80 4f 6e 65 28 42 74 72 65 65 20 2a 70 2c 20 63 6f  One(Btree *p, co
13d90 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
13da0 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
13db0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
13dc0 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e  p->inTrans==TRAN
13dd0 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 42  S_WRITE ){.    B
13de0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
13df0 2d 3e 70 42 74 3b 0a 20 20 20 20 73 71 6c 69 74  ->pBt;.    sqlit
13e00 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
13e10 0a 20 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 70  .    pBt->db = p
13e20 2d 3e 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51  ->db;.#ifndef SQ
13e30 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
13e40 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74  CUUM.    if( pBt
13e50 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
13e60 20 20 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56        rc = autoV
13e70 61 63 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 29  acuumCommit(pBt)
13e80 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
13e90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13ea0 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
13eb0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20  eLeave(p);.     
13ec0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
13ed0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
13ee0 69 66 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  if.    rc = sqli
13ef0 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
13f00 61 73 65 4f 6e 65 28 70 42 74 2d 3e 70 50 61 67  aseOne(pBt->pPag
13f10 65 72 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b  er, zMaster, 0);
13f20 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
13f30 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
13f40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
13f50 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20  *.** Commit the 
13f60 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72  transaction curr
13f70 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73  ently in progres
13f80 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
13f90 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73  utine implements
13fa0 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
13fb0 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63  e of a 2-phase c
13fc0 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73  ommit.  The.** s
13fd0 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 28  qlite3BtreeSync(
13fe0 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  ) routine does t
13ff0 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61  he first phase a
14000 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76  nd should be inv
14010 6f 6b 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f  oked.** prior to
14020 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
14030 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69  utine.  The sqli
14040 74 65 33 42 74 72 65 65 53 79 6e 63 28 29 20 72  te3BtreeSync() r
14050 6f 75 74 69 6e 65 20 64 69 64 0a 2a 2a 20 61 6c  outine did.** al
14060 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72  l the work of wr
14070 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iting informatio
14080 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e  n out to disk an
14090 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a  d flushing the.*
140a0 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68  * contents so th
140b0 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74  at they are writ
140c0 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73  ten onto the dis
140d0 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20  k platter.  All 
140e0 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
140f0 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c  has to do is del
14100 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ete or truncate 
14110 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
14120 72 6e 61 6c 0a 2a 2a 20 28 77 68 69 63 68 20 63  rnal.** (which c
14130 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61  auses the transa
14140 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29  ction to commit)
14150 20 61 6e 64 20 64 72 6f 70 20 6c 6f 63 6b 73 2e   and drop locks.
14160 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
14170 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
14180 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
14190 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
141a0 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
141b0 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
141c0 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
141d0 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
141e0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
141f0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
14200 54 77 6f 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  Two(Btree *p){. 
14210 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
14220 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69   p->pBt;..  sqli
14230 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
14240 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d  ;.  pBt->db = p-
14250 3e 64 62 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  >db;.  btreeInte
14260 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
14270 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
14280 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  s a write-transa
14290 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d  ction open, comm
142a0 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  it the shared-bt
142b0 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73  rees .  ** trans
142c0 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74  action and set t
142d0 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
142e0 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20  to TRANS_READ.. 
142f0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
14300 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
14310 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  E ){.    int rc;
14320 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
14330 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
14340 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
14350 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
14360 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20  >nTransaction>0 
14370 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
14380 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
14390 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67  aseTwo(pBt->pPag
143a0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
143b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
143c0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
143d0 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
143e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
143f0 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e  .    pBt->inTran
14400 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
14410 52 45 41 44 3b 0a 20 20 7d 0a 20 20 63 6c 65 61  READ;.  }.  clea
14420 72 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54  rAllSharedCacheT
14430 61 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 0a 20  ableLocks(p);.. 
14440 20 2f 2a 20 49 66 20 74 68 65 20 68 61 6e 64 6c   /* If the handl
14450 65 20 68 61 73 20 61 6e 79 20 6b 69 6e 64 20 6f  e has any kind o
14460 66 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 70  f transaction op
14470 65 6e 2c 20 64 65 63 72 65 6d 65 6e 74 20 74 68  en, decrement th
14480 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  e transaction.  
14490 2a 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65 20  ** count of the 
144a0 73 68 61 72 65 64 20 62 74 72 65 65 2e 20 49 66  shared btree. If
144b0 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
144c0 20 63 6f 75 6e 74 20 72 65 61 63 68 65 73 20 30   count reaches 0
144d0 2c 20 73 65 74 0a 20 20 2a 2a 20 74 68 65 20 73  , set.  ** the s
144e0 68 61 72 65 64 20 73 74 61 74 65 20 74 6f 20 54  hared state to T
144f0 52 41 4e 53 5f 4e 4f 4e 45 2e 20 54 68 65 20 75  RANS_NONE. The u
14500 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
14510 65 64 28 29 20 63 61 6c 6c 20 62 65 6c 6f 77 0a  ed() call below.
14520 20 20 2a 2a 20 77 69 6c 6c 20 75 6e 6c 6f 63 6b    ** will unlock
14530 20 74 68 65 20 70 61 67 65 72 2e 0a 20 20 2a 2f   the pager..  */
14540 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e  .  if( p->inTran
14550 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29 7b  s!=TRANS_NONE ){
14560 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 61 6e 73  .    pBt->nTrans
14570 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20 20 20 69 66  action--;.    if
14580 28 20 30 3d 3d 70 42 74 2d 3e 6e 54 72 61 6e 73  ( 0==pBt->nTrans
14590 61 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  action ){.      
145a0 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69  pBt->inTransacti
145b0 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b  on = TRANS_NONE;
145c0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
145d0 20 53 65 74 20 74 68 65 20 68 61 6e 64 6c 65 73   Set the handles
145e0 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
145f0 74 69 6f 6e 20 73 74 61 74 65 20 74 6f 20 54 52  tion state to TR
14600 41 4e 53 5f 4e 4f 4e 45 20 61 6e 64 20 75 6e 6c  ANS_NONE and unl
14610 6f 63 6b 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  ock.  ** the pag
14620 65 72 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20  er if this call 
14630 63 6c 6f 73 65 64 20 74 68 65 20 6f 6e 6c 79 20  closed the only 
14640 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
14650 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
14660 20 20 62 74 72 65 65 43 6c 65 61 72 48 61 73 43    btreeClearHasC
14670 6f 6e 74 65 6e 74 28 70 42 74 29 3b 0a 20 20 70  ontent(pBt);.  p
14680 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
14690 53 5f 4e 4f 4e 45 3b 0a 20 20 75 6e 6c 6f 63 6b  S_NONE;.  unlock
146a0 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70 42  BtreeIfUnused(pB
146b0 74 29 3b 0a 0a 20 20 62 74 72 65 65 49 6e 74 65  t);..  btreeInte
146c0 67 72 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69  grity(p);.  sqli
146d0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
146e0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
146f0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  E_OK;.}../*.** D
14700 6f 20 62 6f 74 68 20 70 68 61 73 65 73 20 6f 66  o both phases of
14710 20 61 20 63 6f 6d 6d 69 74 2e 0a 2a 2f 0a 69 6e   a commit..*/.in
14720 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
14730 6d 6d 69 74 28 42 74 72 65 65 20 2a 70 29 7b 0a  mmit(Btree *p){.
14740 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
14750 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
14760 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
14770 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
14780 4f 6e 65 28 70 2c 20 30 29 3b 0a 20 20 69 66 28  One(p, 0);.  if(
14790 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
147a0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
147b0 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61  e3BtreeCommitPha
147c0 73 65 54 77 6f 28 70 29 3b 0a 20 20 7d 0a 20 20  seTwo(p);.  }.  
147d0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
147e0 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
147f0 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44  c;.}..#ifndef ND
14800 45 42 55 47 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EBUG./*.** Retur
14810 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
14820 77 72 69 74 65 2d 63 75 72 73 6f 72 73 20 6f 70  write-cursors op
14830 65 6e 20 6f 6e 20 74 68 69 73 20 68 61 6e 64 6c  en on this handl
14840 65 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20 75  e. This is for u
14850 73 65 0a 2a 2a 20 69 6e 20 61 73 73 65 72 74 28  se.** in assert(
14860 29 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 73  ) expressions, s
14870 6f 20 69 74 20 69 73 20 6f 6e 6c 79 20 63 6f 6d  o it is only com
14880 70 69 6c 65 64 20 69 66 20 4e 44 45 42 55 47 20  piled if NDEBUG 
14890 69 73 20 6e 6f 74 0a 2a 2a 20 64 65 66 69 6e 65  is not.** define
148a0 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  d..**.** For the
148b0 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
148c0 73 20 72 6f 75 74 69 6e 65 2c 20 61 20 77 72 69  s routine, a wri
148d0 74 65 2d 63 75 72 73 6f 72 20 69 73 20 61 6e 79  te-cursor is any
148e0 20 63 75 72 73 6f 72 20 74 68 61 74 0a 2a 2a 20   cursor that.** 
148f0 69 73 20 63 61 70 61 62 6c 65 20 6f 66 20 77 72  is capable of wr
14900 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74  iting to the dat
14910 61 62 73 65 2e 20 20 54 68 61 74 20 6d 65 61 6e  abse.  That mean
14920 73 20 74 68 65 20 63 75 72 73 6f 72 20 77 61 73  s the cursor was
14930 0a 2a 2a 20 6f 72 69 67 69 6e 61 6c 6c 79 20 6f  .** originally o
14940 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74 69 6e  pened for writin
14950 67 20 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72  g and the cursor
14960 20 68 61 73 20 6e 6f 74 20 62 65 20 64 69 73 61   has not be disa
14970 62 6c 65 64 0a 2a 2a 20 62 79 20 68 61 76 69 6e  bled.** by havin
14980 67 20 69 74 73 20 73 74 61 74 65 20 63 68 61 6e  g its state chan
14990 67 65 64 20 74 6f 20 43 55 52 53 4f 52 5f 46 41  ged to CURSOR_FA
149a0 55 4c 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ULT..*/.static i
149b0 6e 74 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72  nt countWriteCur
149c0 73 6f 72 73 28 42 74 53 68 61 72 65 64 20 2a 70  sors(BtShared *p
149d0 42 74 29 7b 0a 20 20 42 74 43 75 72 73 6f 72 20  Bt){.  BtCursor 
149e0 2a 70 43 75 72 3b 0a 20 20 69 6e 74 20 72 20 3d  *pCur;.  int r =
149f0 20 30 3b 0a 20 20 66 6f 72 28 70 43 75 72 3d 70   0;.  for(pCur=p
14a00 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 43 75  Bt->pCursor; pCu
14a10 72 3b 20 70 43 75 72 3d 70 43 75 72 2d 3e 70 4e  r; pCur=pCur->pN
14a20 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 43  ext){.    if( pC
14a30 75 72 2d 3e 77 72 46 6c 61 67 20 26 26 20 70 43  ur->wrFlag && pC
14a40 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
14a50 4f 52 5f 46 41 55 4c 54 20 29 20 72 2b 2b 3b 20  OR_FAULT ) r++; 
14a60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b  .  }.  return r;
14a70 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
14a80 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65   This routine se
14a90 74 73 20 74 68 65 20 73 74 61 74 65 20 74 6f 20  ts the state to 
14aa0 43 55 52 53 4f 52 5f 46 41 55 4c 54 20 61 6e 64  CURSOR_FAULT and
14ab0 20 74 68 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f   the error.** co
14ac0 64 65 20 74 6f 20 65 72 72 43 6f 64 65 20 66 6f  de to errCode fo
14ad0 72 20 65 76 65 72 79 20 63 75 72 73 6f 72 20 6f  r every cursor o
14ae0 6e 20 42 74 53 68 61 72 65 64 20 74 68 61 74 20  n BtShared that 
14af0 70 42 74 72 65 65 0a 2a 2a 20 72 65 66 65 72 65  pBtree.** refere
14b00 6e 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 45 76 65 72  nces..**.** Ever
14b10 79 20 63 75 72 73 6f 72 20 69 73 20 74 72 69 70  y cursor is trip
14b20 70 65 64 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63  ped, including c
14b30 75 72 73 6f 72 73 20 74 68 61 74 20 62 65 6c 6f  ursors that belo
14b40 6e 67 0a 2a 2a 20 74 6f 20 6f 74 68 65 72 20 64  ng.** to other d
14b50 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
14b60 6f 6e 73 20 74 68 61 74 20 68 61 70 70 65 6e 20  ons that happen 
14b70 74 6f 20 62 65 20 73 68 61 72 69 6e 67 0a 2a 2a  to be sharing.**
14b80 20 74 68 65 20 63 61 63 68 65 20 77 69 74 68 20   the cache with 
14b90 70 42 74 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  pBtree..**.** Th
14ba0 69 73 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20  is routine gets 
14bb0 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20 72 6f  called when a ro
14bc0 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2e 0a 2a  llback occurs..*
14bd0 2a 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 75 73  * All cursors us
14be0 69 6e 67 20 74 68 65 20 73 61 6d 65 20 63 61 63  ing the same cac
14bf0 68 65 20 6d 75 73 74 20 62 65 20 74 72 69 70 70  he must be tripp
14c00 65 64 0a 2a 2a 20 74 6f 20 70 72 65 76 65 6e 74  ed.** to prevent
14c10 20 74 68 65 6d 20 66 72 6f 6d 20 74 72 79 69 6e   them from tryin
14c20 67 20 74 6f 20 75 73 65 20 74 68 65 20 62 74 72  g to use the btr
14c30 65 65 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20  ee after.** the 
14c40 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 72  rollback.  The r
14c50 6f 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65  ollback may have
14c60 20 64 65 6c 65 74 65 64 20 74 61 62 6c 65 73 0a   deleted tables.
14c70 2a 2a 20 6f 72 20 6d 6f 76 65 64 20 72 6f 6f 74  ** or moved root
14c80 20 70 61 67 65 73 2c 20 73 6f 20 69 74 20 69 73   pages, so it is
14c90 20 6e 6f 74 20 73 75 66 66 69 63 69 65 6e 74 20   not sufficient 
14ca0 74 6f 0a 2a 2a 20 73 61 76 65 20 74 68 65 20 73  to.** save the s
14cb0 74 61 74 65 20 6f 66 20 74 68 65 20 63 75 72 73  tate of the curs
14cc0 6f 72 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20  or.  The cursor 
14cd0 6d 75 73 74 20 62 65 0a 2a 2a 20 69 6e 76 61 6c  must be.** inval
14ce0 69 64 61 74 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20  idated..*/.void 
14cf0 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69 70  sqlite3BtreeTrip
14d00 41 6c 6c 43 75 72 73 6f 72 73 28 42 74 72 65 65  AllCursors(Btree
14d10 20 2a 70 42 74 72 65 65 2c 20 69 6e 74 20 65 72   *pBtree, int er
14d20 72 43 6f 64 65 29 7b 0a 20 20 42 74 43 75 72 73  rCode){.  BtCurs
14d30 6f 72 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33  or *p;.  sqlite3
14d40 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65  BtreeEnter(pBtre
14d50 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 42 74 72  e);.  for(p=pBtr
14d60 65 65 2d 3e 70 42 74 2d 3e 70 43 75 72 73 6f 72  ee->pBt->pCursor
14d70 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
14d80 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
14d90 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65   sqlite3BtreeCle
14da0 61 72 43 75 72 73 6f 72 28 70 29 3b 0a 20 20 20  arCursor(p);.   
14db0 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52   p->eState = CUR
14dc0 53 4f 52 5f 46 41 55 4c 54 3b 0a 20 20 20 20 70  SOR_FAULT;.    p
14dd0 2d 3e 73 6b 69 70 20 3d 20 65 72 72 43 6f 64 65  ->skip = errCode
14de0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
14df0 3c 3d 70 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  <=p->iPage; i++)
14e00 7b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  {.      releaseP
14e10 61 67 65 28 70 2d 3e 61 70 50 61 67 65 5b 69 5d  age(p->apPage[i]
14e20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 61 70 50 61  );.      p->apPa
14e30 67 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 7d  ge[i] = 0;.    }
14e40 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
14e50 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65 29  reeLeave(pBtree)
14e60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
14e70 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63 74  ack the transact
14e80 69 6f 6e 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  ion in progress.
14e90 20 20 41 6c 6c 20 63 75 72 73 6f 72 73 20 77 69    All cursors wi
14ea0 6c 6c 20 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64  ll be.** invalid
14eb0 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61  ed by this opera
14ec0 74 69 6f 6e 2e 20 20 41 6e 79 20 61 74 74 65 6d  tion.  Any attem
14ed0 70 74 20 74 6f 20 75 73 65 20 61 20 63 75 72 73  pt to use a curs
14ee0 6f 72 0a 2a 2a 20 74 68 61 74 20 77 61 73 20 6f  or.** that was o
14ef0 70 65 6e 20 61 74 20 74 68 65 20 62 65 67 69 6e  pen at the begin
14f00 6e 69 6e 67 20 6f 66 20 74 68 69 73 20 6f 70 65  ning of this ope
14f10 72 61 74 69 6f 6e 20 77 69 6c 6c 20 72 65 73 75  ration will resu
14f20 6c 74 0a 2a 2a 20 69 6e 20 61 6e 20 65 72 72 6f  lt.** in an erro
14f30 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69  r..**.** This wi
14f40 6c 6c 20 72 65 6c 65 61 73 65 20 74 68 65 20 77  ll release the w
14f50 72 69 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  rite lock on the
14f60 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
14f70 20 49 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65   If there.** are
14f80 20 6e 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f   no active curso
14f90 72 73 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65  rs, it also rele
14fa0 61 73 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f  ases the read lo
14fb0 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ck..*/.int sqlit
14fc0 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
14fd0 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74  Btree *p){.  int
14fe0 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20   rc;.  BtShared 
14ff0 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
15000 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
15010 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  ;..  sqlite3Btre
15020 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74  eEnter(p);.  pBt
15030 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20  ->db = p->db;.  
15040 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
15050 6f 72 73 28 70 42 74 2c 20 30 2c 20 30 29 3b 0a  ors(pBt, 0, 0);.
15060 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15070 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
15080 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
15090 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54  E_OK ){.    /* T
150a0 68 69 73 20 69 73 20 61 20 68 6f 72 72 69 62 6c  his is a horribl
150b0 65 20 73 69 74 75 61 74 69 6f 6e 2e 20 41 6e 20  e situation. An 
150c0 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65  IO or malloc() e
150d0 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 77 68  rror occurred wh
150e0 69 6c 73 74 0a 20 20 20 20 2a 2a 20 74 72 79 69  ilst.    ** tryi
150f0 6e 67 20 74 6f 20 73 61 76 65 20 63 75 72 73 6f  ng to save curso
15100 72 20 70 6f 73 69 74 69 6f 6e 73 2e 20 49 66 20  r positions. If 
15110 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f 6d  this is an autom
15120 61 74 69 63 20 72 6f 6c 6c 62 61 63 6b 20 28 61  atic rollback (a
15130 73 0a 20 20 20 20 2a 2a 20 74 68 65 20 72 65 73  s.    ** the res
15140 75 6c 74 20 6f 66 20 61 20 63 6f 6e 73 74 72 61  ult of a constra
15150 69 6e 74 2c 20 6d 61 6c 6c 6f 63 28 29 20 66 61  int, malloc() fa
15160 69 6c 75 72 65 20 6f 72 20 49 4f 20 65 72 72 6f  ilure or IO erro
15170 72 29 20 74 68 65 6e 20 0a 20 20 20 20 2a 2a 20  r) then .    ** 
15180 74 68 65 20 63 61 63 68 65 20 6d 61 79 20 62 65  the cache may be
15190 20 69 6e 74 65 72 6e 61 6c 6c 79 20 69 6e 63 6f   internally inco
151a0 6e 73 69 73 74 65 6e 74 20 28 6e 6f 74 20 63 6f  nsistent (not co
151b0 6e 74 61 69 6e 20 76 61 6c 69 64 20 74 72 65 65  ntain valid tree
151c0 73 29 20 73 6f 0a 20 20 20 20 2a 2a 20 77 65 20  s) so.    ** we 
151d0 63 61 6e 6e 6f 74 20 73 69 6d 70 6c 79 20 72 65  cannot simply re
151e0 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 74  turn the error t
151f0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 49 6e  o the caller. In
15200 73 74 65 61 64 2c 20 61 62 6f 72 74 20 0a 20 20  stead, abort .  
15210 20 20 2a 2a 20 61 6c 6c 20 71 75 65 72 69 65 73    ** all queries
15220 20 74 68 61 74 20 6d 61 79 20 62 65 20 75 73 69   that may be usi
15230 6e 67 20 61 6e 79 20 6f 66 20 74 68 65 20 63 75  ng any of the cu
15240 72 73 6f 72 73 20 74 68 61 74 20 66 61 69 6c 65  rsors that faile
15250 64 20 74 6f 20 73 61 76 65 2e 0a 20 20 20 20 2a  d to save..    *
15260 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  /.    sqlite3Btr
15270 65 65 54 72 69 70 41 6c 6c 43 75 72 73 6f 72 73  eeTripAllCursors
15280 28 70 2c 20 72 63 29 3b 0a 20 20 7d 0a 23 65 6e  (p, rc);.  }.#en
15290 64 69 66 0a 20 20 62 74 72 65 65 49 6e 74 65 67  dif.  btreeInteg
152a0 72 69 74 79 28 70 29 3b 0a 20 20 63 6c 65 61 72  rity(p);.  clear
152b0 41 6c 6c 53 68 61 72 65 64 43 61 63 68 65 54 61  AllSharedCacheTa
152c0 62 6c 65 4c 6f 63 6b 73 28 70 29 3b 0a 0a 20 20  bleLocks(p);..  
152d0 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d  if( p->inTrans==
152e0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
152f0 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a 20 20 20     int rc2;..   
15300 20 61 73 73 65 72 74 28 20 54 52 41 4e 53 5f 57   assert( TRANS_W
15310 52 49 54 45 3d 3d 70 42 74 2d 3e 69 6e 54 72 61  RITE==pBt->inTra
15320 6e 73 61 63 74 69 6f 6e 20 29 3b 0a 20 20 20 20  nsaction );.    
15330 72 63 32 20 3d 20 73 71 6c 69 74 65 33 50 61 67  rc2 = sqlite3Pag
15340 65 72 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e  erRollback(pBt->
15350 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
15360 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2!=SQLITE_OK 
15370 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63  ){.      rc = rc
15380 32 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  2;.    }..    /*
15390 20 54 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6d 61   The rollback ma
153a0 79 20 68 61 76 65 20 64 65 73 74 72 6f 79 65 64  y have destroyed
153b0 20 74 68 65 20 70 50 61 67 65 31 2d 3e 61 44 61   the pPage1->aDa
153c0 74 61 20 76 61 6c 75 65 2e 20 20 53 6f 0a 20 20  ta value.  So.  
153d0 20 20 2a 2a 20 63 61 6c 6c 20 73 71 6c 69 74 65    ** call sqlite
153e0 33 42 74 72 65 65 47 65 74 50 61 67 65 28 29 20  3BtreeGetPage() 
153f0 6f 6e 20 70 61 67 65 20 31 20 61 67 61 69 6e 20  on page 1 again 
15400 74 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73  to make.    ** s
15410 75 72 65 20 70 50 61 67 65 31 2d 3e 61 44 61 74  ure pPage1->aDat
15420 61 20 69 73 20 73 65 74 20 63 6f 72 72 65 63 74  a is set correct
15430 6c 79 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73  ly. */.    if( s
15440 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
15450 67 65 28 70 42 74 2c 20 31 2c 20 26 70 50 61 67  ge(pBt, 1, &pPag
15460 65 31 2c 20 30 29 3d 3d 53 51 4c 49 54 45 5f 4f  e1, 0)==SQLITE_O
15470 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  K ){.      relea
15480 73 65 50 61 67 65 28 70 50 61 67 65 31 29 3b 0a  sePage(pPage1);.
15490 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
154a0 28 20 63 6f 75 6e 74 57 72 69 74 65 43 75 72 73  ( countWriteCurs
154b0 6f 72 73 28 70 42 74 29 3d 3d 30 20 29 3b 0a 20  ors(pBt)==0 );. 
154c0 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61     pBt->inTransa
154d0 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 52 45  ction = TRANS_RE
154e0 41 44 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  AD;.  }..  if( p
154f0 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53  ->inTrans!=TRANS
15500 5f 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 61 73 73  _NONE ){.    ass
15510 65 72 74 28 20 70 42 74 2d 3e 6e 54 72 61 6e 73  ert( pBt->nTrans
15520 61 63 74 69 6f 6e 3e 30 20 29 3b 0a 20 20 20 20  action>0 );.    
15530 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
15540 6e 2d 2d 3b 0a 20 20 20 20 69 66 28 20 30 3d 3d  n--;.    if( 0==
15550 70 42 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f  pBt->nTransactio
15560 6e 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e  n ){.      pBt->
15570 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20  inTransaction = 
15580 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20  TRANS_NONE;.    
15590 7d 0a 20 20 7d 0a 0a 20 20 62 74 72 65 65 43 6c  }.  }..  btreeCl
155a0 65 61 72 48 61 73 43 6f 6e 74 65 6e 74 28 70 42  earHasContent(pB
155b0 74 29 3b 0a 20 20 70 2d 3e 69 6e 54 72 61 6e 73  t);.  p->inTrans
155c0 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20   = TRANS_NONE;. 
155d0 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e   unlockBtreeIfUn
155e0 75 73 65 64 28 70 42 74 29 3b 0a 0a 20 20 62 74  used(pBt);..  bt
155f0 72 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b  reeIntegrity(p);
15600 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
15610 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
15620 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
15630 74 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74  tart a statement
15640 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e   subtransaction.
15650 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
15660 69 6f 6e 20 63 61 6e 20 63 61 6e 20 62 65 20 72  ion can can be r
15670 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 69 6e  olled.** back in
15680 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74  dependently of t
15690 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74  he main transact
156a0 69 6f 6e 2e 20 59 6f 75 20 6d 75 73 74 20 73 74  ion. You must st
156b0 61 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f  art a transactio
156c0 6e 20 0a 2a 2a 20 62 65 66 6f 72 65 20 73 74 61  n .** before sta
156d0 72 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73  rting a subtrans
156e0 61 63 74 69 6f 6e 2e 20 54 68 65 20 73 75 62 74  action. The subt
156f0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e  ransaction is en
15700 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ded automaticall
15710 79 20 0a 2a 2a 20 69 66 20 74 68 65 20 6d 61 69  y .** if the mai
15720 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  n transaction co
15730 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20 62  mmits or rolls b
15740 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65  ack..**.** State
15750 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
15760 69 6f 6e 73 20 61 72 65 20 75 73 65 64 20 61 72  ions are used ar
15770 6f 75 6e 64 20 69 6e 64 69 76 69 64 75 61 6c 20  ound individual 
15780 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a  SQL statements.*
15790 2a 20 74 68 61 74 20 61 72 65 20 63 6f 6e 74 61  * that are conta
157a0 69 6e 65 64 20 77 69 74 68 69 6e 20 61 20 42 45  ined within a BE
157b0 47 49 4e 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f  GIN...COMMIT blo
157c0 63 6b 2e 20 20 49 66 20 61 20 63 6f 6e 73 74 72  ck.  If a constr
157d0 61 69 6e 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63  aint.** error oc
157e0 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  curs within the 
157f0 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 65  statement, the e
15800 66 66 65 63 74 20 6f 66 20 74 68 61 74 20 6f 6e  ffect of that on
15810 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63  e statement.** c
15820 61 6e 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  an be rolled bac
15830 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  k without having
15840 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
15850 20 65 6e 74 69 72 65 20 74 72 61 6e 73 61 63 74   entire transact
15860 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 73 74 61  ion..**.** A sta
15870 74 65 6d 65 6e 74 20 73 75 62 2d 74 72 61 6e 73  tement sub-trans
15880 61 63 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d  action is implem
15890 65 6e 74 65 64 20 61 73 20 61 6e 20 61 6e 6f 6e  ented as an anon
158a0 79 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 2e  ymous savepoint.
158b0 20 54 68 65 0a 2a 2a 20 76 61 6c 75 65 20 70 61   The.** value pa
158c0 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
158d0 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  nd parameter is 
158e0 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
158f0 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 2c 0a   of savepoints,.
15900 2a 2a 20 69 6e 63 6c 75 64 69 6e 67 20 74 68 65  ** including the
15910 20 6e 65 77 20 61 6e 6f 6e 79 6d 6f 75 73 20 73   new anonymous s
15920 61 76 65 70 6f 69 6e 74 2c 20 6f 70 65 6e 20 6f  avepoint, open o
15930 6e 20 74 68 65 20 42 2d 54 72 65 65 2e 20 69 2e  n the B-Tree. i.
15940 65 2e 20 69 66 20 74 68 65 72 65 0a 2a 2a 20 61  e. if there.** a
15950 72 65 20 6e 6f 20 61 63 74 69 76 65 20 73 61 76  re no active sav
15960 65 70 6f 69 6e 74 73 20 61 6e 64 20 6e 6f 20 6f  epoints and no o
15970 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74 2d 74  ther statement-t
15980 72 61 6e 73 61 63 74 69 6f 6e 73 20 6f 70 65 6e  ransactions open
15990 2c 0a 2a 2a 20 69 53 74 61 74 65 6d 65 6e 74 20  ,.** iStatement 
159a0 69 73 20 31 2e 20 54 68 69 73 20 61 6e 6f 6e 79  is 1. This anony
159b0 6d 6f 75 73 20 73 61 76 65 70 6f 69 6e 74 20 63  mous savepoint c
159c0 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20 6f  an be released o
159d0 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b 0a 2a 2a  r rolled back.**
159e0 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74   using the sqlit
159f0 65 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74  e3BtreeSavepoint
15a00 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  () function..*/.
15a10 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
15a20 42 65 67 69 6e 53 74 6d 74 28 42 74 72 65 65 20  BeginStmt(Btree 
15a30 2a 70 2c 20 69 6e 74 20 69 53 74 61 74 65 6d 65  *p, int iStateme
15a40 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  nt){.  int rc;. 
15a50 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
15a60 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
15a70 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
15a80 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  .  pBt->db = p->
15a90 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d  db;.  assert( p-
15aa0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
15ab0 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
15ac0 74 28 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79  t( pBt->readOnly
15ad0 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
15ae0 20 69 53 74 61 74 65 6d 65 6e 74 3e 30 20 29 3b   iStatement>0 );
15af0 0a 20 20 61 73 73 65 72 74 28 20 69 53 74 61 74  .  assert( iStat
15b00 65 6d 65 6e 74 3e 70 2d 3e 64 62 2d 3e 6e 53 61  ement>p->db->nSa
15b10 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 69 66 28  vepoint );.  if(
15b20 20 4e 45 56 45 52 28 70 2d 3e 69 6e 54 72 61 6e   NEVER(p->inTran
15b30 73 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 7c  s!=TRANS_WRITE |
15b40 7c 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 29  | pBt->readOnly)
15b50 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
15b60 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3b 0a 20 20  ITE_INTERNAL;.  
15b70 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
15b80 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
15b90 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
15ba0 54 45 20 29 3b 0a 20 20 20 20 2f 2a 20 41 74 20  TE );.    /* At 
15bb0 74 68 65 20 70 61 67 65 72 20 6c 65 76 65 6c 2c  the pager level,
15bc0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
15bd0 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 20 73 61  nsaction is a sa
15be0 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 20 20 20  vepoint with.   
15bf0 20 2a 2a 20 61 6e 20 69 6e 64 65 78 20 67 72 65   ** an index gre
15c00 61 74 65 72 20 74 68 61 6e 20 61 6c 6c 20 73 61  ater than all sa
15c10 76 65 70 6f 69 6e 74 73 20 63 72 65 61 74 65 64  vepoints created
15c20 20 65 78 70 6c 69 63 69 74 6c 79 20 75 73 69 6e   explicitly usin
15c30 67 0a 20 20 20 20 2a 2a 20 53 51 4c 20 73 74 61  g.    ** SQL sta
15c40 74 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 69  tements. It is i
15c50 6c 6c 65 67 61 6c 20 74 6f 20 6f 70 65 6e 2c 20  llegal to open, 
15c60 72 65 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62  release or rollb
15c70 61 63 6b 20 61 6e 79 0a 20 20 20 20 2a 2a 20 73  ack any.    ** s
15c80 75 63 68 20 73 61 76 65 70 6f 69 6e 74 73 20 77  uch savepoints w
15c90 68 69 6c 65 20 74 68 65 20 73 74 61 74 65 6d 65  hile the stateme
15ca0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  nt transaction s
15cb0 61 76 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69  avepoint is acti
15cc0 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  ve..    */.    r
15cd0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
15ce0 4f 70 65 6e 53 61 76 65 70 6f 69 6e 74 28 70 42  OpenSavepoint(pB
15cf0 74 2d 3e 70 50 61 67 65 72 2c 20 69 53 74 61 74  t->pPager, iStat
15d00 65 6d 65 6e 74 29 3b 0a 20 20 7d 0a 20 20 73 71  ement);.  }.  sq
15d10 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
15d20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
15d30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 65  .}../*.** The se
15d40 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
15d50 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
15d60 6f 70 2c 20 69 73 20 61 6c 77 61 79 73 20 53 41  op, is always SA
15d70 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
15d80 0a 2a 2a 20 6f 72 20 53 41 56 45 50 4f 49 4e 54  .** or SAVEPOINT
15d90 5f 52 45 4c 45 41 53 45 2e 20 54 68 69 73 20 66  _RELEASE. This f
15da0 75 6e 63 74 69 6f 6e 20 65 69 74 68 65 72 20 72  unction either r
15db0 65 6c 65 61 73 65 73 20 6f 72 20 72 6f 6c 6c 73  eleases or rolls
15dc0 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 73 61 76   back the.** sav
15dd0 65 70 6f 69 6e 74 20 69 64 65 6e 74 69 66 69 65  epoint identifie
15de0 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 69  d by parameter i
15df0 53 61 76 65 70 6f 69 6e 74 2c 20 64 65 70 65 6e  Savepoint, depen
15e00 64 69 6e 67 20 6f 6e 20 74 68 65 20 76 61 6c 75  ding on the valu
15e10 65 20 0a 2a 2a 20 6f 66 20 6f 70 2e 0a 2a 2a 0a  e .** of op..**.
15e20 2a 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 53 61  ** Normally, iSa
15e30 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65 61 74  vepoint is great
15e40 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  er than or equal
15e50 20 74 6f 20 7a 65 72 6f 2e 20 48 6f 77 65 76 65   to zero. Howeve
15e60 72 2c 20 69 66 20 6f 70 20 69 73 0a 2a 2a 20 53  r, if op is.** S
15e70 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43  AVEPOINT_ROLLBAC
15e80 4b 2c 20 74 68 65 6e 20 69 53 61 76 65 70 6f 69  K, then iSavepoi
15e90 6e 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 2d  nt may also be -
15ea0 31 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  1. In this case 
15eb0 74 68 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73  the .** contents
15ec0 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 74   of the entire t
15ed0 72 61 6e 73 61 63 74 69 6f 6e 20 61 72 65 20 72  ransaction are r
15ee0 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68 69 73  olled back. This
15ef0 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a   is different.**
15f00 20 66 72 6f 6d 20 61 20 6e 6f 72 6d 61 6c 20 74   from a normal t
15f10 72 61 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 62  ransaction rollb
15f20 61 63 6b 2c 20 61 73 20 6e 6f 20 6c 6f 63 6b 73  ack, as no locks
15f30 20 61 72 65 20 72 65 6c 65 61 73 65 64 20 61 6e   are released an
15f40 64 20 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63  d the.** transac
15f50 74 69 6f 6e 20 72 65 6d 61 69 6e 73 20 6f 70 65  tion remains ope
15f60 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
15f70 33 42 74 72 65 65 53 61 76 65 70 6f 69 6e 74 28  3BtreeSavepoint(
15f80 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 6f 70  Btree *p, int op
15f90 2c 20 69 6e 74 20 69 53 61 76 65 70 6f 69 6e 74  , int iSavepoint
15fa0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
15fb0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
15fc0 20 26 26 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d   && p->inTrans==
15fd0 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20  TRANS_WRITE ){. 
15fe0 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74     BtShared *pBt
15ff0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 20 20 61   = p->pBt;.    a
16000 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50  ssert( op==SAVEP
16010 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20  OINT_RELEASE || 
16020 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
16030 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 20 20 61 73  LLBACK );.    as
16040 73 65 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74  sert( iSavepoint
16050 3e 3d 30 20 7c 7c 20 28 69 53 61 76 65 70 6f 69  >=0 || (iSavepoi
16060 6e 74 3d 3d 2d 31 20 26 26 20 6f 70 3d 3d 53 41  nt==-1 && op==SA
16070 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b  VEPOINT_ROLLBACK
16080 29 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) );.    sqlite3
16090 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
160a0 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e     pBt->db = p->
160b0 64 62 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  db;.    rc = sql
160c0 69 74 65 33 50 61 67 65 72 53 61 76 65 70 6f 69  ite3PagerSavepoi
160d0 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  nt(pBt->pPager, 
160e0 6f 70 2c 20 69 53 61 76 65 70 6f 69 6e 74 29 3b  op, iSavepoint);
160f0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
16100 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
16110 72 63 20 3d 20 6e 65 77 44 61 74 61 62 61 73 65  rc = newDatabase
16120 28 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (pBt);.    }.   
16130 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
16140 76 65 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ve(p);.  }.  ret
16150 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
16160 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 75   Create a new cu
16170 72 73 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72  rsor for the BTr
16180 65 65 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73  ee whose root is
16190 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20   on the page.** 
161a0 69 54 61 62 6c 65 2e 20 20 54 68 65 20 61 63 74  iTable.  The act
161b0 20 6f 66 20 61 63 71 75 69 72 69 6e 67 20 61 20   of acquiring a 
161c0 63 75 72 73 6f 72 20 67 65 74 73 20 61 20 72 65  cursor gets a re
161d0 61 64 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20 74  ad lock on .** t
161e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
161f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61  ..**.** If wrFla
16200 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 63  g==0, then the c
16210 75 72 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62  ursor can only b
16220 65 20 75 73 65 64 20 66 6f 72 20 72 65 61 64 69  e used for readi
16230 6e 67 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67  ng..** If wrFlag
16240 3d 3d 31 2c 20 74 68 65 6e 20 74 68 65 20 63 75  ==1, then the cu
16250 72 73 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64  rsor can be used
16260 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20   for reading or 
16270 66 6f 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69  for.** writing i
16280 66 20 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f  f other conditio
16290 6e 73 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61  ns for writing a
162a0 72 65 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68  re also met.  Th
162b0 65 73 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 63  ese.** are the c
162c0 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d  onditions that m
162d0 75 73 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72  ust be met in or
162e0 64 65 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20  der for writing 
162f0 74 6f 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64  to.** be allowed
16300 3a 0a 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20  :.**.** 1:  The 
16310 63 75 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65  cursor must have
16320 20 62 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74   been opened wit
16330 68 20 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a  h wrFlag==1.**.*
16340 2a 20 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61  * 2:  Other data
16350 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
16360 20 74 68 61 74 20 73 68 61 72 65 20 74 68 65 20   that share the 
16370 73 61 6d 65 20 70 61 67 65 72 20 63 61 63 68 65  same pager cache
16380 0a 2a 2a 20 20 20 20 20 62 75 74 20 77 68 69 63  .**     but whic
16390 68 20 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65  h are not in the
163a0 20 52 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45   READ_UNCOMMITTE
163b0 44 20 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20  D state may not 
163c0 68 61 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73  have.**     curs
163d0 6f 72 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72  ors open with wr
163e0 46 6c 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73  Flag==0 on the s
163f0 61 6d 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65  ame table.  Othe
16400 72 77 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65  rwise.**     the
16410 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79   changes made by
16420 20 74 68 69 73 20 77 72 69 74 65 20 63 75 72 73   this write curs
16430 6f 72 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69  or would be visi
16440 62 6c 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68  ble to.**     th
16450 65 20 72 65 61 64 20 63 75 72 73 6f 72 73 20 69  e read cursors i
16460 6e 20 74 68 65 20 6f 74 68 65 72 20 64 61 74 61  n the other data
16470 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
16480 0a 2a 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64  .**.** 3:  The d
16490 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 20  atabase must be 
164a0 77 72 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e  writable (not on
164b0 20 72 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61   read-only media
164c0 29 0a 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72  ).**.** 4:  Ther
164d0 65 20 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74  e must be an act
164e0 69 76 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ive transaction.
164f0 0a 2a 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69  .**.** No checki
16500 6e 67 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61  ng is done to ma
16510 6b 65 20 73 75 72 65 20 74 68 61 74 20 70 61 67  ke sure that pag
16520 65 20 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20  e iTable really 
16530 69 73 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70  is the.** root p
16540 61 67 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e  age of a b-tree.
16550 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20    If it is not, 
16560 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20  then the cursor 
16570 61 63 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c  acquired.** will
16580 20 6e 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63   not work correc
16590 74 6c 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  tly..**.** It is
165a0 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68   assumed that th
165b0 65 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  e sqlite3BtreeCu
165c0 72 73 6f 72 53 69 7a 65 28 29 20 62 79 74 65 73  rsorSize() bytes
165d0 20 6f 66 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 70   of memory .** p
165e0 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 43 75  ointed to by pCu
165f0 72 20 68 61 76 65 20 62 65 65 6e 20 7a 65 72 6f  r have been zero
16600 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
16610 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
16620 62 74 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42  btreeCursor(.  B
16630 74 72 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20  tree *p,        
16640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16650 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72        /* The btr
16660 65 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62  ee */.  int iTab
16670 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  le,             
16680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16690 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74  * Root page of t
166a0 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  able to open */.
166b0 20 20 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20    int wrFlag,   
166c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166d0 20 20 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f           /* 1 to
166e0 20 77 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f   write. 0 read-o
166f0 6e 6c 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  nly */.  struct 
16700 4b 65 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66  KeyInfo *pKeyInf
16710 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o,              
16720 2f 2a 20 46 69 72 73 74 20 61 72 67 20 74 6f 20  /* First arg to 
16730 63 6f 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74  comparison funct
16740 69 6f 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f  ion */.  BtCurso
16750 72 20 2a 70 43 75 72 20 20 20 20 20 20 20 20 20  r *pCur         
16760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16770 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77  /* Space for new
16780 20 63 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20   cursor */.){.  
16790 69 6e 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20 6e  int rc;.  Pgno n
167a0 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72 65 64  Page;.  BtShared
167b0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
167c0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
167d0 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
167e0 78 28 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74  x(p) );.  assert
167f0 28 20 77 72 46 6c 61 67 3d 3d 30 20 7c 7c 20 77  ( wrFlag==0 || w
16800 72 46 6c 61 67 3d 3d 31 20 29 3b 0a 20 20 69 66  rFlag==1 );.  if
16810 28 20 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20  ( wrFlag ){.    
16820 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72 65  assert( !pBt->re
16830 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 20 20 69 66  adOnly );.    if
16840 28 20 4e 45 56 45 52 28 70 42 74 2d 3e 72 65 61  ( NEVER(pBt->rea
16850 64 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  dOnly) ){.      
16860 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 52 45  return SQLITE_RE
16870 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 7d 0a 20 20  ADONLY;.    }.  
16880 20 20 72 63 20 3d 20 63 68 65 63 6b 46 6f 72 52    rc = checkForR
16890 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70 2c 20  eadConflicts(p, 
168a0 69 54 61 62 6c 65 2c 20 30 2c 20 30 29 3b 0a 20  iTable, 0, 0);. 
168b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
168c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73  E_OK ){.      as
168d0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
168e0 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
168f0 43 48 45 20 29 3b 0a 20 20 20 20 20 20 72 65 74  CHE );.      ret
16900 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
16910 7d 0a 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 50  }..  if( pBt->pP
16920 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20 20 72  age1==0 ){.    r
16930 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 57 69 74  c = lockBtreeWit
16940 68 52 65 74 72 79 28 70 29 3b 0a 20 20 20 20 69  hRetry(p);.    i
16950 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16960 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
16970 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   rc;.    }.  }. 
16980 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20   pCur->pgnoRoot 
16990 3d 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 3b 0a  = (Pgno)iTable;.
169a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
169b0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
169c0 2d 3e 70 50 61 67 65 72 2c 20 28 69 6e 74 20 2a  ->pPager, (int *
169d0 29 26 6e 50 61 67 65 29 3b 20 0a 20 20 69 66 28  )&nPage); .  if(
169e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
169f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
16a00 0a 20 20 7d 0a 20 20 69 66 28 20 69 54 61 62 6c  .  }.  if( iTabl
16a10 65 3d 3d 31 20 26 26 20 6e 50 61 67 65 3d 3d 30  e==1 && nPage==0
16a20 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
16a30 49 54 45 5f 45 4d 50 54 59 3b 0a 20 20 20 20 67  ITE_EMPTY;.    g
16a40 6f 74 6f 20 63 72 65 61 74 65 5f 63 75 72 73 6f  oto create_curso
16a50 72 5f 65 78 63 65 70 74 69 6f 6e 3b 0a 20 20 7d  r_exception;.  }
16a60 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e  .  rc = getAndIn
16a70 69 74 50 61 67 65 28 70 42 74 2c 20 70 43 75 72  itPage(pBt, pCur
16a80 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75  ->pgnoRoot, &pCu
16a90 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29 3b 0a 20  r->apPage[0]);. 
16aa0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16ab0 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63  OK ){.    goto c
16ac0 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78 63  reate_cursor_exc
16ad0 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f  eption;.  }..  /
16ae0 2a 20 4e 6f 77 20 74 68 61 74 20 6e 6f 20 6f 74  * Now that no ot
16af0 68 65 72 20 65 72 72 6f 72 73 20 63 61 6e 20 6f  her errors can o
16b00 63 63 75 72 2c 20 66 69 6e 69 73 68 20 66 69 6c  ccur, finish fil
16b10 6c 69 6e 67 20 69 6e 20 74 68 65 20 42 74 43 75  ling in the BtCu
16b20 72 73 6f 72 0a 20 20 2a 2a 20 76 61 72 69 61 62  rsor.  ** variab
16b30 6c 65 73 2c 20 6c 69 6e 6b 20 74 68 65 20 63 75  les, link the cu
16b40 72 73 6f 72 20 69 6e 74 6f 20 74 68 65 20 42 74  rsor into the Bt
16b50 53 68 61 72 65 64 20 6c 69 73 74 20 61 6e 64 20  Shared list and 
16b60 73 65 74 20 2a 70 70 43 75 72 20 28 74 68 65 0a  set *ppCur (the.
16b70 20 20 2a 2a 20 6f 75 74 70 75 74 20 61 72 67 75    ** output argu
16b80 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
16b90 63 74 69 6f 6e 29 2e 0a 20 20 2a 2f 0a 20 20 70  ction)..  */.  p
16ba0 43 75 72 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20  Cur->pKeyInfo = 
16bb0 70 4b 65 79 49 6e 66 6f 3b 0a 20 20 70 43 75 72  pKeyInfo;.  pCur
16bc0 2d 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20  ->pBtree = p;.  
16bd0 70 43 75 72 2d 3e 70 42 74 20 3d 20 70 42 74 3b  pCur->pBt = pBt;
16be0 0a 20 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20  .  pCur->wrFlag 
16bf0 3d 20 28 75 38 29 77 72 46 6c 61 67 3b 0a 20 20  = (u8)wrFlag;.  
16c00 70 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 70 42  pCur->pNext = pB
16c10 74 2d 3e 70 43 75 72 73 6f 72 3b 0a 20 20 69 66  t->pCursor;.  if
16c20 28 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b  ( pCur->pNext ){
16c30 0a 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78 74  .    pCur->pNext
16c40 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 3b 0a  ->pPrev = pCur;.
16c50 20 20 7d 0a 20 20 70 42 74 2d 3e 70 43 75 72 73    }.  pBt->pCurs
16c60 6f 72 20 3d 20 70 43 75 72 3b 0a 20 20 70 43 75  or = pCur;.  pCu
16c70 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53  r->eState = CURS
16c80 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 70 43  OR_INVALID;.  pC
16c90 75 72 2d 3e 63 61 63 68 65 64 52 6f 77 69 64 20  ur->cachedRowid 
16ca0 3d 20 30 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53  = 0;..  return S
16cb0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 63 72 65 61 74  QLITE_OK;..creat
16cc0 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69  e_cursor_excepti
16cd0 6f 6e 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67  on:.  releasePag
16ce0 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30  e(pCur->apPage[0
16cf0 5d 29 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65  ]);.  unlockBtre
16d00 65 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a  eIfUnused(pBt);.
16d10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69    return rc;.}.i
16d20 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
16d30 75 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a  ursor(.  Btree *
16d40 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
16d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d60 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65       /* The btre
16d70 65 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c  e */.  int iTabl
16d80 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
16d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16da0 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20     /* Root page 
16db0 6f 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e  of table to open
16dc0 20 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67   */.  int wrFlag
16dd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
16de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16df0 20 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e    /* 1 to write.
16e00 20 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a   0 read-only */.
16e10 20 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f    struct KeyInfo
16e20 20 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20   *pKeyInfo,     
16e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16e40 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 78 43   First arg to xC
16e50 6f 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74  ompare() */.  Bt
16e60 43 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20  Cursor *pCur    
16e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
16e90 74 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65  te new cursor he
16ea0 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  re */.){.  int r
16eb0 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  c;.  sqlite3Btre
16ec0 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e  eEnter(p);.  p->
16ed0 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
16ee0 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72  .  rc = btreeCur
16ef0 73 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77  sor(p, iTable, w
16f00 72 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c  rFlag, pKeyInfo,
16f10 20 70 43 75 72 29 3b 0a 20 20 73 71 6c 69 74 65   pCur);.  sqlite
16f20 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
16f30 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
16f40 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
16f50 20 73 69 7a 65 20 6f 66 20 61 20 42 74 43 75 72   size of a BtCur
16f60 73 6f 72 20 6f 62 6a 65 63 74 20 69 6e 20 62 79  sor object in by
16f70 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  tes..**.** This 
16f80 69 6e 74 65 72 66 61 63 65 73 20 69 73 20 6e 65  interfaces is ne
16f90 65 64 65 64 20 73 6f 20 74 68 61 74 20 75 73 65  eded so that use
16fa0 72 73 20 6f 66 20 63 75 72 73 6f 72 73 20 63 61  rs of cursors ca
16fb0 6e 20 70 72 65 61 6c 6c 6f 63 61 74 65 0a 2a 2a  n preallocate.**
16fc0 20 73 75 66 66 69 63 69 65 6e 74 20 73 74 6f 72   sufficient stor
16fd0 61 67 65 20 74 6f 20 68 6f 6c 64 20 61 20 63 75  age to hold a cu
16fe0 72 73 6f 72 2e 20 20 54 68 65 20 42 74 43 75 72  rsor.  The BtCur
16ff0 73 6f 72 20 6f 62 6a 65 63 74 20 69 73 20 6f 70  sor object is op
17000 61 71 75 65 0a 2a 2a 20 74 6f 20 75 73 65 72 73  aque.** to users
17010 20 73 6f 20 74 68 65 79 20 63 61 6e 6e 6f 74 20   so they cannot 
17020 64 6f 20 74 68 65 20 73 69 7a 65 6f 66 28 29 20  do the sizeof() 
17030 74 68 65 6d 73 65 6c 76 65 73 20 2d 20 74 68 65  themselves - the
17040 79 20 6d 75 73 74 20 63 61 6c 6c 0a 2a 2a 20 74  y must call.** t
17050 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a  his routine..*/.
17060 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
17070 43 75 72 73 6f 72 53 69 7a 65 28 76 6f 69 64 29  CursorSize(void)
17080 7b 0a 20 20 72 65 74 75 72 6e 20 73 69 7a 65 6f  {.  return sizeo
17090 66 28 42 74 43 75 72 73 6f 72 29 3b 0a 7d 0a 0a  f(BtCursor);.}..
170a0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 61  /*.** Set the ca
170b0 63 68 65 64 20 72 6f 77 69 64 20 76 61 6c 75 65  ched rowid value
170c0 20 6f 66 20 65 76 65 72 79 20 63 75 72 73 6f 72   of every cursor
170d0 20 69 6e 20 74 68 65 20 73 61 6d 65 20 64 61 74   in the same dat
170e0 61 62 61 73 65 20 66 69 6c 65 0a 2a 2a 20 61 73  abase file.** as
170f0 20 70 43 75 72 20 61 6e 64 20 68 61 76 69 6e 67   pCur and having
17100 20 74 68 65 20 73 61 6d 65 20 72 6f 6f 74 20 70   the same root p
17110 61 67 65 20 6e 75 6d 62 65 72 20 61 73 20 70 43  age number as pC
17120 75 72 2e 20 20 54 68 65 20 76 61 6c 75 65 20 69  ur.  The value i
17130 73 0a 2a 2a 20 73 65 74 20 74 6f 20 69 52 6f 77  s.** set to iRow
17140 69 64 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 70  id..**.** Only p
17150 6f 73 69 74 69 76 65 20 72 6f 77 69 64 20 76 61  ositive rowid va
17160 6c 75 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65  lues are conside
17170 72 65 64 20 76 61 6c 69 64 20 66 6f 72 20 74 68  red valid for th
17180 69 73 20 63 61 63 68 65 2e 0a 2a 2a 20 54 68 65  is cache..** The
17190 20 63 61 63 68 65 20 69 73 20 69 6e 69 74 69 61   cache is initia
171a0 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 2c 20 69  lized to zero, i
171b0 6e 64 69 63 61 74 69 6e 67 20 61 6e 20 69 6e 76  ndicating an inv
171c0 61 6c 69 64 20 63 61 63 68 65 2e 0a 2a 2a 20 41  alid cache..** A
171d0 20 62 74 72 65 65 20 77 69 6c 6c 20 77 6f 72 6b   btree will work
171e0 20 66 69 6e 65 20 77 69 74 68 20 7a 65 72 6f 20   fine with zero 
171f0 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f 77 69  or negative rowi
17200 64 73 2e 20 20 57 65 20 6a 75 73 74 20 63 61 6e  ds.  We just can
17210 6e 6f 74 0a 2a 2a 20 63 61 63 68 65 20 7a 65 72  not.** cache zer
17220 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f  o or negative ro
17230 77 69 64 73 2c 20 77 68 69 63 68 20 6d 65 61 6e  wids, which mean
17240 73 20 74 61 62 6c 65 73 20 74 68 61 74 20 75 73  s tables that us
17250 65 20 7a 65 72 6f 20 6f 72 0a 2a 2a 20 6e 65 67  e zero or.** neg
17260 61 74 69 76 65 20 72 6f 77 69 64 73 20 6d 69 67  ative rowids mig
17270 68 74 20 72 75 6e 20 61 20 6c 69 74 74 6c 65 20  ht run a little 
17280 73 6c 6f 77 65 72 2e 20 20 42 75 74 20 69 6e 20  slower.  But in 
17290 70 72 61 63 74 69 63 65 2c 20 7a 65 72 6f 0a 2a  practice, zero.*
172a0 2a 20 6f 72 20 6e 65 67 61 74 69 76 65 20 72 6f  * or negative ro
172b0 77 69 64 73 20 61 72 65 20 76 65 72 79 20 75 6e  wids are very un
172c0 63 6f 6d 6d 6f 6e 20 73 6f 20 74 68 69 73 20 73  common so this s
172d0 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 20 70  hould not be a p
172e0 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 76 6f 69 64 20  roblem..*/.void 
172f0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43  sqlite3BtreeSetC
17300 61 63 68 65 64 52 6f 77 69 64 28 42 74 43 75 72  achedRowid(BtCur
17310 73 6f 72 20 2a 70 43 75 72 2c 20 73 71 6c 69 74  sor *pCur, sqlit
17320 65 33 5f 69 6e 74 36 34 20 69 52 6f 77 69 64 29  e3_int64 iRowid)
17330 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
17340 0a 20 20 66 6f 72 28 70 3d 70 43 75 72 2d 3e 70  .  for(p=pCur->p
17350 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20  Bt->pCursor; p; 
17360 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  p=p->pNext){.   
17370 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74   if( p->pgnoRoot
17380 3d 3d 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  ==pCur->pgnoRoot
17390 20 29 20 70 2d 3e 63 61 63 68 65 64 52 6f 77 69   ) p->cachedRowi
173a0 64 20 3d 20 69 52 6f 77 69 64 3b 0a 20 20 7d 0a  d = iRowid;.  }.
173b0 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
173c0 63 61 63 68 65 64 52 6f 77 69 64 3d 3d 69 52 6f  cachedRowid==iRo
173d0 77 69 64 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  wid );.}../*.** 
173e0 52 65 74 75 72 6e 20 74 68 65 20 63 61 63 68 65  Return the cache
173f0 64 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20  d rowid for the 
17400 67 69 76 65 6e 20 63 75 72 73 6f 72 2e 20 20 41  given cursor.  A
17410 20 6e 65 67 61 74 69 76 65 20 6f 72 20 7a 65 72   negative or zer
17420 6f 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75  o.** return valu
17430 65 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  e indicates that
17440 20 74 68 65 20 72 6f 77 69 64 20 63 61 63 68 65   the rowid cache
17450 20 69 73 20 69 6e 76 61 6c 69 64 20 61 6e 64 20   is invalid and 
17460 73 68 6f 75 6c 64 20 62 65 0a 2a 2a 20 69 67 6e  should be.** ign
17470 6f 72 65 64 2e 20 20 49 66 20 74 68 65 20 72 6f  ored.  If the ro
17480 77 69 64 20 63 61 63 68 65 20 68 61 73 20 6e 65  wid cache has ne
17490 76 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20  ver before been 
174a0 73 65 74 2c 20 74 68 65 6e 20 61 0a 2a 2a 20 7a  set, then a.** z
174b0 65 72 6f 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ero is returned.
174c0 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36  .*/.sqlite3_int6
174d0 34 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  4 sqlite3BtreeGe
174e0 74 43 61 63 68 65 64 52 6f 77 69 64 28 42 74 43  tCachedRowid(BtC
174f0 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
17500 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 63 61 63  return pCur->cac
17510 68 65 64 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a  hedRowid;.}../*.
17520 2a 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f  ** Close a curso
17530 72 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63  r.  The read loc
17540 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
17550 65 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73  e file is releas
17560 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c  ed.** when the l
17570 61 73 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c  ast cursor is cl
17580 6f 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  osed..*/.int sql
17590 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75  ite3BtreeCloseCu
175a0 72 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70  rsor(BtCursor *p
175b0 43 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70  Cur){.  Btree *p
175c0 42 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42  Btree = pCur->pB
175d0 74 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72  tree;.  if( pBtr
175e0 65 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  ee ){.    int i;
175f0 0a 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70  .    BtShared *p
17600 42 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a  Bt = pCur->pBt;.
17610 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
17620 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Enter(pBtree);. 
17630 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 42 74     pBt->db = pBt
17640 72 65 65 2d 3e 64 62 3b 0a 20 20 20 20 73 71 6c  ree->db;.    sql
17650 69 74 65 33 42 74 72 65 65 43 6c 65 61 72 43 75  ite3BtreeClearCu
17660 72 73 6f 72 28 70 43 75 72 29 3b 0a 20 20 20 20  rsor(pCur);.    
17670 69 66 28 20 70 43 75 72 2d 3e 70 50 72 65 76 20  if( pCur->pPrev 
17680 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d 3e 70  ){.      pCur->p
17690 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 43  Prev->pNext = pC
176a0 75 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ur->pNext;.    }
176b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 42 74 2d  else{.      pBt-
176c0 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75 72 2d  >pCursor = pCur-
176d0 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  >pNext;.    }.  
176e0 20 20 69 66 28 20 70 43 75 72 2d 3e 70 4e 65 78    if( pCur->pNex
176f0 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  t ){.      pCur-
17700 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d 20  >pNext->pPrev = 
17710 70 43 75 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20  pCur->pPrev;.   
17720 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20   }.    for(i=0; 
17730 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  i<=pCur->iPage; 
17740 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  i++){.      rele
17750 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
17760 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  Page[i]);.    }.
17770 20 20 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49      unlockBtreeI
17780 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20 20  fUnused(pBt);.  
17790 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72    invalidateOver
177a0 66 6c 6f 77 43 61 63 68 65 28 70 43 75 72 29 3b  flowCache(pCur);
177b0 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f  .    /* sqlite3_
177c0 66 72 65 65 28 70 43 75 72 29 3b 20 2a 2f 0a 20  free(pCur); */. 
177d0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c     sqlite3BtreeL
177e0 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20  eave(pBtree);.  
177f0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
17800 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  E_OK;.}../*.** M
17810 61 6b 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20  ake a temporary 
17820 63 75 72 73 6f 72 20 62 79 20 66 69 6c 6c 69 6e  cursor by fillin
17830 67 20 69 6e 20 74 68 65 20 66 69 65 6c 64 73 20  g in the fields 
17840 6f 66 20 70 54 65 6d 70 43 75 72 2e 0a 2a 2a 20  of pTempCur..** 
17850 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20 63 75  The temporary cu
17860 72 73 6f 72 20 69 73 20 6e 6f 74 20 6f 6e 20 74  rsor is not on t
17870 68 65 20 63 75 72 73 6f 72 20 6c 69 73 74 20 66  he cursor list f
17880 6f 72 20 74 68 65 20 42 74 72 65 65 2e 0a 2a 2f  or the Btree..*/
17890 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72  .void sqlite3Btr
178a0 65 65 47 65 74 54 65 6d 70 43 75 72 73 6f 72 28  eeGetTempCursor(
178b0 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
178c0 42 74 43 75 72 73 6f 72 20 2a 70 54 65 6d 70 43  BtCursor *pTempC
178d0 75 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ur){.  int i;.  
178e0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
178f0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
17900 3b 0a 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70  ;.  memcpy(pTemp
17910 43 75 72 2c 20 70 43 75 72 2c 20 73 69 7a 65 6f  Cur, pCur, sizeo
17920 66 28 42 74 43 75 72 73 6f 72 29 29 3b 0a 20 20  f(BtCursor));.  
17930 70 54 65 6d 70 43 75 72 2d 3e 70 4e 65 78 74 20  pTempCur->pNext 
17940 3d 20 30 3b 0a 20 20 70 54 65 6d 70 43 75 72 2d  = 0;.  pTempCur-
17950 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 66 6f  >pPrev = 0;.  fo
17960 72 28 69 3d 30 3b 20 69 3c 3d 70 54 65 6d 70 43  r(i=0; i<=pTempC
17970 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
17980 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
17990 72 52 65 66 28 70 54 65 6d 70 43 75 72 2d 3e 61  rRef(pTempCur->a
179a0 70 50 61 67 65 5b 69 5d 2d 3e 70 44 62 50 61 67  pPage[i]->pDbPag
179b0 65 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  e);.  }.  assert
179c0 28 20 70 54 65 6d 70 43 75 72 2d 3e 70 4b 65 79  ( pTempCur->pKey
179d0 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ==0 );.}../*.** 
179e0 44 65 6c 65 74 65 20 61 20 74 65 6d 70 6f 72 61  Delete a tempora
179f0 72 79 20 63 75 72 73 6f 72 20 73 75 63 68 20 61  ry cursor such a
17a00 73 20 77 61 73 20 6d 61 64 65 20 62 79 20 74 68  s was made by th
17a10 65 20 43 72 65 61 74 65 54 65 6d 70 6f 72 61 72  e CreateTemporar
17a20 79 43 75 72 73 6f 72 28 29 0a 2a 2a 20 66 75 6e  yCursor().** fun
17a30 63 74 69 6f 6e 20 61 62 6f 76 65 2e 0a 2a 2f 0a  ction above..*/.
17a40 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74 72 65  void sqlite3Btre
17a50 65 52 65 6c 65 61 73 65 54 65 6d 70 43 75 72 73  eReleaseTempCurs
17a60 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  or(BtCursor *pCu
17a70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  r){.  int i;.  a
17a80 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
17a90 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
17aa0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70  .  for(i=0; i<=p
17ab0 43 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29  Cur->iPage; i++)
17ac0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  {.    sqlite3Pag
17ad0 65 72 55 6e 72 65 66 28 70 43 75 72 2d 3e 61 70  erUnref(pCur->ap
17ae0 50 61 67 65 5b 69 5d 2d 3e 70 44 62 50 61 67 65  Page[i]->pDbPage
17af0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
17b00 5f 66 72 65 65 28 70 43 75 72 2d 3e 70 4b 65 79  _free(pCur->pKey
17b10 29 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61  );.}..../*.** Ma
17b20 6b 65 20 73 75 72 65 20 74 68 65 20 42 74 43 75  ke sure the BtCu
17b30 72 73 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74  rsor* given in t
17b40 68 65 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20  he argument has 
17b50 61 20 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72  a valid.** BtCur
17b60 73 6f 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75  sor.info structu
17b70 72 65 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f  re.  If it is no
17b80 74 20 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c  t already valid,
17b90 20 63 61 6c 6c 0a 2a 2a 20 73 71 6c 69 74 65 33   call.** sqlite3
17ba0 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29  BtreeParseCell()
17bb0 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a   to fill it in..
17bc0 2a 2a 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69  **.** BtCursor.i
17bd0 6e 66 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f  nfo is a cache o
17be0 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  f the informatio
17bf0 6e 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  n in the current
17c00 20 63 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20   cell..** Using 
17c10 74 68 69 73 20 63 61 63 68 65 20 72 65 64 75 63  this cache reduc
17c20 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  es the number of
17c30 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
17c40 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28  3BtreeParseCell(
17c50 29 2e 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36  )..**.** 2007-06
17c60 2d 32 35 3a 20 20 54 68 65 72 65 20 69 73 20 61  -25:  There is a
17c70 20 62 75 67 20 69 6e 20 73 6f 6d 65 20 76 65 72   bug in some ver
17c80 73 69 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74 68  sions of MSVC th
17c90 61 74 20 63 61 75 73 65 20 74 68 65 0a 2a 2a 20  at cause the.** 
17ca0 63 6f 6d 70 69 6c 65 72 20 74 6f 20 63 72 61 73  compiler to cras
17cb0 68 20 77 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e  h when getCellIn
17cc0 66 6f 28 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e  fo() is implemen
17cd0 74 65 64 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a  ted as a macro..
17ce0 2a 2a 20 42 75 74 20 74 68 65 72 65 20 69 73 20  ** But there is 
17cf0 61 20 6d 65 61 73 75 72 65 61 62 6c 65 20 73 70  a measureable sp
17d00 65 65 64 20 61 64 76 61 6e 74 61 67 65 20 74 6f  eed advantage to
17d10 20 75 73 69 6e 67 20 74 68 65 20 6d 61 63 72 6f   using the macro
17d20 20 6f 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e   on gcc.** (when
17d30 20 6c 65 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f   less compiler o
17d40 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b  ptimizations lik
17d50 65 20 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65  e -Os or -O0 are
17d60 20 75 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a   used and the.**
17d70 20 63 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74   compiler is not
17d80 20 64 6f 69 6e 67 20 61 67 72 65 73 73 69 76 65   doing agressive
17d90 20 69 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20   inlining.)  So 
17da0 77 65 20 75 73 65 20 61 20 72 65 61 6c 20 66 75  we use a real fu
17db0 6e 63 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53  nction.** for MS
17dc0 56 43 20 61 6e 64 20 61 20 6d 61 63 72 6f 20 66  VC and a macro f
17dd0 6f 72 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c  or everything el
17de0 73 65 2e 20 20 54 69 63 6b 65 74 20 23 32 34 35  se.  Ticket #245
17df0 37 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44  7..*/.#ifndef ND
17e00 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f  EBUG.  static vo
17e10 69 64 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66  id assertCellInf
17e20 6f 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  o(BtCursor *pCur
17e30 29 7b 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20  ){.    CellInfo 
17e40 69 6e 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50  info;.    int iP
17e50 61 67 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  age = pCur->iPag
17e60 65 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69  e;.    memset(&i
17e70 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69  nfo, 0, sizeof(i
17e80 6e 66 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  nfo));.    sqlit
17e90 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
17ea0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50  (pCur->apPage[iP
17eb0 61 67 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64  age], pCur->aiId
17ec0 78 5b 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29  x[iPage], &info)
17ed0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 6d 65  ;.    assert( me
17ee0 6d 63 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75  mcmp(&info, &pCu
17ef0 72 2d 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28  r->info, sizeof(
17f00 69 6e 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d  info))==0 );.  }
17f10 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65  .#else.  #define
17f20 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
17f30 78 29 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  x).#endif.#ifdef
17f40 20 5f 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55   _MSC_VER.  /* U
17f50 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69  se a real functi
17f60 6f 6e 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f  on in MSVC to wo
17f70 72 6b 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69  rk around bugs i
17f80 6e 20 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e  n that compiler.
17f90 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69   */.  static voi
17fa0 64 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74  d getCellInfo(Bt
17fb0 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
17fc0 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66     if( pCur->inf
17fd0 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20  o.nSize==0 ){.  
17fe0 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20      int iPage = 
17ff0 70 43 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20  pCur->iPage;.   
18000 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
18010 61 72 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61  arseCell(pCur->a
18020 70 50 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75  pPage[iPage],pCu
18030 72 2d 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c  r->aiIdx[iPage],
18040 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20  &pCur->info);.  
18050 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
18060 4b 65 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c  Key = 1;.    }el
18070 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  se{.      assert
18080 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a  CellInfo(pCur);.
18090 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20      }.  }.#else 
180a0 2f 2a 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56  /* if not _MSC_V
180b0 45 52 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61  ER */.  /* Use a
180c0 20 6d 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74   macro in all ot
180d0 68 65 72 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f  her compilers so
180e0 20 74 68 61 74 20 74 68 65 20 66 75 6e 63 74 69   that the functi
180f0 6f 6e 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f  on is inlined */
18100 0a 23 64 65 66 69 6e 65 20 67 65 74 43 65 6c 6c  .#define getCell
18110 49 6e 66 6f 28 70 43 75 72 29 20 20 20 20 20 20  Info(pCur)      
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 20 20 20 20 20 20 20 20                  
18150 5c 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e  \.  if( pCur->in
18160 66 6f 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20  fo.nSize==0 ){  
18170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181a0 20 5c 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65   \.    int iPage
181b0 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 20   = pCur->iPage; 
181c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
181f0 20 20 5c 0a 20 20 20 20 73 71 6c 69 74 65 33 42    \.    sqlite3B
18200 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43  treeParseCell(pC
18210 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65  ur->apPage[iPage
18220 5d 2c 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50  ],pCur->aiIdx[iP
18230 61 67 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f  age],&pCur->info
18240 29 3b 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e 76  ); \.    pCur->v
18250 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b 20 20 20  alidNKey = 1;   
18260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18290 20 20 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20      \.  }else{  
182a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
182e0 20 20 20 20 20 5c 0a 20 20 20 20 61 73 73 65 72       \.    asser
182f0 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b  tCellInfo(pCur);
18300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18330 20 20 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64        \.  }.#end
18340 69 66 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a  if /* _MSC_VER *
18350 2f 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53  /../*.** Set *pS
18360 69 7a 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20  ize to the size 
18370 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 6e 65  of the buffer ne
18380 65 64 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65  eded to hold the
18390 20 76 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65   value of.** the
183a0 20 6b 65 79 20 66 6f 72 20 74 68 65 20 63 75 72   key for the cur
183b0 72 65 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20  rent entry.  If 
183c0 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f  the cursor is no
183d0 74 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f  t pointing.** to
183e0 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20   a valid entry, 
183f0 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  *pSize is set to
18400 20 30 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61   0. .**.** For a
18410 20 74 61 62 6c 65 20 77 69 74 68 20 74 68 65 20   table with the 
18420 49 4e 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c  INTKEY flag set,
18430 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
18440 74 75 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a  turns the key.**
18450 20 69 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65   itself, not the
18460 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
18470 20 69 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a   in the key..*/.
18480 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
18490 4b 65 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72  KeySize(BtCursor
184a0 20 2a 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69   *pCur, i64 *pSi
184b0 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  ze){.  int rc;..
184c0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
184d0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
184e0 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f   );.  rc = resto
184f0 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
18500 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63  (pCur);.  if( rc
18510 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
18520 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
18530 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
18540 49 4e 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  INVALID || pCur-
18550 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
18560 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28  VALID );.    if(
18570 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
18580 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b  URSOR_INVALID ){
18590 0a 20 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20  .      *pSize = 
185a0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
185b0 20 20 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28      getCellInfo(
185c0 70 43 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53  pCur);.      *pS
185d0 69 7a 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ize = pCur->info
185e0 2e 6e 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  .nKey;.    }.  }
185f0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
18600 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a  ./*.** Set *pSiz
18610 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  e to the number 
18620 6f 66 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  of bytes of data
18630 20 69 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68   in the entry th
18640 65 0a 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72  e.** cursor curr
18650 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e  ently points to.
18660 20 20 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20    Always return 
18670 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61  SQLITE_OK..** Fa
18680 69 6c 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73  ilure is not pos
18690 73 69 62 6c 65 2e 20 20 49 66 20 74 68 65 20 63  sible.  If the c
186a0 75 72 73 6f 72 20 69 73 20 6e 6f 74 20 63 75 72  ursor is not cur
186b0 72 65 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69  rently.** pointi
186c0 6e 67 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 28  ng to an entry (
186d0 77 68 69 63 68 20 63 61 6e 20 68 61 70 70 65 6e  which can happen
186e0 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  , for example, i
186f0 66 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  f.** the databas
18700 65 20 69 73 20 65 6d 70 74 79 29 20 74 68 65 6e  e is empty) then
18710 20 2a 70 53 69 7a 65 20 69 73 20 73 65 74 20 74   *pSize is set t
18720 6f 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  o 0..*/.int sqli
18730 74 65 33 42 74 72 65 65 44 61 74 61 53 69 7a 65  te3BtreeDataSize
18740 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
18750 20 75 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20   u32 *pSize){.  
18760 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
18770 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
18780 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72  tex(pCur) );.  r
18790 63 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f  c = restoreCurso
187a0 72 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b  rPosition(pCur);
187b0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
187c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65  E_OK ){.    asse
187d0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
187e0 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  ==CURSOR_INVALID
187f0 20 7c 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65   || pCur->eState
18800 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
18810 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e  ;.    if( pCur->
18820 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49  eState==CURSOR_I
18830 4e 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20  NVALID ){.      
18840 2f 2a 20 4e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  /* Not pointing 
18850 61 74 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79  at a valid entry
18860 20 2d 20 73 65 74 20 2a 70 53 69 7a 65 20 74 6f   - set *pSize to
18870 20 30 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 70 53   0. */.      *pS
18880 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ize = 0;.    }el
18890 73 65 7b 0a 20 20 20 20 20 20 67 65 74 43 65 6c  se{.      getCel
188a0 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20  lInfo(pCur);.   
188b0 20 20 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72     *pSize = pCur
188c0 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20  ->info.nData;.  
188d0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
188e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69   rc;.}../*.** Gi
188f0 76 65 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ven the page num
18900 62 65 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c  ber of an overfl
18910 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ow page in the d
18920 61 74 61 62 61 73 65 20 28 70 61 72 61 6d 65 74  atabase (paramet
18930 65 72 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69  er.** ovfl), thi
18940 73 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73  s function finds
18950 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
18960 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61 67   of the next pag
18970 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e  e in the .** lin
18980 6b 65 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72  ked list of over
18990 66 6c 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70  flow pages. If p
189a0 6f 73 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73  ossible, it uses
189b0 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d   the auto-vacuum
189c0 0a 2a 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20  .** pointer-map 
189d0 64 61 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20  data instead of 
189e0 72 65 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74  reading the cont
189f0 65 6e 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c  ent of page ovfl
18a00 20 74 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a   to do so. .**.*
18a10 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
18a20 63 75 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65  curs an SQLite e
18a30 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
18a40 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65  urned. Otherwise
18a50 3a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  :.**.** The page
18a60 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
18a70 65 78 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  ext overflow pag
18a80 65 20 69 6e 20 74 68 65 20 6c 69 6e 6b 65 64 20  e in the linked 
18a90 6c 69 73 74 20 69 73 20 0a 2a 2a 20 77 72 69 74  list is .** writ
18aa0 74 65 6e 20 74 6f 20 2a 70 50 67 6e 6f 4e 65 78  ten to *pPgnoNex
18ab0 74 2e 20 49 66 20 70 61 67 65 20 6f 76 66 6c 20  t. If page ovfl 
18ac0 69 73 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  is the last page
18ad0 20 69 6e 20 69 74 73 20 6c 69 6e 6b 65 64 20 0a   in its linked .
18ae0 2a 2a 20 6c 69 73 74 2c 20 2a 70 50 67 6e 6f 4e  ** list, *pPgnoN
18af0 65 78 74 20 69 73 20 73 65 74 20 74 6f 20 7a 65  ext is set to ze
18b00 72 6f 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 70 70  ro. .**.** If pp
18b10 50 61 67 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  Page is not NULL
18b20 2c 20 61 6e 64 20 61 20 72 65 66 65 72 65 6e 63  , and a referenc
18b30 65 20 74 6f 20 74 68 65 20 4d 65 6d 50 61 67 65  e to the MemPage
18b40 20 6f 62 6a 65 63 74 20 63 6f 72 72 65 73 70 6f   object correspo
18b50 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 61 67 65  nding.** to page
18b60 20 6e 75 6d 62 65 72 20 70 4f 76 66 6c 20 77 61   number pOvfl wa
18b70 73 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 65 6e  s obtained, then
18b80 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
18b90 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 61 74  to point to that
18ba0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 2e 20 49  .** reference. I
18bb0 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
18bc0 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
18bd0 61 6c 6c 65 72 20 74 6f 20 63 61 6c 6c 20 72 65  aller to call re
18be0 6c 65 61 73 65 50 61 67 65 28 29 0a 2a 2a 20 6f  leasePage().** o
18bf0 6e 20 2a 70 70 50 61 67 65 20 74 6f 20 66 72 65  n *ppPage to fre
18c00 65 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 2e  e the reference.
18c10 20 49 6e 20 6e 6f 20 72 65 66 65 72 65 6e 63 65   In no reference
18c20 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 28 62   was obtained (b
18c30 65 63 61 75 73 65 0a 2a 2a 20 74 68 65 20 70 6f  ecause.** the po
18c40 69 6e 74 65 72 2d 6d 61 70 20 77 61 73 20 75 73  inter-map was us
18c50 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  ed to obtain the
18c60 20 76 61 6c 75 65 20 66 6f 72 20 2a 70 50 67 6e   value for *pPgn
18c70 6f 4e 65 78 74 29 2c 20 74 68 65 6e 0a 2a 2a 20  oNext), then.** 
18c80 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
18c90 6f 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  o zero..*/.stati
18ca0 63 20 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f  c int getOverflo
18cb0 77 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  wPage(.  BtShare
18cc0 64 20 2a 70 42 74 2c 20 0a 20 20 50 67 6e 6f 20  d *pBt, .  Pgno 
18cd0 6f 76 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20  ovfl,           
18ce0 20 20 20 20 20 20 20 20 2f 2a 20 4f 76 65 72 66          /* Overf
18cf0 6c 6f 77 20 70 61 67 65 20 2a 2f 0a 20 20 4d 65  low page */.  Me
18d00 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20  mPage **ppPage, 
18d10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
18d20 54 3a 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c  T: MemPage handl
18d30 65 20 28 6d 61 79 20 62 65 20 4e 55 4c 4c 29 20  e (may be NULL) 
18d40 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  */.  Pgno *pPgno
18d50 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20  Next            
18d60 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f    /* OUT: Next o
18d70 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d  verflow page num
18d80 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f  ber */.){.  Pgno
18d90 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 4d 65 6d   next = 0;.  Mem
18da0 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b  Page *pPage = 0;
18db0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
18dc0 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
18dd0 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
18de0 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
18df0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 67   );.  assert(pPg
18e00 6e 6f 4e 65 78 74 29 3b 0a 0a 23 69 66 6e 64 65  noNext);..#ifnde
18e10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
18e20 54 4f 56 41 43 55 55 4d 0a 20 20 2f 2a 20 54 72  TOVACUUM.  /* Tr
18e30 79 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6e 65  y to find the ne
18e40 78 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f  xt page in the o
18e50 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 75 73 69  verflow list usi
18e60 6e 67 20 74 68 65 0a 20 20 2a 2a 20 61 75 74 6f  ng the.  ** auto
18e70 76 61 63 75 75 6d 20 70 6f 69 6e 74 65 72 2d 6d  vacuum pointer-m
18e80 61 70 20 70 61 67 65 73 2e 20 47 75 65 73 73 20  ap pages. Guess 
18e90 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 70 61  that the next pa
18ea0 67 65 20 69 6e 20 0a 20 20 2a 2a 20 74 68 65 20  ge in .  ** the 
18eb0 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74 20 69 73  overflow list is
18ec0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 28 6f 76   page number (ov
18ed0 66 6c 2b 31 29 2e 20 49 66 20 74 68 61 74 20 67  fl+1). If that g
18ee0 75 65 73 73 20 74 75 72 6e 73 20 0a 20 20 2a 2a  uess turns .  **
18ef0 20 6f 75 74 20 74 6f 20 62 65 20 77 72 6f 6e 67   out to be wrong
18f00 2c 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 6c  , fall back to l
18f10 6f 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 20  oading the data 
18f20 6f 66 20 70 61 67 65 20 0a 20 20 2a 2a 20 6e 75  of page .  ** nu
18f30 6d 62 65 72 20 6f 76 66 6c 20 74 6f 20 64 65 74  mber ovfl to det
18f40 65 72 6d 69 6e 65 20 74 68 65 20 6e 65 78 74 20  ermine the next 
18f50 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 20 20 2a  page number..  *
18f60 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  /.  if( pBt->aut
18f70 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  oVacuum ){.    P
18f80 67 6e 6f 20 70 67 6e 6f 3b 0a 20 20 20 20 50 67  gno pgno;.    Pg
18f90 6e 6f 20 69 47 75 65 73 73 20 3d 20 6f 76 66 6c  no iGuess = ovfl
18fa0 2b 31 3b 0a 20 20 20 20 75 38 20 65 54 79 70 65  +1;.    u8 eType
18fb0 3b 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 50 54  ;..    while( PT
18fc0 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
18fd0 20 69 47 75 65 73 73 29 20 7c 7c 20 69 47 75 65   iGuess) || iGue
18fe0 73 73 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ss==PENDING_BYTE
18ff0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
19000 20 20 20 20 69 47 75 65 73 73 2b 2b 3b 0a 20 20      iGuess++;.  
19010 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 69 47 75    }..    if( iGu
19020 65 73 73 3c 3d 70 61 67 65 72 50 61 67 65 63 6f  ess<=pagerPageco
19030 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20  unt(pBt) ){.    
19040 20 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74    rc = ptrmapGet
19050 28 70 42 74 2c 20 69 47 75 65 73 73 2c 20 26 65  (pBt, iGuess, &e
19060 54 79 70 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20  Type, &pgno);.  
19070 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
19080 54 45 5f 4f 4b 20 26 26 20 65 54 79 70 65 3d 3d  TE_OK && eType==
19090 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32  PTRMAP_OVERFLOW2
190a0 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c 20 29   && pgno==ovfl )
190b0 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74 20 3d  {.        next =
190c0 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20 20 20   iGuess;.       
190d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 44 4f 4e   rc = SQLITE_DON
190e0 45 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  E;.      }.    }
190f0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
19100 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
19110 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
19120 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
19130 28 70 42 74 2c 20 6f 76 66 6c 2c 20 26 70 50 61  (pBt, ovfl, &pPa
19140 67 65 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65  ge, 0);.    asse
19150 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rt(rc==SQLITE_OK
19160 20 7c 7c 20 70 50 61 67 65 3d 3d 30 29 3b 0a 20   || pPage==0);. 
19170 20 20 20 69 66 28 20 6e 65 78 74 3d 3d 30 20 26     if( next==0 &
19180 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
19190 29 7b 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20  ){.      next = 
191a0 67 65 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  get4byte(pPage->
191b0 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  aData);.    }.  
191c0 7d 0a 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20  }..  *pPgnoNext 
191d0 3d 20 6e 65 78 74 3b 0a 20 20 69 66 28 20 70 70  = next;.  if( pp
191e0 50 61 67 65 20 29 7b 0a 20 20 20 20 2a 70 70 50  Page ){.    *ppP
191f0 61 67 65 20 3d 20 70 50 61 67 65 3b 0a 20 20 7d  age = pPage;.  }
19200 65 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73  else{.    releas
19210 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
19220 7d 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  }.  return (rc==
19230 53 51 4c 49 54 45 5f 44 4f 4e 45 20 3f 20 53 51  SQLITE_DONE ? SQ
19240 4c 49 54 45 5f 4f 4b 20 3a 20 72 63 29 3b 0a 7d  LITE_OK : rc);.}
19250 0a 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 64 61 74  ../*.** Copy dat
19260 61 20 66 72 6f 6d 20 61 20 62 75 66 66 65 72 20  a from a buffer 
19270 74 6f 20 61 20 70 61 67 65 2c 20 6f 72 20 66 72  to a page, or fr
19280 6f 6d 20 61 20 70 61 67 65 20 74 6f 20 61 20 62  om a page to a b
19290 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 70 50 61  uffer..**.** pPa
192a0 79 6c 6f 61 64 20 69 73 20 61 20 70 6f 69 6e 74  yload is a point
192b0 65 72 20 74 6f 20 64 61 74 61 20 73 74 6f 72 65  er to data store
192c0 64 20 6f 6e 20 64 61 74 61 62 61 73 65 20 70 61  d on database pa
192d0 67 65 20 70 44 62 50 61 67 65 2e 0a 2a 2a 20 49  ge pDbPage..** I
192e0 66 20 61 72 67 75 6d 65 6e 74 20 65 4f 70 20 69  f argument eOp i
192f0 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 6e 42  s false, then nB
19300 79 74 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  yte bytes of dat
19310 61 20 61 72 65 20 63 6f 70 69 65 64 0a 2a 2a 20  a are copied.** 
19320 66 72 6f 6d 20 70 50 61 79 6c 6f 61 64 20 74 6f  from pPayload to
19330 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
19340 74 65 64 20 61 74 20 62 79 20 70 42 75 66 2e 20  ted at by pBuf. 
19350 49 66 20 65 4f 70 20 69 73 20 74 72 75 65 2c 0a  If eOp is true,.
19360 2a 2a 20 74 68 65 6e 20 73 71 6c 69 74 65 33 50  ** then sqlite3P
19370 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63  agerWrite() is c
19380 61 6c 6c 65 64 20 6f 6e 20 70 44 62 50 61 67 65  alled on pDbPage
19390 20 61 6e 64 20 6e 42 79 74 65 20 62 79 74 65 73   and nByte bytes
193a0 0a 2a 2a 20 6f 66 20 64 61 74 61 20 61 72 65 20  .** of data are 
193b0 63 6f 70 69 65 64 20 66 72 6f 6d 20 74 68 65 20  copied from the 
193c0 62 75 66 66 65 72 20 70 42 75 66 20 74 6f 20 70  buffer pBuf to p
193d0 50 61 79 6c 6f 61 64 2e 0a 2a 2a 0a 2a 2a 20 53  Payload..**.** S
193e0 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
193f0 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73 2c  rned on success,
19400 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65 72   otherwise an er
19410 72 6f 72 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  ror code..*/.sta
19420 74 69 63 20 69 6e 74 20 63 6f 70 79 50 61 79 6c  tic int copyPayl
19430 6f 61 64 28 0a 20 20 76 6f 69 64 20 2a 70 50 61  oad(.  void *pPa
19440 79 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 20 20  yload,          
19450 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 70   /* Pointer to p
19460 61 67 65 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f  age data */.  vo
19470 69 64 20 2a 70 42 75 66 2c 20 20 20 20 20 20 20  id *pBuf,       
19480 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
19490 65 72 20 74 6f 20 62 75 66 66 65 72 20 2a 2f 0a  er to buffer */.
194a0 20 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20 20    int nByte,    
194b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
194c0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
194d0 6f 20 63 6f 70 79 20 2a 2f 0a 20 20 69 6e 74 20  o copy */.  int 
194e0 65 4f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  eOp,            
194f0 20 20 20 20 20 20 2f 2a 20 30 20 2d 3e 20 63 6f        /* 0 -> co
19500 70 79 20 66 72 6f 6d 20 70 61 67 65 2c 20 31 20  py from page, 1 
19510 2d 3e 20 63 6f 70 79 20 74 6f 20 70 61 67 65 20  -> copy to page 
19520 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62  */.  DbPage *pDb
19530 50 61 67 65 20 20 20 20 20 20 20 20 20 20 20 2f  Page           /
19540 2a 20 50 61 67 65 20 63 6f 6e 74 61 69 6e 69 6e  * Page containin
19550 67 20 70 50 61 79 6c 6f 61 64 20 2a 2f 0a 29 7b  g pPayload */.){
19560 0a 20 20 69 66 28 20 65 4f 70 20 29 7b 0a 20 20  .  if( eOp ){.  
19570 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20 66    /* Copy data f
19580 72 6f 6d 20 62 75 66 66 65 72 20 74 6f 20 70 61  rom buffer to pa
19590 67 65 20 28 61 20 77 72 69 74 65 20 6f 70 65 72  ge (a write oper
195a0 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 69 6e  ation) */.    in
195b0 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61  t rc = sqlite3Pa
195c0 67 65 72 57 72 69 74 65 28 70 44 62 50 61 67 65  gerWrite(pDbPage
195d0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
195e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
195f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
19600 20 7d 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50   }.    memcpy(pP
19610 61 79 6c 6f 61 64 2c 20 70 42 75 66 2c 20 6e 42  ayload, pBuf, nB
19620 79 74 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  yte);.  }else{. 
19630 20 20 20 2f 2a 20 43 6f 70 79 20 64 61 74 61 20     /* Copy data 
19640 66 72 6f 6d 20 70 61 67 65 20 74 6f 20 62 75 66  from page to buf
19650 66 65 72 20 28 61 20 72 65 61 64 20 6f 70 65 72  fer (a read oper
19660 61 74 69 6f 6e 29 20 2a 2f 0a 20 20 20 20 6d 65  ation) */.    me
19670 6d 63 70 79 28 70 42 75 66 2c 20 70 50 61 79 6c  mcpy(pBuf, pPayl
19680 6f 61 64 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d  oad, nByte);.  }
19690 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
196a0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
196b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75  is function is u
196c0 73 65 64 20 74 6f 20 72 65 61 64 20 6f 72 20 6f  sed to read or o
196d0 76 65 72 77 72 69 74 65 20 70 61 79 6c 6f 61 64  verwrite payload
196e0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20   information.** 
196f0 66 6f 72 20 74 68 65 20 65 6e 74 72 79 20 74 68  for the entry th
19700 61 74 20 74 68 65 20 70 43 75 72 20 63 75 72 73  at the pCur curs
19710 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74  or is pointing t
19720 6f 2e 20 49 66 20 74 68 65 20 65 4f 70 0a 2a 2a  o. If the eOp.**
19730 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30 2c   parameter is 0,
19740 20 74 68 69 73 20 69 73 20 61 20 72 65 61 64 20   this is a read 
19750 6f 70 65 72 61 74 69 6f 6e 20 28 64 61 74 61 20  operation (data 
19760 63 6f 70 69 65 64 20 69 6e 74 6f 0a 2a 2a 20 62  copied into.** b
19770 75 66 66 65 72 20 70 42 75 66 29 2e 20 49 66 20  uffer pBuf). If 
19780 69 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  it is non-zero, 
19790 61 20 77 72 69 74 65 20 28 64 61 74 61 20 63 6f  a write (data co
197a0 70 69 65 64 20 66 72 6f 6d 0a 2a 2a 20 62 75 66  pied from.** buf
197b0 66 65 72 20 70 42 75 66 29 2e 0a 2a 2a 0a 2a 2a  fer pBuf)..**.**
197c0 20 41 20 74 6f 74 61 6c 20 6f 66 20 22 61 6d 74   A total of "amt
197d0 22 20 62 79 74 65 73 20 61 72 65 20 72 65 61 64  " bytes are read
197e0 20 6f 72 20 77 72 69 74 74 65 6e 20 62 65 67 69   or written begi
197f0 6e 6e 69 6e 67 20 61 74 20 22 6f 66 66 73 65 74  nning at "offset
19800 22 2e 0a 2a 2a 20 44 61 74 61 20 69 73 20 72 65  "..** Data is re
19810 61 64 20 74 6f 20 6f 72 20 66 72 6f 6d 20 74 68  ad to or from th
19820 65 20 62 75 66 66 65 72 20 70 42 75 66 2e 0a 2a  e buffer pBuf..*
19830 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
19840 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 6b 65 20  e does not make 
19850 61 20 64 69 73 74 69 6e 63 74 69 6f 6e 20 62 65  a distinction be
19860 74 77 65 65 6e 20 6b 65 79 20 61 6e 64 20 64 61  tween key and da
19870 74 61 2e 0a 2a 2a 20 49 74 20 6a 75 73 74 20 72  ta..** It just r
19880 65 61 64 73 20 6f 72 20 77 72 69 74 65 73 20 62  eads or writes b
19890 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20 70 61  ytes from the pa
198a0 79 6c 6f 61 64 20 61 72 65 61 2e 20 20 44 61 74  yload area.  Dat
198b0 61 20 6d 69 67 68 74 20 0a 2a 2a 20 61 70 70 65  a might .** appe
198c0 61 72 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 70  ar on the main p
198d0 61 67 65 20 6f 72 20 62 65 20 73 63 61 74 74 65  age or be scatte
198e0 72 65 64 20 6f 75 74 20 6f 6e 20 6d 75 6c 74 69  red out on multi
198f0 70 6c 65 20 6f 76 65 72 66 6c 6f 77 20 0a 2a 2a  ple overflow .**
19900 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   pages..**.** If
19910 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e 69 73   the BtCursor.is
19920 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66  IncrblobHandle f
19930 6c 61 67 20 69 73 20 73 65 74 2c 20 61 6e 64 20  lag is set, and 
19940 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 63  the current.** c
19950 75 72 73 6f 72 20 65 6e 74 72 79 20 75 73 65 73  ursor entry uses
19960 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65   one or more ove
19970 72 66 6c 6f 77 20 70 61 67 65 73 2c 20 74 68 69  rflow pages, thi
19980 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 61 6c  s function.** al
19990 6c 6f 63 61 74 65 73 20 73 70 61 63 65 20 66 6f  locates space fo
199a0 72 20 61 6e 64 20 6c 61 7a 69 6c 79 20 70 6f 70  r and lazily pop
199b0 6c 75 61 74 65 73 20 74 68 65 20 6f 76 65 72 66  luates the overf
199c0 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 0a 2a  low page-list .*
199d0 2a 20 63 61 63 68 65 20 61 72 72 61 79 20 28 42  * cache array (B
199e0 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
199f0 77 29 2e 20 53 75 62 73 65 71 75 65 6e 74 20 63  w). Subsequent c
19a00 61 6c 6c 73 20 75 73 65 20 74 68 69 73 0a 2a 2a  alls use this.**
19a10 20 63 61 63 68 65 20 74 6f 20 6d 61 6b 65 20 73   cache to make s
19a20 65 65 6b 69 6e 67 20 74 6f 20 74 68 65 20 73 75  eeking to the su
19a30 70 70 6c 69 65 64 20 6f 66 66 73 65 74 20 6d 6f  pplied offset mo
19a40 72 65 20 65 66 66 69 63 69 65 6e 74 2e 0a 2a 2a  re efficient..**
19a50 0a 2a 2a 20 4f 6e 63 65 20 61 6e 20 6f 76 65 72  .** Once an over
19a60 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
19a70 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ache has been al
19a80 6c 6f 63 61 74 65 64 2c 20 69 74 20 6d 61 79 20  located, it may 
19a90 62 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65  be.** invalidate
19aa0 64 20 69 66 20 73 6f 6d 65 20 6f 74 68 65 72 20  d if some other 
19ab0 63 75 72 73 6f 72 20 77 72 69 74 65 73 20 74 6f  cursor writes to
19ac0 20 74 68 65 20 73 61 6d 65 20 74 61 62 6c 65 2c   the same table,
19ad0 20 6f 72 20 69 66 0a 2a 2a 20 74 68 65 20 63 75   or if.** the cu
19ae0 72 73 6f 72 20 69 73 20 6d 6f 76 65 64 20 74 6f  rsor is moved to
19af0 20 61 20 64 69 66 66 65 72 65 6e 74 20 72 6f 77   a different row
19b00 2e 20 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20  . Additionally, 
19b10 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a  in auto-vacuum.*
19b20 2a 20 6d 6f 64 65 2c 20 74 68 65 20 66 6f 6c 6c  * mode, the foll
19b30 6f 77 69 6e 67 20 65 76 65 6e 74 73 20 6d 61 79  owing events may
19b40 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 20 6f   invalidate an o
19b50 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
19b60 74 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 20  t cache..**.**  
19b70 20 2a 20 41 6e 20 69 6e 63 72 65 6d 65 6e 74 61   * An incrementa
19b80 6c 20 76 61 63 75 75 6d 2c 0a 2a 2a 20 20 20 2a  l vacuum,.**   *
19b90 20 41 20 63 6f 6d 6d 69 74 20 69 6e 20 61 75 74   A commit in aut
19ba0 6f 5f 76 61 63 75 75 6d 3d 22 66 75 6c 6c 22 20  o_vacuum="full" 
19bb0 6d 6f 64 65 2c 0a 2a 2a 20 20 20 2a 20 43 72 65  mode,.**   * Cre
19bc0 61 74 69 6e 67 20 61 20 74 61 62 6c 65 20 28 6d  ating a table (m
19bd0 61 79 20 72 65 71 75 69 72 65 20 6d 6f 76 69 6e  ay require movin
19be0 67 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  g an overflow pa
19bf0 67 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ge)..*/.static i
19c00 6e 74 20 61 63 63 65 73 73 50 61 79 6c 6f 61 64  nt accessPayload
19c10 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43  (.  BtCursor *pC
19c20 75 72 2c 20 20 20 20 20 20 2f 2a 20 43 75 72 73  ur,      /* Curs
19c30 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 65  or pointing to e
19c40 6e 74 72 79 20 74 6f 20 72 65 61 64 20 66 72 6f  ntry to read fro
19c50 6d 20 2a 2f 0a 20 20 75 33 32 20 6f 66 66 73 65  m */.  u32 offse
19c60 74 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  t,          /* B
19c70 65 67 69 6e 20 72 65 61 64 69 6e 67 20 74 68 69  egin reading thi
19c80 73 20 66 61 72 20 69 6e 74 6f 20 70 61 79 6c 6f  s far into paylo
19c90 61 64 20 2a 2f 0a 20 20 75 33 32 20 61 6d 74 2c  ad */.  u32 amt,
19ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
19cb0 52 65 61 64 20 74 68 69 73 20 6d 61 6e 79 20 62  Read this many b
19cc0 79 74 65 73 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  ytes */.  unsign
19cd0 65 64 20 63 68 61 72 20 2a 70 42 75 66 2c 20 2f  ed char *pBuf, /
19ce0 2a 20 57 72 69 74 65 20 74 68 65 20 62 79 74 65  * Write the byte
19cf0 73 20 69 6e 74 6f 20 74 68 69 73 20 62 75 66 66  s into this buff
19d00 65 72 20 2a 2f 20 0a 20 20 69 6e 74 20 73 6b 69  er */ .  int ski
19d10 70 4b 65 79 2c 20 20 20 20 20 20 20 20 20 2f 2a  pKey,         /*
19d20 20 6f 66 66 73 65 74 20 62 65 67 69 6e 73 20 61   offset begins a
19d30 74 20 64 61 74 61 20 69 66 20 74 68 69 73 20 69  t data if this i
19d40 73 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20  s true */.  int 
19d50 65 4f 70 20 20 20 20 20 20 20 20 20 20 20 20 20  eOp             
19d60 20 2f 2a 20 7a 65 72 6f 20 74 6f 20 72 65 61 64   /* zero to read
19d70 2e 20 6e 6f 6e 2d 7a 65 72 6f 20 74 6f 20 77 72  . non-zero to wr
19d80 69 74 65 2e 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  ite. */.){.  uns
19d90 69 67 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79  igned char *aPay
19da0 6c 6f 61 64 3b 0a 20 20 69 6e 74 20 72 63 20 3d  load;.  int rc =
19db0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 33   SQLITE_OK;.  u3
19dc0 32 20 6e 4b 65 79 3b 0a 20 20 69 6e 74 20 69 49  2 nKey;.  int iI
19dd0 64 78 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  dx = 0;.  MemPag
19de0 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
19df0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
19e00 61 67 65 5d 3b 20 2f 2a 20 42 74 72 65 65 20 70  age]; /* Btree p
19e10 61 67 65 20 6f 66 20 63 75 72 72 65 6e 74 20 65  age of current e
19e20 6e 74 72 79 20 2a 2f 0a 20 20 42 74 53 68 61 72  ntry */.  BtShar
19e30 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
19e40 70 42 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  pBt;            
19e50 20 20 20 20 20 20 2f 2a 20 42 74 72 65 65 20 74        /* Btree t
19e60 68 69 73 20 63 75 72 73 6f 72 20 62 65 6c 6f 6e  his cursor belon
19e70 67 73 20 74 6f 20 2a 2f 0a 0a 20 20 61 73 73 65  gs to */..  asse
19e80 72 74 28 20 70 50 61 67 65 20 29 3b 0a 20 20 61  rt( pPage );.  a
19e90 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74  ssert( pCur->eSt
19ea0 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49  ate==CURSOR_VALI
19eb0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
19ec0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
19ed0 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e  >iPage]<pPage->n
19ee0 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74  Cell );.  assert
19ef0 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
19f00 65 78 28 70 43 75 72 29 20 29 3b 0a 0a 20 20 67  ex(pCur) );..  g
19f10 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29  etCellInfo(pCur)
19f20 3b 0a 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 70  ;.  aPayload = p
19f30 43 75 72 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20  Cur->info.pCell 
19f40 2b 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65  + pCur->info.nHe
19f50 61 64 65 72 3b 0a 20 20 6e 4b 65 79 20 3d 20 28  ader;.  nKey = (
19f60 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3f 20  pPage->intKey ? 
19f70 30 20 3a 20 28 69 6e 74 29 70 43 75 72 2d 3e 69  0 : (int)pCur->i
19f80 6e 66 6f 2e 6e 4b 65 79 29 3b 0a 0a 20 20 69 66  nfo.nKey);..  if
19f90 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20  ( skipKey ){.   
19fa0 20 6f 66 66 73 65 74 20 2b 3d 20 6e 4b 65 79 3b   offset += nKey;
19fb0 0a 20 20 7d 0a 20 20 69 66 28 20 6f 66 66 73 65  .  }.  if( offse
19fc0 74 2b 61 6d 74 20 3e 20 6e 4b 65 79 2b 70 43 75  t+amt > nKey+pCu
19fd0 72 2d 3e 69 6e 66 6f 2e 6e 44 61 74 61 20 0a 20  r->info.nData . 
19fe0 20 20 7c 7c 20 26 61 50 61 79 6c 6f 61 64 5b 70    || &aPayload[p
19ff0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
1a000 5d 20 3e 20 26 70 50 61 67 65 2d 3e 61 44 61 74  ] > &pPage->aDat
1a010 61 5b 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  a[pBt->usableSiz
1a020 65 5d 0a 20 20 29 7b 0a 20 20 20 20 2f 2a 20 54  e].  ){.    /* T
1a030 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f 72  rying to read or
1a040 20 77 72 69 74 65 20 70 61 73 74 20 74 68 65 20   write past the 
1a050 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61 20  end of the data 
1a060 69 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20  is an error */. 
1a070 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1a080 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
1a090 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69   }..  /* Check i
1a0a0 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20 72  f data must be r
1a0b0 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f 66  ead/written to/f
1a0c0 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70 61  rom the btree pa
1a0d0 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20 20  ge itself. */.  
1a0e0 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72 2d  if( offset<pCur-
1a0f0 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a  >info.nLocal ){.
1a100 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b      int a = amt;
1a110 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73 65  .    if( a+offse
1a120 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  t>pCur->info.nLo
1a130 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20 3d  cal ){.      a =
1a140 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
1a150 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20 20  al - offset;.   
1a160 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70 79   }.    rc = copy
1a170 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61  Payload(&aPayloa
1a180 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66 2c  d[offset], pBuf,
1a190 20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d 3e   a, eOp, pPage->
1a1a0 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f 66  pDbPage);.    of
1a1b0 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70 42  fset = 0;.    pB
1a1c0 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d 74  uf += a;.    amt
1a1d0 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a   -= a;.  }else{.
1a1e0 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70 43      offset -= pC
1a1f0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b  ur->info.nLocal;
1a200 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
1a210 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74  SQLITE_OK && amt
1a220 3e 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  >0 ){.    const 
1a230 75 33 32 20 6f 76 66 6c 53 69 7a 65 20 3d 20 70  u32 ovflSize = p
1a240 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d  Bt->usableSize -
1a250 20 34 3b 20 20 2f 2a 20 42 79 74 65 73 20 63 6f   4;  /* Bytes co
1a260 6e 74 65 6e 74 20 70 65 72 20 6f 76 66 6c 20 70  ntent per ovfl p
1a270 61 67 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20  age */.    Pgno 
1a280 6e 65 78 74 50 61 67 65 3b 0a 0a 20 20 20 20 6e  nextPage;..    n
1a290 65 78 74 50 61 67 65 20 3d 20 67 65 74 34 62 79  extPage = get4by
1a2a0 74 65 28 26 61 50 61 79 6c 6f 61 64 5b 70 43 75  te(&aPayload[pCu
1a2b0 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 5d 29  r->info.nLocal])
1a2c0 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
1a2d0 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
1a2e0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 69 73      /* If the is
1a2f0 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 66  IncrblobHandle f
1a300 6c 61 67 20 69 73 20 73 65 74 20 61 6e 64 20 74  lag is set and t
1a310 68 65 20 42 74 43 75 72 73 6f 72 2e 61 4f 76 65  he BtCursor.aOve
1a320 72 66 6c 6f 77 5b 5d 0a 20 20 20 20 2a 2a 20 68  rflow[].    ** h
1a330 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c 6c 6f  as not been allo
1a340 63 61 74 65 64 2c 20 61 6c 6c 6f 63 61 74 65 20  cated, allocate 
1a350 69 74 20 6e 6f 77 2e 20 54 68 65 20 61 72 72 61  it now. The arra
1a360 79 20 69 73 20 73 69 7a 65 64 20 61 74 0a 20 20  y is sized at.  
1a370 20 20 2a 2a 20 6f 6e 65 20 65 6e 74 72 79 20 66    ** one entry f
1a380 6f 72 20 65 61 63 68 20 6f 76 65 72 66 6c 6f 77  or each overflow
1a390 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76 65   page in the ove
1a3a0 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68 65  rflow chain. The
1a3b0 0a 20 20 20 20 2a 2a 20 70 61 67 65 20 6e 75 6d  .    ** page num
1a3c0 62 65 72 20 6f 66 20 74 68 65 20 66 69 72 73 74  ber of the first
1a3d0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69   overflow page i
1a3e0 73 20 73 74 6f 72 65 64 20 69 6e 20 61 4f 76 65  s stored in aOve
1a3f0 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20 20 20 2a 2a  rflow[0],.    **
1a400 20 65 74 63 2e 20 41 20 76 61 6c 75 65 20 6f 66   etc. A value of
1a410 20 30 20 69 6e 20 74 68 65 20 61 4f 76 65 72 66   0 in the aOverf
1a420 6c 6f 77 5b 5d 20 61 72 72 61 79 20 6d 65 61 6e  low[] array mean
1a430 73 20 22 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e  s "not yet known
1a440 22 0a 20 20 20 20 2a 2a 20 28 74 68 65 20 63 61  ".    ** (the ca
1a450 63 68 65 20 69 73 20 6c 61 7a 69 6c 79 20 70 6f  che is lazily po
1a460 70 75 6c 61 74 65 64 29 2e 0a 20 20 20 20 2a 2f  pulated)..    */
1a470 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69  .    if( pCur->i
1a480 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20  sIncrblobHandle 
1a490 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72 66  && !pCur->aOverf
1a4a0 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  low ){.      int
1a4b0 20 6e 4f 76 66 6c 20 3d 20 28 70 43 75 72 2d 3e   nOvfl = (pCur->
1a4c0 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 2d 70 43  info.nPayload-pC
1a4d0 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 2b  ur->info.nLocal+
1a4e0 6f 76 66 6c 53 69 7a 65 2d 31 29 2f 6f 76 66 6c  ovflSize-1)/ovfl
1a4f0 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 43 75 72  Size;.      pCur
1a500 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 3d 20 28 50  ->aOverflow = (P
1a510 67 6e 6f 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c  gno *)sqlite3Mal
1a520 6c 6f 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 50  locZero(sizeof(P
1a530 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b 0a 20 20 20  gno)*nOvfl);.   
1a540 20 20 20 69 66 28 20 6e 4f 76 66 6c 20 26 26 20     if( nOvfl && 
1a550 21 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77  !pCur->aOverflow
1a560 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1a570 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1a580 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1a590 20 20 2f 2a 20 49 66 20 74 68 65 20 6f 76 65 72    /* If the over
1a5a0 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20 63  flow page-list c
1a5b0 61 63 68 65 20 68 61 73 20 62 65 65 6e 20 61 6c  ache has been al
1a5c0 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 0a  located and the.
1a5d0 20 20 20 20 2a 2a 20 65 6e 74 72 79 20 66 6f 72      ** entry for
1a5e0 20 74 68 65 20 66 69 72 73 74 20 72 65 71 75 69   the first requi
1a5f0 72 65 64 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  red overflow pag
1a600 65 20 69 73 20 76 61 6c 69 64 2c 20 73 6b 69 70  e is valid, skip
1a610 0a 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79  .    ** directly
1a620 20 74 6f 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20   to it..    */. 
1a630 20 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76     if( pCur->aOv
1a640 65 72 66 6c 6f 77 20 26 26 20 70 43 75 72 2d 3e  erflow && pCur->
1a650 61 4f 76 65 72 66 6c 6f 77 5b 6f 66 66 73 65 74  aOverflow[offset
1a660 2f 6f 76 66 6c 53 69 7a 65 5d 20 29 7b 0a 20 20  /ovflSize] ){.  
1a670 20 20 20 20 69 49 64 78 20 3d 20 28 6f 66 66 73      iIdx = (offs
1a680 65 74 2f 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20  et/ovflSize);.  
1a690 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 70      nextPage = p
1a6a0 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69  Cur->aOverflow[i
1a6b0 49 64 78 5d 3b 0a 20 20 20 20 20 20 6f 66 66 73  Idx];.      offs
1a6c0 65 74 20 3d 20 28 6f 66 66 73 65 74 25 6f 76 66  et = (offset%ovf
1a6d0 6c 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 65  lSize);.    }.#e
1a6e0 6e 64 69 66 0a 0a 20 20 20 20 66 6f 72 28 20 3b  ndif..    for( ;
1a6f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1a700 26 20 61 6d 74 3e 30 20 26 26 20 6e 65 78 74 50  & amt>0 && nextP
1a710 61 67 65 3b 20 69 49 64 78 2b 2b 29 7b 0a 0a 23  age; iIdx++){..#
1a720 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a730 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20  IT_INCRBLOB.    
1a740 20 20 2f 2a 20 49 66 20 72 65 71 75 69 72 65 64    /* If required
1a750 2c 20 70 6f 70 75 6c 61 74 65 20 74 68 65 20 6f  , populate the o
1a760 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
1a770 74 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  t cache. */.    
1a780 20 20 69 66 28 20 70 43 75 72 2d 3e 61 4f 76 65    if( pCur->aOve
1a790 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20  rflow ){.       
1a7a0 20 61 73 73 65 72 74 28 21 70 43 75 72 2d 3e 61   assert(!pCur->a
1a7b0 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78 5d 20 7c  Overflow[iIdx] |
1a7c0 7c 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f  | pCur->aOverflo
1a7d0 77 5b 69 49 64 78 5d 3d 3d 6e 65 78 74 50 61 67  w[iIdx]==nextPag
1a7e0 65 29 3b 0a 20 20 20 20 20 20 20 20 70 43 75 72  e);.        pCur
1a7f0 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64 78  ->aOverflow[iIdx
1a800 5d 20 3d 20 6e 65 78 74 50 61 67 65 3b 0a 20 20  ] = nextPage;.  
1a810 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
1a820 20 20 20 20 69 66 28 20 6f 66 66 73 65 74 3e 3d      if( offset>=
1a830 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  ovflSize ){.    
1a840 20 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20      /* The only 
1a850 72 65 61 73 6f 6e 20 74 6f 20 72 65 61 64 20 74  reason to read t
1a860 68 69 73 20 70 61 67 65 20 69 73 20 74 6f 20 6f  his page is to o
1a870 62 74 61 69 6e 20 74 68 65 20 70 61 67 65 0a 20  btain the page. 
1a880 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72         ** number
1a890 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 70 61   for the next pa
1a8a0 67 65 20 69 6e 20 74 68 65 20 6f 76 65 72 66 6c  ge in the overfl
1a8b0 6f 77 20 63 68 61 69 6e 2e 20 54 68 65 20 70 61  ow chain. The pa
1a8c0 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61  ge.        ** da
1a8d0 74 61 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  ta is not requir
1a8e0 65 64 2e 20 53 6f 20 66 69 72 73 74 20 74 72 79  ed. So first try
1a8f0 20 74 6f 20 6c 6f 6f 6b 75 70 20 74 68 65 20 6f   to lookup the o
1a900 76 65 72 66 6c 6f 77 0a 20 20 20 20 20 20 20 20  verflow.        
1a910 2a 2a 20 70 61 67 65 2d 6c 69 73 74 20 63 61 63  ** page-list cac
1a920 68 65 2c 20 69 66 20 61 6e 79 2c 20 74 68 65 6e  he, if any, then
1a930 20 66 61 6c 6c 20 62 61 63 6b 20 74 6f 20 74 68   fall back to th
1a940 65 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61 67  e getOverflowPag
1a950 65 28 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  e().        ** f
1a960 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20  unction..       
1a970 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   */.#ifndef SQLI
1a980 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42  TE_OMIT_INCRBLOB
1a990 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43 75  .        if( pCu
1a9a0 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20  r->aOverflow && 
1a9b0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
1a9c0 69 49 64 78 2b 31 5d 20 29 7b 0a 20 20 20 20 20  iIdx+1] ){.     
1a9d0 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20       nextPage = 
1a9e0 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
1a9f0 69 49 64 78 2b 31 5d 3b 0a 20 20 20 20 20 20 20  iIdx+1];.       
1aa00 20 7d 20 65 6c 73 65 20 0a 23 65 6e 64 69 66 0a   } else .#endif.
1aa10 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 67            rc = g
1aa20 65 74 4f 76 65 72 66 6c 6f 77 50 61 67 65 28 70  etOverflowPage(p
1aa30 42 74 2c 20 6e 65 78 74 50 61 67 65 2c 20 30 2c  Bt, nextPage, 0,
1aa40 20 26 6e 65 78 74 50 61 67 65 29 3b 0a 20 20 20   &nextPage);.   
1aa50 20 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 6f       offset -= o
1aa60 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d  vflSize;.      }
1aa70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
1aa80 20 4e 65 65 64 20 74 6f 20 72 65 61 64 20 74 68   Need to read th
1aa90 69 73 20 70 61 67 65 20 70 72 6f 70 65 72 6c 79  is page properly
1aaa0 2e 20 49 74 20 63 6f 6e 74 61 69 6e 73 20 73 6f  . It contains so
1aab0 6d 65 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20  me of the.      
1aac0 20 20 2a 2a 20 72 61 6e 67 65 20 6f 66 20 64 61    ** range of da
1aad0 74 61 20 74 68 61 74 20 69 73 20 62 65 69 6e 67  ta that is being
1aae0 20 72 65 61 64 20 28 65 4f 70 3d 3d 30 29 20 6f   read (eOp==0) o
1aaf0 72 20 77 72 69 74 74 65 6e 20 28 65 4f 70 21 3d  r written (eOp!=
1ab00 30 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  0)..        */. 
1ab10 20 20 20 20 20 20 20 44 62 50 61 67 65 20 2a 70         DbPage *p
1ab20 44 62 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20  DbPage;.        
1ab30 69 6e 74 20 61 20 3d 20 61 6d 74 3b 0a 20 20 20  int a = amt;.   
1ab40 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
1ab50 33 50 61 67 65 72 47 65 74 28 70 42 74 2d 3e 70  3PagerGet(pBt->p
1ab60 50 61 67 65 72 2c 20 6e 65 78 74 50 61 67 65 2c  Pager, nextPage,
1ab70 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20   &pDbPage);.    
1ab80 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1ab90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
1aba0 20 20 20 61 50 61 79 6c 6f 61 64 20 3d 20 73 71     aPayload = sq
1abb0 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
1abc0 61 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  a(pDbPage);.    
1abd0 20 20 20 20 20 20 6e 65 78 74 50 61 67 65 20 3d        nextPage =
1abe0 20 67 65 74 34 62 79 74 65 28 61 50 61 79 6c 6f   get4byte(aPaylo
1abf0 61 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ad);.          i
1ac00 66 28 20 61 20 2b 20 6f 66 66 73 65 74 20 3e 20  f( a + offset > 
1ac10 6f 76 66 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  ovflSize ){.    
1ac20 20 20 20 20 20 20 20 20 61 20 3d 20 6f 76 66 6c          a = ovfl
1ac30 53 69 7a 65 20 2d 20 6f 66 66 73 65 74 3b 0a 20  Size - offset;. 
1ac40 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1ac50 20 20 20 20 20 72 63 20 3d 20 63 6f 70 79 50 61       rc = copyPa
1ac60 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f 61 64 5b  yload(&aPayload[
1ac70 6f 66 66 73 65 74 2b 34 5d 2c 20 70 42 75 66 2c  offset+4], pBuf,
1ac80 20 61 2c 20 65 4f 70 2c 20 70 44 62 50 61 67 65   a, eOp, pDbPage
1ac90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
1aca0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
1acb0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1acc0 20 20 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20     offset = 0;. 
1acd0 20 20 20 20 20 20 20 20 20 61 6d 74 20 2d 3d 20           amt -= 
1ace0 61 3b 0a 20 20 20 20 20 20 20 20 20 20 70 42 75  a;.          pBu
1acf0 66 20 2b 3d 20 61 3b 0a 20 20 20 20 20 20 20 20  f += a;.        
1ad00 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1ad10 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
1ad20 51 4c 49 54 45 5f 4f 4b 20 26 26 20 61 6d 74 3e  QLITE_OK && amt>
1ad30 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1ad40 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
1ad50 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
1ad60 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1ad70 65 61 64 20 70 61 72 74 20 6f 66 20 74 68 65 20  ead part of the 
1ad80 6b 65 79 20 61 73 73 6f 63 69 61 74 65 64 20 77  key associated w
1ad90 69 74 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e  ith cursor pCur.
1ada0 20 20 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d    Exactly.** "am
1adb0 74 22 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65  t" bytes will be
1adc0 20 74 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f   transfered into
1add0 20 70 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72   pBuf[].  The tr
1ade0 61 6e 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73  ansfer.** begins
1adf0 20 61 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a   at "offset"..**
1ae00 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
1ae10 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20  E_OK on success 
1ae20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
1ae30 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65   if anything goe
1ae40 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20  s.** wrong.  An 
1ae50 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
1ae60 64 20 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74  d if "offset+amt
1ae70 22 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e  " is larger than
1ae80 0a 2a 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c  .** the availabl
1ae90 65 20 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e  e payload..*/.in
1aea0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  t sqlite3BtreeKe
1aeb0 79 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  y(BtCursor *pCur
1aec0 2c 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33  , u32 offset, u3
1aed0 32 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75  2 amt, void *pBu
1aee0 66 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  f){.  int rc;.. 
1aef0 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1af00 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1af10 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
1af20 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
1af30 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d  pCur);.  if( rc=
1af40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1af50 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1af60 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1af70 41 4c 49 44 20 29 3b 0a 20 20 20 20 61 73 73 65  ALID );.    asse
1af80 72 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  rt( pCur->iPage>
1af90 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61  =0 && pCur->apPa
1afa0 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  ge[pCur->iPage] 
1afb0 29 3b 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  );.    if( pCur-
1afc0 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
1afd0 65 79 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  ey ){.      retu
1afe0 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
1aff0 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20  T_BKPT;.    }.  
1b000 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1b010 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
1b020 65 5d 3c 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  e]<pCur->apPage[
1b030 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
1b040 65 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ell );.    rc = 
1b050 61 63 63 65 73 73 50 61 79 6c 6f 61 64 28 70 43  accessPayload(pC
1b060 75 72 2c 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c  ur, offset, amt,
1b070 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a   (unsigned char*
1b080 29 70 42 75 66 2c 20 30 2c 20 30 29 3b 0a 20 20  )pBuf, 0, 0);.  
1b090 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1b0a0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 70 61 72  ../*.** Read par
1b0b0 74 20 6f 66 20 74 68 65 20 64 61 74 61 20 61 73  t of the data as
1b0c0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 63 75  sociated with cu
1b0d0 72 73 6f 72 20 70 43 75 72 2e 20 20 45 78 61 63  rsor pCur.  Exac
1b0e0 74 6c 79 0a 2a 2a 20 22 61 6d 74 22 20 62 79 74  tly.** "amt" byt
1b0f0 65 73 20 77 69 6c 6c 20 62 65 20 74 72 61 6e 73  es will be trans
1b100 66 65 72 65 64 20 69 6e 74 6f 20 70 42 75 66 5b  fered into pBuf[
1b110 5d 2e 20 20 54 68 65 20 74 72 61 6e 73 66 65 72  ].  The transfer
1b120 0a 2a 2a 20 62 65 67 69 6e 73 20 61 74 20 22 6f  .** begins at "o
1b130 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a 2a 20 52 65  ffset"..**.** Re
1b140 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
1b150 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20  n success or an 
1b160 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
1b170 79 74 68 69 6e 67 20 67 6f 65 73 0a 2a 2a 20 77  ything goes.** w
1b180 72 6f 6e 67 2e 20 20 41 6e 20 65 72 72 6f 72 20  rong.  An error 
1b190 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 22  is returned if "
1b1a0 6f 66 66 73 65 74 2b 61 6d 74 22 20 69 73 20 6c  offset+amt" is l
1b1b0 61 72 67 65 72 20 74 68 61 6e 0a 2a 2a 20 74 68  arger than.** th
1b1c0 65 20 61 76 61 69 6c 61 62 6c 65 20 70 61 79 6c  e available payl
1b1d0 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  oad..*/.int sqli
1b1e0 74 65 33 42 74 72 65 65 44 61 74 61 28 42 74 43  te3BtreeData(BtC
1b1f0 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75 33 32  ursor *pCur, u32
1b200 20 6f 66 66 73 65 74 2c 20 75 33 32 20 61 6d 74   offset, u32 amt
1b210 2c 20 76 6f 69 64 20 2a 70 42 75 66 29 7b 0a 20  , void *pBuf){. 
1b220 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 6e 64 65   int rc;..#ifnde
1b230 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
1b240 43 52 42 4c 4f 42 0a 20 20 69 66 20 28 20 70 43  CRBLOB.  if ( pC
1b250 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1b260 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
1b270 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b280 41 42 4f 52 54 3b 0a 20 20 7d 0a 23 65 6e 64 69  ABORT;.  }.#endi
1b290 66 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  f..  assert( cur
1b2a0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1b2b0 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
1b2c0 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
1b2d0 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
1b2e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1b2f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
1b300 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1b310 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
1b320 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
1b330 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
1b340 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1b350 67 65 5d 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ge] );.    asser
1b360 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
1b370 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
1b380 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1b390 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
1b3a0 20 20 20 20 72 63 20 3d 20 61 63 63 65 73 73 50      rc = accessP
1b3b0 61 79 6c 6f 61 64 28 70 43 75 72 2c 20 6f 66 66  ayload(pCur, off
1b3c0 73 65 74 2c 20 61 6d 74 2c 20 70 42 75 66 2c 20  set, amt, pBuf, 
1b3d0 31 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  1, 0);.  }.  ret
1b3e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1b3f0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
1b400 72 20 74 6f 20 70 61 79 6c 6f 61 64 20 69 6e 66  r to payload inf
1b410 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 74 68  ormation from th
1b420 65 20 65 6e 74 72 79 20 74 68 61 74 20 74 68 65  e entry that the
1b430 20 0a 2a 2a 20 70 43 75 72 20 63 75 72 73 6f 72   .** pCur cursor
1b440 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e   is pointing to.
1b450 20 20 54 68 65 20 70 6f 69 6e 74 65 72 20 69 73    The pointer is
1b460 20 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   to the beginnin
1b470 67 20 6f 66 0a 2a 2a 20 74 68 65 20 6b 65 79 20  g of.** the key 
1b480 69 66 20 73 6b 69 70 4b 65 79 3d 3d 30 20 61 6e  if skipKey==0 an
1b490 64 20 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74  d it points to t
1b4a0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
1b4b0 64 61 74 61 20 69 66 0a 2a 2a 20 73 6b 69 70 4b  data if.** skipK
1b4c0 65 79 3d 3d 31 2e 20 20 54 68 65 20 6e 75 6d 62  ey==1.  The numb
1b4d0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 61  er of bytes of a
1b4e0 76 61 69 6c 61 62 6c 65 20 6b 65 79 2f 64 61 74  vailable key/dat
1b4f0 61 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20  a is written.** 
1b500 69 6e 74 6f 20 2a 70 41 6d 74 2e 20 20 49 66 20  into *pAmt.  If 
1b510 2a 70 41 6d 74 3d 3d 30 2c 20 74 68 65 6e 20 74  *pAmt==0, then t
1b520 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
1b530 64 20 77 69 6c 6c 20 6e 6f 74 20 62 65 0a 2a 2a  d will not be.**
1b540 20 61 20 76 61 6c 69 64 20 70 6f 69 6e 74 65 72   a valid pointer
1b550 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1b560 74 69 6e 65 20 69 73 20 61 6e 20 6f 70 74 69 6d  tine is an optim
1b570 69 7a 61 74 69 6f 6e 2e 20 20 49 74 20 69 73 20  ization.  It is 
1b580 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74 68 65 20 65  common for the e
1b590 6e 74 69 72 65 20 6b 65 79 0a 2a 2a 20 61 6e 64  ntire key.** and
1b5a0 20 64 61 74 61 20 74 6f 20 66 69 74 20 6f 6e 20   data to fit on 
1b5b0 74 68 65 20 6c 6f 63 61 6c 20 70 61 67 65 20 61  the local page a
1b5c0 6e 64 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20  nd for there to 
1b5d0 62 65 20 6e 6f 20 6f 76 65 72 66 6c 6f 77 0a 2a  be no overflow.*
1b5e0 2a 20 70 61 67 65 73 2e 20 20 57 68 65 6e 20 74  * pages.  When t
1b5f0 68 61 74 20 69 73 20 73 6f 2c 20 74 68 69 73 20  hat is so, this 
1b600 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65 20 75  routine can be u
1b610 73 65 64 20 74 6f 20 61 63 63 65 73 73 20 74 68  sed to access th
1b620 65 0a 2a 2a 20 6b 65 79 20 61 6e 64 20 64 61 74  e.** key and dat
1b630 61 20 77 69 74 68 6f 75 74 20 6d 61 6b 69 6e 67  a without making
1b640 20 61 20 63 6f 70 79 2e 20 20 49 66 20 74 68 65   a copy.  If the
1b650 20 6b 65 79 20 61 6e 64 2f 6f 72 20 64 61 74 61   key and/or data
1b660 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f 6e 74 6f 20   spills.** onto 
1b670 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2c 20  overflow pages, 
1b680 74 68 65 6e 20 61 63 63 65 73 73 50 61 79 6c 6f  then accessPaylo
1b690 61 64 28 29 20 6d 75 73 74 20 62 65 20 75 73 65  ad() must be use
1b6a0 64 20 74 6f 20 72 65 61 73 73 65 6d 62 6c 65 0a  d to reassemble.
1b6b0 2a 2a 20 74 68 65 20 6b 65 79 2f 64 61 74 61 20  ** the key/data 
1b6c0 61 6e 64 20 63 6f 70 79 20 69 74 20 69 6e 74 6f  and copy it into
1b6d0 20 61 20 70 72 65 61 6c 6c 6f 63 61 74 65 64 20   a preallocated 
1b6e0 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  buffer..**.** Th
1b6f0 65 20 70 6f 69 6e 74 65 72 20 72 65 74 75 72 6e  e pointer return
1b700 65 64 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  ed by this routi
1b710 6e 65 20 6c 6f 6f 6b 73 20 64 69 72 65 63 74 6c  ne looks directl
1b720 79 20 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65  y into the cache
1b730 64 0a 2a 2a 20 70 61 67 65 20 6f 66 20 74 68 65  d.** page of the
1b740 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
1b750 64 61 74 61 20 6d 69 67 68 74 20 63 68 61 6e 67  data might chang
1b760 65 20 6f 72 20 6d 6f 76 65 20 74 68 65 20 6e 65  e or move the ne
1b770 78 74 20 74 69 6d 65 0a 2a 2a 20 61 6e 79 20 62  xt time.** any b
1b780 74 72 65 65 20 72 6f 75 74 69 6e 65 20 69 73 20  tree routine is 
1b790 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  called..*/.stati
1b7a0 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64  c const unsigned
1b7b0 20 63 68 61 72 20 2a 66 65 74 63 68 50 61 79 6c   char *fetchPayl
1b7c0 6f 61 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20  oad(.  BtCursor 
1b7d0 2a 70 43 75 72 2c 20 20 20 20 20 20 2f 2a 20 43  *pCur,      /* C
1b7e0 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e 67 20 74  ursor pointing t
1b7f0 6f 20 65 6e 74 72 79 20 74 6f 20 72 65 61 64 20  o entry to read 
1b800 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  from */.  int *p
1b810 41 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Amt,           /
1b820 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d 62  * Write the numb
1b830 65 72 20 6f 66 20 61 76 61 69 6c 61 62 6c 65 20  er of available 
1b840 62 79 74 65 73 20 68 65 72 65 20 2a 2f 0a 20 20  bytes here */.  
1b850 69 6e 74 20 73 6b 69 70 4b 65 79 20 20 20 20 20  int skipKey     
1b860 20 20 20 20 20 2f 2a 20 72 65 61 64 20 62 65 67       /* read beg
1b870 69 6e 6e 69 6e 67 20 61 74 20 64 61 74 61 20 69  inning at data i
1b880 66 20 74 68 69 73 20 69 73 20 74 72 75 65 20 2a  f this is true *
1b890 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
1b8a0 63 68 61 72 20 2a 61 50 61 79 6c 6f 61 64 3b 0a  char *aPayload;.
1b8b0 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65    MemPage *pPage
1b8c0 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20  ;.  u32 nKey;.  
1b8d0 75 33 32 20 6e 4c 6f 63 61 6c 3b 0a 0a 20 20 61  u32 nLocal;..  a
1b8e0 73 73 65 72 74 28 20 70 43 75 72 21 3d 30 20 26  ssert( pCur!=0 &
1b8f0 26 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 3d 30  & pCur->iPage>=0
1b900 20 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65   && pCur->apPage
1b910 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 29 3b 0a  [pCur->iPage]);.
1b920 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1b930 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1b940 41 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74  ALID );.  assert
1b950 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1b960 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 70 50  ex(pCur) );.  pP
1b970 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
1b980 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
1b990 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1b9a0 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1b9b0 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge]<pPage->nCell
1b9c0 20 29 3b 0a 20 20 67 65 74 43 65 6c 6c 49 6e 66   );.  getCellInf
1b9d0 6f 28 70 43 75 72 29 3b 0a 20 20 61 50 61 79 6c  o(pCur);.  aPayl
1b9e0 6f 61 64 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  oad = pCur->info
1b9f0 2e 70 43 65 6c 6c 3b 0a 20 20 61 50 61 79 6c 6f  .pCell;.  aPaylo
1ba00 61 64 20 2b 3d 20 70 43 75 72 2d 3e 69 6e 66 6f  ad += pCur->info
1ba10 2e 6e 48 65 61 64 65 72 3b 0a 20 20 69 66 28 20  .nHeader;.  if( 
1ba20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
1ba30 0a 20 20 20 20 6e 4b 65 79 20 3d 20 30 3b 0a 20  .    nKey = 0;. 
1ba40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6e 4b 65 79   }else{.    nKey
1ba50 20 3d 20 28 69 6e 74 29 70 43 75 72 2d 3e 69 6e   = (int)pCur->in
1ba60 66 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69  fo.nKey;.  }.  i
1ba70 66 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20  f( skipKey ){.  
1ba80 20 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b    aPayload += nK
1ba90 65 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d  ey;.    nLocal =
1baa0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
1bab0 61 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c  al - nKey;.  }el
1bac0 73 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d  se{.    nLocal =
1bad0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63   pCur->info.nLoc
1bae0 61 6c 3b 0a 20 20 20 20 69 66 28 20 6e 4c 6f 63  al;.    if( nLoc
1baf0 61 6c 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20  al>nKey ){.     
1bb00 20 6e 4c 6f 63 61 6c 20 3d 20 6e 4b 65 79 3b 0a   nLocal = nKey;.
1bb10 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 41 6d      }.  }.  *pAm
1bb20 74 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65  t = nLocal;.  re
1bb30 74 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a 7d  turn aPayload;.}
1bb40 0a 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  .../*.** For the
1bb50 20 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73   entry that curs
1bb60 6f 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74  or pCur is point
1bb70 20 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a   to, return as.*
1bb80 2a 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20  * many bytes of 
1bb90 74 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20  the key or data 
1bba0 61 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  as are available
1bbb0 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a   on the local.**
1bbc0 20 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57   b-tree page.  W
1bbd0 72 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20  rite the number 
1bbe0 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74  of available byt
1bbf0 65 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a  es into *pAmt..*
1bc00 2a 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72  *.** The pointer
1bc10 20 72 65 74 75 72 6e 65 64 20 69 73 20 65 70 68   returned is eph
1bc20 65 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79  emeral.  The key
1bc30 2f 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a  /data may move.*
1bc40 2a 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65  * or be destroye
1bc50 64 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61  d on the next ca
1bc60 6c 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20  ll to any Btree 
1bc70 72 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c  routine,.** incl
1bc80 75 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d  uding calls from
1bc90 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61   other threads a
1bca0 67 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20  gainst the same 
1bcb0 63 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c  cache..** Hence,
1bcc0 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20   a mutex on the 
1bcd0 42 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20  BtShared should 
1bce0 62 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f  be held prior to
1bcf0 20 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73   calling.** this
1bd00 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
1bd10 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69  These routines i
1bd20 73 20 75 73 65 64 20 74 6f 20 67 65 74 20 71 75  s used to get qu
1bd30 69 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65  ick access to ke
1bd40 79 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e  y and data.** in
1bd50 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
1bd60 20 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c   where no overfl
1bd70 6f 77 20 70 61 67 65 73 20 61 72 65 20 75 73 65  ow pages are use
1bd80 64 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64  d..*/.const void
1bd90 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65   *sqlite3BtreeKe
1bda0 79 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20  yFetch(BtCursor 
1bdb0 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74  *pCur, int *pAmt
1bdc0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ){.  assert( cur
1bdd0 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
1bde0 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75  ur) );.  if( pCu
1bdf0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
1be00 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72  R_VALID ){.    r
1be10 65 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69  eturn (const voi
1be20 64 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28  d*)fetchPayload(
1be30 70 43 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a  pCur, pAmt, 0);.
1be40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1be50 7d 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71  }.const void *sq
1be60 6c 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65  lite3BtreeDataFe
1be70 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43  tch(BtCursor *pC
1be80 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a  ur, int *pAmt){.
1be90 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1bea0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1beb0 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   );.  if( pCur->
1bec0 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56  eState==CURSOR_V
1bed0 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75  ALID ){.    retu
1bee0 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29  rn (const void*)
1bef0 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75  fetchPayload(pCu
1bf00 72 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d  r, pAmt, 1);.  }
1bf10 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
1bf20 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20  ./*.** Move the 
1bf30 63 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61  cursor down to a
1bf40 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e   new child page.
1bf50 20 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72    The newPgno ar
1bf60 67 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a  gument is the.**
1bf70 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20   page number of 
1bf80 74 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74  the child page t
1bf90 6f 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f 0a 73 74  o move to..*/.st
1bfa0 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43  atic int moveToC
1bfb0 68 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70  hild(BtCursor *p
1bfc0 43 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f  Cur, u32 newPgno
1bfd0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
1bfe0 6e 74 20 69 20 3d 20 70 43 75 72 2d 3e 69 50 61  nt i = pCur->iPa
1bff0 67 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ge;.  MemPage *p
1c000 4e 65 77 50 61 67 65 3b 0a 20 20 42 74 53 68 61  NewPage;.  BtSha
1c010 72 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d  red *pBt = pCur-
1c020 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  >pBt;..  assert(
1c030 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1c040 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1c050 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74  ert( pCur->eStat
1c060 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20  e==CURSOR_VALID 
1c070 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
1c080 72 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f  r->iPage<BTCURSO
1c090 52 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20  R_MAX_DEPTH );. 
1c0a0 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
1c0b0 3e 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f  >=(BTCURSOR_MAX_
1c0c0 44 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20  DEPTH-1) ){.    
1c0d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1c0e0 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
1c0f0 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69    rc = getAndIni
1c100 74 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67  tPage(pBt, newPg
1c110 6e 6f 2c 20 26 70 4e 65 77 50 61 67 65 29 3b 0a  no, &pNewPage);.
1c120 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
1c130 6e 20 72 63 3b 0a 20 20 70 43 75 72 2d 3e 61 70  n rc;.  pCur->ap
1c140 50 61 67 65 5b 69 2b 31 5d 20 3d 20 70 4e 65 77  Page[i+1] = pNew
1c150 50 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 61 69  Page;.  pCur->ai
1c160 49 64 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20  Idx[i+1] = 0;.  
1c170 70 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a  pCur->iPage++;..
1c180 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69    pCur->info.nSi
1c190 7a 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e  ze = 0;.  pCur->
1c1a0 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20  validNKey = 0;. 
1c1b0 20 69 66 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e   if( pNewPage->n
1c1c0 43 65 6c 6c 3c 31 20 29 7b 0a 20 20 20 20 72 65  Cell<1 ){.    re
1c1d0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1c1e0 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  UPT_BKPT;.  }.  
1c1f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1c200 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45  ;.}..#ifndef NDE
1c210 42 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70  BUG./*.** Page p
1c220 50 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74  Parent is an int
1c230 65 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29  ernal (non-leaf)
1c240 20 74 72 65 65 20 70 61 67 65 2e 20 54 68 69 73   tree page. This
1c250 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73   function .** as
1c260 73 65 72 74 73 20 74 68 61 74 20 70 61 67 65 20  serts that page 
1c270 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73  number iChild is
1c280 20 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20   the left-child 
1c290 69 66 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a  if the iIdx'th.*
1c2a0 2a 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70  * cell in page p
1c2b0 50 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69  Parent. Or, if i
1c2c0 49 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20  Idx is equal to 
1c2d0 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
1c2e0 20 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20   of.** cells in 
1c2f0 70 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61  pParent, that pa
1c300 67 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64  ge number iChild
1c310 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68   is the right-ch
1c320 69 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61  ild of.** the pa
1c330 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ge..*/.static vo
1c340 69 64 20 61 73 73 65 72 74 50 61 72 65 6e 74 49  id assertParentI
1c350 6e 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50  ndex(MemPage *pP
1c360 61 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c  arent, int iIdx,
1c370 20 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20   Pgno iChild){. 
1c380 20 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70   assert( iIdx<=p
1c390 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b  Parent->nCell );
1c3a0 0a 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61  .  if( iIdx==pPa
1c3b0 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20  rent->nCell ){. 
1c3c0 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62     assert( get4b
1c3d0 79 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44  yte(&pParent->aD
1c3e0 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72  ata[pParent->hdr
1c3f0 4f 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69  Offset+8])==iChi
1c400 6c 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ld );.  }else{. 
1c410 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62     assert( get4b
1c420 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
1c430 72 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43  rent, iIdx))==iC
1c440 68 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65  hild );.  }.}.#e
1c450 6c 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73  lse.#  define as
1c460 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28  sertParentIndex(
1c470 78 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a  x,y,z) .#endif..
1c480 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
1c490 75 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20  ursor up to the 
1c4a0 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a  parent page..**.
1c4b0 2a 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20  ** pCur->idx is 
1c4c0 73 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20  set to the cell 
1c4d0 69 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61  index that conta
1c4e0 69 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a  ins the pointer.
1c4f0 2a 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77  ** to the page w
1c500 65 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f  e are coming fro
1c510 6d 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f  m.  If we are co
1c520 6d 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  ming from the.**
1c530 20 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c   right-most chil
1c540 64 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72  d page then pCur
1c550 2d 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20  ->idx is set to 
1c560 6f 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a  one more than.**
1c570 20 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c   the largest cel
1c580 6c 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64  l index..*/.void
1c590 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76   sqlite3BtreeMov
1c5a0 65 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73  eToParent(BtCurs
1c5b0 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73  or *pCur){.  ass
1c5c0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1c5d0 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1c5e0 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1c5f0 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1c600 4c 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  LID );.  assert(
1c610 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29   pCur->iPage>0 )
1c620 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
1c630 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1c640 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72  Page] );.  asser
1c650 74 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20  tParentIndex(.  
1c660 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70    pCur->apPage[p
1c670 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a  Cur->iPage-1], .
1c680 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
1c690 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20  pCur->iPage-1], 
1c6a0 0a 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67  .    pCur->apPag
1c6b0 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
1c6c0 70 67 6e 6f 0a 20 20 29 3b 0a 20 20 72 65 6c 65  pgno.  );.  rele
1c6d0 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
1c6e0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1c6f0 5d 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67  ]);.  pCur->iPag
1c700 65 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66  e--;.  pCur->inf
1c710 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  o.nSize = 0;.  p
1c720 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d  Cur->validNKey =
1c730 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76   0;.}../*.** Mov
1c740 65 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20  e the cursor to 
1c750 74 68 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2f  the root page.*/
1c760 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65  .static int move
1c770 54 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20  ToRoot(BtCursor 
1c780 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
1c790 65 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  e *pRoot;.  int 
1c7a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1c7b0 20 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75    Btree *p = pCu
1c7c0 72 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53  r->pBtree;.  BtS
1c7d0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
1c7e0 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
1c7f0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
1c800 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
1c810 72 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  rt( CURSOR_INVAL
1c820 49 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55  ID < CURSOR_REQU
1c830 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
1c840 65 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49  ert( CURSOR_VALI
1c850 44 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51  D   < CURSOR_REQ
1c860 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73  UIRESEEK );.  as
1c870 73 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55  sert( CURSOR_FAU
1c880 4c 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45  LT   > CURSOR_RE
1c890 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
1c8a0 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e  f( pCur->eState>
1c8b0 3d 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53  =CURSOR_REQUIRES
1c8c0 45 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70  EEK ){.    if( p
1c8d0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1c8e0 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
1c8f0 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e     return pCur->
1c900 73 6b 69 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20  skip;.    }.    
1c910 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61  sqlite3BtreeClea
1c920 72 43 75 72 73 6f 72 28 70 43 75 72 29 3b 0a 20  rCursor(pCur);. 
1c930 20 7d 0a 0a 20 20 69 66 28 20 70 43 75 72 2d 3e   }..  if( pCur->
1c940 69 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20  iPage>=0 ){.    
1c950 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
1c960 3d 31 3b 20 69 3c 3d 70 43 75 72 2d 3e 69 50 61  =1; i<=pCur->iPa
1c970 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ge; i++){.      
1c980 72 65 6c 65 61 73 65 50 61 67 65 28 70 43 75 72  releasePage(pCur
1c990 2d 3e 61 70 50 61 67 65 5b 69 5d 29 3b 0a 20 20  ->apPage[i]);.  
1c9a0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
1c9b0 20 69 66 28 20 0a 20 20 20 20 20 20 53 51 4c 49   if( .      SQLI
1c9c0 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 67 65 74  TE_OK!=(rc = get
1c9d0 41 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c  AndInitPage(pBt,
1c9e0 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
1c9f0 20 26 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30   &pCur->apPage[0
1ca00 5d 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ])).    ){.     
1ca10 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20   pCur->eState = 
1ca20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a  CURSOR_INVALID;.
1ca30 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1ca40 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 52  .    }.  }..  pR
1ca50 6f 6f 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  oot = pCur->apPa
1ca60 67 65 5b 30 5d 3b 0a 20 20 61 73 73 65 72 74 28  ge[0];.  assert(
1ca70 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 70 43   pRoot->pgno==pC
1ca80 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 20 29 3b 0a  ur->pgnoRoot );.
1ca90 20 20 70 43 75 72 2d 3e 69 50 61 67 65 20 3d 20    pCur->iPage = 
1caa0 30 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49 64 78  0;.  pCur->aiIdx
1cab0 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  [0] = 0;.  pCur-
1cac0 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
1cad0 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20  .  pCur->atLast 
1cae0 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76 61 6c  = 0;.  pCur->val
1caf0 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 0a 20 20 69  idNKey = 0;..  i
1cb00 66 28 20 70 52 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d  f( pRoot->nCell=
1cb10 3d 30 20 26 26 20 21 70 52 6f 6f 74 2d 3e 6c 65  =0 && !pRoot->le
1cb20 61 66 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 73  af ){.    Pgno s
1cb30 75 62 70 61 67 65 3b 0a 20 20 20 20 61 73 73 65  ubpage;.    asse
1cb40 72 74 28 20 70 52 6f 6f 74 2d 3e 70 67 6e 6f 3d  rt( pRoot->pgno=
1cb50 3d 31 20 29 3b 0a 20 20 20 20 73 75 62 70 61 67  =1 );.    subpag
1cb60 65 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 52  e = get4byte(&pR
1cb70 6f 6f 74 2d 3e 61 44 61 74 61 5b 70 52 6f 6f 74  oot->aData[pRoot
1cb80 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
1cb90 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 75 62  .    assert( sub
1cba0 70 61 67 65 3e 30 20 29 3b 0a 20 20 20 20 70 43  page>0 );.    pC
1cbb0 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52  ur->eState = CUR
1cbc0 53 4f 52 5f 56 41 4c 49 44 3b 0a 20 20 20 20 72  SOR_VALID;.    r
1cbd0 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
1cbe0 70 43 75 72 2c 20 73 75 62 70 61 67 65 29 3b 0a  pCur, subpage);.
1cbf0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 43 75    }else{.    pCu
1cc00 72 2d 3e 65 53 74 61 74 65 20 3d 20 28 28 70 52  r->eState = ((pR
1cc10 6f 6f 74 2d 3e 6e 43 65 6c 6c 3e 30 29 3f 43 55  oot->nCell>0)?CU
1cc20 52 53 4f 52 5f 56 41 4c 49 44 3a 43 55 52 53 4f  RSOR_VALID:CURSO
1cc30 52 5f 49 4e 56 41 4c 49 44 29 3b 0a 20 20 7d 0a  R_INVALID);.  }.
1cc40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1cc50 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
1cc60 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68  ursor down to th
1cc70 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65 61 66  e left-most leaf
1cc80 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
1cc90 68 65 0a 2a 2a 20 65 6e 74 72 79 20 74 6f 20 77  he.** entry to w
1cca0 68 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65  hich it is curre
1ccb0 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 0a 2a  ntly pointing..*
1ccc0 2a 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f  *.** The left-mo
1ccd0 73 74 20 6c 65 61 66 20 69 73 20 74 68 65 20 6f  st leaf is the o
1cce0 6e 65 20 77 69 74 68 20 74 68 65 20 73 6d 61 6c  ne with the smal
1ccf0 6c 65 73 74 20 6b 65 79 20 2d 20 74 68 65 20 66  lest key - the f
1cd00 69 72 73 74 0a 2a 2a 20 69 6e 20 61 73 63 65 6e  irst.** in ascen
1cd10 64 69 6e 67 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73  ding order..*/.s
1cd20 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f  tatic int moveTo
1cd30 4c 65 66 74 6d 6f 73 74 28 42 74 43 75 72 73 6f  Leftmost(BtCurso
1cd40 72 20 2a 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f  r *pCur){.  Pgno
1cd50 20 70 67 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20   pgno;.  int rc 
1cd60 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d  = SQLITE_OK;.  M
1cd70 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a  emPage *pPage;..
1cd80 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1cd90 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1cda0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43   );.  assert( pC
1cdb0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1cdc0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77 68  OR_VALID );.  wh
1cdd0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
1cde0 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d 20  OK && !(pPage = 
1cdf0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1ce00 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61 66  r->iPage])->leaf
1ce10 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1ce20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1ce30 2d 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e  ->iPage]<pPage->
1ce40 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 70 67 6e  nCell );.    pgn
1ce50 6f 20 3d 20 67 65 74 34 62 79 74 65 28 66 69 6e  o = get4byte(fin
1ce60 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 75  dCell(pPage, pCu
1ce70 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1ce80 50 61 67 65 5d 29 29 3b 0a 20 20 20 20 72 63 20  Page]));.    rc 
1ce90 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43  = moveToChild(pC
1cea0 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20  ur, pgno);.  }. 
1ceb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1cec0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
1ced0 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 74 68 65  rsor down to the
1cee0 20 72 69 67 68 74 2d 6d 6f 73 74 20 6c 65 61 66   right-most leaf
1cef0 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
1cf00 68 65 0a 2a 2a 20 70 61 67 65 20 74 6f 20 77 68  he.** page to wh
1cf10 69 63 68 20 69 74 20 69 73 20 63 75 72 72 65 6e  ich it is curren
1cf20 74 6c 79 20 70 6f 69 6e 74 69 6e 67 2e 20 20 4e  tly pointing.  N
1cf30 6f 74 69 63 65 20 74 68 65 20 64 69 66 66 65 72  otice the differ
1cf40 65 6e 63 65 0a 2a 2a 20 62 65 74 77 65 65 6e 20  ence.** between 
1cf50 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f 73 74 28 29  moveToLeftmost()
1cf60 20 61 6e 64 20 6d 6f 76 65 54 6f 52 69 67 68 74   and moveToRight
1cf70 6d 6f 73 74 28 29 2e 20 20 6d 6f 76 65 54 6f 4c  most().  moveToL
1cf80 65 66 74 6d 6f 73 74 28 29 0a 2a 2a 20 66 69 6e  eftmost().** fin
1cf90 64 73 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74  ds the left-most
1cfa0 20 65 6e 74 72 79 20 62 65 6e 65 61 74 68 20 74   entry beneath t
1cfb0 68 65 20 2a 65 6e 74 72 79 2a 20 77 68 65 72 65  he *entry* where
1cfc0 61 73 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f  as moveToRightmo
1cfd0 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
1cfe0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
1cff0 72 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a  ry beneath the *
1d000 70 61 67 65 2a 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  page*..**.** The
1d010 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74 72   right-most entr
1d020 79 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69 74  y is the one wit
1d030 68 20 74 68 65 20 6c 61 72 67 65 73 74 20 6b 65  h the largest ke
1d040 79 20 2d 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20  y - the last.** 
1d050 6b 65 79 20 69 6e 20 61 73 63 65 6e 64 69 6e 67  key in ascending
1d060 20 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69   order..*/.stati
1d070 63 20 69 6e 74 20 6d 6f 76 65 54 6f 52 69 67 68  c int moveToRigh
1d080 74 6d 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a  tmost(BtCursor *
1d090 70 43 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  pCur){.  Pgno pg
1d0a0 6e 6f 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  no;.  int rc = S
1d0b0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50  QLITE_OK;.  MemP
1d0c0 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a  age *pPage = 0;.
1d0d0 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f  .  assert( curso
1d0e0 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72  rHoldsMutex(pCur
1d0f0 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
1d100 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
1d110 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 77  SOR_VALID );.  w
1d120 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
1d130 5f 4f 4b 20 26 26 20 21 28 70 50 61 67 65 20 3d  _OK && !(pPage =
1d140 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1d150 75 72 2d 3e 69 50 61 67 65 5d 29 2d 3e 6c 65 61  ur->iPage])->lea
1d160 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d 20  f ){.    pgno = 
1d170 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d  get4byte(&pPage-
1d180 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64  >aData[pPage->hd
1d190 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20  rOffset+8]);.   
1d1a0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
1d1b0 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61 67  r->iPage] = pPag
1d1c0 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 20 20 72 63  e->nCell;.    rc
1d1d0 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
1d1e0 43 75 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a  Cur, pgno);.  }.
1d1f0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1d200 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 43 75 72 2d  _OK ){.    pCur-
1d210 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1d220 67 65 5d 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65  ge] = pPage->nCe
1d230 6c 6c 2d 31 3b 0a 20 20 20 20 70 43 75 72 2d 3e  ll-1;.    pCur->
1d240 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
1d250 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
1d260 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Key = 0;.  }.  r
1d270 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20  eturn rc;.}../* 
1d280 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1d290 74 6f 20 74 68 65 20 66 69 72 73 74 20 65 6e 74  to the first ent
1d2a0 72 79 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e  ry in the table.
1d2b0 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
1d2c0 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
1d2d0 2e 20 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20  .  Set *pRes to 
1d2e0 30 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  0 if the cursor 
1d2f0 61 63 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20  actually points 
1d300 74 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20  to something.** 
1d310 6f 72 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20  or set *pRes to 
1d320 31 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  1 if the table i
1d330 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
1d340 73 71 6c 69 74 65 33 42 74 72 65 65 46 69 72 73  sqlite3BtreeFirs
1d350 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t(BtCursor *pCur
1d360 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20  , int *pRes){.  
1d370 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
1d380 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1d390 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61  tex(pCur) );.  a
1d3a0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
1d3b0 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e  utex_held(pCur->
1d3c0 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65  pBtree->db->mute
1d3d0 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76  x) );.  rc = mov
1d3e0 65 54 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20  eToRoot(pCur);. 
1d3f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d400 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  OK ){.    if( pC
1d410 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1d420 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
1d430 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
1d440 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1d450 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  Page]->nCell==0 
1d460 29 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d  );.      *pRes =
1d470 20 31 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   1;.      rc = S
1d480 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
1d490 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
1d4a0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
1d4b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
1d4c0 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 2a  ell>0 );.      *
1d4d0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
1d4e0 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74 6d  rc = moveToLeftm
1d4f0 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d  ost(pCur);.    }
1d500 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
1d510 3b 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65  ;.}../* Move the
1d520 20 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6c   cursor to the l
1d530 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
1d540 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
1d550 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
1d560 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
1d570 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
1d580 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
1d590 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
1d5a0 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
1d5b0 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
1d5c0 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
1d5d0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1d5e0 72 65 65 4c 61 73 74 28 42 74 43 75 72 73 6f 72  reeLast(BtCursor
1d5f0 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65   *pCur, int *pRe
1d600 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 0a  s){.  int rc;. .
1d610 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1d620 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1d630 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
1d640 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1d650 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
1d660 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
1d670 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
1d680 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
1d690 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d6a0 20 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41   if( CURSOR_INVA
1d6b0 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74  LID==pCur->eStat
1d6c0 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
1d6d0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
1d6e0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
1d6f0 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ell==0 );.      
1d700 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 7d  *pRes = 1;.    }
1d710 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65  else{.      asse
1d720 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
1d730 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
1d740 3b 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20  ;.      *pRes = 
1d750 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f  0;.      rc = mo
1d760 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 70 43  veToRightmost(pC
1d770 75 72 29 3b 0a 20 20 20 20 20 20 67 65 74 43 65  ur);.      getCe
1d780 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
1d790 20 20 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74      pCur->atLast
1d7a0 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   = rc==SQLITE_OK
1d7b0 20 3f 31 3a 30 3b 0a 20 20 20 20 7d 0a 20 20 7d   ?1:0;.    }.  }
1d7c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1d7d0 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63 75 72  ./* Move the cur
1d7e0 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74 20 70  sor so that it p
1d7f0 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e 74 72  oints to an entr
1d800 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79 20 0a  y near the key .
1d810 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62 79 20  ** specified by 
1d820 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74 4b 65  pIdxKey or intKe
1d830 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20 73 75  y.   Return a su
1d840 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  ccess code..**.*
1d850 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74 61 62  * For INTKEY tab
1d860 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65 79 20  les, the intKey 
1d870 70 61 72 61 6d 65 74 65 72 20 69 73 20 75 73 65  parameter is use
1d880 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a 2a 20  d.  pIdxKey .** 
1d890 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20 20 46  must be NULL.  F
1d8a0 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65 73 2c  or index tables,
1d8b0 20 70 49 64 78 4b 65 79 20 69 73 20 75 73 65 64   pIdxKey is used
1d8c0 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a 20 69   and intKey.** i
1d8d0 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a  s ignored..**.**
1d8e0 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d 61 74   If an exact mat
1d8f0 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 2c  ch is not found,
1d900 20 74 68 65 6e 20 74 68 65 20 63 75 72 73 6f 72   then the cursor
1d910 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 6c 65   is always.** le
1d920 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61  ft pointing at a
1d930 20 6c 65 61 66 20 70 61 67 65 20 77 68 69 63 68   leaf page which
1d940 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68 65 20   would hold the 
1d950 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a 20 77  entry if it.** w
1d960 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20 54 68  ere present.  Th
1d970 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74 20 70  e cursor might p
1d980 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74 72 79  oint to an entry
1d990 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a 20 62   that comes.** b
1d9a0 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72 20 74  efore or after t
1d9b0 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20 41 6e  he key..**.** An
1d9c0 20 69 6e 74 65 67 65 72 20 69 73 20 77 72 69 74   integer is writ
1d9d0 74 65 6e 20 69 6e 74 6f 20 2a 70 52 65 73 20 77  ten into *pRes w
1d9e0 68 69 63 68 20 69 73 20 74 68 65 20 72 65 73 75  hich is the resu
1d9f0 6c 74 20 6f 66 0a 2a 2a 20 63 6f 6d 70 61 72 69  lt of.** compari
1da00 6e 67 20 74 68 65 20 6b 65 79 20 77 69 74 68 20  ng the key with 
1da10 74 68 65 20 65 6e 74 72 79 20 74 6f 20 77 68 69  the entry to whi
1da20 63 68 20 74 68 65 20 63 75 72 73 6f 72 20 69 73  ch the cursor is
1da30 20 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67 2e 20 20   .** pointing.  
1da40 54 68 65 20 6d 65 61 6e 69 6e 67 20 6f 66 20 74  The meaning of t
1da50 68 65 20 69 6e 74 65 67 65 72 20 77 72 69 74 74  he integer writt
1da60 65 6e 20 69 6e 74 6f 0a 2a 2a 20 2a 70 52 65 73  en into.** *pRes
1da70 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
1da80 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3c  **.**     *pRes<
1da90 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f  0      The curso
1daa0 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69  r is left pointi
1dab0 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74  ng at an entry t
1dac0 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  hat.**          
1dad0 20 20 20 20 20 20 20 20 69 73 20 73 6d 61 6c 6c          is small
1dae0 65 72 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70  er than intKey/p
1daf0 49 64 78 4b 65 79 20 6f 72 20 69 66 20 74 68 65  IdxKey or if the
1db00 20 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a   table is empty.
1db10 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1db20 20 20 20 20 61 6e 64 20 74 68 65 20 63 75 72 73      and the curs
1db30 6f 72 20 69 73 20 74 68 65 72 65 66 6f 72 65 20  or is therefore 
1db40 6c 65 66 74 20 70 6f 69 6e 74 20 74 6f 20 6e 6f  left point to no
1db50 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  thing..**.**    
1db60 20 2a 70 52 65 73 3d 3d 30 20 20 20 20 20 54 68   *pRes==0     Th
1db70 65 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74  e cursor is left
1db80 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20   pointing at an 
1db90 65 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20  entry that.**   
1dba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65                 e
1dbb0 78 61 63 74 6c 79 20 6d 61 74 63 68 65 73 20 69  xactly matches i
1dbc0 6e 74 4b 65 79 2f 70 49 64 78 4b 65 79 2e 0a 2a  ntKey/pIdxKey..*
1dbd0 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73 3e 30  *.**     *pRes>0
1dbe0 20 20 20 20 20 20 54 68 65 20 63 75 72 73 6f 72        The cursor
1dbf0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
1dc00 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 74 68  g at an entry th
1dc10 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  at.**           
1dc20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67 65 72         is larger
1dc30 20 74 68 61 6e 20 69 6e 74 4b 65 79 2f 70 49 64   than intKey/pId
1dc40 78 4b 65 79 2e 0a 2a 2a 0a 2a 2f 0a 69 6e 74 20  xKey..**.*/.int 
1dc50 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
1dc60 74 6f 55 6e 70 61 63 6b 65 64 28 0a 20 20 42 74  toUnpacked(.  Bt
1dc70 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 20 20  Cursor *pCur,   
1dc80 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 75         /* The cu
1dc90 72 73 6f 72 20 74 6f 20 62 65 20 6d 6f 76 65 64  rsor to be moved
1dca0 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65   */.  UnpackedRe
1dcb0 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 2c 20 2f  cord *pIdxKey, /
1dcc0 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
1dcd0 20 6b 65 79 20 2a 2f 0a 20 20 69 36 34 20 69 6e   key */.  i64 in
1dce0 74 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20 20  tKey,           
1dcf0 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
1dd00 6b 65 79 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61  key */.  int bia
1dd10 73 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  sRight,         
1dd20 20 20 2f 2a 20 49 66 20 74 72 75 65 2c 20 62 69    /* If true, bi
1dd30 61 73 20 74 68 65 20 73 65 61 72 63 68 20 74 6f  as the search to
1dd40 20 74 68 65 20 68 69 67 68 20 65 6e 64 20 2a 2f   the high end */
1dd50 0a 20 20 69 6e 74 20 2a 70 52 65 73 20 20 20 20  .  int *pRes    
1dd60 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
1dd70 72 69 74 65 20 73 65 61 72 63 68 20 72 65 73 75  rite search resu
1dd80 6c 74 73 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20  lts here */.){. 
1dd90 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
1dda0 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1ddb0 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1ddc0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
1ddd0 6d 75 74 65 78 5f 68 65 6c 64 28 70 43 75 72 2d  mutex_held(pCur-
1dde0 3e 70 42 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74  >pBtree->db->mut
1ddf0 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ex) );..  /* If 
1de00 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 61 6c  the cursor is al
1de10 72 65 61 64 79 20 70 6f 73 69 74 69 6f 6e 65 64  ready positioned
1de20 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20 77 65   at the point we
1de30 20 61 72 65 20 74 72 79 69 6e 67 0a 20 20 2a 2a   are trying.  **
1de40 20 74 6f 20 6d 6f 76 65 20 74 6f 2c 20 74 68 65   to move to, the
1de50 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20 77 69  n just return wi
1de60 74 68 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 20  thout doing any 
1de70 77 6f 72 6b 20 2a 2f 0a 20 20 69 66 28 20 70 43  work */.  if( pC
1de80 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1de90 4f 52 5f 56 41 4c 49 44 20 26 26 20 70 43 75 72  OR_VALID && pCur
1dea0 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 0a 20 20 20  ->validNKey .   
1deb0 26 26 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  && pCur->apPage[
1dec0 30 5d 2d 3e 69 6e 74 4b 65 79 20 0a 20 20 29 7b  0]->intKey .  ){
1ded0 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69  .    if( pCur->i
1dee0 6e 66 6f 2e 6e 4b 65 79 3d 3d 69 6e 74 4b 65 79  nfo.nKey==intKey
1def0 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73 20   ){.      *pRes 
1df00 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
1df10 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  n SQLITE_OK;.   
1df20 20 7d 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d   }.    if( pCur-
1df30 3e 61 74 4c 61 73 74 20 26 26 20 70 43 75 72 2d  >atLast && pCur-
1df40 3e 69 6e 66 6f 2e 6e 4b 65 79 3c 69 6e 74 4b 65  >info.nKey<intKe
1df50 79 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 65 73  y ){.      *pRes
1df60 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 72 65 74   = -1;.      ret
1df70 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1df80 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 63 20 3d     }.  }..  rc =
1df90 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
1dfa0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
1dfb0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1dfc0 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  }.  assert( pCur
1dfd0 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1dfe0 50 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72  Page] );.  asser
1dff0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
1e000 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 73  pCur->iPage]->is
1e010 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20 70 43  Init );.  if( pC
1e020 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1e030 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20 20  OR_INVALID ){.  
1e040 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20 20    *pRes = -1;.  
1e050 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1e060 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1e070 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ge]->nCell==0 );
1e080 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1e090 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73  TE_OK;.  }.  ass
1e0a0 65 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67  ert( pCur->apPag
1e0b0 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c 20  e[0]->intKey || 
1e0c0 70 49 64 78 4b 65 79 20 29 3b 0a 20 20 66 6f 72  pIdxKey );.  for
1e0d0 28 3b 3b 29 7b 0a 20 20 20 20 69 6e 74 20 6c 77  (;;){.    int lw
1e0e0 72 2c 20 75 70 72 3b 0a 20 20 20 20 50 67 6e 6f  r, upr;.    Pgno
1e0f0 20 63 68 6c 64 50 67 3b 0a 20 20 20 20 4d 65 6d   chldPg;.    Mem
1e100 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43  Page *pPage = pC
1e110 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
1e120 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69 6e 74  >iPage];.    int
1e130 20 63 20 3d 20 2d 31 3b 20 20 2f 2a 20 70 52 65   c = -1;  /* pRe
1e140 73 20 72 65 74 75 72 6e 20 69 66 20 74 61 62 6c  s return if tabl
1e150 65 20 69 73 20 65 6d 70 74 79 20 6d 75 73 74 20  e is empty must 
1e160 62 65 20 2d 31 20 2a 2f 0a 20 20 20 20 6c 77 72  be -1 */.    lwr
1e170 20 3d 20 30 3b 0a 20 20 20 20 75 70 72 20 3d 20   = 0;.    upr = 
1e180 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a  pPage->nCell-1;.
1e190 20 20 20 20 69 66 28 20 28 21 70 50 61 67 65 2d      if( (!pPage-
1e1a0 3e 69 6e 74 4b 65 79 20 26 26 20 70 49 64 78 4b  >intKey && pIdxK
1e1b0 65 79 3d 3d 30 29 20 7c 7c 20 75 70 72 3c 30 20  ey==0) || upr<0 
1e1c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
1e1d0 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1e1e0 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f  T;.      goto mo
1e1f0 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
1e200 20 7d 0a 20 20 20 20 69 66 28 20 62 69 61 73 52   }.    if( biasR
1e210 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 70 43  ight ){.      pC
1e220 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
1e230 69 50 61 67 65 5d 20 3d 20 28 75 31 36 29 75 70  iPage] = (u16)up
1e240 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  r;.    }else{.  
1e250 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
1e260 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
1e270 75 31 36 29 28 28 75 70 72 2b 6c 77 72 29 2f 32  u16)((upr+lwr)/2
1e280 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  );.    }.    for
1e290 28 3b 3b 29 7b 0a 20 20 20 20 20 20 76 6f 69 64  (;;){.      void
1e2a0 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20   *pCellKey;.    
1e2b0 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a    i64 nCellKey;.
1e2c0 20 20 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20        int idx = 
1e2d0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1e2e0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 20 20  ->iPage];.      
1e2f0 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1e300 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 43 75 72   = 0;.      pCur
1e310 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b  ->validNKey = 1;
1e320 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
1e330 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
1e340 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20      u8 *pCell;. 
1e350 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66         pCell = f
1e360 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
1e370 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  dx) + pPage->chi
1e380 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20  ldPtrSize;.     
1e390 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61     if( pPage->ha
1e3a0 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  sData ){.       
1e3b0 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
1e3c0 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d          pCell +=
1e3d0 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 43 65   getVarint32(pCe
1e3e0 6c 6c 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20  ll, dummy);.    
1e3f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65      }.        ge
1e400 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28  tVarint(pCell, (
1e410 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b  u64*)&nCellKey);
1e420 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65  .        if( nCe
1e430 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b  llKey==intKey ){
1e440 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 30  .          c = 0
1e450 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
1e460 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74  if( nCellKey<int
1e470 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
1e480 20 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20   c = -1;.       
1e490 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1e4a0 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b    assert( nCellK
1e4b0 65 79 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20  ey>intKey );.   
1e4c0 20 20 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20         c = +1;. 
1e4d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1e4e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
1e4f0 74 20 61 76 61 69 6c 61 62 6c 65 3b 0a 20 20 20  t available;.   
1e500 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20       pCellKey = 
1e510 28 76 6f 69 64 20 2a 29 66 65 74 63 68 50 61 79  (void *)fetchPay
1e520 6c 6f 61 64 28 70 43 75 72 2c 20 26 61 76 61 69  load(pCur, &avai
1e530 6c 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  lable, 0);.     
1e540 20 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 70 43     nCellKey = pC
1e550 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
1e560 20 20 20 20 20 20 20 69 66 28 20 61 76 61 69 6c         if( avail
1e570 61 62 6c 65 3e 3d 6e 43 65 6c 6c 4b 65 79 20 29  able>=nCellKey )
1e580 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  {.          c = 
1e590 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1e5a0 64 43 6f 6d 70 61 72 65 28 28 69 6e 74 29 6e 43  dCompare((int)nC
1e5b0 65 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79  ellKey, pCellKey
1e5c0 2c 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20  , pIdxKey);.    
1e5d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e5e0 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20       pCellKey = 
1e5f0 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 28  sqlite3Malloc( (
1e600 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 20 29 3b 0a  int)nCellKey );.
1e610 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 43            if( pC
1e620 65 6c 6c 4b 65 79 3d 3d 30 20 29 7b 0a 20 20 20  ellKey==0 ){.   
1e630 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1e640 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
1e650 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
1e660 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
1e670 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e680 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
1e690 72 65 65 4b 65 79 28 70 43 75 72 2c 20 30 2c 20  reeKey(pCur, 0, 
1e6a0 28 69 6e 74 29 6e 43 65 6c 6c 4b 65 79 2c 20 28  (int)nCellKey, (
1e6b0 76 6f 69 64 2a 29 70 43 65 6c 6c 4b 65 79 29 3b  void*)pCellKey);
1e6c0 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 73  .          c = s
1e6d0 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72 64  qlite3VdbeRecord
1e6e0 43 6f 6d 70 61 72 65 28 28 69 6e 74 29 6e 43 65  Compare((int)nCe
1e6f0 6c 6c 4b 65 79 2c 20 70 43 65 6c 6c 4b 65 79 2c  llKey, pCellKey,
1e700 20 70 49 64 78 4b 65 79 29 3b 0a 20 20 20 20 20   pIdxKey);.     
1e710 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1e720 65 28 70 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20  e(pCellKey);.   
1e730 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
1e740 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
1e750 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  sh;.        }.  
1e760 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1e770 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
1e780 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20  pCur->info.nKey 
1e790 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20  = nCellKey;.    
1e7a0 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69      if( pPage->i
1e7b0 6e 74 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d  ntKey && !pPage-
1e7c0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 20  >leaf ){.       
1e7d0 20 20 20 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20     lwr = idx;.  
1e7e0 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 6c 77          upr = lw
1e7f0 72 20 2d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  r - 1;.         
1e800 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1e810 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
1e820 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *pRes = 0;.    
1e830 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1e840 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
1e850 67 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69  goto moveto_fini
1e860 73 68 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  sh;.        }.  
1e870 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1e880 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 6c  c<0 ){.        l
1e890 77 72 20 3d 20 69 64 78 2b 31 3b 0a 20 20 20 20  wr = idx+1;.    
1e8a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1e8b0 20 75 70 72 20 3d 20 69 64 78 2d 31 3b 0a 20 20   upr = idx-1;.  
1e8c0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1e8d0 6c 77 72 3e 75 70 72 20 29 7b 0a 20 20 20 20 20  lwr>upr ){.     
1e8e0 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b     pCur->info.nK
1e8f0 65 79 20 3d 20 6e 43 65 6c 6c 4b 65 79 3b 0a 20  ey = nCellKey;. 
1e900 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1e910 20 20 20 20 7d 0a 20 20 20 20 20 20 70 43 75 72      }.      pCur
1e920 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1e930 61 67 65 5d 20 3d 20 28 75 31 36 29 28 28 6c 77  age] = (u16)((lw
1e940 72 2b 75 70 72 29 2f 32 29 3b 0a 20 20 20 20 7d  r+upr)/2);.    }
1e950 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77 72  .    assert( lwr
1e960 3d 3d 75 70 72 2b 31 20 29 3b 0a 20 20 20 20 61  ==upr+1 );.    a
1e970 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73  ssert( pPage->is
1e980 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28 20  Init );.    if( 
1e990 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20  pPage->leaf ){. 
1e9a0 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 30 3b       chldPg = 0;
1e9b0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6c  .    }else if( l
1e9c0 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  wr>=pPage->nCell
1e9d0 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50 67   ){.      chldPg
1e9e0 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
1e9f0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
1ea00 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
1ea10 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ea20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62 79   chldPg = get4by
1ea30 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  te(findCell(pPag
1ea40 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d 0a  e, lwr));.    }.
1ea50 20 20 20 20 69 66 28 20 63 68 6c 64 50 67 3d 3d      if( chldPg==
1ea60 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
1ea70 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70  t( pCur->aiIdx[p
1ea80 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75 72  Cur->iPage]<pCur
1ea90 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69  ->apPage[pCur->i
1eaa0 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  Page]->nCell );.
1eab0 20 20 20 20 20 20 69 66 28 20 70 52 65 73 20 29        if( pRes )
1eac0 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20 20   *pRes = c;.    
1ead0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1eae0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76  ;.      goto mov
1eaf0 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
1eb00 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64  }.    pCur->aiId
1eb10 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d  x[pCur->iPage] =
1eb20 20 28 75 31 36 29 6c 77 72 3b 0a 20 20 20 20 70   (u16)lwr;.    p
1eb30 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20  Cur->info.nSize 
1eb40 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d 3e 76  = 0;.    pCur->v
1eb50 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
1eb60 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69    rc = moveToChi
1eb70 6c 64 28 70 43 75 72 2c 20 63 68 6c 64 50 67 29  ld(pCur, chldPg)
1eb80 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
1eb90 6f 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73  oto moveto_finis
1eba0 68 3b 0a 20 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69  h;.  }.moveto_fi
1ebb0 6e 69 73 68 3a 0a 20 20 72 65 74 75 72 6e 20 72  nish:.  return r
1ebc0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74  c;.}../*.** In t
1ebd0 68 69 73 20 76 65 72 73 69 6f 6e 20 6f 66 20 42  his version of B
1ebe0 74 72 65 65 4d 6f 76 65 74 6f 2c 20 70 4b 65 79  treeMoveto, pKey
1ebf0 20 69 73 20 61 20 70 61 63 6b 65 64 20 69 6e 64   is a packed ind
1ec00 65 78 20 72 65 63 6f 72 64 0a 2a 2a 20 73 75 63  ex record.** suc
1ec10 68 20 61 73 20 69 73 20 67 65 6e 65 72 61 74 65  h as is generate
1ec20 64 20 62 79 20 74 68 65 20 4f 50 5f 4d 61 6b 65  d by the OP_Make
1ec30 52 65 63 6f 72 64 20 6f 70 63 6f 64 65 2e 20 20  Record opcode.  
1ec40 55 6e 70 61 63 6b 20 74 68 65 0a 2a 2a 20 72 65  Unpack the.** re
1ec50 63 6f 72 64 20 61 6e 64 20 74 68 65 6e 20 63 61  cord and then ca
1ec60 6c 6c 20 42 74 72 65 65 4d 6f 76 65 74 6f 55 6e  ll BtreeMovetoUn
1ec70 70 61 63 6b 65 64 28 29 20 74 6f 20 64 6f 20 74  packed() to do t
1ec80 68 65 20 77 6f 72 6b 2e 0a 2a 2f 0a 69 6e 74 20  he work..*/.int 
1ec90 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
1eca0 74 6f 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  to(.  BtCursor *
1ecb0 70 43 75 72 2c 20 20 20 20 20 2f 2a 20 43 75 72  pCur,     /* Cur
1ecc0 73 6f 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20  sor open on the 
1ecd0 62 74 72 65 65 20 74 6f 20 62 65 20 73 65 61 72  btree to be sear
1ece0 63 68 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ched */.  const 
1ecf0 76 6f 69 64 20 2a 70 4b 65 79 2c 20 20 20 2f 2a  void *pKey,   /*
1ed00 20 50 61 63 6b 65 64 20 6b 65 79 20 69 66 20 74   Packed key if t
1ed10 68 65 20 62 74 72 65 65 20 69 73 20 61 6e 20 69  he btree is an i
1ed20 6e 64 65 78 20 2a 2f 0a 20 20 69 36 34 20 6e 4b  ndex */.  i64 nK
1ed30 65 79 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ey,           /*
1ed40 20 49 6e 74 65 67 65 72 20 6b 65 79 20 66 6f 72   Integer key for
1ed50 20 74 61 62 6c 65 73 2e 20 20 53 69 7a 65 20 6f   tables.  Size o
1ed60 66 20 70 4b 65 79 20 66 6f 72 20 69 6e 64 69 63  f pKey for indic
1ed70 65 73 20 2a 2f 0a 20 20 69 6e 74 20 62 69 61 73  es */.  int bias
1ed80 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ,           /* B
1ed90 69 61 73 20 73 65 61 72 63 68 20 74 6f 20 74 68  ias search to th
1eda0 65 20 68 69 67 68 20 65 6e 64 20 2a 2f 0a 20 20  e high end */.  
1edb0 69 6e 74 20 2a 70 52 65 73 20 20 20 20 20 20 20  int *pRes       
1edc0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61      /* Write sea
1edd0 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65  rch results here
1ede0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
1edf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee00 20 20 20 20 2f 2a 20 53 74 61 74 75 73 20 63 6f      /* Status co
1ee10 64 65 20 2a 2f 0a 20 20 55 6e 70 61 63 6b 65 64  de */.  Unpacked
1ee20 52 65 63 6f 72 64 20 2a 70 49 64 78 4b 65 79 3b  Record *pIdxKey;
1ee30 20 20 20 2f 2a 20 55 6e 70 61 63 6b 65 64 20 69     /* Unpacked i
1ee40 6e 64 65 78 20 6b 65 79 20 2a 2f 0a 20 20 55 6e  ndex key */.  Un
1ee50 70 61 63 6b 65 64 52 65 63 6f 72 64 20 61 53 70  packedRecord aSp
1ee60 61 63 65 5b 31 36 5d 3b 20 2f 2a 20 54 65 6d 70  ace[16]; /* Temp
1ee70 20 73 70 61 63 65 20 66 6f 72 20 70 49 64 78 4b   space for pIdxK
1ee80 65 79 20 2d 20 74 6f 20 61 76 6f 69 64 20 61 20  ey - to avoid a 
1ee90 6d 61 6c 6c 6f 63 20 2a 2f 0a 0a 20 20 69 66 28  malloc */..  if(
1eea0 20 70 4b 65 79 20 29 7b 0a 20 20 20 20 61 73 73   pKey ){.    ass
1eeb0 65 72 74 28 20 6e 4b 65 79 3d 3d 28 69 36 34 29  ert( nKey==(i64)
1eec0 28 69 6e 74 29 6e 4b 65 79 20 29 3b 0a 20 20 20  (int)nKey );.   
1eed0 20 70 49 64 78 4b 65 79 20 3d 20 73 71 6c 69 74   pIdxKey = sqlit
1eee0 65 33 56 64 62 65 52 65 63 6f 72 64 55 6e 70 61  e3VdbeRecordUnpa
1eef0 63 6b 28 70 43 75 72 2d 3e 70 4b 65 79 49 6e 66  ck(pCur->pKeyInf
1ef00 6f 2c 20 28 69 6e 74 29 6e 4b 65 79 2c 20 70 4b  o, (int)nKey, pK
1ef10 65 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ey,.            
1ef20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef30 20 20 20 20 20 20 20 20 20 20 61 53 70 61 63 65            aSpace
1ef40 2c 20 73 69 7a 65 6f 66 28 61 53 70 61 63 65 29  , sizeof(aSpace)
1ef50 29 3b 0a 20 20 20 20 69 66 28 20 70 49 64 78 4b  );.    if( pIdxK
1ef60 65 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ey==0 ) return S
1ef70 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
1ef80 65 6c 73 65 7b 0a 20 20 20 20 70 49 64 78 4b 65  else{.    pIdxKe
1ef90 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 63 20  y = 0;.  }.  rc 
1efa0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f  = sqlite3BtreeMo
1efb0 76 65 74 6f 55 6e 70 61 63 6b 65 64 28 70 43 75  vetoUnpacked(pCu
1efc0 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e 4b 65 79  r, pIdxKey, nKey
1efd0 2c 20 62 69 61 73 2c 20 70 52 65 73 29 3b 0a 20  , bias, pRes);. 
1efe0 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20 20 20   if( pKey ){.   
1eff0 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 6c 65   sqlite3VdbeDele
1f000 74 65 55 6e 70 61 63 6b 65 64 52 65 63 6f 72 64  teUnpackedRecord
1f010 28 70 49 64 78 4b 65 79 29 3b 0a 20 20 7d 0a 20  (pIdxKey);.  }. 
1f020 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
1f030 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
1f040 45 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  E if the cursor 
1f050 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e 67 20  is not pointing 
1f060 61 74 20 61 6e 20 65 6e 74 72 79 20 6f 66 20 74  at an entry of t
1f070 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  he table..**.** 
1f080 54 52 55 45 20 77 69 6c 6c 20 62 65 20 72 65 74  TRUE will be ret
1f090 75 72 6e 65 64 20 61 66 74 65 72 20 61 20 63 61  urned after a ca
1f0a0 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72  ll to sqlite3Btr
1f0b0 65 65 4e 65 78 74 28 29 20 6d 6f 76 65 73 0a 2a  eeNext() moves.*
1f0c0 2a 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20  * past the last 
1f0d0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 61 62  entry in the tab
1f0e0 6c 65 20 6f 72 20 73 71 6c 69 74 65 33 42 74 72  le or sqlite3Btr
1f0f0 65 65 50 72 65 76 28 29 20 6d 6f 76 65 73 20 70  eePrev() moves p
1f100 61 73 74 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  ast.** the first
1f110 20 65 6e 74 72 79 2e 20 20 54 52 55 45 20 69 73   entry.  TRUE is
1f120 20 61 6c 73 6f 20 72 65 74 75 72 6e 65 64 20 69   also returned i
1f130 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 65  f the table is e
1f140 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mpty..*/.int sql
1f150 69 74 65 33 42 74 72 65 65 45 6f 66 28 42 74 43  ite3BtreeEof(BtC
1f160 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20  ursor *pCur){.  
1f170 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74 20 69 66  /* TODO: What if
1f180 20 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 69   the cursor is i
1f190 6e 20 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45  n CURSOR_REQUIRE
1f1a0 53 45 45 4b 20 62 75 74 20 61 6c 6c 20 74 61 62  SEEK but all tab
1f1b0 6c 65 20 65 6e 74 72 69 65 73 0a 20 20 2a 2a 20  le entries.  ** 
1f1c0 68 61 76 65 20 62 65 65 6e 20 64 65 6c 65 74 65  have been delete
1f1d0 64 3f 20 54 68 69 73 20 41 50 49 20 77 69 6c 6c  d? This API will
1f1e0 20 6e 65 65 64 20 74 6f 20 63 68 61 6e 67 65 20   need to change 
1f1f0 74 6f 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72  to return an err
1f200 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20 61 73 20  or code.  ** as 
1f210 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6f 6f 6c  well as the bool
1f220 65 61 6e 20 72 65 73 75 6c 74 20 76 61 6c 75 65  ean result value
1f230 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ..  */.  return 
1f240 28 43 55 52 53 4f 52 5f 56 41 4c 49 44 21 3d 70  (CURSOR_VALID!=p
1f250 43 75 72 2d 3e 65 53 74 61 74 65 29 3b 0a 7d 0a  Cur->eState);.}.
1f260 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1f270 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
1f280 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 66 6f 72  ction handle for
1f290 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 73 71   a cursor..*/.sq
1f2a0 6c 69 74 65 33 20 2a 73 71 6c 69 74 65 33 42 74  lite3 *sqlite3Bt
1f2b0 72 65 65 43 75 72 73 6f 72 44 62 28 63 6f 6e 73  reeCursorDb(cons
1f2c0 74 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  t BtCursor *pCur
1f2d0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ){.  assert( sql
1f2e0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1f2f0 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62  pCur->pBtree->db
1f300 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65  ->mutex) );.  re
1f310 74 75 72 6e 20 70 43 75 72 2d 3e 70 42 74 72 65  turn pCur->pBtre
1f320 65 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e->db;.}../*.** 
1f330 41 64 76 61 6e 63 65 20 74 68 65 20 63 75 72 73  Advance the curs
1f340 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 65  or to the next e
1f350 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
1f360 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75 63  base.  If.** suc
1f370 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65 74  cessful then set
1f380 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74 68   *pRes=0.  If th
1f390 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73 20  e cursor.** was 
1f3a0 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e 67  already pointing
1f3b0 20 74 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74   to the last ent
1f3c0 72 79 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ry in the databa
1f3d0 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 69  se before.** thi
1f3e0 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 63 61  s routine was ca
1f3f0 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74 20 2a  lled, then set *
1f400 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74 20 73  pRes=1..*/.int s
1f410 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
1f420 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
1f430 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e  int *pRes){.  in
1f440 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b  t rc;.  int idx;
1f450 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
1f460 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  e;..  assert( cu
1f470 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
1f480 43 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72  Cur) );.  rc = r
1f490 65 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69  estoreCursorPosi
1f4a0 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66  tion(pCur);.  if
1f4b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1f4c0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
1f4d0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
1f4e0 70 52 65 73 21 3d 30 20 29 3b 0a 20 20 69 66 28  pRes!=0 );.  if(
1f4f0 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d   CURSOR_INVALID=
1f500 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29 7b  =pCur->eState ){
1f510 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a  .    *pRes = 1;.
1f520 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1f530 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
1f540 70 43 75 72 2d 3e 73 6b 69 70 3e 30 20 29 7b 0a  pCur->skip>0 ){.
1f550 20 20 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d      pCur->skip =
1f560 20 30 3b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   0;.    *pRes = 
1f570 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  0;.    return SQ
1f580 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
1f590 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a  Cur->skip = 0;..
1f5a0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
1f5b0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1f5c0 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20 2b 2b 70  ge];.  idx = ++p
1f5d0 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1f5e0 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
1f5f0 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74  t( pPage->isInit
1f600 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64   );.  assert( id
1f610 78 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20  x<=pPage->nCell 
1f620 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  );..  pCur->info
1f630 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
1f640 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
1f650 30 3b 0a 20 20 69 66 28 20 69 64 78 3e 3d 70 50  0;.  if( idx>=pP
1f660 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  age->nCell ){.  
1f670 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
1f680 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  af ){.      rc =
1f690 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
1f6a0 72 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61  r, get4byte(&pPa
1f6b0 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
1f6c0 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b  >hdrOffset+8]));
1f6d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
1f6e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
1f6f0 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66 74   rc = moveToLeft
1f700 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
1f710 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
1f720 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1f730 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20    }.    do{.    
1f740 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
1f750 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
1f760 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
1f770 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
1f780 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
1f790 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1f7a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1f7b0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1f7c0 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65  3BtreeMoveToPare
1f7d0 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 20 20  nt(pCur);.      
1f7e0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
1f7f0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1f800 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 70  ];.    }while( p
1f810 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
1f820 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d 3e  >iPage]>=pPage->
1f830 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 2a 70 52  nCell );.    *pR
1f840 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  es = 0;.    if( 
1f850 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 7b  pPage->intKey ){
1f860 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1f870 74 65 33 42 74 72 65 65 4e 65 78 74 28 70 43 75  te3BtreeNext(pCu
1f880 72 2c 20 70 52 65 73 29 3b 0a 20 20 20 20 7d 65  r, pRes);.    }e
1f890 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
1f8a0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
1f8b0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1f8c0 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 30 3b    }.  *pRes = 0;
1f8d0 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65  .  if( pPage->le
1f8e0 61 66 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  af ){.    return
1f8f0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1f900 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c 65 66    rc = moveToLef
1f910 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 72  tmost(pCur);.  r
1f920 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
1f930 0a 2a 2a 20 53 74 65 70 20 74 68 65 20 63 75 72  .** Step the cur
1f940 73 6f 72 20 74 6f 20 74 68 65 20 62 61 63 6b 20  sor to the back 
1f950 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  to the previous 
1f960 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
1f970 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20 73 75  abase.  If.** su
1f980 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20 73 65  ccessful then se
1f990 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66 20 74  t *pRes=0.  If t
1f9a0 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77 61 73  he cursor.** was
1f9b0 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74 69 6e   already pointin
1f9c0 67 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 65  g to the first e
1f9d0 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74 61  ntry in the data
1f9e0 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74  base before.** t
1f9f0 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20  his routine was 
1fa00 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65 74  called, then set
1fa10 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e 74   *pRes=1..*/.int
1fa20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72 65   sqlite3BtreePre
1fa30 76 69 6f 75 73 28 42 74 43 75 72 73 6f 72 20 2a  vious(BtCursor *
1fa40 70 43 75 72 2c 20 69 6e 74 20 2a 70 52 65 73 29  pCur, int *pRes)
1fa50 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
1fa60 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 0a 20  mPage *pPage;.. 
1fa70 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
1fa80 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
1fa90 29 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72  );.  rc = restor
1faa0 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  eCursorPosition(
1fab0 70 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 21  pCur);.  if( rc!
1fac0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1fad0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1fae0 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20  .  pCur->atLast 
1faf0 3d 20 30 3b 0a 20 20 69 66 28 20 43 55 52 53 4f  = 0;.  if( CURSO
1fb00 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72 2d  R_INVALID==pCur-
1fb10 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20 2a  >eState ){.    *
1fb20 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 72 65  pRes = 1;.    re
1fb30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1fb40 20 20 7d 0a 20 20 69 66 28 20 70 43 75 72 2d 3e    }.  if( pCur->
1fb50 73 6b 69 70 3c 30 20 29 7b 0a 20 20 20 20 70 43  skip<0 ){.    pC
1fb60 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 20 20  ur->skip = 0;.  
1fb70 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
1fb80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1fb90 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72 2d 3e 73  K;.  }.  pCur->s
1fba0 6b 69 70 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67  kip = 0;..  pPag
1fbb0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
1fbc0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
1fbd0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
1fbe0 69 73 49 6e 69 74 20 29 3b 0a 20 20 69 66 28 20  isInit );.  if( 
1fbf0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
1fc00 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20 70 43      int idx = pC
1fc10 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
1fc20 69 50 61 67 65 5d 3b 0a 20 20 20 20 72 63 20 3d  iPage];.    rc =
1fc30 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75   moveToChild(pCu
1fc40 72 2c 20 67 65 74 34 62 79 74 65 28 66 69 6e 64  r, get4byte(find
1fc50 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29  Cell(pPage, idx)
1fc60 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  ));.    if( rc )
1fc70 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1fc80 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  c;.    }.    rc 
1fc90 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73  = moveToRightmos
1fca0 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65  t(pCur);.  }else
1fcb0 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 43 75  {.    while( pCu
1fcc0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
1fcd0 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  Page]==0 ){.    
1fce0 20 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67    if( pCur->iPag
1fcf0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
1fd00 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
1fd10 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
1fd20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31         *pRes = 1
1fd30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
1fd40 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
1fd50 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1fd60 33 42 74 72 65 65 4d 6f 76 65 54 6f 50 61 72 65  3BtreeMoveToPare
1fd70 6e 74 28 70 43 75 72 29 3b 0a 20 20 20 20 7d 0a  nt(pCur);.    }.
1fd80 20 20 20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e      pCur->info.n
1fd90 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 70 43  Size = 0;.    pC
1fda0 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
1fdb0 30 3b 0a 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  0;..    pCur->ai
1fdc0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1fdd0 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20  --;.    pPage = 
1fde0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
1fdf0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 69  r->iPage];.    i
1fe00 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
1fe10 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65 61 66   && !pPage->leaf
1fe20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1fe30 71 6c 69 74 65 33 42 74 72 65 65 50 72 65 76 69  qlite3BtreePrevi
1fe40 6f 75 73 28 70 43 75 72 2c 20 70 52 65 73 29 3b  ous(pCur, pRes);
1fe50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1fe60 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
1fe70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  ;.    }.  }.  *p
1fe80 52 65 73 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  Res = 0;.  retur
1fe90 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
1fea0 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61  llocate a new pa
1feb0 67 65 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ge from the data
1fec0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
1fed0 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 69 73   The new page is
1fee0 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
1fef0 2e 20 20 28 49 6e 20 6f 74 68 65 72 20 77 6f 72  .  (In other wor
1ff00 64 73 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72  ds, sqlite3Pager
1ff10 57 72 69 74 65 28 29 0a 2a 2a 20 68 61 73 20 61  Write().** has a
1ff20 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
1ff30 65 64 20 6f 6e 20 74 68 65 20 6e 65 77 20 70 61  ed on the new pa
1ff40 67 65 2e 29 20 20 54 68 65 20 6e 65 77 20 70 61  ge.)  The new pa
1ff50 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a 2a 20 62  ge has also.** b
1ff60 65 65 6e 20 72 65 66 65 72 65 6e 63 65 64 20 61  een referenced a
1ff70 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72  nd the calling r
1ff80 6f 75 74 69 6e 65 20 69 73 20 72 65 73 70 6f 6e  outine is respon
1ff90 73 69 62 6c 65 20 66 6f 72 20 63 61 6c 6c 69 6e  sible for callin
1ffa0 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  g.** sqlite3Page
1ffb0 72 55 6e 72 65 66 28 29 20 6f 6e 20 74 68 65 20  rUnref() on the 
1ffc0 6e 65 77 20 70 61 67 65 20 77 68 65 6e 20 69 74  new page when it
1ffd0 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20   is done..**.** 
1ffe0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
1fff0 75 72 6e 65 64 20 6f 6e 20 73 75 63 63 65 73 73  urned on success
20000 2e 20 20 41 6e 79 20 6f 74 68 65 72 20 72 65 74  .  Any other ret
20010 75 72 6e 20 76 61 6c 75 65 20 69 6e 64 69 63 61  urn value indica
20020 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 2e  tes.** an error.
20030 20 20 2a 70 70 50 61 67 65 20 61 6e 64 20 2a 70    *ppPage and *p
20040 50 67 6e 6f 20 61 72 65 20 75 6e 64 65 66 69 6e  Pgno are undefin
20050 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e 74 20  ed in the event 
20060 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 20  of an error..** 
20070 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 73 71  Do not invoke sq
20080 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
20090 29 20 6f 6e 20 2a 70 70 50 61 67 65 20 69 66 20  ) on *ppPage if 
200a0 61 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74 75  an error is retu
200b0 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rned..**.** If t
200c0 68 65 20 22 6e 65 61 72 62 79 22 20 70 61 72 61  he "nearby" para
200d0 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 30 2c 20  meter is not 0, 
200e0 74 68 65 6e 20 61 20 28 66 65 65 62 6c 65 29 20  then a (feeble) 
200f0 65 66 66 6f 72 74 20 69 73 20 6d 61 64 65 20 74  effort is made t
20100 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20 61 20 70  o .** locate a p
20110 61 67 65 20 63 6c 6f 73 65 20 74 6f 20 74 68 65  age close to the
20120 20 70 61 67 65 20 6e 75 6d 62 65 72 20 22 6e 65   page number "ne
20130 61 72 62 79 22 2e 20 20 54 68 69 73 20 63 61 6e  arby".  This can
20140 20 62 65 20 75 73 65 64 20 69 6e 20 61 6e 0a 2a   be used in an.*
20150 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 6b 65 65  * attempt to kee
20160 70 20 72 65 6c 61 74 65 64 20 70 61 67 65 73 20  p related pages 
20170 63 6c 6f 73 65 20 74 6f 20 65 61 63 68 20 6f 74  close to each ot
20180 68 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62  her in the datab
20190 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20 77 68 69  ase file,.** whi
201a0 63 68 20 69 6e 20 74 75 72 6e 20 63 61 6e 20 6d  ch in turn can m
201b0 61 6b 65 20 64 61 74 61 62 61 73 65 20 61 63 63  ake database acc
201c0 65 73 73 20 66 61 73 74 65 72 2e 0a 2a 2a 0a 2a  ess faster..**.*
201d0 2a 20 49 66 20 74 68 65 20 22 65 78 61 63 74 22  * If the "exact"
201e0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
201f0 74 20 30 2c 20 61 6e 64 20 74 68 65 20 70 61 67  t 0, and the pag
20200 65 2d 6e 75 6d 62 65 72 20 6e 65 61 72 62 79 20  e-number nearby 
20210 65 78 69 73 74 73 20 0a 2a 2a 20 61 6e 79 77 68  exists .** anywh
20220 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65 65 2d  ere on the free-
20230 6c 69 73 74 2c 20 74 68 65 6e 20 69 74 20 69 73  list, then it is
20240 20 67 75 61 72 65 6e 74 65 65 64 20 74 6f 20 62   guarenteed to b
20250 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  e returned. This
20260 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  .** is only used
20270 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
20280 64 61 74 61 62 61 73 65 73 20 77 68 65 6e 20 61  databases when a
20290 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77 20  llocating a new 
202a0 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  table..*/.static
202b0 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72   int allocateBtr
202c0 65 65 50 61 67 65 28 0a 20 20 42 74 53 68 61 72  eePage(.  BtShar
202d0 65 64 20 2a 70 42 74 2c 20 0a 20 20 4d 65 6d 50  ed *pBt, .  MemP
202e0 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 0a 20  age **ppPage, . 
202f0 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c 20 0a 20   Pgno *pPgno, . 
20300 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c 0a 20 20   Pgno nearby,.  
20310 75 38 20 65 78 61 63 74 0a 29 7b 0a 20 20 4d 65  u8 exact.){.  Me
20320 6d 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 20  mPage *pPage1;. 
20330 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e   int rc;.  int n
20340 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  ;     /* Number 
20350 6f 66 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  of pages on the 
20360 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 69 6e  freelist */.  in
20370 74 20 6b 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  t k;     /* Numb
20380 65 72 20 6f 66 20 6c 65 61 76 65 73 20 6f 6e 20  er of leaves on 
20390 74 68 65 20 74 72 75 6e 6b 20 6f 66 20 74 68 65  the trunk of the
203a0 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20 20 4d   freelist */.  M
203b0 65 6d 50 61 67 65 20 2a 70 54 72 75 6e 6b 20 3d  emPage *pTrunk =
203c0 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   0;.  MemPage *p
203d0 50 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 0a  PrevTrunk = 0;..
203e0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
203f0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
20400 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 50  ->mutex) );.  pP
20410 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50 61 67  age1 = pBt->pPag
20420 65 31 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79  e1;.  n = get4by
20430 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
20440 61 5b 33 36 5d 29 3b 0a 20 20 69 66 28 20 6e 3e  a[36]);.  if( n>
20450 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 72  0 ){.    /* Ther
20460 65 20 61 72 65 20 70 61 67 65 73 20 6f 6e 20 74  e are pages on t
20470 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65  he freelist.  Re
20480 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65  use one of those
20490 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20 20 20 50   pages. */.    P
204a0 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  gno iTrunk;.    
204b0 75 38 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20  u8 searchList = 
204c0 30 3b 20 2f 2a 20 49 66 20 74 68 65 20 66 72 65  0; /* If the fre
204d0 65 2d 6c 69 73 74 20 6d 75 73 74 20 62 65 20 73  e-list must be s
204e0 65 61 72 63 68 65 64 20 66 6f 72 20 27 6e 65 61  earched for 'nea
204f0 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a 20 20 20  rby' */.    .   
20500 20 2f 2a 20 49 66 20 74 68 65 20 27 65 78 61 63   /* If the 'exac
20510 74 27 20 70 61 72 61 6d 65 74 65 72 20 77 61 73  t' parameter was
20520 20 74 72 75 65 20 61 6e 64 20 61 20 71 75 65 72   true and a quer
20530 79 20 6f 66 20 74 68 65 20 70 6f 69 6e 74 65 72  y of the pointer
20540 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73 68 6f 77  -map.    ** show
20550 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  s that the page 
20560 27 6e 65 61 72 62 79 27 20 69 73 20 73 6f 6d 65  'nearby' is some
20570 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72 65  where on the fre
20580 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a 20 20 20  e-list, then.   
20590 20 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 2d 6c   ** the entire-l
205a0 69 73 74 20 77 69 6c 6c 20 62 65 20 73 65 61 72  ist will be sear
205b0 63 68 65 64 20 66 6f 72 20 74 68 61 74 20 70 61  ched for that pa
205c0 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64  ge..    */.#ifnd
205d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
205e0 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66  UTOVACUUM.    if
205f0 28 20 65 78 61 63 74 20 26 26 20 6e 65 61 72 62  ( exact && nearb
20600 79 3c 3d 70 61 67 65 72 50 61 67 65 63 6f 75 6e  y<=pagerPagecoun
20610 74 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20  t(pBt) ){.      
20620 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 20 20  u8 eType;.      
20630 61 73 73 65 72 74 28 20 6e 65 61 72 62 79 3e 30  assert( nearby>0
20640 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
20650 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
20660 6d 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  m );.      rc = 
20670 70 74 72 6d 61 70 47 65 74 28 70 42 74 2c 20 6e  ptrmapGet(pBt, n
20680 65 61 72 62 79 2c 20 26 65 54 79 70 65 2c 20 30  earby, &eType, 0
20690 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
206a0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
206b0 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50 54     if( eType==PT
206c0 52 4d 41 50 5f 46 52 45 45 50 41 47 45 20 29 7b  RMAP_FREEPAGE ){
206d0 0a 20 20 20 20 20 20 20 20 73 65 61 72 63 68 4c  .        searchL
206e0 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ist = 1;.      }
206f0 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20  .      *pPgno = 
20700 6e 65 61 72 62 79 3b 0a 20 20 20 20 7d 0a 23 65  nearby;.    }.#e
20710 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 44 65 63  ndif..    /* Dec
20720 72 65 6d 65 6e 74 20 74 68 65 20 66 72 65 65 2d  rement the free-
20730 6c 69 73 74 20 63 6f 75 6e 74 20 62 79 20 31 2e  list count by 1.
20740 20 53 65 74 20 69 54 72 75 6e 6b 20 74 6f 20 74   Set iTrunk to t
20750 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 0a  he index of the.
20760 20 20 20 20 2a 2a 20 66 69 72 73 74 20 66 72 65      ** first fre
20770 65 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67  e-list trunk pag
20780 65 2e 20 69 50 72 65 76 54 72 75 6e 6b 20 69 73  e. iPrevTrunk is
20790 20 69 6e 69 74 69 61 6c 6c 79 20 31 2e 0a 20 20   initially 1..  
207a0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
207b0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
207c0 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
207d0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
207e0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 75  eturn rc;.    pu
207f0 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
20800 61 44 61 74 61 5b 33 36 5d 2c 20 6e 2d 31 29 3b  aData[36], n-1);
20810 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 64  ..    /* The cod
20820 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 6c 6f  e within this lo
20830 6f 70 20 69 73 20 72 75 6e 20 6f 6e 6c 79 20 6f  op is run only o
20840 6e 63 65 20 69 66 20 74 68 65 20 27 73 65 61 72  nce if the 'sear
20850 63 68 4c 69 73 74 27 20 76 61 72 69 61 62 6c 65  chList' variable
20860 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 74  .    ** is not t
20870 72 75 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  rue. Otherwise, 
20880 69 74 20 72 75 6e 73 20 6f 6e 63 65 20 66 6f 72  it runs once for
20890 20 65 61 63 68 20 74 72 75 6e 6b 2d 70 61 67 65   each trunk-page
208a0 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 66   on the.    ** f
208b0 72 65 65 2d 6c 69 73 74 20 75 6e 74 69 6c 20 74  ree-list until t
208c0 68 65 20 70 61 67 65 20 27 6e 65 61 72 62 79 27  he page 'nearby'
208d0 20 69 73 20 6c 6f 63 61 74 65 64 2e 0a 20 20 20   is located..   
208e0 20 2a 2f 0a 20 20 20 20 64 6f 20 7b 0a 20 20 20   */.    do {.   
208f0 20 20 20 70 50 72 65 76 54 72 75 6e 6b 20 3d 20     pPrevTrunk = 
20900 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 69 66  pTrunk;.      if
20910 28 20 70 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a  ( pPrevTrunk ){.
20920 20 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d          iTrunk =
20930 20 67 65 74 34 62 79 74 65 28 26 70 50 72 65 76   get4byte(&pPrev
20940 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 29  Trunk->aData[0])
20950 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
20960 20 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20         iTrunk = 
20970 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31  get4byte(&pPage1
20980 2d 3e 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  ->aData[32]);.  
20990 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
209a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
209b0 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e 6b  Page(pBt, iTrunk
209c0 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a 20  , &pTrunk, 0);. 
209d0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
209e0 20 20 20 20 20 20 20 70 54 72 75 6e 6b 20 3d 20         pTrunk = 
209f0 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  0;.        goto 
20a00 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67  end_allocate_pag
20a10 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  e;.      }..    
20a20 20 20 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26    k = get4byte(&
20a30 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d  pTrunk->aData[4]
20a40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  );.      if( k==
20a50 30 20 26 26 20 21 73 65 61 72 63 68 4c 69 73 74  0 && !searchList
20a60 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
20a70 68 65 20 74 72 75 6e 6b 20 68 61 73 20 6e 6f 20  he trunk has no 
20a80 6c 65 61 76 65 73 20 61 6e 64 20 74 68 65 20 6c  leaves and the l
20a90 69 73 74 20 69 73 20 6e 6f 74 20 62 65 69 6e 67  ist is not being
20aa0 20 73 65 61 72 63 68 65 64 2e 20 0a 20 20 20 20   searched. .    
20ab0 20 20 20 20 2a 2a 20 53 6f 20 65 78 74 72 61 63      ** So extrac
20ac0 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  t the trunk page
20ad0 20 69 74 73 65 6c 66 20 61 6e 64 20 75 73 65 20   itself and use 
20ae0 69 74 20 61 73 20 74 68 65 20 6e 65 77 6c 79 20  it as the newly 
20af0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 6f  .        ** allo
20b00 63 61 74 65 64 20 70 61 67 65 20 2a 2f 0a 20 20  cated page */.  
20b10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
20b20 72 65 76 54 72 75 6e 6b 3d 3d 30 20 29 3b 0a 20  revTrunk==0 );. 
20b30 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
20b40 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
20b50 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
20b60 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
20b70 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
20b80 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
20b90 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
20ba0 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 69        *pPgno = i
20bb0 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 6d  Trunk;.        m
20bc0 65 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61  emcpy(&pPage1->a
20bd0 44 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e  Data[32], &pTrun
20be0 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b  k->aData[0], 4);
20bf0 0a 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65  .        *ppPage
20c00 20 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20   = pTrunk;.     
20c10 20 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20     pTrunk = 0;. 
20c20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22 41         TRACE(("A
20c30 4c 4c 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e  LLOCATE: %d trun
20c40 6b 20 2d 20 25 64 20 66 72 65 65 20 70 61 67 65  k - %d free page
20c50 73 20 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e  s left\n", *pPgn
20c60 6f 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20  o, n-1));.      
20c70 7d 65 6c 73 65 20 69 66 28 20 6b 3e 70 42 74 2d  }else if( k>pBt-
20c80 3e 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20  >usableSize/4 - 
20c90 32 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  2 ){.        /* 
20ca0 56 61 6c 75 65 20 6f 66 20 6b 20 69 73 20 6f 75  Value of k is ou
20cb0 74 20 6f 66 20 72 61 6e 67 65 2e 20 20 44 61 74  t of range.  Dat
20cc0 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  abase corruption
20cd0 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
20ce0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
20cf0 42 4b 50 54 3b 0a 20 20 20 20 20 20 20 20 67 6f  BKPT;.        go
20d00 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  to end_allocate_
20d10 70 61 67 65 3b 0a 23 69 66 6e 64 65 66 20 53 51  page;.#ifndef SQ
20d20 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
20d30 43 55 55 4d 0a 20 20 20 20 20 20 7d 65 6c 73 65  CUUM.      }else
20d40 20 69 66 28 20 73 65 61 72 63 68 4c 69 73 74 20   if( searchList 
20d50 26 26 20 6e 65 61 72 62 79 3d 3d 69 54 72 75 6e  && nearby==iTrun
20d60 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  k ){.        /* 
20d70 54 68 65 20 6c 69 73 74 20 69 73 20 62 65 69 6e  The list is bein
20d80 67 20 73 65 61 72 63 68 65 64 20 61 6e 64 20 74  g searched and t
20d90 68 69 73 20 74 72 75 6e 6b 20 70 61 67 65 20 69  his trunk page i
20da0 73 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 20  s the page.     
20db0 20 20 20 2a 2a 20 74 6f 20 61 6c 6c 6f 63 61 74     ** to allocat
20dc0 65 2c 20 72 65 67 61 72 64 6c 65 73 73 20 6f 66  e, regardless of
20dd0 20 77 68 65 74 68 65 72 20 69 74 20 68 61 73 20   whether it has 
20de0 6c 65 61 76 65 73 2e 0a 20 20 20 20 20 20 20 20  leaves..        
20df0 2a 2f 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  */.        asser
20e00 74 28 20 2a 70 50 67 6e 6f 3d 3d 69 54 72 75 6e  t( *pPgno==iTrun
20e10 6b 20 29 3b 0a 20 20 20 20 20 20 20 20 2a 70 70  k );.        *pp
20e20 50 61 67 65 20 3d 20 70 54 72 75 6e 6b 3b 0a 20  Page = pTrunk;. 
20e30 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
20e40 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72  t = 0;.        r
20e50 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
20e60 57 72 69 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44  Write(pTrunk->pD
20e70 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  bPage);.        
20e80 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
20e90 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
20ea0 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
20eb0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
20ec0 28 20 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( k==0 ){.      
20ed0 20 20 20 20 69 66 28 20 21 70 50 72 65 76 54 72      if( !pPrevTr
20ee0 75 6e 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  unk ){.         
20ef0 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
20f00 31 2d 3e 61 44 61 74 61 5b 33 32 5d 2c 20 26 70  1->aData[32], &p
20f10 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c  Trunk->aData[0],
20f20 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   4);.          }
20f30 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
20f40 20 20 6d 65 6d 63 70 79 28 26 70 50 72 65 76 54    memcpy(&pPrevT
20f50 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20  runk->aData[0], 
20f60 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  &pTrunk->aData[0
20f70 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20  ], 4);.         
20f80 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
20f90 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  {.          /* T
20fa0 68 65 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73  he trunk page is
20fb0 20 72 65 71 75 69 72 65 64 20 62 79 20 74 68 65   required by the
20fc0 20 63 61 6c 6c 65 72 20 62 75 74 20 69 74 20 63   caller but it c
20fd0 6f 6e 74 61 69 6e 73 20 0a 20 20 20 20 20 20 20  ontains .       
20fe0 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 73 20 74     ** pointers t
20ff0 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 76  o free-list leav
21000 65 73 2e 20 54 68 65 20 66 69 72 73 74 20 6c 65  es. The first le
21010 61 66 20 62 65 63 6f 6d 65 73 20 61 20 74 72 75  af becomes a tru
21020 6e 6b 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  nk.          ** 
21030 70 61 67 65 20 69 6e 20 74 68 69 73 20 63 61 73  page in this cas
21040 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  e..          */.
21050 20 20 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67            MemPag
21060 65 20 2a 70 4e 65 77 54 72 75 6e 6b 3b 0a 20 20  e *pNewTrunk;.  
21070 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 4e 65          Pgno iNe
21080 77 54 72 75 6e 6b 20 3d 20 67 65 74 34 62 79 74  wTrunk = get4byt
21090 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61  e(&pTrunk->aData
210a0 5b 38 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [8]);.          
210b0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
210c0 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 69 4e  eGetPage(pBt, iN
210d0 65 77 54 72 75 6e 6b 2c 20 26 70 4e 65 77 54 72  ewTrunk, &pNewTr
210e0 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  unk, 0);.       
210f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
21100 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
21110 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c      goto end_all
21120 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20 20  ocate_page;.    
21130 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21140 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
21150 67 65 72 57 72 69 74 65 28 70 4e 65 77 54 72 75  gerWrite(pNewTru
21160 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  nk->pDbPage);.  
21170 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
21180 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21190 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
211a0 50 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b  Page(pNewTrunk);
211b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
211c0 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70  o end_allocate_p
211d0 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  age;.          }
211e0 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
211f0 79 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  y(&pNewTrunk->aD
21200 61 74 61 5b 30 5d 2c 20 26 70 54 72 75 6e 6b 2d  ata[0], &pTrunk-
21210 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20  >aData[0], 4);. 
21220 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
21230 65 28 26 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44  e(&pNewTrunk->aD
21240 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b 0a 20 20  ata[4], k-1);.  
21250 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26          memcpy(&
21260 70 4e 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61  pNewTrunk->aData
21270 5b 38 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  [8], &pTrunk->aD
21280 61 74 61 5b 31 32 5d 2c 20 28 6b 2d 31 29 2a 34  ata[12], (k-1)*4
21290 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 6c  );.          rel
212a0 65 61 73 65 50 61 67 65 28 70 4e 65 77 54 72 75  easePage(pNewTru
212b0 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nk);.          i
212c0 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29  f( !pPrevTrunk )
212d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
212e0 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
212f0 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50  erIswriteable(pP
21300 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 20 29  age1->pDbPage) )
21310 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  ;.            pu
21320 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e  t4byte(&pPage1->
21330 61 44 61 74 61 5b 33 32 5d 2c 20 69 4e 65 77 54  aData[32], iNewT
21340 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  runk);.         
21350 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21360 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21370 50 61 67 65 72 57 72 69 74 65 28 70 50 72 65 76  PagerWrite(pPrev
21380 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
21390 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
213a0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
213b0 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61 6c       goto end_al
213c0 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20 20  locate_page;.   
213d0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
213e0 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
213f0 26 70 50 72 65 76 54 72 75 6e 6b 2d 3e 61 44 61  &pPrevTrunk->aDa
21400 74 61 5b 30 5d 2c 20 69 4e 65 77 54 72 75 6e 6b  ta[0], iNewTrunk
21410 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
21420 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21430 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20   pTrunk = 0;.   
21440 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
21450 4f 43 41 54 45 3a 20 25 64 20 74 72 75 6e 6b 20  OCATE: %d trunk 
21460 2d 20 25 64 20 66 72 65 65 20 70 61 67 65 73 20  - %d free pages 
21470 6c 65 66 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c  left\n", *pPgno,
21480 20 6e 2d 31 29 29 3b 0a 23 65 6e 64 69 66 0a 20   n-1));.#endif. 
21490 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
214a0 20 20 20 20 2f 2a 20 45 78 74 72 61 63 74 20 61      /* Extract a
214b0 20 6c 65 61 66 20 66 72 6f 6d 20 74 68 65 20 74   leaf from the t
214c0 72 75 6e 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  runk */.        
214d0 69 6e 74 20 63 6c 6f 73 65 73 74 3b 0a 20 20 20  int closest;.   
214e0 20 20 20 20 20 50 67 6e 6f 20 69 50 61 67 65 3b       Pgno iPage;
214f0 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65  .        unsigne
21500 64 20 63 68 61 72 20 2a 61 44 61 74 61 20 3d 20  d char *aData = 
21510 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 3b 0a 20  pTrunk->aData;. 
21520 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
21530 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 54  te3PagerWrite(pT
21540 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b 0a  runk->pDbPage);.
21550 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
21560 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
21570 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61   end_allocate_pa
21580 67 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ge;.        }.  
21590 20 20 20 20 20 20 69 66 28 20 6e 65 61 72 62 79        if( nearby
215a0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
215b0 69 6e 74 20 69 2c 20 64 69 73 74 3b 0a 20 20 20  int i, dist;.   
215c0 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
215d0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 64 69   0;.          di
215e0 73 74 20 3d 20 67 65 74 34 62 79 74 65 28 26 61  st = get4byte(&a
215f0 44 61 74 61 5b 38 5d 29 20 2d 20 6e 65 61 72 62  Data[8]) - nearb
21600 79 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  y;.          if(
21610 20 64 69 73 74 3c 30 20 29 20 64 69 73 74 20 3d   dist<0 ) dist =
21620 20 2d 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20   -dist;.        
21630 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6b 3b 20    for(i=1; i<k; 
21640 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
21650 20 20 69 6e 74 20 64 32 20 3d 20 67 65 74 34 62    int d2 = get4b
21660 79 74 65 28 26 61 44 61 74 61 5b 38 2b 69 2a 34  yte(&aData[8+i*4
21670 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20 20  ]) - nearby;.   
21680 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32 3c           if( d2<
21690 30 20 29 20 64 32 20 3d 20 2d 64 32 3b 0a 20 20  0 ) d2 = -d2;.  
216a0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 64 32            if( d2
216b0 3c 64 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  <dist ){.       
216c0 20 20 20 20 20 20 20 63 6c 6f 73 65 73 74 20 3d         closest =
216d0 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   i;.            
216e0 20 20 64 69 73 74 20 3d 20 64 32 3b 0a 20 20 20    dist = d2;.   
216f0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21700 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
21710 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
21720 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20 20 20  closest = 0;.   
21730 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
21740 69 50 61 67 65 20 3d 20 67 65 74 34 62 79 74 65  iPage = get4byte
21750 28 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73  (&aData[8+closes
21760 74 2a 34 5d 29 3b 0a 20 20 20 20 20 20 20 20 69  t*4]);.        i
21770 66 28 20 21 73 65 61 72 63 68 4c 69 73 74 20 7c  f( !searchList |
21780 7c 20 69 50 61 67 65 3d 3d 6e 65 61 72 62 79 20  | iPage==nearby 
21790 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
217a0 20 6e 6f 43 6f 6e 74 65 6e 74 3b 0a 20 20 20 20   noContent;.    
217b0 20 20 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65        Pgno nPage
217c0 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50 67  ;.          *pPg
217d0 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20 20  no = iPage;.    
217e0 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 70 61        nPage = pa
217f0 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
21800 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
21810 20 2a 70 50 67 6e 6f 3e 6e 50 61 67 65 20 29 7b   *pPgno>nPage ){
21820 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
21830 46 72 65 65 20 70 61 67 65 20 6f 66 66 20 74 68  Free page off th
21840 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
21850 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  e */.           
21860 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
21870 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
21880 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
21890 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
218a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
218b0 20 20 20 20 20 54 52 41 43 45 28 28 22 41 4c 4c       TRACE(("ALL
218c0 4f 43 41 54 45 3a 20 25 64 20 77 61 73 20 6c 65  OCATE: %d was le
218d0 61 66 20 25 64 20 6f 66 20 25 64 20 6f 6e 20 74  af %d of %d on t
218e0 72 75 6e 6b 20 25 64 22 0a 20 20 20 20 20 20 20  runk %d".       
218f0 20 20 20 20 20 20 20 20 20 20 22 3a 20 25 64 20            ": %d 
21900 6d 6f 72 65 20 66 72 65 65 20 70 61 67 65 73 5c  more free pages\
21910 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
21920 20 20 20 20 20 2a 70 50 67 6e 6f 2c 20 63 6c 6f       *pPgno, clo
21930 73 65 73 74 2b 31 2c 20 6b 2c 20 70 54 72 75 6e  sest+1, k, pTrun
21940 6b 2d 3e 70 67 6e 6f 2c 20 6e 2d 31 29 29 3b 0a  k->pgno, n-1));.
21950 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63 6c            if( cl
21960 6f 73 65 73 74 3c 6b 2d 31 20 29 7b 0a 20 20 20  osest<k-1 ){.   
21970 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
21980 26 61 44 61 74 61 5b 38 2b 63 6c 6f 73 65 73 74  &aData[8+closest
21990 2a 34 5d 2c 20 26 61 44 61 74 61 5b 34 2b 6b 2a  *4], &aData[4+k*
219a0 34 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20  4], 4);.        
219b0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 75    }.          pu
219c0 74 34 62 79 74 65 28 26 61 44 61 74 61 5b 34 5d  t4byte(&aData[4]
219d0 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  , k-1);.        
219e0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
219f0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
21a00 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67  e(pTrunk->pDbPag
21a10 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  e) );.          
21a20 6e 6f 43 6f 6e 74 65 6e 74 20 3d 20 21 62 74 72  noContent = !btr
21a30 65 65 47 65 74 48 61 73 43 6f 6e 74 65 6e 74 28  eeGetHasContent(
21a40 70 42 74 2c 20 2a 70 50 67 6e 6f 29 3b 0a 20 20  pBt, *pPgno);.  
21a50 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
21a60 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
21a70 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c 20 70 70  (pBt, *pPgno, pp
21a80 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29  Page, noContent)
21a90 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
21aa0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
21ab0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
21ac0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
21ad0 69 74 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70  ite((*ppPage)->p
21ae0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
21af0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
21b00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
21b10 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
21b20 61 67 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20  age(*ppPage);.  
21b30 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
21b40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
21b50 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
21b60 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21b70 20 20 7d 0a 20 20 20 20 20 20 72 65 6c 65 61 73    }.      releas
21b80 65 50 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b  ePage(pPrevTrunk
21b90 29 3b 0a 20 20 20 20 20 20 70 50 72 65 76 54 72  );.      pPrevTr
21ba0 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 7d 77 68  unk = 0;.    }wh
21bb0 69 6c 65 28 20 73 65 61 72 63 68 4c 69 73 74 20  ile( searchList 
21bc0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
21bd0 2f 2a 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20  /* There are no 
21be0 70 61 67 65 73 20 6f 6e 20 74 68 65 20 66 72 65  pages on the fre
21bf0 65 6c 69 73 74 2c 20 73 6f 20 63 72 65 61 74 65  elist, so create
21c00 20 61 20 6e 65 77 20 70 61 67 65 20 61 74 20 74   a new page at t
21c10 68 65 0a 20 20 20 20 2a 2a 20 65 6e 64 20 6f 66  he.    ** end of
21c20 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20   the file */.   
21c30 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 70 61 67   int nPage = pag
21c40 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74 29  erPagecount(pBt)
21c50 3b 0a 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e  ;.    *pPgno = n
21c60 50 61 67 65 20 2b 20 31 3b 0a 0a 20 20 20 20 69  Page + 1;..    i
21c70 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44 49  f( *pPgno==PENDI
21c80 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
21c90 29 20 29 7b 0a 20 20 20 20 20 20 28 2a 70 50 67  ) ){.      (*pPg
21ca0 6e 6f 29 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 23 69  no)++;.    }..#i
21cb0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
21cc0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
21cd0 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
21ce0 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49  cuum && PTRMAP_I
21cf0 53 50 41 47 45 28 70 42 74 2c 20 2a 70 50 67 6e  SPAGE(pBt, *pPgn
21d00 6f 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  o) ){.      /* I
21d10 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20  f *pPgno refers 
21d20 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  to a pointer-map
21d30 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20   page, allocate 
21d40 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20  two new pages.  
21d50 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e      ** at the en
21d60 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e  d of the file in
21d70 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68  stead of one. Th
21d80 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65  e first allocate
21d90 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  d page.      ** 
21da0 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f  becomes a new po
21db0 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
21dc0 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73  the second is us
21dd0 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
21de0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
21df0 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
21e00 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f  E: %d from end o
21e10 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d  f file (pointer-
21e20 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 2a 70  map page)\n", *p
21e30 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 61 73  Pgno));.      as
21e40 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45  sert( *pPgno!=PE
21e50 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
21e60 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 28 2a  pBt) );.      (*
21e70 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 20  pPgno)++;.      
21e80 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44  if( *pPgno==PEND
21e90 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
21ea0 74 29 20 29 7b 20 28 2a 70 50 67 6e 6f 29 2b 2b  t) ){ (*pPgno)++
21eb0 3b 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ; }.    }.#endif
21ec0 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 2a 70  ..    assert( *p
21ed0 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f 42 59  Pgno!=PENDING_BY
21ee0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 3b 0a  TE_PAGE(pBt) );.
21ef0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21f00 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
21f10 2c 20 2a 70 50 67 6e 6f 2c 20 70 70 50 61 67 65  , *pPgno, ppPage
21f20 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
21f30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
21f40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
21f50 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67  gerWrite((*ppPag
21f60 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e)->pDbPage);.  
21f70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
21f80 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c  _OK ){.      rel
21f90 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
21fa0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41  );.    }.    TRA
21fb0 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20 25  CE(("ALLOCATE: %
21fc0 64 20 66 72 6f 6d 20 65 6e 64 20 6f 66 20 66 69  d from end of fi
21fd0 6c 65 5c 6e 22 2c 20 2a 70 50 67 6e 6f 29 29 3b  le\n", *pPgno));
21fe0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
21ff0 2a 70 50 67 6e 6f 21 3d 50 45 4e 44 49 4e 47 5f  *pPgno!=PENDING_
22000 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29  BYTE_PAGE(pBt) )
22010 3b 0a 0a 65 6e 64 5f 61 6c 6c 6f 63 61 74 65 5f  ;..end_allocate_
22020 70 61 67 65 3a 0a 20 20 72 65 6c 65 61 73 65 50  page:.  releaseP
22030 61 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 72  age(pTrunk);.  r
22040 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76  eleasePage(pPrev
22050 54 72 75 6e 6b 29 3b 0a 20 20 69 66 28 20 72 63  Trunk);.  if( rc
22060 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
22070 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
22080 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28  gerPageRefcount(
22090 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50 61  (*ppPage)->pDbPa
220a0 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 20 20 72  ge)>1 ){.      r
220b0 65 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61  eleasePage(*ppPa
220c0 67 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  ge);.      retur
220d0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
220e0 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20  _BKPT;.    }.   
220f0 20 28 2a 70 70 50 61 67 65 29 2d 3e 69 73 49 6e   (*ppPage)->isIn
22100 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  it = 0;.  }.  re
22110 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
22120 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
22130 69 73 20 75 73 65 64 20 74 6f 20 61 64 64 20 70  is used to add p
22140 61 67 65 20 69 50 61 67 65 20 74 6f 20 74 68 65  age iPage to the
22150 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
22160 72 65 65 2d 6c 69 73 74 2e 20 0a 2a 2a 20 49 74  ree-list. .** It
22170 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74   is assumed that
22180 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
22190 20 61 6c 72 65 61 64 79 20 61 20 70 61 72 74 20   already a part 
221a0 6f 66 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74  of the free-list
221b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 61 6c 75  ..**.** The valu
221c0 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
221d0 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
221e0 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
221f0 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 0a 2a 2a   is optional..**
22200 20 49 66 20 74 68 65 20 63 61 6c 6c 65 72 20 68   If the caller h
22210 61 70 70 65 6e 73 20 74 6f 20 68 61 76 65 20 61  appens to have a
22220 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
22230 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63 74 20 0a  MemPage object .
22240 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ** corresponding
22250 20 74 6f 20 70 61 67 65 20 69 50 61 67 65 20 68   to page iPage h
22260 61 6e 64 79 2c 20 69 74 20 6d 61 79 20 70 61 73  andy, it may pas
22270 73 20 69 74 20 61 73 20 74 68 65 20 73 65 63 6f  s it as the seco
22280 6e 64 20 76 61 6c 75 65 2e 20 0a 2a 2a 20 4f 74  nd value. .** Ot
22290 68 65 72 77 69 73 65 2c 20 69 74 20 6d 61 79 20  herwise, it may 
222a0 70 61 73 73 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  pass NULL..**.**
222b0 20 49 66 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   If a pointer to
222c0 20 61 20 4d 65 6d 50 61 67 65 20 6f 62 6a 65 63   a MemPage objec
222d0 74 20 69 73 20 70 61 73 73 65 64 20 61 73 20 74  t is passed as t
222e0 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
222f0 6e 74 2c 0a 2a 2a 20 69 74 73 20 72 65 66 65 72  nt,.** its refer
22300 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 6e 6f  ence count is no
22310 74 20 61 6c 74 65 72 65 64 20 62 79 20 74 68 69  t altered by thi
22320 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  s function..*/.s
22330 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50 61  tatic int freePa
22340 67 65 32 28 42 74 53 68 61 72 65 64 20 2a 70 42  ge2(BtShared *pB
22350 74 2c 20 4d 65 6d 50 61 67 65 20 2a 70 4d 65 6d  t, MemPage *pMem
22360 50 61 67 65 2c 20 50 67 6e 6f 20 69 50 61 67 65  Page, Pgno iPage
22370 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 54  ){.  MemPage *pT
22380 72 75 6e 6b 20 3d 20 30 3b 20 20 20 20 20 20 20  runk = 0;       
22390 20 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65           /* Free
223a0 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
223b0 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 54 72 75 6e   */.  Pgno iTrun
223c0 6b 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  k = 0;          
223d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
223e0 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65  e number of free
223f0 2d 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65  -list trunk page
22400 20 2a 2f 20 0a 20 20 4d 65 6d 50 61 67 65 20 2a   */ .  MemPage *
22410 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70 50  pPage1 = pBt->pP
22420 61 67 65 31 3b 20 20 20 20 20 20 2f 2a 20 4c 6f  age1;      /* Lo
22430 63 61 6c 20 72 65 66 65 72 65 6e 63 65 20 74 6f  cal reference to
22440 20 70 61 67 65 20 31 20 2a 2f 0a 20 20 4d 65 6d   page 1 */.  Mem
22450 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20  Page *pPage;    
22460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22470 20 2f 2a 20 50 61 67 65 20 62 65 69 6e 67 20 66   /* Page being f
22480 72 65 65 64 2e 20 4d 61 79 20 62 65 20 4e 55 4c  reed. May be NUL
22490 4c 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  L. */.  int rc; 
224a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
224c0 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a 20 20  eturn Code */.  
224d0 69 6e 74 20 6e 46 72 65 65 3b 20 20 20 20 20 20  int nFree;      
224e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224f0 20 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 6e      /* Initial n
22500 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f  umber of pages o
22510 6e 20 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a  n free-list */..
22520 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
22530 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
22540 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
22550 73 65 72 74 28 20 69 50 61 67 65 3e 31 20 29 3b  sert( iPage>1 );
22560 0a 20 20 61 73 73 65 72 74 28 20 21 70 4d 65 6d  .  assert( !pMem
22570 50 61 67 65 20 7c 7c 20 70 4d 65 6d 50 61 67 65  Page || pMemPage
22580 2d 3e 70 67 6e 6f 3d 3d 69 50 61 67 65 20 29 3b  ->pgno==iPage );
22590 0a 0a 20 20 69 66 28 20 70 4d 65 6d 50 61 67 65  ..  if( pMemPage
225a0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 20 3d 20   ){.    pPage = 
225b0 70 4d 65 6d 50 61 67 65 3b 0a 20 20 20 20 73 71  pMemPage;.    sq
225c0 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 70 50  lite3PagerRef(pP
225d0 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  age->pDbPage);. 
225e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
225f0 65 20 3d 20 62 74 72 65 65 50 61 67 65 4c 6f 6f  e = btreePageLoo
22600 6b 75 70 28 70 42 74 2c 20 69 50 61 67 65 29 3b  kup(pBt, iPage);
22610 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 63 72 65  .  }..  /* Incre
22620 6d 65 6e 74 20 74 68 65 20 66 72 65 65 20 70 61  ment the free pa
22630 67 65 20 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67  ge count on pPag
22640 65 31 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  e1 */.  rc = sql
22650 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
22660 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29 3b  Page1->pDbPage);
22670 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
22680 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
22690 20 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74   nFree = get4byt
226a0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
226b0 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79 74  [36]);.  put4byt
226c0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
226d0 5b 33 36 5d 2c 20 6e 46 72 65 65 2b 31 29 3b 0a  [36], nFree+1);.
226e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53  .#ifdef SQLITE_S
226f0 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f  ECURE_DELETE.  /
22700 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45 5f  * If the SQLITE_
22710 53 45 43 55 52 45 5f 44 45 4c 45 54 45 20 63 6f  SECURE_DELETE co
22720 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
22730 6e 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  n is enabled, th
22740 65 6e 0a 20 20 2a 2a 20 61 6c 77 61 79 73 20 66  en.  ** always f
22750 75 6c 6c 79 20 6f 76 65 72 77 72 69 74 65 20 64  ully overwrite d
22760 65 6c 65 74 65 64 20 69 6e 66 6f 72 6d 61 74 69  eleted informati
22770 6f 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20  on with zeros.. 
22780 20 2a 2f 0a 20 20 69 66 28 20 28 21 70 50 61 67   */.  if( (!pPag
22790 65 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74  e && (rc = sqlit
227a0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
227b0 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61 67  Bt, iPage, &pPag
227c0 65 2c 20 30 29 29 29 0a 20 20 20 7c 7c 20 20 20  e, 0))).   ||   
227d0 20 20 20 20 20 20 20 20 20 28 72 63 20 3d 20 73           (rc = s
227e0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
227f0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
22800 29 0a 20 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ).  ){.    goto 
22810 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
22820 7d 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65  }.  memset(pPage
22830 2d 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->aData, 0, pPag
22840 65 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  e->pBt->pageSize
22850 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  );.#endif..  /* 
22860 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
22870 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61  supports auto-va
22880 63 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65  cuum, write an e
22890 6e 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e  ntry in the poin
228a0 74 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20  ter-map.  ** to 
228b0 69 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68  indicate that th
228c0 65 20 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a  e page is free..
228d0 20 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54    */.  if( ISAUT
228e0 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 72  OVACUUM ){.    r
228f0 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
22900 74 2c 20 69 50 61 67 65 2c 20 50 54 52 4d 41 50  t, iPage, PTRMAP
22910 5f 46 52 45 45 50 41 47 45 2c 20 30 29 3b 0a 20  _FREEPAGE, 0);. 
22920 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
22930 20 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20   freepage_out;. 
22940 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 6d 61 6e   }..  /* Now man
22950 69 70 75 6c 61 74 65 20 74 68 65 20 61 63 74 75  ipulate the actu
22960 61 6c 20 64 61 74 61 62 61 73 65 20 66 72 65 65  al database free
22970 2d 6c 69 73 74 20 73 74 72 75 63 74 75 72 65 2e  -list structure.
22980 20 54 68 65 72 65 20 61 72 65 20 74 77 6f 0a 20   There are two. 
22990 20 2a 2a 20 70 6f 73 73 69 62 69 6c 69 74 69 65   ** possibilitie
229a0 73 2e 20 49 66 20 74 68 65 20 66 72 65 65 2d 6c  s. If the free-l
229b0 69 73 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ist is currently
229c0 20 65 6d 70 74 79 2c 20 6f 72 20 69 66 20 74 68   empty, or if th
229d0 65 20 66 69 72 73 74 0a 20 20 2a 2a 20 74 72 75  e first.  ** tru
229e0 6e 6b 20 70 61 67 65 20 69 6e 20 74 68 65 20 66  nk page in the f
229f0 72 65 65 2d 6c 69 73 74 20 69 73 20 66 75 6c 6c  ree-list is full
22a00 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65  , then this page
22a10 20 77 69 6c 6c 20 62 65 63 6f 6d 65 20 61 0a 20   will become a. 
22a20 20 2a 2a 20 6e 65 77 20 66 72 65 65 2d 6c 69 73   ** new free-lis
22a30 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 4f 74  t trunk page. Ot
22a40 68 65 72 77 69 73 65 2c 20 69 74 20 77 69 6c 6c  herwise, it will
22a50 20 62 65 63 6f 6d 65 20 61 20 6c 65 61 66 20 6f   become a leaf o
22a60 66 20 74 68 65 0a 20 20 2a 2a 20 66 69 72 73 74  f the.  ** first
22a70 20 74 72 75 6e 6b 20 70 61 67 65 20 69 6e 20 74   trunk page in t
22a80 68 65 20 63 75 72 72 65 6e 74 20 66 72 65 65 2d  he current free-
22a90 6c 69 73 74 2e 20 54 68 69 73 20 62 6c 6f 63 6b  list. This block
22aa0 20 74 65 73 74 73 20 69 66 20 69 74 0a 20 20 2a   tests if it.  *
22ab0 2a 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  * is possible to
22ac0 20 61 64 64 20 74 68 65 20 70 61 67 65 20 61 73   add the page as
22ad0 20 61 20 6e 65 77 20 66 72 65 65 2d 6c 69 73 74   a new free-list
22ae0 20 6c 65 61 66 2e 0a 20 20 2a 2f 0a 20 20 69 66   leaf..  */.  if
22af0 28 20 6e 46 72 65 65 21 3d 30 20 29 7b 0a 20 20  ( nFree!=0 ){.  
22b00 20 20 69 6e 74 20 6e 4c 65 61 66 3b 20 20 20 20    int nLeaf;    
22b10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
22b20 6e 69 74 69 61 6c 20 6e 75 6d 62 65 72 20 6f 66  nitial number of
22b30 20 6c 65 61 66 20 63 65 6c 6c 73 20 6f 6e 20 74   leaf cells on t
22b40 72 75 6e 6b 20 70 61 67 65 20 2a 2f 0a 0a 20 20  runk page */..  
22b50 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
22b60 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
22b70 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 72 63 20  ta[32]);.    rc 
22b80 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
22b90 74 50 61 67 65 28 70 42 74 2c 20 69 54 72 75 6e  tPage(pBt, iTrun
22ba0 6b 2c 20 26 70 54 72 75 6e 6b 2c 20 30 29 3b 0a  k, &pTrunk, 0);.
22bb0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
22bc0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
22bd0 6f 74 6f 20 66 72 65 65 70 61 67 65 5f 6f 75 74  oto freepage_out
22be0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 4c 65  ;.    }..    nLe
22bf0 61 66 20 3d 20 67 65 74 34 62 79 74 65 28 26 70  af = get4byte(&p
22c00 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 29  Trunk->aData[4])
22c10 3b 0a 20 20 20 20 69 66 28 20 6e 4c 65 61 66 3c  ;.    if( nLeaf<
22c20 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
22c30 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
22c40 4b 50 54 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  KPT;.      goto 
22c50 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
22c60 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4c 65 61    }.    if( nLea
22c70 66 3c 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  f<pBt->usableSiz
22c80 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20  e/4 - 8 ){.     
22c90 20 2f 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65   /* In this case
22ca0 20 74 68 65 72 65 20 69 73 20 72 6f 6f 6d 20 6f   there is room o
22cb0 6e 20 74 68 65 20 74 72 75 6e 6b 20 70 61 67 65  n the trunk page
22cc0 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 70   to insert the p
22cd0 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 62 65 69  age.      ** bei
22ce0 6e 67 20 66 72 65 65 64 20 61 73 20 61 20 6e 65  ng freed as a ne
22cf0 77 20 6c 65 61 66 2e 0a 20 20 20 20 20 20 2a 2a  w leaf..      **
22d00 0a 20 20 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  .      ** Note t
22d10 68 61 74 20 74 68 65 20 74 72 75 6e 6b 20 70 61  hat the trunk pa
22d20 67 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  ge is not really
22d30 20 66 75 6c 6c 20 75 6e 74 69 6c 20 69 74 20 63   full until it c
22d40 6f 6e 74 61 69 6e 73 0a 20 20 20 20 20 20 2a 2a  ontains.      **
22d50 20 75 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20   usableSize/4 - 
22d60 32 20 65 6e 74 72 69 65 73 2c 20 6e 6f 74 20 75  2 entries, not u
22d70 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20  sableSize/4 - 8 
22d80 65 6e 74 72 69 65 73 20 61 73 20 77 65 20 68 61  entries as we ha
22d90 76 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 64 65  ve.      ** code
22da0 64 2e 20 20 42 75 74 20 64 75 65 20 74 6f 20 61  d.  But due to a
22db0 20 63 6f 64 69 6e 67 20 65 72 72 6f 72 20 69 6e   coding error in
22dc0 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 53 51 4c   versions of SQL
22dd0 69 74 65 20 70 72 69 6f 72 20 74 6f 0a 20 20 20  ite prior to.   
22de0 20 20 20 2a 2a 20 33 2e 36 2e 30 2c 20 64 61 74     ** 3.6.0, dat
22df0 61 62 61 73 65 73 20 77 69 74 68 20 66 72 65 65  abases with free
22e00 6c 69 73 74 20 74 72 75 6e 6b 20 70 61 67 65 73  list trunk pages
22e10 20 68 6f 6c 64 69 6e 67 20 6d 6f 72 65 20 74 68   holding more th
22e20 61 6e 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62  an.      ** usab
22e30 6c 65 53 69 7a 65 2f 34 20 2d 20 38 20 65 6e 74  leSize/4 - 8 ent
22e40 72 69 65 73 20 77 69 6c 6c 20 62 65 20 72 65 70  ries will be rep
22e50 6f 72 74 65 64 20 61 73 20 63 6f 72 72 75 70 74  orted as corrupt
22e60 2e 20 20 49 6e 20 6f 72 64 65 72 0a 20 20 20 20  .  In order.    
22e70 20 20 2a 2a 20 74 6f 20 6d 61 69 6e 74 61 69 6e    ** to maintain
22e80 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61   backwards compa
22e90 74 69 62 69 6c 69 74 79 20 77 69 74 68 20 6f 6c  tibility with ol
22ea0 64 65 72 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  der versions of 
22eb0 53 51 4c 69 74 65 2c 0a 20 20 20 20 20 20 2a 2a  SQLite,.      **
22ec0 20 77 65 20 77 69 6c 6c 20 63 6f 6e 74 61 69 6e   we will contain
22ed0 20 74 6f 20 72 65 73 74 72 69 63 74 20 74 68 65   to restrict the
22ee0 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
22ef0 65 73 20 74 6f 20 75 73 61 62 6c 65 53 69 7a 65  es to usableSize
22f00 2f 34 20 2d 20 38 0a 20 20 20 20 20 20 2a 2a 20  /4 - 8.      ** 
22f10 66 6f 72 20 6e 6f 77 2e 20 20 41 74 20 73 6f 6d  for now.  At som
22f20 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  e point in the f
22f30 75 74 75 72 65 20 28 6f 6e 63 65 20 65 76 65 72  uture (once ever
22f40 79 6f 6e 65 20 68 61 73 20 75 70 67 72 61 64 65  yone has upgrade
22f50 64 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 33 2e  d.      ** to 3.
22f60 36 2e 30 20 6f 72 20 6c 61 74 65 72 29 20 77 65  6.0 or later) we
22f70 20 73 68 6f 75 6c 64 20 63 6f 6e 73 69 64 65 72   should consider
22f80 20 66 69 78 69 6e 67 20 74 68 65 20 63 6f 6e 64   fixing the cond
22f90 69 74 69 6f 6e 61 6c 20 61 62 6f 76 65 0a 20 20  itional above.  
22fa0 20 20 20 20 2a 2a 20 74 6f 20 72 65 61 64 20 22      ** to read "
22fb0 75 73 61 62 6c 65 53 69 7a 65 2f 34 2d 32 22 20  usableSize/4-2" 
22fc0 69 6e 73 74 65 61 64 20 6f 66 20 22 75 73 61 62  instead of "usab
22fd0 6c 65 53 69 7a 65 2f 34 2d 38 22 2e 0a 20 20 20  leSize/4-8"..   
22fe0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
22ff0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
23000 74 65 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61  te(pTrunk->pDbPa
23010 67 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ge);.      if( r
23020 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23030 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
23040 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b  (&pTrunk->aData[
23050 34 5d 2c 20 6e 4c 65 61 66 2b 31 29 3b 0a 20 20  4], nLeaf+1);.  
23060 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26        put4byte(&
23070 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 2b  pTrunk->aData[8+
23080 6e 4c 65 61 66 2a 34 5d 2c 20 69 50 61 67 65 29  nLeaf*4], iPage)
23090 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
230a0 5f 53 45 43 55 52 45 5f 44 45 4c 45 54 45 0a 20  _SECURE_DELETE. 
230b0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
230c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
230d0 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
230e0 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ite(pPage->pDbPa
230f0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  ge);.        }.#
23100 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 72 63  endif.        rc
23110 20 3d 20 62 74 72 65 65 53 65 74 48 61 73 43 6f   = btreeSetHasCo
23120 6e 74 65 6e 74 28 70 42 74 2c 20 69 50 61 67 65  ntent(pBt, iPage
23130 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
23140 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50 41   TRACE(("FREE-PA
23150 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20 74  GE: %d leaf on t
23160 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22 2c  runk page %d\n",
23170 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72 75  pPage->pgno,pTru
23180 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  nk->pgno));.    
23190 20 20 67 6f 74 6f 20 66 72 65 65 70 61 67 65 5f    goto freepage_
231a0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  out;.    }.  }..
231b0 20 20 2f 2a 20 49 66 20 63 6f 6e 74 72 6f 6c 20    /* If control 
231c0 66 6c 6f 77 73 20 74 6f 20 74 68 69 73 20 70 6f  flows to this po
231d0 69 6e 74 2c 20 74 68 65 6e 20 69 74 20 77 61 73  int, then it was
231e0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 74 6f   not possible to
231f0 20 61 64 64 20 74 68 65 0a 20 20 2a 2a 20 74 68   add the.  ** th
23200 65 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65  e page being fre
23210 65 64 20 61 73 20 61 20 6c 65 61 66 20 70 61 67  ed as a leaf pag
23220 65 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74  e of the first t
23230 72 75 6e 6b 20 69 6e 20 74 68 65 20 66 72 65 65  runk in the free
23240 2d 6c 69 73 74 2e 0a 20 20 2a 2a 20 50 6f 73 73  -list..  ** Poss
23250 69 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65  ibly because the
23260 20 66 72 65 65 2d 6c 69 73 74 20 69 73 20 65 6d   free-list is em
23270 70 74 79 2c 20 6f 72 20 70 6f 73 73 69 62 6c 79  pty, or possibly
23280 20 62 65 63 61 75 73 65 20 74 68 65 20 0a 20 20   because the .  
23290 2a 2a 20 66 69 72 73 74 20 74 72 75 6e 6b 20 69  ** first trunk i
232a0 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  n the free-list 
232b0 69 73 20 66 75 6c 6c 2e 20 45 69 74 68 65 72 20  is full. Either 
232c0 77 61 79 2c 20 74 68 65 20 70 61 67 65 20 62 65  way, the page be
232d0 69 6e 67 20 66 72 65 65 64 0a 20 20 2a 2a 20 77  ing freed.  ** w
232e0 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20 6e  ill become the n
232f0 65 77 20 66 69 72 73 74 20 74 72 75 6e 6b 20 70  ew first trunk p
23300 61 67 65 20 69 6e 20 74 68 65 20 66 72 65 65 2d  age in the free-
23310 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
23320 20 20 20 28 28 21 70 50 61 67 65 29 20 26 26 20     ((!pPage) && 
23330 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69  (0 != (rc = sqli
23340 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
23350 70 42 74 2c 20 69 50 61 67 65 2c 20 26 70 50 61  pBt, iPage, &pPa
23360 67 65 2c 20 30 29 29 29 29 0a 20 20 20 20 20 7c  ge, 0)))).     |
23370 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71  | (0 != (rc = sq
23380 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
23390 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29  pPage->pDbPage))
233a0 29 0a 20 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  ).  ){.    goto 
233b0 66 72 65 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20  freepage_out;.  
233c0 7d 0a 20 20 70 75 74 34 62 79 74 65 28 70 50 61  }.  put4byte(pPa
233d0 67 65 2d 3e 61 44 61 74 61 2c 20 69 54 72 75 6e  ge->aData, iTrun
233e0 6b 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26  k);.  put4byte(&
233f0 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 34 5d 2c  pPage->aData[4],
23400 20 30 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28   0);.  put4byte(
23410 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33  &pPage1->aData[3
23420 32 5d 2c 20 69 50 61 67 65 29 3b 0a 20 20 54 52  2], iPage);.  TR
23430 41 43 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a  ACE(("FREE-PAGE:
23440 20 25 64 20 6e 65 77 20 74 72 75 6e 6b 20 70 61   %d new trunk pa
23450 67 65 20 72 65 70 6c 61 63 69 6e 67 20 25 64 5c  ge replacing %d\
23460 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c  n", pPage->pgno,
23470 20 69 54 72 75 6e 6b 29 29 3b 0a 0a 66 72 65 65   iTrunk));..free
23480 70 61 67 65 5f 6f 75 74 3a 0a 20 20 69 66 28 20  page_out:.  if( 
23490 70 50 61 67 65 20 29 7b 0a 20 20 20 20 70 50 61  pPage ){.    pPa
234a0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
234b0 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 50 61 67    }.  releasePag
234c0 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65 6c 65  e(pPage);.  rele
234d0 61 73 65 50 61 67 65 28 70 54 72 75 6e 6b 29 3b  asePage(pTrunk);
234e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
234f0 73 74 61 74 69 63 20 69 6e 74 20 66 72 65 65 50  static int freeP
23500 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
23510 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 66 72  ge){.  return fr
23520 65 65 50 61 67 65 32 28 70 50 61 67 65 2d 3e 70  eePage2(pPage->p
23530 42 74 2c 20 70 50 61 67 65 2c 20 70 50 61 67 65  Bt, pPage, pPage
23540 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ->pgno);.}../*.*
23550 2a 20 46 72 65 65 20 61 6e 79 20 6f 76 65 72 66  * Free any overf
23560 6c 6f 77 20 70 61 67 65 73 20 61 73 73 6f 63 69  low pages associ
23570 61 74 65 64 20 77 69 74 68 20 74 68 65 20 67 69  ated with the gi
23580 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f 0a 73 74 61  ven Cell..*/.sta
23590 74 69 63 20 69 6e 74 20 63 6c 65 61 72 43 65 6c  tic int clearCel
235a0 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
235b0 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  , unsigned char 
235c0 2a 70 43 65 6c 6c 29 7b 0a 20 20 42 74 53 68 61  *pCell){.  BtSha
235d0 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65  red *pBt = pPage
235e0 2d 3e 70 42 74 3b 0a 20 20 43 65 6c 6c 49 6e 66  ->pBt;.  CellInf
235f0 6f 20 69 6e 66 6f 3b 0a 20 20 50 67 6e 6f 20 6f  o info;.  Pgno o
23600 76 66 6c 50 67 6e 6f 3b 0a 20 20 69 6e 74 20 72  vflPgno;.  int r
23610 63 3b 0a 20 20 69 6e 74 20 6e 4f 76 66 6c 3b 0a  c;.  int nOvfl;.
23620 20 20 75 31 36 20 6f 76 66 6c 50 61 67 65 53 69    u16 ovflPageSi
23630 7a 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ze;..  assert( s
23640 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
23650 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
23660 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
23670 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
23680 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
23690 20 26 69 6e 66 6f 29 3b 0a 20 20 69 66 28 20 69   &info);.  if( i
236a0 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 3d 3d 30  nfo.iOverflow==0
236b0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
236c0 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f 2a 20 4e 6f  QLITE_OK;  /* No
236d0 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 2e   overflow pages.
236e0 20 52 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   Return without 
236f0 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 2a  doing anything *
23700 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c 50 67 6e 6f  /.  }.  ovflPgno
23710 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
23720 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
23730 77 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  w]);.  assert( p
23740 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 3e  Bt->usableSize >
23750 20 34 20 29 3b 0a 20 20 6f 76 66 6c 50 61 67 65   4 );.  ovflPage
23760 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Size = pBt->usab
23770 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20 20 6e 4f  leSize - 4;.  nO
23780 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e 50 61 79  vfl = (info.nPay
23790 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63  load - info.nLoc
237a0 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65 53 69 7a  al + ovflPageSiz
237b0 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61 67 65 53  e - 1)/ovflPageS
237c0 69 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  ize;.  assert( o
237d0 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6e 4f  vflPgno==0 || nO
237e0 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68 69 6c 65  vfl>0 );.  while
237f0 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a 20 20 20  ( nOvfl-- ){.   
23800 20 50 67 6e 6f 20 69 4e 65 78 74 20 3d 20 30 3b   Pgno iNext = 0;
23810 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f  .    MemPage *pO
23820 76 66 6c 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  vfl = 0;.    if(
23830 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c 20   ovflPgno==0 || 
23840 6f 76 66 6c 50 67 6e 6f 3e 70 61 67 65 72 50 61  ovflPgno>pagerPa
23850 67 65 63 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a  gecount(pBt) ){.
23860 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
23870 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
23880 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
23890 6e 4f 76 66 6c 20 29 7b 0a 20 20 20 20 20 20 72  nOvfl ){.      r
238a0 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  c = getOverflowP
238b0 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67 6e  age(pBt, ovflPgn
238c0 6f 2c 20 26 70 4f 76 66 6c 2c 20 26 69 4e 65 78  o, &pOvfl, &iNex
238d0 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
238e0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
238f0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 66 72 65    }.    rc = fre
23900 65 50 61 67 65 32 28 70 42 74 2c 20 70 4f 76 66  ePage2(pBt, pOvf
23910 6c 2c 20 6f 76 66 6c 50 67 6e 6f 29 3b 0a 20 20  l, ovflPgno);.  
23920 20 20 69 66 28 20 70 4f 76 66 6c 20 29 7b 0a 20    if( pOvfl ){. 
23930 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65       sqlite3Page
23940 72 55 6e 72 65 66 28 70 4f 76 66 6c 2d 3e 70 44  rUnref(pOvfl->pD
23950 62 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  bPage);.    }.  
23960 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
23970 6e 20 72 63 3b 0a 20 20 20 20 6f 76 66 6c 50 67  n rc;.    ovflPg
23980 6e 6f 20 3d 20 69 4e 65 78 74 3b 0a 20 20 7d 0a  no = iNext;.  }.
23990 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
239a0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
239b0 61 74 65 20 74 68 65 20 62 79 74 65 20 73 65 71  ate the byte seq
239c0 75 65 6e 63 65 20 75 73 65 64 20 74 6f 20 72 65  uence used to re
239d0 70 72 65 73 65 6e 74 20 61 20 63 65 6c 6c 20 6f  present a cell o
239e0 6e 20 70 61 67 65 20 70 50 61 67 65 0a 2a 2a 20  n page pPage.** 
239f0 61 6e 64 20 77 72 69 74 65 20 74 68 61 74 20 62  and write that b
23a00 79 74 65 20 73 65 71 75 65 6e 63 65 20 69 6e 74  yte sequence int
23a10 6f 20 70 43 65 6c 6c 5b 5d 2e 20 20 4f 76 65 72  o pCell[].  Over
23a20 66 6c 6f 77 20 70 61 67 65 73 20 61 72 65 0a 2a  flow pages are.*
23a30 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  * allocated and 
23a40 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 6e 65 63  filled in as nec
23a50 65 73 73 61 72 79 2e 20 20 54 68 65 20 63 61 6c  essary.  The cal
23a60 6c 69 6e 67 20 70 72 6f 63 65 64 75 72 65 0a 2a  ling procedure.*
23a70 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
23a80 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65   for making sure
23a90 20 73 75 66 66 69 63 69 65 6e 74 20 73 70 61 63   sufficient spac
23aa0 65 20 68 61 73 20 62 65 65 6e 20 61 6c 6c 6f 63  e has been alloc
23ab0 61 74 65 64 0a 2a 2a 20 66 6f 72 20 70 43 65 6c  ated.** for pCel
23ac0 6c 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  l[]..**.** Note 
23ad0 74 68 61 74 20 70 43 65 6c 6c 20 64 6f 65 73 20  that pCell does 
23ae0 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 6e 65  not necessary ne
23af0 65 64 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74  ed to point to t
23b00 68 65 20 70 50 61 67 65 2d 3e 61 44 61 74 61 0a  he pPage->aData.
23b10 2a 2a 20 61 72 65 61 2e 20 20 70 43 65 6c 6c 20  ** area.  pCell 
23b20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 73  might point to s
23b30 6f 6d 65 20 74 65 6d 70 6f 72 61 72 79 20 73 74  ome temporary st
23b40 6f 72 61 67 65 2e 20 20 54 68 65 20 63 65 6c 6c  orage.  The cell
23b50 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 63 6f 6e 73   will.** be cons
23b60 74 72 75 63 74 65 64 20 69 6e 20 74 68 69 73 20  tructed in this 
23b70 74 65 6d 70 6f 72 61 72 79 20 61 72 65 61 20 74  temporary area t
23b80 68 65 6e 20 63 6f 70 69 65 64 20 69 6e 74 6f 20  hen copied into 
23b90 70 50 61 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20  pPage->aData.** 
23ba0 6c 61 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  later..*/.static
23bb0 20 69 6e 74 20 66 69 6c 6c 49 6e 43 65 6c 6c 28   int fillInCell(
23bc0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
23bd0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
23be0 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 68    /* The page th
23bf0 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  at contains the 
23c00 63 65 6c 6c 20 2a 2f 0a 20 20 75 6e 73 69 67 6e  cell */.  unsign
23c10 65 64 20 63 68 61 72 20 2a 70 43 65 6c 6c 2c 20  ed char *pCell, 
23c20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70           /* Comp
23c30 6c 65 74 65 20 74 65 78 74 20 6f 66 20 74 68 65  lete text of the
23c40 20 63 65 6c 6c 20 2a 2f 0a 20 20 63 6f 6e 73 74   cell */.  const
23c50 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34   void *pKey, i64
23c60 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65   nKey,    /* The
23c70 20 6b 65 79 20 2a 2f 0a 20 20 63 6f 6e 73 74 20   key */.  const 
23c80 76 6f 69 64 20 2a 70 44 61 74 61 2c 69 6e 74 20  void *pData,int 
23c90 6e 44 61 74 61 2c 20 20 20 2f 2a 20 54 68 65 20  nData,   /* The 
23ca0 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6e 5a  data */.  int nZ
23cb0 65 72 6f 2c 20 20 20 20 20 20 20 20 20 20 20 20  ero,            
23cc0 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
23cd0 61 20 7a 65 72 6f 20 62 79 74 65 73 20 74 6f 20  a zero bytes to 
23ce0 61 70 70 65 6e 64 20 74 6f 20 70 44 61 74 61 20  append to pData 
23cf0 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 53 69 7a 65  */.  int *pnSize
23d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d10 20 20 20 20 2f 2a 20 57 72 69 74 65 20 63 65 6c      /* Write cel
23d20 6c 20 73 69 7a 65 20 68 65 72 65 20 2a 2f 0a 29  l size here */.)
23d30 7b 0a 20 20 69 6e 74 20 6e 50 61 79 6c 6f 61 64  {.  int nPayload
23d40 3b 0a 20 20 63 6f 6e 73 74 20 75 38 20 2a 70 53  ;.  const u8 *pS
23d50 72 63 3b 0a 20 20 69 6e 74 20 6e 53 72 63 2c 20  rc;.  int nSrc, 
23d60 6e 2c 20 72 63 3b 0a 20 20 69 6e 74 20 73 70 61  n, rc;.  int spa
23d70 63 65 4c 65 66 74 3b 0a 20 20 4d 65 6d 50 61 67  ceLeft;.  MemPag
23d80 65 20 2a 70 4f 76 66 6c 20 3d 20 30 3b 0a 20 20  e *pOvfl = 0;.  
23d90 4d 65 6d 50 61 67 65 20 2a 70 54 6f 52 65 6c 65  MemPage *pToRele
23da0 61 73 65 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67  ase = 0;.  unsig
23db0 6e 65 64 20 63 68 61 72 20 2a 70 50 72 69 6f 72  ned char *pPrior
23dc0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
23dd0 72 20 2a 70 50 61 79 6c 6f 61 64 3b 0a 20 20 42  r *pPayload;.  B
23de0 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
23df0 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 50 67 6e  Page->pBt;.  Pgn
23e00 6f 20 70 67 6e 6f 4f 76 66 6c 20 3d 20 30 3b 0a  o pgnoOvfl = 0;.
23e10 20 20 69 6e 74 20 6e 48 65 61 64 65 72 3b 0a 20    int nHeader;. 
23e20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a   CellInfo info;.
23e30 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
23e40 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
23e50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
23e60 20 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 20   );..  /* pPage 
23e70 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 69  is not necessari
23e80 6c 79 20 77 72 69 74 65 61 62 6c 65 20 73 69 6e  ly writeable sin
23e90 63 65 20 70 43 65 6c 6c 20 6d 69 67 68 74 20 62  ce pCell might b
23ea0 65 20 61 75 78 69 6c 69 61 72 79 0a 20 20 2a 2a  e auxiliary.  **
23eb0 20 62 75 66 66 65 72 20 73 70 61 63 65 20 74 68   buffer space th
23ec0 61 74 20 69 73 20 73 65 70 61 72 61 74 65 20 66  at is separate f
23ed0 72 6f 6d 20 74 68 65 20 70 50 61 67 65 20 62 75  rom the pPage bu
23ee0 66 66 65 72 20 61 72 65 61 20 2a 2f 0a 20 20 61  ffer area */.  a
23ef0 73 73 65 72 74 28 20 70 43 65 6c 6c 3c 70 50 61  ssert( pCell<pPa
23f00 67 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 43 65  ge->aData || pCe
23f10 6c 6c 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74  ll>=&pPage->aDat
23f20 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  a[pBt->pageSize]
23f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
23f40 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
23f50 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70  iteable(pPage->p
23f60 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 2f 2a  DbPage) );..  /*
23f70 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 68 65 61   Fill in the hea
23f80 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65 61 64 65  der. */.  nHeade
23f90 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 21 70 50  r = 0;.  if( !pP
23fa0 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  age->leaf ){.   
23fb0 20 6e 48 65 61 64 65 72 20 2b 3d 20 34 3b 0a 20   nHeader += 4;. 
23fc0 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e   }.  if( pPage->
23fd0 68 61 73 44 61 74 61 20 29 7b 0a 20 20 20 20 6e  hasData ){.    n
23fe0 48 65 61 64 65 72 20 2b 3d 20 70 75 74 56 61 72  Header += putVar
23ff0 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64  int(&pCell[nHead
24000 65 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a 65 72 6f  er], nData+nZero
24010 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
24020 6e 44 61 74 61 20 3d 20 6e 5a 65 72 6f 20 3d 20  nData = nZero = 
24030 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61 64 65 72  0;.  }.  nHeader
24040 20 2b 3d 20 70 75 74 56 61 72 69 6e 74 28 26 70   += putVarint(&p
24050 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d 2c 20 2a  Cell[nHeader], *
24060 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b 0a 20 20  (u64*)&nKey);.  
24070 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72 73  sqlite3BtreePars
24080 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20  eCellPtr(pPage, 
24090 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20  pCell, &info);. 
240a0 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 48   assert( info.nH
240b0 65 61 64 65 72 3d 3d 6e 48 65 61 64 65 72 20 29  eader==nHeader )
240c0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f  ;.  assert( info
240d0 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29 3b 0a 20  .nKey==nKey );. 
240e0 20 61 73 73 65 72 74 28 20 69 6e 66 6f 2e 6e 44   assert( info.nD
240f0 61 74 61 3d 3d 28 75 33 32 29 28 6e 44 61 74 61  ata==(u32)(nData
24100 2b 6e 5a 65 72 6f 29 20 29 3b 0a 20 20 0a 20 20  +nZero) );.  .  
24110 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20 70  /* Fill in the p
24120 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 6e 50 61 79  ayload */.  nPay
24130 6c 6f 61 64 20 3d 20 6e 44 61 74 61 20 2b 20 6e  load = nData + n
24140 5a 65 72 6f 3b 0a 20 20 69 66 28 20 70 50 61 67  Zero;.  if( pPag
24150 65 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  e->intKey ){.   
24160 20 70 53 72 63 20 3d 20 70 44 61 74 61 3b 0a 20   pSrc = pData;. 
24170 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b     nSrc = nData;
24180 0a 20 20 20 20 6e 44 61 74 61 20 3d 20 30 3b 0a  .    nData = 0;.
24190 20 20 7d 65 6c 73 65 7b 20 0a 20 20 20 20 69 66    }else{ .    if
241a0 28 20 6e 4b 65 79 3e 30 78 37 66 66 66 66 66 66  ( nKey>0x7ffffff
241b0 66 20 7c 7c 20 70 4b 65 79 3d 3d 30 20 29 7b 0a  f || pKey==0 ){.
241c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
241d0 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  ITE_CORRUPT;.   
241e0 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20   }.    nPayload 
241f0 2b 3d 20 28 69 6e 74 29 6e 4b 65 79 3b 0a 20 20  += (int)nKey;.  
24200 20 20 70 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20    pSrc = pKey;. 
24210 20 20 20 6e 53 72 63 20 3d 20 28 69 6e 74 29 6e     nSrc = (int)n
24220 4b 65 79 3b 0a 20 20 7d 0a 20 20 2a 70 6e 53 69  Key;.  }.  *pnSi
24230 7a 65 20 3d 20 69 6e 66 6f 2e 6e 53 69 7a 65 3b  ze = info.nSize;
24240 0a 20 20 73 70 61 63 65 4c 65 66 74 20 3d 20 69  .  spaceLeft = i
24250 6e 66 6f 2e 6e 4c 6f 63 61 6c 3b 0a 20 20 70 50  nfo.nLocal;.  pP
24260 61 79 6c 6f 61 64 20 3d 20 26 70 43 65 6c 6c 5b  ayload = &pCell[
24270 6e 48 65 61 64 65 72 5d 3b 0a 20 20 70 50 72 69  nHeader];.  pPri
24280 6f 72 20 3d 20 26 70 43 65 6c 6c 5b 69 6e 66 6f  or = &pCell[info
24290 2e 69 4f 76 65 72 66 6c 6f 77 5d 3b 0a 0a 20 20  .iOverflow];..  
242a0 77 68 69 6c 65 28 20 6e 50 61 79 6c 6f 61 64 3e  while( nPayload>
242b0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 73 70 61  0 ){.    if( spa
242c0 63 65 4c 65 66 74 3d 3d 30 20 29 7b 0a 23 69 66  ceLeft==0 ){.#if
242d0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
242e0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
242f0 20 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61    Pgno pgnoPtrma
24300 70 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a  p = pgnoOvfl; /*
24310 20 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70   Overflow page p
24320 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79  ointer-map entry
24330 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69   page */.      i
24340 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
24350 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f  um ){.        do
24360 7b 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f  {.          pgno
24370 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Ovfl++;.        
24380 7d 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20  } while( .      
24390 20 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47      PTRMAP_ISPAG
243a0 45 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29  E(pBt, pgnoOvfl)
243b0 20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45   || pgnoOvfl==PE
243c0 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
243d0 70 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b  pBt) .        );
243e0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
243f0 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
24400 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
24410 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f  , &pOvfl, &pgnoO
24420 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 30  vfl, pgnoOvfl, 0
24430 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
24440 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
24450 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
24460 65 20 64 61 74 61 62 61 73 65 20 73 75 70 70 6f  e database suppo
24470 72 74 73 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c  rts auto-vacuum,
24480 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64 20   and the second 
24490 6f 72 20 73 75 62 73 65 71 75 65 6e 74 0a 20 20  or subsequent.  
244a0 20 20 20 20 2a 2a 20 6f 76 65 72 66 6c 6f 77 20      ** overflow 
244b0 70 61 67 65 20 69 73 20 62 65 69 6e 67 20 61 6c  page is being al
244c0 6c 6f 63 61 74 65 64 2c 20 61 64 64 20 61 6e 20  located, add an 
244d0 65 6e 74 72 79 20 74 6f 20 74 68 65 20 70 6f 69  entry to the poi
244e0 6e 74 65 72 2d 6d 61 70 0a 20 20 20 20 20 20 2a  nter-map.      *
244f0 2a 20 66 6f 72 20 74 68 61 74 20 70 61 67 65 20  * for that page 
24500 6e 6f 77 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20  now. .      **. 
24510 20 20 20 20 20 2a 2a 20 49 66 20 74 68 69 73 20       ** If this 
24520 69 73 20 74 68 65 20 66 69 72 73 74 20 6f 76 65  is the first ove
24530 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e  rflow page, then
24540 20 77 72 69 74 65 20 61 20 70 61 72 74 69 61 6c   write a partial
24550 20 65 6e 74 72 79 20 0a 20 20 20 20 20 20 2a 2a   entry .      **
24560 20 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d   to the pointer-
24570 6d 61 70 2e 20 49 66 20 77 65 20 77 72 69 74 65  map. If we write
24580 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74 68 69 73   nothing to this
24590 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 73 6c 6f   pointer-map slo
245a0 74 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  t,.      ** then
245b0 20 74 68 65 20 6f 70 74 69 6d 69 73 74 69 63 20   the optimistic 
245c0 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 20 70  overflow chain p
245d0 72 6f 63 65 73 73 69 6e 67 20 69 6e 20 63 6c 65  rocessing in cle
245e0 61 72 43 65 6c 6c 28 29 0a 20 20 20 20 20 20 2a  arCell().      *
245f0 2a 20 6d 61 79 20 6d 69 73 69 6e 74 65 72 70 72  * may misinterpr
24600 65 74 20 74 68 65 20 75 6e 69 6e 69 74 69 61 6c  et the uninitial
24610 69 73 65 64 20 76 61 6c 75 65 73 20 61 6e 64 20  ised values and 
24620 64 65 6c 65 74 65 20 74 68 65 0a 20 20 20 20 20  delete the.     
24630 20 2a 2a 20 77 72 6f 6e 67 20 70 61 67 65 73 20   ** wrong pages 
24640 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73  from the databas
24650 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
24660 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
24670 61 63 75 75 6d 20 26 26 20 72 63 3d 3d 53 51 4c  acuum && rc==SQL
24680 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
24690 20 20 75 38 20 65 54 79 70 65 20 3d 20 28 70 67    u8 eType = (pg
246a0 6e 6f 50 74 72 6d 61 70 3f 50 54 52 4d 41 50 5f  noPtrmap?PTRMAP_
246b0 4f 56 45 52 46 4c 4f 57 32 3a 50 54 52 4d 41 50  OVERFLOW2:PTRMAP
246c0 5f 4f 56 45 52 46 4c 4f 57 31 29 3b 0a 20 20 20  _OVERFLOW1);.   
246d0 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
246e0 50 75 74 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66  Put(pBt, pgnoOvf
246f0 6c 2c 20 65 54 79 70 65 2c 20 70 67 6e 6f 50 74  l, eType, pgnoPt
24700 72 6d 61 70 29 3b 0a 20 20 20 20 20 20 20 20 69  rmap);.        i
24710 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
24720 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70     releasePage(p
24730 4f 76 66 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Ovfl);.        }
24740 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
24750 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
24760 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
24770 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65 29 3b  age(pToRelease);
24780 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
24790 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
247a0 20 20 20 2f 2a 20 49 66 20 70 54 6f 52 65 6c 65     /* If pToRele
247b0 61 73 65 20 69 73 20 6e 6f 74 20 7a 65 72 6f 20  ase is not zero 
247c0 74 68 61 6e 20 70 50 72 69 6f 72 20 70 6f 69 6e  than pPrior poin
247d0 74 73 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ts into the data
247e0 20 61 72 65 61 0a 20 20 20 20 20 20 2a 2a 20 6f   area.      ** o
247f0 66 20 70 54 6f 52 65 6c 65 61 73 65 2e 20 20 4d  f pToRelease.  M
24800 61 6b 65 20 73 75 72 65 20 70 54 6f 52 65 6c 65  ake sure pToRele
24810 61 73 65 20 69 73 20 73 74 69 6c 6c 20 77 72 69  ase is still wri
24820 74 65 61 62 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  teable. */.     
24830 20 61 73 73 65 72 74 28 20 70 54 6f 52 65 6c 65   assert( pToRele
24840 61 73 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ase==0 || sqlite
24850 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
24860 65 28 70 54 6f 52 65 6c 65 61 73 65 2d 3e 70 44  e(pToRelease->pD
24870 62 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20  bPage) );..     
24880 20 2f 2a 20 49 66 20 70 50 72 69 6f 72 20 69 73   /* If pPrior is
24890 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
248a0 61 20 61 72 65 61 20 6f 66 20 70 50 61 67 65 2c  a area of pPage,
248b0 20 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 20   then make sure 
248c0 70 50 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 69  pPage.      ** i
248d0 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61 62 6c  s still writeabl
248e0 65 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72  e */.      asser
248f0 74 28 20 70 50 72 69 6f 72 3c 70 50 61 67 65 2d  t( pPrior<pPage-
24900 3e 61 44 61 74 61 20 7c 7c 20 70 50 72 69 6f 72  >aData || pPrior
24910 3e 3d 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  >=&pPage->aData[
24920 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d 0a 20  pBt->pageSize]. 
24930 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71             || sq
24940 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
24950 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
24960 50 61 67 65 29 20 29 3b 0a 0a 20 20 20 20 20 20  Page) );..      
24970 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
24980 20 70 67 6e 6f 4f 76 66 6c 29 3b 0a 20 20 20 20   pgnoOvfl);.    
24990 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
249a0 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 20 20 20  oRelease);.     
249b0 20 70 54 6f 52 65 6c 65 61 73 65 20 3d 20 70 4f   pToRelease = pO
249c0 76 66 6c 3b 0a 20 20 20 20 20 20 70 50 72 69 6f  vfl;.      pPrio
249d0 72 20 3d 20 70 4f 76 66 6c 2d 3e 61 44 61 74 61  r = pOvfl->aData
249e0 3b 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  ;.      put4byte
249f0 28 70 50 72 69 6f 72 2c 20 30 29 3b 0a 20 20 20  (pPrior, 0);.   
24a00 20 20 20 70 50 61 79 6c 6f 61 64 20 3d 20 26 70     pPayload = &p
24a10 4f 76 66 6c 2d 3e 61 44 61 74 61 5b 34 5d 3b 0a  Ovfl->aData[4];.
24a20 20 20 20 20 20 20 73 70 61 63 65 4c 65 66 74 20        spaceLeft 
24a30 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  = pBt->usableSiz
24a40 65 20 2d 20 34 3b 0a 20 20 20 20 7d 0a 20 20 20  e - 4;.    }.   
24a50 20 6e 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20   n = nPayload;. 
24a60 20 20 20 69 66 28 20 6e 3e 73 70 61 63 65 4c 65     if( n>spaceLe
24a70 66 74 20 29 20 6e 20 3d 20 73 70 61 63 65 4c 65  ft ) n = spaceLe
24a80 66 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70  ft;..    /* If p
24a90 54 6f 52 65 6c 65 61 73 65 20 69 73 20 6e 6f 74  ToRelease is not
24aa0 20 7a 65 72 6f 20 74 68 61 6e 20 70 50 61 79 6c   zero than pPayl
24ab0 6f 61 64 20 70 6f 69 6e 74 73 20 69 6e 74 6f 20  oad points into 
24ac0 74 68 65 20 64 61 74 61 20 61 72 65 61 0a 20 20  the data area.  
24ad0 20 20 2a 2a 20 6f 66 20 70 54 6f 52 65 6c 65 61    ** of pToRelea
24ae0 73 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 70  se.  Make sure p
24af0 54 6f 52 65 6c 65 61 73 65 20 69 73 20 73 74 69  ToRelease is sti
24b00 6c 6c 20 77 72 69 74 65 61 62 6c 65 2e 20 2a 2f  ll writeable. */
24b10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f  .    assert( pTo
24b20 52 65 6c 65 61 73 65 3d 3d 30 20 7c 7c 20 73 71  Release==0 || sq
24b30 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
24b40 65 61 62 6c 65 28 70 54 6f 52 65 6c 65 61 73 65  eable(pToRelease
24b50 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20  ->pDbPage) );.. 
24b60 20 20 20 2f 2a 20 49 66 20 70 50 61 79 6c 6f 61     /* If pPayloa
24b70 64 20 69 73 20 70 61 72 74 20 6f 66 20 74 68 65  d is part of the
24b80 20 64 61 74 61 20 61 72 65 61 20 6f 66 20 70 50   data area of pP
24b90 61 67 65 2c 20 74 68 65 6e 20 6d 61 6b 65 20 73  age, then make s
24ba0 75 72 65 20 70 50 61 67 65 0a 20 20 20 20 2a 2a  ure pPage.    **
24bb0 20 69 73 20 73 74 69 6c 6c 20 77 72 69 74 65 61   is still writea
24bc0 62 6c 65 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ble */.    asser
24bd0 74 28 20 70 50 61 79 6c 6f 61 64 3c 70 50 61 67  t( pPayload<pPag
24be0 65 2d 3e 61 44 61 74 61 20 7c 7c 20 70 50 61 79  e->aData || pPay
24bf0 6c 6f 61 64 3e 3d 26 70 50 61 67 65 2d 3e 61 44  load>=&pPage->aD
24c00 61 74 61 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a  ata[pBt->pageSiz
24c10 65 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  e].            |
24c20 7c 20 73 71 6c 69 74 65 33 50 61 67 65 72 49 73  | sqlite3PagerIs
24c30 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65 2d  writeable(pPage-
24c40 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 0a 20 20  >pDbPage) );..  
24c50 20 20 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a    if( nSrc>0 ){.
24c60 20 20 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63        if( n>nSrc
24c70 20 29 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20   ) n = nSrc;.   
24c80 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 20     assert( pSrc 
24c90 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  );.      memcpy(
24ca0 70 50 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20  pPayload, pSrc, 
24cb0 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  n);.    }else{. 
24cc0 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79       memset(pPay
24cd0 6c 6f 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20  load, 0, n);.   
24ce0 20 7d 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20   }.    nPayload 
24cf0 2d 3d 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f  -= n;.    pPaylo
24d00 61 64 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72  ad += n;.    pSr
24d10 63 20 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63  c += n;.    nSrc
24d20 20 2d 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65   -= n;.    space
24d30 4c 65 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69  Left -= n;.    i
24d40 66 28 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20  f( nSrc==0 ){.  
24d50 20 20 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61      nSrc = nData
24d60 3b 0a 20 20 20 20 20 20 70 53 72 63 20 3d 20 70  ;.      pSrc = p
24d70 44 61 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Data;.    }.  }.
24d80 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54    releasePage(pT
24d90 6f 52 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74  oRelease);.  ret
24da0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
24db0 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74  ../*.** Remove t
24dc0 68 65 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f  he i-th cell fro
24dd0 6d 20 70 50 61 67 65 2e 20 20 54 68 69 73 20 72  m pPage.  This r
24de0 6f 75 74 69 6e 65 20 65 66 66 65 63 74 73 20 70  outine effects p
24df0 50 61 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68  Page only..** Th
24e00 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69  e cell content i
24e10 73 20 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64  s not freed or d
24e20 65 61 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20  eallocated.  It 
24e30 69 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a  is assumed that.
24e40 2a 2a 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74  ** the cell cont
24e50 65 6e 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70  ent has been cop
24e60 69 65 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c  ied someplace el
24e70 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
24e80 65 20 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65  e just.** remove
24e90 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  s the reference 
24ea0 74 6f 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d  to the cell from
24eb0 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73   pPage..**.** "s
24ec0 7a 22 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e  z" must be the n
24ed0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
24ee0 6e 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73  n the cell..*/.s
24ef0 74 61 74 69 63 20 69 6e 74 20 64 72 6f 70 43 65  tatic int dropCe
24f00 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  ll(MemPage *pPag
24f10 65 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20  e, int idx, int 
24f20 73 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  sz){.  int i;   
24f30 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
24f40 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
24f50 70 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  pc;         /* O
24f60 66 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f  ffset to cell co
24f70 6e 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65  ntent of cell be
24f80 69 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20  ing deleted */. 
24f90 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20   u8 *data;      
24fa0 20 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61   /* pPage->aData
24fb0 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20   */.  u8 *ptr;  
24fc0 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
24fd0 20 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75   move bytes arou
24fe0 6e 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d  nd within data[]
24ff0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
25000 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 65 74        /* The ret
25010 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61  urn code */..  a
25020 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26 26  ssert( idx>=0 &&
25030 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65 6c   idx<pPage->nCel
25040 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  l );.  assert( s
25050 7a 3d 3d 63 65 6c 6c 53 69 7a 65 28 70 50 61 67  z==cellSize(pPag
25060 65 2c 20 69 64 78 29 20 29 3b 0a 20 20 61 73 73  e, idx) );.  ass
25070 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
25080 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
25090 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ge->pDbPage) );.
250a0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
250b0 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
250c0 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
250d0 29 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67  );.  data = pPag
250e0 65 2d 3e 61 44 61 74 61 3b 0a 20 20 70 74 72 20  e->aData;.  ptr 
250f0 3d 20 26 64 61 74 61 5b 70 50 61 67 65 2d 3e 63  = &data[pPage->c
25100 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 64  ellOffset + 2*id
25110 78 5d 3b 0a 20 20 70 63 20 3d 20 67 65 74 32 62  x];.  pc = get2b
25120 79 74 65 28 70 74 72 29 3b 0a 20 20 69 66 28 20  yte(ptr);.  if( 
25130 28 70 63 3c 70 50 61 67 65 2d 3e 68 64 72 4f 66  (pc<pPage->hdrOf
25140 66 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c  fset+6+(pPage->l
25150 65 61 66 3f 30 3a 34 29 29 0a 20 20 20 20 20 7c  eaf?0:4)).     |
25160 7c 20 28 70 63 2b 73 7a 3e 70 50 61 67 65 2d 3e  | (pc+sz>pPage->
25170 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29  pBt->usableSize)
25180 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
25190 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
251a0 50 54 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 66  PT;.  }.  rc = f
251b0 72 65 65 53 70 61 63 65 28 70 50 61 67 65 2c 20  reeSpace(pPage, 
251c0 70 63 2c 20 73 7a 29 3b 0a 20 20 69 66 28 20 72  pc, sz);.  if( r
251d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
251e0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
251f0 20 7d 0a 20 20 66 6f 72 28 69 3d 69 64 78 2b 31   }.  for(i=idx+1
25200 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ; i<pPage->nCell
25210 3b 20 69 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b 0a  ; i++, ptr+=2){.
25220 20 20 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72      ptr[0] = ptr
25230 5b 32 5d 3b 0a 20 20 20 20 70 74 72 5b 31 5d 20  [2];.    ptr[1] 
25240 3d 20 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20 20  = ptr[3];.  }.  
25250 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a  pPage->nCell--;.
25260 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
25270 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65  [pPage->hdrOffse
25280 74 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65  t+3], pPage->nCe
25290 6c 6c 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46  ll);.  pPage->nF
252a0 72 65 65 20 2b 3d 20 32 3b 0a 20 20 72 65 74 75  ree += 2;.  retu
252b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
252c0 0a 2f 2a 0a 2a 2a 20 49 6e 73 65 72 74 20 61 20  ./*.** Insert a 
252d0 6e 65 77 20 63 65 6c 6c 20 6f 6e 20 70 50 61 67  new cell on pPag
252e0 65 20 61 74 20 63 65 6c 6c 20 69 6e 64 65 78 20  e at cell index 
252f0 22 69 22 2e 20 20 70 43 65 6c 6c 20 70 6f 69 6e  "i".  pCell poin
25300 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f 6e  ts to the.** con
25310 74 65 6e 74 20 6f 66 20 74 68 65 20 63 65 6c 6c  tent of the cell
25320 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
25330 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 77 69 6c 6c  ell content will
25340 20 66 69 74 20 6f 6e 20 74 68 65 20 70 61 67 65   fit on the page
25350 2c 20 74 68 65 6e 20 70 75 74 20 69 74 20 74 68  , then put it th
25360 65 72 65 2e 20 20 49 66 20 69 74 0a 2a 2a 20 77  ere.  If it.** w
25370 69 6c 6c 20 6e 6f 74 20 66 69 74 2c 20 74 68 65  ill not fit, the
25380 6e 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66  n make a copy of
25390 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
253a0 74 20 69 6e 74 6f 20 70 54 65 6d 70 20 69 66 0a  t into pTemp if.
253b0 2a 2a 20 70 54 65 6d 70 20 69 73 20 6e 6f 74 20  ** pTemp is not 
253c0 6e 75 6c 6c 2e 20 20 52 65 67 61 72 64 6c 65 73  null.  Regardles
253d0 73 20 6f 66 20 70 54 65 6d 70 2c 20 61 6c 6c 6f  s of pTemp, allo
253e0 63 61 74 65 20 61 20 6e 65 77 20 65 6e 74 72 79  cate a new entry
253f0 0a 2a 2a 20 69 6e 20 70 50 61 67 65 2d 3e 61 4f  .** in pPage->aO
25400 76 66 6c 5b 5d 20 61 6e 64 20 6d 61 6b 65 20 69  vfl[] and make i
25410 74 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 63  t point to the c
25420 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 28 65 69 74  ell content (eit
25430 68 65 72 0a 2a 2a 20 69 6e 20 70 54 65 6d 70 20  her.** in pTemp 
25440 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  or the original 
25450 70 43 65 6c 6c 29 20 61 6e 64 20 61 6c 73 6f 20  pCell) and also 
25460 72 65 63 6f 72 64 20 69 74 73 20 69 6e 64 65 78  record its index
25470 2e 20 0a 2a 2a 20 41 6c 6c 6f 63 61 74 69 6e 67  . .** Allocating
25480 20 61 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20   a new entry in 
25490 70 50 61 67 65 2d 3e 61 43 65 6c 6c 5b 5d 20 69  pPage->aCell[] i
254a0 6d 70 6c 69 65 73 20 74 68 61 74 20 0a 2a 2a 20  mplies that .** 
254b0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
254c0 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e   is incremented.
254d0 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 53 6b 69 70 20  .**.** If nSkip 
254e0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
254f0 6e 20 64 6f 20 6e 6f 74 20 63 6f 70 79 20 74 68  n do not copy th
25500 65 20 66 69 72 73 74 20 6e 53 6b 69 70 20 62 79  e first nSkip by
25510 74 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 63 65  tes of the.** ce
25520 6c 6c 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 77  ll. The caller w
25530 69 6c 6c 20 6f 76 65 72 77 72 69 74 65 20 74 68  ill overwrite th
25540 65 6d 20 61 66 74 65 72 20 74 68 69 73 20 66 75  em after this fu
25550 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20  nction returns. 
25560 49 66 0a 2a 2a 20 6e 53 6b 69 70 20 69 73 20 6e  If.** nSkip is n
25570 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 70 43  on-zero, then pC
25580 65 6c 6c 20 6d 61 79 20 6e 6f 74 20 70 6f 69 6e  ell may not poin
25590 74 20 74 6f 20 61 6e 20 69 6e 76 61 6c 69 64 20  t to an invalid 
255a0 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
255b0 0a 2a 2a 20 28 62 75 74 20 70 43 65 6c 6c 2b 6e  .** (but pCell+n
255c0 53 6b 69 70 20 69 73 20 61 6c 77 61 79 73 20 76  Skip is always v
255d0 61 6c 69 64 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  alid)..*/.static
255e0 20 69 6e 74 20 69 6e 73 65 72 74 43 65 6c 6c 28   int insertCell(
255f0 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
25600 65 2c 20 20 20 2f 2a 20 50 61 67 65 20 69 6e 74  e,   /* Page int
25610 6f 20 77 68 69 63 68 20 77 65 20 61 72 65 20 63  o which we are c
25620 6f 70 79 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  opying */.  int 
25630 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i,            /*
25640 20 4e 65 77 20 63 65 6c 6c 20 62 65 63 6f 6d 65   New cell become
25650 73 20 74 68 65 20 69 2d 74 68 20 63 65 6c 6c 20  s the i-th cell 
25660 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20  of the page */. 
25670 20 75 38 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20   u8 *pCell,     
25680 20 20 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66     /* Content of
25690 20 74 68 65 20 6e 65 77 20 63 65 6c 6c 20 2a 2f   the new cell */
256a0 0a 20 20 69 6e 74 20 73 7a 2c 20 20 20 20 20 20  .  int sz,      
256b0 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66       /* Bytes of
256c0 20 63 6f 6e 74 65 6e 74 20 69 6e 20 70 43 65 6c   content in pCel
256d0 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 54 65 6d 70  l */.  u8 *pTemp
256e0 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  ,        /* Temp
256f0 20 73 74 6f 72 61 67 65 20 73 70 61 63 65 20 66   storage space f
25700 6f 72 20 70 43 65 6c 6c 2c 20 69 66 20 6e 65 65  or pCell, if nee
25710 64 65 64 20 2a 2f 0a 20 20 75 38 20 6e 53 6b 69  ded */.  u8 nSki
25720 70 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f  p          /* Do
25730 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20 66   not write the f
25740 69 72 73 74 20 6e 53 6b 69 70 20 62 79 74 65 73  irst nSkip bytes
25750 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 2a 2f 0a   of the cell */.
25760 29 7b 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20  ){.  int idx;   
25770 20 20 20 20 20 20 20 2f 2a 20 57 68 65 72 65 20         /* Where 
25780 74 6f 20 77 72 69 74 65 20 6e 65 77 20 63 65 6c  to write new cel
25790 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 20 64 61 74  l content in dat
257a0 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 20  a[] */.  int j; 
257b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
257c0 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
257d0 69 6e 74 20 74 6f 70 3b 20 20 20 20 20 20 20 20  int top;        
257e0 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65 20    /* First byte 
257f0 6f 66 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61  of content for a
25800 6e 79 20 63 65 6c 6c 20 69 6e 20 64 61 74 61 5b  ny cell in data[
25810 5d 20 2a 2f 0a 20 20 69 6e 74 20 65 6e 64 3b 20  ] */.  int end; 
25820 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
25830 74 20 62 79 74 65 20 70 61 73 74 20 74 68 65 20  t byte past the 
25840 6c 61 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65  last cell pointe
25850 72 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  r in data[] */. 
25860 20 69 6e 74 20 69 6e 73 3b 20 20 20 20 20 20 20   int ins;       
25870 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 64     /* Index in d
25880 61 74 61 5b 5d 20 77 68 65 72 65 20 6e 65 77 20  ata[] where new 
25890 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 73 20  cell pointer is 
258a0 69 6e 73 65 72 74 65 64 20 2a 2f 0a 20 20 69 6e  inserted */.  in
258b0 74 20 68 64 72 3b 20 20 20 20 20 20 20 20 20 20  t hdr;          
258c0 2f 2a 20 4f 66 66 73 65 74 20 69 6e 74 6f 20 64  /* Offset into d
258d0 61 74 61 5b 5d 20 6f 66 20 74 68 65 20 70 61 67  ata[] of the pag
258e0 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 6e  e header */.  in
258f0 74 20 63 65 6c 6c 4f 66 66 73 65 74 3b 20 20 20  t cellOffset;   
25900 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 66 69  /* Address of fi
25910 72 73 74 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72  rst cell pointer
25920 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20 20   in data[] */.  
25930 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
25940 20 20 2f 2a 20 54 68 65 20 63 6f 6e 74 65 6e 74    /* The content
25950 20 6f 66 20 74 68 65 20 77 68 6f 6c 65 20 70 61   of the whole pa
25960 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b  ge */.  u8 *ptr;
25970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
25980 64 20 66 6f 72 20 6d 6f 76 69 6e 67 20 69 6e 66  d for moving inf
25990 6f 72 6d 61 74 69 6f 6e 20 61 72 6f 75 6e 64 20  ormation around 
259a0 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 0a 20 20  in data[] */..  
259b0 61 73 73 65 72 74 28 20 69 3e 3d 30 20 26 26 20  assert( i>=0 && 
259c0 69 3c 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2b  i<=pPage->nCell+
259d0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
259e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
259f0 61 67 65 2d 3e 6e 43 65 6c 6c 3c 3d 4d 58 5f 43  age->nCell<=MX_C
25a00 45 4c 4c 28 70 50 61 67 65 2d 3e 70 42 74 29 20  ELL(pPage->pBt) 
25a10 26 26 20 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65  && MX_CELL(pPage
25a20 2d 3e 70 42 74 29 3c 3d 35 34 36 30 20 29 3b 0a  ->pBt)<=5460 );.
25a30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
25a40 3e 6e 4f 76 65 72 66 6c 6f 77 3c 3d 41 72 72 61  >nOverflow<=Arra
25a50 79 53 69 7a 65 28 70 50 61 67 65 2d 3e 61 4f 76  ySize(pPage->aOv
25a60 66 6c 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  fl) );.  assert(
25a70 20 73 7a 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72   sz==cellSizePtr
25a80 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 20 29  (pPage, pCell) )
25a90 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
25aa0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
25ab0 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78  Page->pBt->mutex
25ac0 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ) );.  if( pPage
25ad0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 7c 7c 20 73  ->nOverflow || s
25ae0 7a 2b 32 3e 70 50 61 67 65 2d 3e 6e 46 72 65 65  z+2>pPage->nFree
25af0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 54 65 6d   ){.    if( pTem
25b00 70 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70  p ){.      memcp
25b10 79 28 70 54 65 6d 70 2b 6e 53 6b 69 70 2c 20 70  y(pTemp+nSkip, p
25b20 43 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e  Cell+nSkip, sz-n
25b30 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 70 43 65  Skip);.      pCe
25b40 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20  ll = pTemp;.    
25b50 7d 0a 20 20 20 20 6a 20 3d 20 70 50 61 67 65 2d  }.    j = pPage-
25b60 3e 6e 4f 76 65 72 66 6c 6f 77 2b 2b 3b 0a 20 20  >nOverflow++;.  
25b70 20 20 61 73 73 65 72 74 28 20 6a 3c 28 69 6e 74    assert( j<(int
25b80 29 28 73 69 7a 65 6f 66 28 70 50 61 67 65 2d 3e  )(sizeof(pPage->
25b90 61 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70 50  aOvfl)/sizeof(pP
25ba0 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 29 20  age->aOvfl[0])) 
25bb0 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f  );.    pPage->aO
25bc0 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70  vfl[j].pCell = p
25bd0 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d  Cell;.    pPage-
25be0 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20  >aOvfl[j].idx = 
25bf0 28 75 31 36 29 69 3b 0a 20 20 20 20 70 50 61 67  (u16)i;.    pPag
25c00 65 2d 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20  e->nFree = 0;.  
25c10 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72  }else{.    int r
25c20 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
25c30 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
25c40 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
25c50 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
25c60 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
25c70 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
25c80 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
25c90 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
25ca0 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
25cb0 20 20 64 61 74 61 20 3d 20 70 50 61 67 65 2d 3e    data = pPage->
25cc0 61 44 61 74 61 3b 0a 20 20 20 20 68 64 72 20 3d  aData;.    hdr =
25cd0 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
25ce0 74 3b 0a 20 20 20 20 74 6f 70 20 3d 20 67 65 74  t;.    top = get
25cf0 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
25d00 35 5d 29 3b 0a 20 20 20 20 63 65 6c 6c 4f 66 66  5]);.    cellOff
25d10 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63 65 6c  set = pPage->cel
25d20 6c 4f 66 66 73 65 74 3b 0a 20 20 20 20 65 6e 64  lOffset;.    end
25d30 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20   = cellOffset + 
25d40 32 2a 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 2b  2*pPage->nCell +
25d50 20 32 3b 0a 20 20 20 20 69 6e 73 20 3d 20 63 65   2;.    ins = ce
25d60 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 69 3b 0a  llOffset + 2*i;.
25d70 20 20 20 20 69 66 28 20 65 6e 64 20 3e 20 74 6f      if( end > to
25d80 70 20 2d 20 73 7a 20 29 7b 0a 20 20 20 20 20 20  p - sz ){.      
25d90 72 63 20 3d 20 64 65 66 72 61 67 6d 65 6e 74 50  rc = defragmentP
25da0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
25db0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
25dc0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
25dd0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
25de0 7d 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 67 65  }.      top = ge
25df0 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
25e00 2b 35 5d 29 3b 0a 20 20 20 20 20 20 61 73 73 65  +5]);.      asse
25e10 72 74 28 20 65 6e 64 20 2b 20 73 7a 20 3c 3d 20  rt( end + sz <= 
25e20 74 6f 70 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  top );.    }.   
25e30 20 69 64 78 20 3d 20 61 6c 6c 6f 63 61 74 65 53   idx = allocateS
25e40 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a 29 3b  pace(pPage, sz);
25e50 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
25e60 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
25e70 28 20 65 6e 64 20 3c 3d 20 67 65 74 32 62 79 74  ( end <= get2byt
25e80 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
25e90 29 3b 0a 20 20 20 20 69 66 20 28 69 64 78 2b 73  );.    if (idx+s
25ea0 7a 20 3e 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e  z > pPage->pBt->
25eb0 75 73 61 62 6c 65 53 69 7a 65 29 20 7b 0a 20 20  usableSize) {.  
25ec0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
25ed0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
25ee0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 2d      }.    pPage-
25ef0 3e 6e 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50  >nCell++;.    pP
25f00 61 67 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 3b  age->nFree -= 2;
25f10 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74  .    memcpy(&dat
25f20 61 5b 69 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43  a[idx+nSkip], pC
25f30 65 6c 6c 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53  ell+nSkip, sz-nS
25f40 6b 69 70 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  kip);.    for(j=
25f50 65 6e 64 2d 32 2c 20 70 74 72 3d 26 64 61 74 61  end-2, ptr=&data
25f60 5b 6a 5d 3b 20 6a 3e 69 6e 73 3b 20 6a 2d 3d 32  [j]; j>ins; j-=2
25f70 2c 20 70 74 72 2d 3d 32 29 7b 0a 20 20 20 20 20  , ptr-=2){.     
25f80 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 2d 32   ptr[0] = ptr[-2
25f90 5d 3b 0a 20 20 20 20 20 20 70 74 72 5b 31 5d 20  ];.      ptr[1] 
25fa0 3d 20 70 74 72 5b 2d 31 5d 3b 0a 20 20 20 20 7d  = ptr[-1];.    }
25fb0 0a 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64  .    put2byte(&d
25fc0 61 74 61 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a  ata[ins], idx);.
25fd0 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61      put2byte(&da
25fe0 74 61 5b 68 64 72 2b 33 5d 2c 20 70 50 61 67 65  ta[hdr+3], pPage
25ff0 2d 3e 6e 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65  ->nCell);.#ifnde
26000 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
26010 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
26020 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74   pPage->pBt->aut
26030 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20  oVacuum ){.     
26040 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 6d 61 79   /* The cell may
26050 20 63 6f 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74   contain a point
26060 65 72 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f  er to an overflo
26070 77 20 70 61 67 65 2e 20 49 66 20 73 6f 2c 20 77  w page. If so, w
26080 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 74 68  rite.      ** th
26090 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20  e entry for the 
260a0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 69 6e  overflow page in
260b0 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d  to the pointer m
260c0 61 70 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ap..      */.   
260d0 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f     CellInfo info
260e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  ;.      sqlite3B
260f0 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72  treeParseCellPtr
26100 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26  (pPage, pCell, &
26110 69 6e 66 6f 29 3b 0a 20 20 20 20 20 20 61 73 73  info);.      ass
26120 65 72 74 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61  ert( (info.nData
26130 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f  +(pPage->intKey?
26140 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69  0:info.nKey))==i
26150 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a  nfo.nPayload );.
26160 20 20 20 20 20 20 69 66 28 20 28 69 6e 66 6f 2e        if( (info.
26170 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e  nData+(pPage->in
26180 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79  tKey?0:info.nKey
26190 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29  ))>info.nLocal )
261a0 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 70  {.        Pgno p
261b0 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62 79  gnoOvfl = get4by
261c0 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69  te(&pCell[info.i
261d0 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20  Overflow]);.    
261e0 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
261f0 75 74 28 70 50 61 67 65 2d 3e 70 42 74 2c 20 70  ut(pPage->pBt, p
26200 67 6e 6f 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f  gnoOvfl, PTRMAP_
26210 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50 61 67 65  OVERFLOW1, pPage
26220 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
26230 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
26240 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
26250 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
26260 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ndif.  }..  retu
26270 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
26280 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 69 73  ./*.** Add a lis
26290 74 20 6f 66 20 63 65 6c 6c 73 20 74 6f 20 61 20  t of cells to a 
262a0 70 61 67 65 2e 20 20 54 68 65 20 70 61 67 65 20  page.  The page 
262b0 73 68 6f 75 6c 64 20 62 65 20 69 6e 69 74 69 61  should be initia
262c0 6c 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 20 54 68  lly empty..** Th
262d0 65 20 63 65 6c 6c 73 20 61 72 65 20 67 75 61 72  e cells are guar
262e0 61 6e 74 65 65 64 20 74 6f 20 66 69 74 20 6f 6e  anteed to fit on
262f0 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74   the page..*/.st
26300 61 74 69 63 20 76 6f 69 64 20 61 73 73 65 6d 62  atic void assemb
26310 6c 65 50 61 67 65 28 0a 20 20 4d 65 6d 50 61 67  lePage(.  MemPag
26320 65 20 2a 70 50 61 67 65 2c 20 20 20 2f 2a 20 54  e *pPage,   /* T
26330 68 65 20 70 61 67 65 20 74 6f 20 62 65 20 61 73  he page to be as
26340 73 65 6d 62 6c 69 65 64 20 2a 2f 0a 20 20 69 6e  semblied */.  in
26350 74 20 6e 43 65 6c 6c 2c 20 20 20 20 20 20 20 20  t nCell,        
26360 2f 2a 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66  /* The number of
26370 20 63 65 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f   cells to add to
26380 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20   this page */.  
26390 75 38 20 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20  u8 **apCell,    
263a0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f    /* Pointers to
263b0 20 63 65 6c 6c 20 62 6f 64 69 65 73 20 2a 2f 0a   cell bodies */.
263c0 20 20 75 31 36 20 2a 61 53 69 7a 65 20 20 20 20    u16 *aSize    
263d0 20 20 20 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20      /* Sizes of 
263e0 74 68 65 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a  the cells */.){.
263f0 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
26400 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
26410 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 74  ter */.  int tot
26420 61 6c 53 69 7a 65 3b 20 20 20 20 2f 2a 20 54 6f  alSize;    /* To
26430 74 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20  tal size of all 
26440 63 65 6c 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 68  cells */.  int h
26450 64 72 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  dr;          /* 
26460 49 6e 64 65 78 20 6f 66 20 70 61 67 65 20 68 65  Index of page he
26470 61 64 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65  ader */.  int ce
26480 6c 6c 70 74 72 3b 20 20 20 20 20 20 2f 2a 20 41  llptr;      /* A
26490 64 64 72 65 73 73 20 6f 66 20 6e 65 78 74 20 63  ddress of next c
264a0 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20  ell pointer */. 
264b0 20 69 6e 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20   int cellbody;  
264c0 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
264d0 20 6e 65 78 74 20 63 65 6c 6c 20 62 6f 64 79 20   next cell body 
264e0 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20  */.  u8 *data;  
264f0 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20 66         /* Data f
26500 6f 72 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 0a  or the page */..
26510 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
26520 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b  >nOverflow==0 );
26530 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
26540 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
26550 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
26560 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 43   );.  assert( nC
26570 65 6c 6c 3e 3d 30 20 26 26 20 6e 43 65 6c 6c 3c  ell>=0 && nCell<
26580 3d 4d 58 5f 43 45 4c 4c 28 70 50 61 67 65 2d 3e  =MX_CELL(pPage->
26590 70 42 74 29 20 26 26 20 4d 58 5f 43 45 4c 4c 28  pBt) && MX_CELL(
265a0 70 50 61 67 65 2d 3e 70 42 74 29 3c 3d 35 34 36  pPage->pBt)<=546
265b0 30 20 29 3b 0a 20 20 74 6f 74 61 6c 53 69 7a 65  0 );.  totalSize
265c0 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
265d0 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a   i<nCell; i++){.
265e0 20 20 20 20 74 6f 74 61 6c 53 69 7a 65 20 2b 3d      totalSize +=
265f0 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 7d 0a 20   aSize[i];.  }. 
26600 20 61 73 73 65 72 74 28 20 74 6f 74 61 6c 53 69   assert( totalSi
26610 7a 65 2b 32 2a 6e 43 65 6c 6c 3c 3d 70 50 61 67  ze+2*nCell<=pPag
26620 65 2d 3e 6e 46 72 65 65 20 29 3b 0a 20 20 61 73  e->nFree );.  as
26630 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
26640 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ll==0 );.  asser
26650 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
26660 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
26670 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
26680 63 65 6c 6c 70 74 72 20 3d 20 70 50 61 67 65 2d  cellptr = pPage-
26690 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 64  >cellOffset;.  d
266a0 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
266b0 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  ta;.  hdr = pPag
266c0 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
266d0 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
266e0 64 72 2b 33 5d 2c 20 6e 43 65 6c 6c 29 3b 0a 20  dr+3], nCell);. 
266f0 20 69 66 28 20 6e 43 65 6c 6c 20 29 7b 0a 20 20   if( nCell ){.  
26700 20 20 63 65 6c 6c 62 6f 64 79 20 3d 20 61 6c 6c    cellbody = all
26710 6f 63 61 74 65 53 70 61 63 65 28 70 50 61 67 65  ocateSpace(pPage
26720 2c 20 74 6f 74 61 6c 53 69 7a 65 29 3b 0a 20 20  , totalSize);.  
26730 20 20 61 73 73 65 72 74 28 20 63 65 6c 6c 62 6f    assert( cellbo
26740 64 79 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65  dy>0 );.    asse
26750 72 74 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65  rt( pPage->nFree
26760 20 3e 3d 20 32 2a 6e 43 65 6c 6c 20 29 3b 0a 20   >= 2*nCell );. 
26770 20 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20     pPage->nFree 
26780 2d 3d 20 32 2a 6e 43 65 6c 6c 3b 0a 20 20 20 20  -= 2*nCell;.    
26790 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c  for(i=0; i<nCell
267a0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 75  ; i++){.      pu
267b0 74 32 62 79 74 65 28 26 64 61 74 61 5b 63 65 6c  t2byte(&data[cel
267c0 6c 70 74 72 5d 2c 20 63 65 6c 6c 62 6f 64 79 29  lptr], cellbody)
267d0 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26  ;.      memcpy(&
267e0 64 61 74 61 5b 63 65 6c 6c 62 6f 64 79 5d 2c 20  data[cellbody], 
267f0 61 70 43 65 6c 6c 5b 69 5d 2c 20 61 53 69 7a 65  apCell[i], aSize
26800 5b 69 5d 29 3b 0a 20 20 20 20 20 20 63 65 6c 6c  [i]);.      cell
26810 70 74 72 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20  ptr += 2;.      
26820 63 65 6c 6c 62 6f 64 79 20 2b 3d 20 61 53 69 7a  cellbody += aSiz
26830 65 5b 69 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e[i];.    }.    
26840 61 73 73 65 72 74 28 20 63 65 6c 6c 62 6f 64 79  assert( cellbody
26850 3d 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  ==pPage->pBt->us
26860 61 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 7d 0a  ableSize );.  }.
26870 20 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 3d    pPage->nCell =
26880 20 28 75 31 36 29 6e 43 65 6c 6c 3b 0a 7d 0a 0a   (u16)nCell;.}..
26890 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
268a0 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73 20 64  ing parameters d
268b0 65 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d 61 6e  etermine how man
268c0 79 20 61 64 6a 61 63 65 6e 74 20 70 61 67 65 73  y adjacent pages
268d0 20 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a 2a 2a   get involved.**
268e0 20 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e 67 20   in a balancing 
268f0 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e 20 69  operation.  NN i
26900 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
26910 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74  neighbors on eit
26920 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66 20 74  her side.** of t
26930 68 65 20 70 61 67 65 20 74 68 61 74 20 70 61 72  he page that par
26940 74 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20  ticipate in the 
26950 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72 61 74  balancing operat
26960 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68 65 0a  ion.  NB is the.
26970 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  ** total number 
26980 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 70 61  of pages that pa
26990 72 74 69 63 69 70 61 74 65 2c 20 69 6e 63 6c 75  rticipate, inclu
269a0 64 69 6e 67 20 74 68 65 20 74 61 72 67 65 74 20  ding the target 
269b0 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e 20 6e  page and.** NN n
269c0 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68  eighbors on eith
269d0 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a 20 54  er side..**.** T
269e0 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c 75 65  he minimum value
269f0 20 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f 66 20   of NN is 1 (of 
26a00 63 6f 75 72 73 65 29 2e 20 20 49 6e 63 72 65 61  course).  Increa
26a10 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20 31 0a  sing NN above 1.
26a20 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33 29 20 67  ** (to 2 or 3) g
26a30 69 76 65 73 20 61 20 6d 6f 64 65 73 74 20 69 6d  ives a modest im
26a40 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53 45 4c  provement in SEL
26a50 45 43 54 20 61 6e 64 20 44 45 4c 45 54 45 20 70  ECT and DELETE p
26a60 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20 69 6e  erformance.** in
26a70 20 65 78 63 68 61 6e 67 65 20 66 6f 72 20 61 20   exchange for a 
26a80 6c 61 72 67 65 72 20 64 65 67 72 61 64 61 74 69  larger degradati
26a90 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20 61 6e 64  on in INSERT and
26aa0 20 55 50 44 41 54 45 20 70 65 72 66 6f 72 6d 61   UPDATE performa
26ab0 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75  nce..** The valu
26ac0 65 20 6f 66 20 4e 4e 20 61 70 70 65 61 72 73 20  e of NN appears 
26ad0 74 6f 20 67 69 76 65 20 74 68 65 20 62 65 73 74  to give the best
26ae0 20 72 65 73 75 6c 74 73 20 6f 76 65 72 61 6c 6c   results overall
26af0 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 4e 20  ..*/.#define NN 
26b00 31 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  1             /*
26b10 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69 67 68   Number of neigh
26b20 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72 20 73  bors on either s
26b30 69 64 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a  ide of pPage */.
26b40 23 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e 2a 32  #define NB (NN*2
26b50 2b 31 29 20 20 20 20 20 20 2f 2a 20 54 6f 74 61  +1)      /* Tota
26b60 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c 76 65 64  l pages involved
26b70 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63 65 20   in the balance 
26b80 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20 72  */../* Forward r
26b90 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74 61 74  eference */.stat
26ba0 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 28 42  ic int balance(B
26bb0 74 43 75 72 73 6f 72 2a 2c 20 69 6e 74 29 3b 0a  tCursor*, int);.
26bc0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
26bd0 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43  OMIT_QUICKBALANC
26be0 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76 65 72  E./*.** This ver
26bf0 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63 65 28  sion of balance(
26c00 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20 63 6f  ) handles the co
26c10 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63 61 73  mmon special cas
26c20 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e 65 77  e where.** a new
26c30 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e 67 20   entry is being 
26c40 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68 65 20  inserted on the 
26c50 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d 65 6e  extreme right-en
26c60 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72 65 65  d of the.** tree
26c70 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  , in other words
26c80 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77 20 65  , when the new e
26c90 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f 6d 65  ntry will become
26ca0 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a 2a 20   the largest.** 
26cb0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74 72 65  entry in the tre
26cc0 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65 61 64  e..**.** Instead
26cd0 20 6f 66 20 74 72 79 69 6e 67 20 62 61 6c 61 6e   of trying balan
26ce0 63 65 20 74 68 65 20 33 20 72 69 67 68 74 2d 6d  ce the 3 right-m
26cf0 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73 2c 20  ost leaf pages, 
26d00 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20 6e 65  just add.** a ne
26d10 77 20 70 61 67 65 20 74 6f 20 74 68 65 20 72 69  w page to the ri
26d20 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 61 6e  ght-hand side an
26d30 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20 6e 65  d put the one ne
26d40 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20 74 68  w entry in.** th
26d50 61 74 20 70 61 67 65 2e 20 20 54 68 69 73 20 6c  at page.  This l
26d60 65 61 76 65 73 20 74 68 65 20 72 69 67 68 74 20  eaves the right 
26d70 73 69 64 65 20 6f 66 20 74 68 65 20 74 72 65 65  side of the tree
26d80 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75 6e 62   somewhat.** unb
26d90 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20 6f 64  alanced.  But od
26da0 64 73 20 61 72 65 20 74 68 61 74 20 77 65 20 77  ds are that we w
26db0 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69 6e 67  ill be inserting
26dc0 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a 2a 20   new entries.** 
26dd0 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f 6e 20  at the end soon 
26de0 61 66 74 65 72 77 61 72 64 73 20 73 6f 20 74 68  afterwards so th
26df0 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79 20 70  e nearly empty p
26e00 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b 6c 79  age will quickly
26e10 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20 4f 6e  .** fill up.  On
26e20 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a 2a 20   average..**.** 
26e30 70 50 61 67 65 20 69 73 20 74 68 65 20 6c 65 61  pPage is the lea
26e40 66 20 70 61 67 65 20 77 68 69 63 68 20 69 73 20  f page which is 
26e50 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 70  the right-most p
26e60 61 67 65 20 69 6e 20 74 68 65 20 74 72 65 65 2e  age in the tree.
26e70 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73 20 69  .** pParent is i
26e80 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50 61 67  ts parent.  pPag
26e90 65 20 6d 75 73 74 20 68 61 76 65 20 61 20 73 69  e must have a si
26ea0 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20 65 6e  ngle overflow en
26eb0 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69 73 20  try.** which is 
26ec0 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74 2d 6d  also the right-m
26ed0 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74 68 65  ost entry on the
26ee0 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   page..*/.static
26ef0 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71 75 69   int balance_qui
26f00 63 6b 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ck(BtCursor *pCu
26f10 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
26f20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20 3d 20  MemPage *pNew = 
26f30 30 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 4e 65  0;.  Pgno pgnoNe
26f40 77 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a  w;.  u8 *pCell;.
26f50 20 20 75 31 36 20 73 7a 43 65 6c 6c 3b 0a 20 20    u16 szCell;.  
26f60 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
26f70 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20   MemPage *pPage 
26f80 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
26f90 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 4d  Cur->iPage];.  M
26fa0 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 20  emPage *pParent 
26fb0 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
26fc0 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a 20  Cur->iPage-1];. 
26fd0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
26fe0 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69   pPage->pBt;.  i
26ff0 6e 74 20 70 61 72 65 6e 74 49 64 78 20 3d 20 70  nt parentIdx = p
27000 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b 20 20  Parent->nCell;  
27010 20 2f 2a 20 70 50 61 72 65 6e 74 20 6e 65 77 20   /* pParent new 
27020 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 64  divider cell ind
27030 65 78 20 2a 2f 0a 20 20 69 6e 74 20 70 61 72 65  ex */.  int pare
27040 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  ntSize;         
27050 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
27060 65 20 6f 66 20 6e 65 77 20 64 69 76 69 64 65 72  e of new divider
27070 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20 70 61   cell */.  u8 pa
27080 72 65 6e 74 43 65 6c 6c 5b 36 34 5d 3b 20 20 20  rentCell[64];   
27090 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
270a0 53 70 61 63 65 20 66 6f 72 20 74 68 65 20 6e 65  Space for the ne
270b0 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a  w divider cell *
270c0 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  /..  assert( sql
270d0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
270e0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
270f0 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  x) );..  /* Allo
27100 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 2e  cate a new page.
27110 20 49 6e 73 65 72 74 20 74 68 65 20 6f 76 65 72   Insert the over
27120 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d 20 70  flow cell from p
27130 50 61 67 65 0a 20 20 2a 2a 20 69 6e 74 6f 20 69  Page.  ** into i
27140 74 2e 20 54 68 65 6e 20 72 65 6d 6f 76 65 20 74  t. Then remove t
27150 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65 6c 6c  he overflow cell
27160 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 20 20 2a   from pPage..  *
27170 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74  /.  rc = allocat
27180 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
27190 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77 2c  &pNew, &pgnoNew,
271a0 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63   0, 0);.  if( rc
271b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
271c0 20 20 20 70 43 65 6c 6c 20 3d 20 70 50 61 67 65     pCell = pPage
271d0 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65 6c 6c  ->aOvfl[0].pCell
271e0 3b 0a 20 20 20 20 73 7a 43 65 6c 6c 20 3d 20 63  ;.    szCell = c
271f0 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
27200 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 61 73  , pCell);.    as
27210 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
27220 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 4e  erIswriteable(pN
27230 65 77 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a  ew->pDbPage) );.
27240 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65      zeroPage(pNe
27250 77 2c 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  w, pPage->aData[
27260 30 5d 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c  0]);.    assembl
27270 65 50 61 67 65 28 70 4e 65 77 2c 20 31 2c 20 26  ePage(pNew, 1, &
27280 70 43 65 6c 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b  pCell, &szCell);
27290 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65  .    pPage->nOve
272a0 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 0a 20 20  rflow = 0;.  .  
272b0 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 63 75    /* pPage is cu
272c0 72 72 65 6e 74 6c 79 20 74 68 65 20 72 69 67 68  rrently the righ
272d0 74 2d 63 68 69 6c 64 20 6f 66 20 70 50 61 72 65  t-child of pPare
272e0 6e 74 2e 20 43 68 61 6e 67 65 20 74 68 69 73 0a  nt. Change this.
272f0 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74 20 74      ** so that t
27300 68 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 69  he right-child i
27310 73 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 61  s the new page a
27320 6c 6c 6f 63 61 74 65 64 20 61 62 6f 76 65 20 61  llocated above a
27330 6e 64 0a 20 20 20 20 2a 2a 20 70 50 61 67 65 20  nd.    ** pPage 
27340 69 73 20 74 68 65 20 6e 65 78 74 2d 74 6f 2d 72  is the next-to-r
27350 69 67 68 74 20 63 68 69 6c 64 2e 20 0a 20 20 20  ight child. .   
27360 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 67 6e 6f 72   **.    ** Ignor
27370 65 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  e the return val
27380 75 65 20 6f 66 20 74 68 65 20 63 61 6c 6c 20 74  ue of the call t
27390 6f 20 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 2e 20  o fillInCell(). 
273a0 66 69 6c 6c 49 6e 43 65 6c 6c 28 29 0a 20 20 20  fillInCell().   
273b0 20 2a 2a 20 6d 61 79 20 6f 6e 6c 79 20 72 65 74   ** may only ret
273c0 75 72 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 53  urn other than S
273d0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 69 74 20 69  QLITE_OK if it i
273e0 73 20 72 65 71 75 69 72 65 64 20 74 6f 20 61 6c  s required to al
273f0 6c 6f 63 61 74 65 0a 20 20 20 20 2a 2a 20 6f 6e  locate.    ** on
27400 65 20 6f 72 20 6d 6f 72 65 20 6f 76 65 72 66 6c  e or more overfl
27410 6f 77 20 70 61 67 65 73 2e 20 53 69 6e 63 65 20  ow pages. Since 
27420 61 6e 20 69 6e 74 65 72 6e 61 6c 20 74 61 62 6c  an internal tabl
27430 65 20 42 2d 54 72 65 65 20 63 65 6c 6c 20 0a 20  e B-Tree cell . 
27440 20 20 20 2a 2a 20 6d 61 79 20 6e 65 76 65 72 20     ** may never 
27450 73 70 69 6c 6c 20 6f 76 65 72 20 6f 6e 74 6f 20  spill over onto 
27460 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
27470 20 28 69 74 20 69 73 20 61 20 6d 61 78 69 6d 75   (it is a maximu
27480 6d 20 6f 66 20 0a 20 20 20 20 2a 2a 20 31 33 20  m of .    ** 13 
27490 62 79 74 65 73 20 69 6e 20 73 69 7a 65 29 2c 20  bytes in size), 
274a0 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 63 65 73  it is not necces
274b0 73 61 72 79 20 74 6f 20 63 68 65 63 6b 20 74 68  sary to check th
274c0 65 20 72 65 74 75 72 6e 20 63 6f 64 65 2e 0a 20  e return code.. 
274d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 69 6d     **.    ** Sim
274e0 69 6c 61 72 6c 79 2c 20 74 68 65 20 69 6e 73 65  ilarly, the inse
274f0 72 74 43 65 6c 6c 28 29 20 66 75 6e 63 74 69 6f  rtCell() functio
27500 6e 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69 66  n cannot fail if
27510 20 74 68 65 20 70 61 67 65 0a 20 20 20 20 2a 2a   the page.    **
27520 20 62 65 69 6e 67 20 69 6e 73 65 72 74 65 64 20   being inserted 
27530 69 6e 74 6f 20 69 73 20 61 6c 72 65 61 64 79 20  into is already 
27540 77 72 69 74 61 62 6c 65 20 61 6e 64 20 74 68 65  writable and the
27550 20 63 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 0a   cell does not .
27560 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 61      ** contain a
27570 6e 20 6f 76 65 72 66 6c 6f 77 20 70 6f 69 6e 74  n overflow point
27580 65 72 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74 68  er. So ignore th
27590 69 73 20 72 65 74 75 72 6e 20 63 6f 64 65 20 74  is return code t
275a0 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  oo..    */.    a
275b0 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43  ssert( pPage->nC
275c0 65 6c 6c 3e 30 20 29 3b 0a 20 20 20 20 70 43 65  ell>0 );.    pCe
275d0 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50  ll = findCell(pP
275e0 61 67 65 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c  age, pPage->nCel
275f0 6c 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  l-1);.    sqlite
27600 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50  3BtreeParseCellP
27610 74 72 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 2c  tr(pPage, pCell,
27620 20 26 69 6e 66 6f 29 3b 0a 20 20 20 20 66 69 6c   &info);.    fil
27630 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  lInCell(pParent,
27640 20 70 61 72 65 6e 74 43 65 6c 6c 2c 20 30 2c 20   parentCell, 0, 
27650 69 6e 66 6f 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c  info.nKey, 0, 0,
27660 20 30 2c 20 26 70 61 72 65 6e 74 53 69 7a 65 29   0, &parentSize)
27670 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61  ;.    assert( pa
27680 72 65 6e 74 53 69 7a 65 3c 36 34 20 29 3b 0a 20  rentSize<64 );. 
27690 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
276a0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
276b0 6c 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50  le(pParent->pDbP
276c0 61 67 65 29 20 29 3b 0a 20 20 20 20 69 6e 73 65  age) );.    inse
276d0 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20  rtCell(pParent, 
276e0 70 61 72 65 6e 74 49 64 78 2c 20 70 61 72 65 6e  parentIdx, paren
276f0 74 43 65 6c 6c 2c 20 70 61 72 65 6e 74 53 69 7a  tCell, parentSiz
27700 65 2c 20 30 2c 20 34 29 3b 0a 20 20 20 20 70 75  e, 0, 4);.    pu
27710 74 34 62 79 74 65 28 66 69 6e 64 4f 76 65 72 66  t4byte(findOverf
27720 6c 6f 77 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  lowCell(pParent,
27730 70 61 72 65 6e 74 49 64 78 29 2c 20 70 50 61 67  parentIdx), pPag
27740 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 70 75  e->pgno);.    pu
27750 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
27760 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
27770 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67  hdrOffset+8], pg
27780 6e 6f 4e 65 77 29 3b 0a 20 20 0a 20 20 20 20 2f  noNew);.  .    /
27790 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20  * If this is an 
277a0 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74 61  auto-vacuum data
277b0 62 61 73 65 2c 20 75 70 64 61 74 65 20 74 68 65  base, update the
277c0 20 70 6f 69 6e 74 65 72 20 6d 61 70 0a 20 20 20   pointer map.   
277d0 20 2a 2a 20 77 69 74 68 20 65 6e 74 72 69 65 73   ** with entries
277e0 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70 61 67   for the new pag
277f0 65 2c 20 61 6e 64 20 61 6e 79 20 70 6f 69 6e 74  e, and any point
27800 65 72 20 66 72 6f 6d 20 74 68 65 20 0a 20 20 20  er from the .   
27810 20 2a 2a 20 63 65 6c 6c 20 6f 6e 20 74 68 65 20   ** cell on the 
27820 70 61 67 65 20 74 6f 20 61 6e 20 6f 76 65 72 66  page to an overf
27830 6c 6f 77 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  low page..    */
27840 0a 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56  .    if( ISAUTOV
27850 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 72  ACUUM ){.      r
27860 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
27870 74 2c 20 70 67 6e 6f 4e 65 77 2c 20 50 54 52 4d  t, pgnoNew, PTRM
27880 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e  AP_BTREE, pParen
27890 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  t->pgno);.      
278a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
278b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
278c0 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28  = ptrmapPutOvfl(
278d0 70 4e 65 77 2c 20 30 29 3b 0a 20 20 20 20 20 20  pNew, 0);.      
278e0 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
278f0 52 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65  Release the refe
27900 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77  rence to the new
27910 20 70 61 67 65 2e 20 2a 2f 0a 20 20 20 20 72 65   page. */.    re
27920 6c 65 61 73 65 50 61 67 65 28 70 4e 65 77 29 3b  leasePage(pNew);
27930 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 74 20 74 68  .  }..  /* At th
27940 69 73 20 70 6f 69 6e 74 20 74 68 65 20 70 50 61  is point the pPa
27950 67 65 2d 3e 6e 46 72 65 65 20 76 61 72 69 61 62  ge->nFree variab
27960 6c 65 20 69 73 20 6e 6f 74 20 73 65 74 20 63 6f  le is not set co
27970 72 72 65 63 74 6c 79 20 77 69 74 68 0a 20 20 2a  rrectly with.  *
27980 2a 20 72 65 73 70 65 63 74 20 74 6f 20 74 68 65  * respect to the
27990 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
279a0 70 61 67 65 20 28 62 65 63 61 75 73 65 20 69 74  page (because it
279b0 20 77 61 73 20 73 65 74 20 74 6f 20 30 20 62 79   was set to 0 by
279c0 20 0a 20 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c   .  ** insertCel
279d0 6c 29 2e 20 53 6f 20 63 61 6c 6c 20 73 71 6c 69  l). So call sqli
279e0 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
279f0 28 29 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  () to make sure 
27a00 69 74 20 69 73 0a 20 20 2a 2a 20 63 6f 72 72 65  it is.  ** corre
27a10 63 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ct..  **.  ** Th
27a20 69 73 20 68 61 73 20 74 6f 20 62 65 20 64 6f 6e  is has to be don
27a30 65 20 65 76 65 6e 20 69 66 20 61 6e 20 65 72 72  e even if an err
27a40 6f 72 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  or will be retur
27a50 6e 65 64 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69  ned. Normally, i
27a60 66 0a 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20  f.  ** an error 
27a70 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74 72  occurs during tr
27a80 65 65 20 62 61 6c 61 6e 63 69 6e 67 2c 20 74 68  ee balancing, th
27a90 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 4d 65  e contents of Me
27aa0 6d 50 61 67 65 20 61 72 65 0a 20 20 2a 2a 20 6e  mPage are.  ** n
27ab0 6f 74 20 69 6d 70 6f 72 74 61 6e 74 2c 20 61 73  ot important, as
27ac0 20 74 68 65 79 20 77 69 6c 6c 20 62 65 20 72 65   they will be re
27ad0 63 61 6c 63 75 6c 61 74 65 64 20 77 68 65 6e 20  calculated when 
27ae0 74 68 65 20 70 61 67 65 20 69 73 20 72 6f 6c 6c  the page is roll
27af0 65 64 0a 20 20 2a 2a 20 62 61 63 6b 2e 20 42 75  ed.  ** back. Bu
27b00 74 20 68 65 72 65 2c 20 69 6e 20 62 61 6c 61 6e  t here, in balan
27b10 63 65 5f 71 75 69 63 6b 28 29 2c 20 69 74 20 69  ce_quick(), it i
27b20 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20  s possible that 
27b30 70 50 61 67 65 20 68 61 73 20 0a 20 20 2a 2a 20  pPage has .  ** 
27b40 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6d 61 72  not yet been mar
27b50 6b 65 64 20 64 69 72 74 79 20 6f 72 20 77 72 69  ked dirty or wri
27b60 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
27b70 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 72  urnal file. Ther
27b80 65 66 6f 72 65 0a 20 20 2a 2a 20 69 74 20 77 69  efore.  ** it wi
27b90 6c 6c 20 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64  ll not be rolled
27ba0 20 62 61 63 6b 20 61 6e 64 20 73 6f 20 69 74 20   back and so it 
27bb0 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20  is important to 
27bc0 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 0a 20  make sure that. 
27bd0 20 2a 2a 20 74 68 65 20 70 61 67 65 20 64 61 74   ** the page dat
27be0 61 20 61 6e 64 20 63 6f 6e 74 65 6e 74 73 20 6f  a and contents o
27bf0 66 20 4d 65 6d 50 61 67 65 20 61 72 65 20 63 6f  f MemPage are co
27c00 6e 73 69 73 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20  nsistent..  */. 
27c10 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
27c20 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   0;.  sqlite3Btr
27c30 65 65 49 6e 69 74 50 61 67 65 28 70 50 61 67 65  eeInitPage(pPage
27c40 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
27c50 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30  ge->nOverflow==0
27c60 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 65 76 65   );..  /* If eve
27c70 72 79 74 68 69 6e 67 20 65 6c 73 65 20 73 75 63  rything else suc
27c80 63 65 65 64 65 64 2c 20 62 61 6c 61 6e 63 65 20  ceeded, balance 
27c90 74 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2c  the parent page,
27ca0 20 69 6e 20 0a 20 20 2a 2a 20 63 61 73 65 20 74   in .  ** case t
27cb0 68 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20  he divider cell 
27cc0 69 6e 73 65 72 74 65 64 20 63 61 75 73 65 64 20  inserted caused 
27cd0 69 74 20 74 6f 20 62 65 63 6f 6d 65 20 6f 76 65  it to become ove
27ce0 72 66 75 6c 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66  rfull..  */.  if
27cf0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27d00 29 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61  ){.    releasePa
27d10 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 70  ge(pPage);.    p
27d20 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a 20 20  Cur->iPage--;.  
27d30 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70    rc = balance(p
27d40 43 75 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Cur, 0);.  }.  r
27d50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
27d60 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
27d70 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45 20 2a  T_QUICKBALANCE *
27d80 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  /../*.** This ro
27d90 75 74 69 6e 65 20 72 65 64 69 73 74 72 69 62 75  utine redistribu
27da0 74 65 73 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61  tes Cells on pPa
27db0 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e 4e 2a  ge and up to NN*
27dc0 32 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 6f 66  2 siblings.** of
27dd0 20 70 50 61 67 65 20 73 6f 20 74 68 61 74 20 61   pPage so that a
27de0 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 61 62  ll pages have ab
27df0 6f 75 74 20 74 68 65 20 73 61 6d 65 20 61 6d 6f  out the same amo
27e00 75 6e 74 20 6f 66 20 66 72 65 65 20 73 70 61 63  unt of free spac
27e10 65 2e 0a 2a 2a 20 55 73 75 61 6c 6c 79 20 4e 4e  e..** Usually NN
27e20 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74   siblings on eit
27e30 68 65 72 20 73 69 64 65 20 6f 66 20 70 50 61 67  her side of pPag
27e40 65 20 69 73 20 75 73 65 64 20 69 6e 20 74 68 65  e is used in the
27e50 20 62 61 6c 61 6e 63 69 6e 67 2c 0a 2a 2a 20 74   balancing,.** t
27e60 68 6f 75 67 68 20 6d 6f 72 65 20 73 69 62 6c 69  hough more sibli
27e70 6e 67 73 20 6d 69 67 68 74 20 63 6f 6d 65 20 66  ngs might come f
27e80 72 6f 6d 20 6f 6e 65 20 73 69 64 65 20 69 66 20  rom one side if 
27e90 70 50 61 67 65 20 69 73 20 74 68 65 20 66 69 72  pPage is the fir
27ea0 73 74 0a 2a 2a 20 6f 72 20 6c 61 73 74 20 63 68  st.** or last ch
27eb0 69 6c 64 20 6f 66 20 69 74 73 20 70 61 72 65 6e  ild of its paren
27ec0 74 2e 20 20 49 66 20 70 50 61 67 65 20 68 61 73  t.  If pPage has
27ed0 20 66 65 77 65 72 20 74 68 61 6e 20 32 2a 4e 4e   fewer than 2*NN
27ee0 20 73 69 62 6c 69 6e 67 73 0a 2a 2a 20 28 73 6f   siblings.** (so
27ef0 6d 65 74 68 69 6e 67 20 77 68 69 63 68 20 63 61  mething which ca
27f00 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 66  n only happen if
27f10 20 70 50 61 67 65 20 69 73 20 74 68 65 20 72 6f   pPage is the ro
27f20 6f 74 20 70 61 67 65 20 6f 72 20 61 20 0a 2a 2a  ot page or a .**
27f30 20 63 68 69 6c 64 20 6f 66 20 72 6f 6f 74 29 20   child of root) 
27f40 74 68 65 6e 20 61 6c 6c 20 61 76 61 69 6c 61 62  then all availab
27f50 6c 65 20 73 69 62 6c 69 6e 67 73 20 70 61 72 74  le siblings part
27f60 69 63 69 70 61 74 65 20 69 6e 20 74 68 65 20 62  icipate in the b
27f70 61 6c 61 6e 63 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  alancing..**.** 
27f80 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69  The number of si
27f90 62 6c 69 6e 67 73 20 6f 66 20 70 50 61 67 65 20  blings of pPage 
27fa0 6d 69 67 68 74 20 62 65 20 69 6e 63 72 65 61 73  might be increas
27fb0 65 64 20 6f 72 20 64 65 63 72 65 61 73 65 64 20  ed or decreased 
27fc0 62 79 20 6f 6e 65 20 6f 72 0a 2a 2a 20 74 77 6f  by one or.** two
27fd0 20 69 6e 20 61 6e 20 65 66 66 6f 72 74 20 74 6f   in an effort to
27fe0 20 6b 65 65 70 20 70 61 67 65 73 20 6e 65 61 72   keep pages near
27ff0 6c 79 20 66 75 6c 6c 20 62 75 74 20 6e 6f 74 20  ly full but not 
28000 6f 76 65 72 20 66 75 6c 6c 2e 20 54 68 65 20 72  over full. The r
28010 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 73  oot page.** is s
28020 70 65 63 69 61 6c 20 61 6e 64 20 69 73 20 61 6c  pecial and is al
28030 6c 6f 77 65 64 20 74 6f 20 62 65 20 6e 65 61 72  lowed to be near
28040 6c 79 20 65 6d 70 74 79 2e 20 49 66 20 70 50 61  ly empty. If pPa
28050 67 65 20 69 73 20 0a 2a 2a 20 74 68 65 20 72 6f  ge is .** the ro
28060 6f 74 20 70 61 67 65 2c 20 74 68 65 6e 20 74 68  ot page, then th
28070 65 20 64 65 70 74 68 20 6f 66 20 74 68 65 20 74  e depth of the t
28080 72 65 65 20 6d 69 67 68 74 20 62 65 20 69 6e 63  ree might be inc
28090 72 65 61 73 65 64 0a 2a 2a 20 6f 72 20 64 65 63  reased.** or dec
280a0 72 65 61 73 65 64 20 62 79 20 6f 6e 65 2c 20 61  reased by one, a
280b0 73 20 6e 65 63 65 73 73 61 72 79 2c 20 74 6f 20  s necessary, to 
280c0 6b 65 65 70 20 74 68 65 20 72 6f 6f 74 20 70 61  keep the root pa
280d0 67 65 20 66 72 6f 6d 20 62 65 69 6e 67 0a 2a 2a  ge from being.**
280e0 20 6f 76 65 72 66 75 6c 6c 20 6f 72 20 63 6f 6d   overfull or com
280f0 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a 2a  pletely empty..*
28100 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 77  *.** Note that w
28110 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
28120 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 6f 6d 65   is called, some
28130 20 6f 66 20 74 68 65 20 43 65 6c 6c 73 20 6f 6e   of the Cells on
28140 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74 20   pPage.** might 
28150 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20  not actually be 
28160 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65 2d  stored in pPage-
28170 3e 61 44 61 74 61 5b 5d 2e 20 20 54 68 69 73 20  >aData[].  This 
28180 63 61 6e 20 68 61 70 70 65 6e 0a 2a 2a 20 69 66  can happen.** if
28190 20 74 68 65 20 70 61 67 65 20 69 73 20 6f 76 65   the page is ove
281a0 72 66 75 6c 6c 2e 20 20 50 61 72 74 20 6f 66 20  rfull.  Part of 
281b0 74 68 65 20 6a 6f 62 20 6f 66 20 74 68 69 73 20  the job of this 
281c0 72 6f 75 74 69 6e 65 20 69 73 20 74 6f 0a 2a 2a  routine is to.**
281d0 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 43   make sure all C
281e0 65 6c 6c 73 20 66 6f 72 20 70 50 61 67 65 20 6f  ells for pPage o
281f0 6e 63 65 20 61 67 61 69 6e 20 66 69 74 20 69 6e  nce again fit in
28200 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 5d 2e   pPage->aData[].
28210 0a 2a 2a 0a 2a 2a 20 49 6e 20 74 68 65 20 63 6f  .**.** In the co
28220 75 72 73 65 20 6f 66 20 62 61 6c 61 6e 63 69 6e  urse of balancin
28230 67 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 6f  g the siblings o
28240 66 20 70 50 61 67 65 2c 20 74 68 65 20 70 61 72  f pPage, the par
28250 65 6e 74 20 6f 66 20 70 50 61 67 65 0a 2a 2a 20  ent of pPage.** 
28260 6d 69 67 68 74 20 62 65 63 6f 6d 65 20 6f 76 65  might become ove
28270 72 66 75 6c 6c 20 6f 72 20 75 6e 64 65 72 66 75  rfull or underfu
28280 6c 6c 2e 20 20 49 66 20 74 68 61 74 20 68 61 70  ll.  If that hap
28290 70 65 6e 73 2c 20 74 68 65 6e 20 74 68 69 73 20  pens, then this 
282a0 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61  routine.** is ca
282b0 6c 6c 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  lled recursively
282c0 20 6f 6e 20 74 68 65 20 70 61 72 65 6e 74 2e 0a   on the parent..
282d0 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f  **.** If this ro
282e0 75 74 69 6e 65 20 66 61 69 6c 73 20 66 6f 72 20  utine fails for 
282f0 61 6e 79 20 72 65 61 73 6f 6e 2c 20 69 74 20 6d  any reason, it m
28300 69 67 68 74 20 6c 65 61 76 65 20 74 68 65 20 64  ight leave the d
28310 61 74 61 62 61 73 65 0a 2a 2a 20 69 6e 20 61 20  atabase.** in a 
28320 63 6f 72 72 75 70 74 65 64 20 73 74 61 74 65 2e  corrupted state.
28330 20 20 53 6f 20 69 66 20 74 68 69 73 20 72 6f 75    So if this rou
28340 74 69 6e 65 20 66 61 69 6c 73 2c 20 74 68 65 20  tine fails, the 
28350 64 61 74 61 62 61 73 65 20 73 68 6f 75 6c 64 0a  database should.
28360 2a 2a 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ** be rolled bac
28370 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
28380 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74   balance_nonroot
28390 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
283a0 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  {.  MemPage *pPa
283b0 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
283c0 20 2f 2a 20 54 68 65 20 6f 76 65 72 20 6f 72 20   /* The over or 
283d0 75 6e 64 65 72 66 75 6c 6c 20 70 61 67 65 20 74  underfull page t
283e0 6f 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 20 20 4d  o balance */.  M
283f0 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74 3b  emPage *pParent;
28400 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
28410 68 65 20 70 61 72 65 6e 74 20 6f 66 20 70 50 61  he parent of pPa
28420 67 65 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  ge */.  BtShared
28430 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20   *pBt;          
28440 20 20 20 20 20 2f 2a 20 54 68 65 20 77 68 6f 6c       /* The whol
28450 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
28460 69 6e 74 20 6e 43 65 6c 6c 20 3d 20 30 3b 20 20  int nCell = 0;  
28470 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28480 4e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20  Number of cells 
28490 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20  in apCell[] */. 
284a0 20 69 6e 74 20 6e 4d 61 78 43 65 6c 6c 73 20 3d   int nMaxCells =
284b0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
284c0 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65 20   Allocated size 
284d0 6f 66 20 61 70 43 65 6c 6c 2c 20 73 7a 43 65 6c  of apCell, szCel
284e0 6c 2c 20 61 46 72 6f 6d 2e 20 2a 2f 0a 20 20 69  l, aFrom. */.  i
284f0 6e 74 20 6e 4f 6c 64 20 3d 20 30 3b 20 20 20 20  nt nOld = 0;    
28500 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
28510 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
28520 6e 20 61 70 4f 6c 64 5b 5d 20 2a 2f 0a 20 20 69  n apOld[] */.  i
28530 6e 74 20 6e 4e 65 77 20 3d 20 30 3b 20 20 20 20  nt nNew = 0;    
28540 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
28550 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
28560 6e 20 61 70 4e 65 77 5b 5d 20 2a 2f 0a 20 20 69  n apNew[] */.  i
28570 6e 74 20 6e 44 69 76 3b 20 20 20 20 20 20 20 20  nt nDiv;        
28580 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
28590 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69  umber of cells i
285a0 6e 20 61 70 44 69 76 5b 5d 20 2a 2f 0a 20 20 69  n apDiv[] */.  i
285b0 6e 74 20 69 2c 20 6a 2c 20 6b 3b 20 20 20 20 20  nt i, j, k;     
285c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
285d0 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
285e0 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20    int idx;      
285f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28600 2a 20 49 6e 64 65 78 20 6f 66 20 70 50 61 67 65  * Index of pPage
28610 20 69 6e 20 70 50 61 72 65 6e 74 2d 3e 61 43 65   in pParent->aCe
28620 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 78  ll[] */.  int nx
28630 44 69 76 3b 20 20 20 20 20 20 20 20 20 20 20 20  Div;            
28640 20 20 20 20 20 20 20 2f 2a 20 4e 65 78 74 20 64         /* Next d
28650 69 76 69 64 65 72 20 73 6c 6f 74 20 69 6e 20 70  ivider slot in p
28660 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20  Parent->aCell[] 
28670 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
28680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28690 20 20 2f 2a 20 54 68 65 20 72 65 74 75 72 6e 20    /* The return 
286a0 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6c 65  code */.  int le
286b0 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 20 20 20  afCorrection;   
286c0 20 20 20 20 20 20 20 2f 2a 20 34 20 69 66 20 70         /* 4 if p
286d0 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20  Page is a leaf. 
286e0 20 30 20 69 66 20 6e 6f 74 20 2a 2f 0a 20 20 69   0 if not */.  i
286f0 6e 74 20 6c 65 61 66 44 61 74 61 3b 20 20 20 20  nt leafData;    
28700 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
28710 72 75 65 20 69 66 20 70 50 61 67 65 20 69 73 20  rue if pPage is 
28720 61 20 6c 65 61 66 20 6f 66 20 61 20 4c 45 41 46  a leaf of a LEAF
28730 44 41 54 41 20 74 72 65 65 20 2a 2f 0a 20 20 69  DATA tree */.  i
28740 6e 74 20 75 73 61 62 6c 65 53 70 61 63 65 3b 20  nt usableSpace; 
28750 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
28760 79 74 65 73 20 69 6e 20 70 50 61 67 65 20 62 65  ytes in pPage be
28770 79 6f 6e 64 20 74 68 65 20 68 65 61 64 65 72 20  yond the header 
28780 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 46 6c 61  */.  int pageFla
28790 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  gs;             
287a0 20 20 2f 2a 20 56 61 6c 75 65 20 6f 66 20 70 50    /* Value of pP
287b0 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 2a 2f  age->aData[0] */
287c0 0a 20 20 69 6e 74 20 73 75 62 74 6f 74 61 6c 3b  .  int subtotal;
287d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287e0 2f 2a 20 53 75 62 74 6f 74 61 6c 20 6f 66 20 62  /* Subtotal of b
287f0 79 74 65 73 20 69 6e 20 63 65 6c 6c 73 20 6f 6e  ytes in cells on
28800 20 6f 6e 65 20 70 61 67 65 20 2a 2f 0a 20 20 69   one page */.  i
28810 6e 74 20 69 53 70 61 63 65 31 20 3d 20 30 3b 20  nt iSpace1 = 0; 
28820 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
28830 69 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65  irst unused byte
28840 20 6f 66 20 61 53 70 61 63 65 31 5b 5d 20 2a 2f   of aSpace1[] */
28850 0a 20 20 69 6e 74 20 69 53 70 61 63 65 32 20 3d  .  int iSpace2 =
28860 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
28870 2f 2a 20 46 69 72 73 74 20 75 6e 75 73 65 64 20  /* First unused 
28880 62 79 74 65 20 6f 66 20 61 53 70 61 63 65 32 5b  byte of aSpace2[
28890 5d 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 53 63 72  ] */.  int szScr
288a0 61 74 63 68 3b 20 20 20 20 20 20 20 20 20 20 20  atch;           
288b0 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73      /* Size of s
288c0 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 72 65  cratch memory re
288d0 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 4d 65 6d  quested */.  Mem
288e0 50 61 67 65 20 2a 61 70 4f 6c 64 5b 4e 42 5d 3b  Page *apOld[NB];
288f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 50 61            /* pPa
28900 67 65 20 61 6e 64 20 75 70 20 74 6f 20 74 77 6f  ge and up to two
28910 20 73 69 62 6c 69 6e 67 73 20 2a 2f 0a 20 20 50   siblings */.  P
28920 67 6e 6f 20 70 67 6e 6f 4f 6c 64 5b 4e 42 5d 3b  gno pgnoOld[NB];
28930 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
28940 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72 20  age numbers for 
28950 65 61 63 68 20 70 61 67 65 20 69 6e 20 61 70 4f  each page in apO
28960 6c 64 5b 5d 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ld[] */.  MemPag
28970 65 20 2a 61 70 43 6f 70 79 5b 4e 42 5d 3b 20 20  e *apCopy[NB];  
28980 20 20 20 20 20 20 20 2f 2a 20 50 72 69 76 61 74         /* Privat
28990 65 20 63 6f 70 69 65 73 20 6f 66 20 61 70 4f 6c  e copies of apOl
289a0 64 5b 5d 20 70 61 67 65 73 20 2a 2f 0a 20 20 4d  d[] pages */.  M
289b0 65 6d 50 61 67 65 20 2a 61 70 4e 65 77 5b 4e 42  emPage *apNew[NB
289c0 2b 32 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 70  +2];        /* p
289d0 50 61 67 65 20 61 6e 64 20 75 70 20 74 6f 20 4e  Page and up to N
289e0 42 20 73 69 62 6c 69 6e 67 73 20 61 66 74 65 72  B siblings after
289f0 20 62 61 6c 61 6e 63 69 6e 67 20 2a 2f 0a 20 20   balancing */.  
28a00 50 67 6e 6f 20 70 67 6e 6f 4e 65 77 5b 4e 42 2b  Pgno pgnoNew[NB+
28a10 32 5d 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  2];          /* 
28a20 50 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72  Page numbers for
28a30 20 65 61 63 68 20 70 61 67 65 20 69 6e 20 61 70   each page in ap
28a40 4e 65 77 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61  New[] */.  u8 *a
28a50 70 44 69 76 5b 4e 42 5d 3b 20 20 20 20 20 20 20  pDiv[NB];       
28a60 20 20 20 20 20 20 20 20 2f 2a 20 44 69 76 69 64          /* Divid
28a70 65 72 20 63 65 6c 6c 73 20 69 6e 20 70 50 61 72  er cells in pPar
28a80 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  ent */.  int cnt
28a90 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20  New[NB+2];      
28aa0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69        /* Index i
28ab0 6e 20 61 43 65 6c 6c 5b 5d 20 6f 66 20 63 65 6c  n aCell[] of cel
28ac0 6c 20 61 66 74 65 72 20 69 2d 74 68 20 70 61 67  l after i-th pag
28ad0 65 20 2a 2f 0a 20 20 69 6e 74 20 73 7a 4e 65 77  e */.  int szNew
28ae0 5b 4e 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20  [NB+2];         
28af0 20 20 20 20 2f 2a 20 43 6f 6d 62 69 6e 65 64 20      /* Combined 
28b00 73 69 7a 65 20 6f 66 20 63 65 6c 6c 73 20 70 6c  size of cells pl
28b10 61 63 65 20 6f 6e 20 69 2d 74 68 20 70 61 67 65  ace on i-th page
28b20 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70 43 65 6c   */.  u8 **apCel
28b30 6c 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  l = 0;          
28b40 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c 6c 73 20     /* All cells 
28b50 62 65 67 69 6e 20 62 61 6c 61 6e 63 65 64 20 2a  begin balanced *
28b60 2f 0a 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b  /.  u16 *szCell;
28b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b80 20 2f 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f   /* Local size o
28b90 66 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61  f all cells in a
28ba0 70 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 75 38 20  pCell[] */.  u8 
28bb0 2a 61 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20  *aCopy[NB];     
28bc0 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72      /* Space for
28bd0 20 68 6f 6c 64 69 6e 67 20 64 61 74 61 20 6f 66   holding data of
28be0 20 61 70 43 6f 70 79 5b 5d 20 2a 2f 0a 20 20 75   apCopy[] */.  u
28bf0 38 20 2a 61 53 70 61 63 65 31 3b 20 20 20 20 20  8 *aSpace1;     
28c00 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 66        /* Space f
28c10 6f 72 20 63 6f 70 69 65 73 20 6f 66 20 64 69 76  or copies of div
28c20 69 64 65 72 73 20 63 65 6c 6c 73 20 62 65 66 6f  iders cells befo
28c30 72 65 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 20 20  re balance */.  
28c40 75 38 20 2a 61 53 70 61 63 65 32 20 3d 20 30 3b  u8 *aSpace2 = 0;
28c50 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
28c60 66 6f 72 20 6f 76 65 72 66 6c 6f 77 20 64 69 76  for overflow div
28c70 69 64 65 72 73 20 63 65 6c 6c 73 20 61 66 74 65  iders cells afte
28c80 72 20 62 61 6c 61 6e 63 65 20 2a 2f 0a 20 20 75  r balance */.  u
28c90 38 20 2a 61 46 72 6f 6d 20 3d 20 30 3b 0a 0a 20  8 *aFrom = 0;.. 
28ca0 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61   pPage = pCur->a
28cb0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
28cc0 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  e];.  assert( sq
28cd0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
28ce0 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74  (pPage->pBt->mut
28cf0 65 78 29 20 29 3b 0a 20 20 56 56 41 5f 4f 4e 4c  ex) );.  VVA_ONL
28d00 59 28 20 70 43 75 72 2d 3e 70 61 67 65 73 53 68  Y( pCur->pagesSh
28d10 75 66 66 6c 65 64 20 3d 20 31 20 29 3b 0a 0a 20  uffled = 1 );.. 
28d20 20 2f 2a 20 0a 20 20 2a 2a 20 46 69 6e 64 20 74   /* .  ** Find t
28d30 68 65 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a  he parent page..
28d40 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
28d50 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b 0a  Cur->iPage>0 );.
28d60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
28d70 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 73 73  >isInit );.  ass
28d80 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
28d90 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 50 61  rIswriteable(pPa
28da0 67 65 2d 3e 70 44 62 50 61 67 65 29 20 7c 7c 20  ge->pDbPage) || 
28db0 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77  pPage->nOverflow
28dc0 3d 3d 31 20 29 3b 0a 20 20 70 42 74 20 3d 20 70  ==1 );.  pBt = p
28dd0 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 70 50 61  Page->pBt;.  pPa
28de0 72 65 6e 74 20 3d 20 70 43 75 72 2d 3e 61 70 50  rent = pCur->apP
28df0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d  age[pCur->iPage-
28e00 31 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  1];.  assert( pP
28e10 61 72 65 6e 74 20 29 3b 0a 20 20 69 66 28 20 53  arent );.  if( S
28e20 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
28e30 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
28e40 65 28 70 50 61 72 65 6e 74 2d 3e 70 44 62 50 61  e(pParent->pDbPa
28e50 67 65 29 29 20 29 7b 0a 20 20 20 20 67 6f 74 6f  ge)) ){.    goto
28e60 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
28e70 3b 0a 20 20 7d 0a 0a 20 20 54 52 41 43 45 28 28  ;.  }..  TRACE((
28e80 22 42 41 4c 41 4e 43 45 3a 20 62 65 67 69 6e 20  "BALANCE: begin 
28e90 70 61 67 65 20 25 64 20 63 68 69 6c 64 20 6f 66  page %d child of
28ea0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d 3e 70   %d\n", pPage->p
28eb0 67 6e 6f 2c 20 70 50 61 72 65 6e 74 2d 3e 70 67  gno, pParent->pg
28ec0 6e 6f 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  no));..#ifndef S
28ed0 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49 43 4b  QLITE_OMIT_QUICK
28ee0 42 41 4c 41 4e 43 45 0a 20 20 2f 2a 0a 20 20 2a  BALANCE.  /*.  *
28ef0 2a 20 41 20 73 70 65 63 69 61 6c 20 63 61 73 65  * A special case
28f00 3a 20 20 49 66 20 61 20 6e 65 77 20 65 6e 74 72  :  If a new entr
28f10 79 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  y has just been 
28f20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 61 0a  inserted into a.
28f30 20 20 2a 2a 20 74 61 62 6c 65 20 28 74 68 61 74    ** table (that
28f40 20 69 73 2c 20 61 20 62 74 72 65 65 20 77 69 74   is, a btree wit
28f50 68 20 69 6e 74 65 67 65 72 20 6b 65 79 73 20 61  h integer keys a
28f60 6e 64 20 61 6c 6c 20 64 61 74 61 20 61 74 20 74  nd all data at t
28f70 68 65 20 6c 65 61 76 65 73 29 0a 20 20 2a 2a 20  he leaves).  ** 
28f80 61 6e 64 20 74 68 65 20 6e 65 77 20 65 6e 74 72  and the new entr
28f90 79 20 69 73 20 74 68 65 20 72 69 67 68 74 2d 6d  y is the right-m
28fa0 6f 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ost entry in the
28fb0 20 74 72 65 65 20 28 69 74 20 68 61 73 20 74 68   tree (it has th
28fc0 65 0a 20 20 2a 2a 20 6c 61 72 67 65 73 74 20 6b  e.  ** largest k
28fd0 65 79 29 20 74 68 65 6e 20 75 73 65 20 74 68 65  ey) then use the
28fe0 20 73 70 65 63 69 61 6c 20 62 61 6c 61 6e 63 65   special balance
28ff0 5f 71 75 69 63 6b 28 29 20 72 6f 75 74 69 6e 65  _quick() routine
29000 20 66 6f 72 0a 20 20 2a 2a 20 62 61 6c 61 6e 63   for.  ** balanc
29010 69 6e 67 2e 20 20 62 61 6c 61 6e 63 65 5f 71 75  ing.  balance_qu
29020 69 63 6b 28 29 20 69 73 20 6d 75 63 68 20 66 61  ick() is much fa
29030 73 74 65 72 20 61 6e 64 20 72 65 73 75 6c 74 73  ster and results
29040 20 69 6e 20 61 20 74 69 67 68 74 65 72 0a 20 20   in a tighter.  
29050 2a 2a 20 70 61 63 6b 69 6e 67 20 6f 66 20 64 61  ** packing of da
29060 74 61 20 69 6e 20 74 68 65 20 63 6f 6d 6d 6f 6e  ta in the common
29070 20 63 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   case..  */.  if
29080 28 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 26 26  ( pPage->leaf &&
29090 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  .      pPage->in
290a0 74 4b 65 79 20 26 26 0a 20 20 20 20 20 20 70 50  tKey &&.      pP
290b0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
290c0 31 20 26 26 0a 20 20 20 20 20 20 70 50 61 67 65  1 &&.      pPage
290d0 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 69 64 78 3d 3d  ->aOvfl[0].idx==
290e0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 26 26 0a  pPage->nCell &&.
290f0 20 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70        pParent->p
29100 67 6e 6f 21 3d 31 20 26 26 0a 20 20 20 20 20 20  gno!=1 &&.      
29110 67 65 74 34 62 79 74 65 28 26 70 50 61 72 65 6e  get4byte(&pParen
29120 74 2d 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74  t->aData[pParent
29130 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3d  ->hdrOffset+8])=
29140 3d 70 50 61 67 65 2d 3e 70 67 6e 6f 0a 20 20 29  =pPage->pgno.  )
29150 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
29160 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20  age->intKey );. 
29170 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 4f 44     /*.    ** TOD
29180 4f 3a 20 43 68 65 63 6b 20 74 68 65 20 73 69 62  O: Check the sib
29190 6c 69 6e 67 73 20 74 6f 20 74 68 65 20 6c 65 66  lings to the lef
291a0 74 20 6f 66 20 70 50 61 67 65 2e 20 49 74 20 6d  t of pPage. It m
291b0 61 79 20 62 65 20 74 68 61 74 0a 20 20 20 20 2a  ay be that.    *
291c0 2a 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 66  * they are not f
291d0 75 6c 6c 20 61 6e 64 20 6e 6f 20 6e 65 77 20 70  ull and no new p
291e0 61 67 65 20 69 73 20 72 65 71 75 69 72 65 64 2e  age is required.
291f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75  .    */.    retu
29200 72 6e 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b  rn balance_quick
29210 28 70 43 75 72 29 3b 0a 20 20 7d 0a 23 65 6e 64  (pCur);.  }.#end
29220 69 66 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45  if..  if( SQLITE
29230 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
29240 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
29250 67 65 2d 3e 70 44 62 50 61 67 65 29 29 20 29 7b  ge->pDbPage)) ){
29260 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63  .    goto balanc
29270 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 0a  e_cleanup;.  }..
29280 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74    /*.  ** Find t
29290 68 65 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 70  he cell in the p
292a0 61 72 65 6e 74 20 70 61 67 65 20 77 68 6f 73 65  arent page whose
292b0 20 6c 65 66 74 20 63 68 69 6c 64 20 70 6f 69 6e   left child poin
292c0 74 73 20 62 61 63 6b 0a 20 20 2a 2a 20 74 6f 20  ts back.  ** to 
292d0 70 50 61 67 65 2e 20 20 54 68 65 20 22 69 64 78  pPage.  The "idx
292e0 22 20 76 61 72 69 61 62 6c 65 20 69 73 20 74 68  " variable is th
292f0 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20  e index of that 
29300 63 65 6c 6c 2e 20 20 49 66 20 70 50 61 67 65 0a  cell.  If pPage.
29310 20 20 2a 2a 20 69 73 20 74 68 65 20 72 69 67 68    ** is the righ
29320 74 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66 20 70  tmost child of p
29330 50 61 72 65 6e 74 20 74 68 65 6e 20 73 65 74 20  Parent then set 
29340 69 64 78 20 74 6f 20 70 50 61 72 65 6e 74 2d 3e  idx to pParent->
29350 6e 43 65 6c 6c 20 0a 20 20 2a 2f 0a 20 20 69 64  nCell .  */.  id
29360 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  x = pCur->aiIdx[
29370 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a  pCur->iPage-1];.
29380 20 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e    assertParentIn
29390 64 65 78 28 70 50 61 72 65 6e 74 2c 20 69 64 78  dex(pParent, idx
293a0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
293b0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20  .  /*.  ** Find 
293c0 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 74 6f  sibling pages to
293d0 20 70 50 61 67 65 20 61 6e 64 20 74 68 65 20 63   pPage and the c
293e0 65 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20  ells in pParent 
293f0 74 68 61 74 20 64 69 76 69 64 65 0a 20 20 2a 2a  that divide.  **
29400 20 74 68 65 20 73 69 62 6c 69 6e 67 73 2e 20 20   the siblings.  
29410 41 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  An attempt is ma
29420 64 65 20 74 6f 20 66 69 6e 64 20 4e 4e 20 73 69  de to find NN si
29430 62 6c 69 6e 67 73 20 6f 6e 20 65 69 74 68 65 72  blings on either
29440 0a 20 20 2a 2a 20 73 69 64 65 20 6f 66 20 70 50  .  ** side of pP
29450 61 67 65 2e 20 20 4d 6f 72 65 20 73 69 62 6c 69  age.  More sibli
29460 6e 67 73 20 61 72 65 20 74 61 6b 65 6e 20 66 72  ngs are taken fr
29470 6f 6d 20 6f 6e 65 20 73 69 64 65 2c 20 68 6f 77  om one side, how
29480 65 76 65 72 2c 20 69 66 0a 20 20 2a 2a 20 70 50  ever, if.  ** pP
29490 61 67 65 20 74 68 65 72 65 20 61 72 65 20 66 65  age there are fe
294a0 77 65 72 20 74 68 61 6e 20 4e 4e 20 73 69 62 6c  wer than NN sibl
294b0 69 6e 67 73 20 6f 6e 20 74 68 65 20 6f 74 68 65  ings on the othe
294c0 72 20 73 69 64 65 2e 20 20 49 66 20 70 50 61 72  r side.  If pPar
294d0 65 6e 74 0a 20 20 2a 2a 20 68 61 73 20 4e 42 20  ent.  ** has NB 
294e0 6f 72 20 66 65 77 65 72 20 63 68 69 6c 64 72 65  or fewer childre
294f0 6e 20 74 68 65 6e 20 61 6c 6c 20 63 68 69 6c 64  n then all child
29500 72 65 6e 20 6f 66 20 70 50 61 72 65 6e 74 20 61  ren of pParent a
29510 72 65 20 74 61 6b 65 6e 2e 0a 20 20 2a 2f 0a 20  re taken..  */. 
29520 20 6e 78 44 69 76 20 3d 20 69 64 78 20 2d 20 4e   nxDiv = idx - N
29530 4e 3b 0a 20 20 69 66 28 20 6e 78 44 69 76 20 2b  N;.  if( nxDiv +
29540 20 4e 42 20 3e 20 70 50 61 72 65 6e 74 2d 3e 6e   NB > pParent->n
29550 43 65 6c 6c 20 29 7b 0a 20 20 20 20 6e 78 44 69  Cell ){.    nxDi
29560 76 20 3d 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65  v = pParent->nCe
29570 6c 6c 20 2d 20 4e 42 20 2b 20 31 3b 0a 20 20 7d  ll - NB + 1;.  }
29580 0a 20 20 69 66 28 20 6e 78 44 69 76 3c 30 20 29  .  if( nxDiv<0 )
29590 7b 0a 20 20 20 20 6e 78 44 69 76 20 3d 20 30 3b  {.    nxDiv = 0;
295a0 0a 20 20 7d 0a 20 20 6e 44 69 76 20 3d 20 30 3b  .  }.  nDiv = 0;
295b0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6b 3d 6e 78  .  for(i=0, k=nx
295c0 44 69 76 3b 20 69 3c 4e 42 3b 20 69 2b 2b 2c 20  Div; i<NB; i++, 
295d0 6b 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 6b 3c  k++){.    if( k<
295e0 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29  pParent->nCell )
295f0 7b 0a 20 20 20 20 20 20 61 70 44 69 76 5b 69 5d  {.      apDiv[i]
29600 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 72   = findCell(pPar
29610 65 6e 74 2c 20 6b 29 3b 0a 20 20 20 20 20 20 6e  ent, k);.      n
29620 44 69 76 2b 2b 3b 0a 20 20 20 20 20 20 61 73 73  Div++;.      ass
29630 65 72 74 28 20 21 70 50 61 72 65 6e 74 2d 3e 6c  ert( !pParent->l
29640 65 61 66 20 29 3b 0a 20 20 20 20 20 20 70 67 6e  eaf );.      pgn
29650 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34 62 79  oOld[i] = get4by
29660 74 65 28 61 70 44 69 76 5b 69 5d 29 3b 0a 20 20  te(apDiv[i]);.  
29670 20 20 7d 65 6c 73 65 20 69 66 28 20 6b 3d 3d 70    }else if( k==p
29680 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b  Parent->nCell ){
29690 0a 20 20 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 69  .      pgnoOld[i
296a0 5d 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  ] = get4byte(&pP
296b0 61 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61  arent->aData[pPa
296c0 72 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b  rent->hdrOffset+
296d0 38 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  8]);.    }else{.
296e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
296f0 20 7d 0a 20 20 20 20 72 63 20 3d 20 67 65 74 41   }.    rc = getA
29700 6e 64 49 6e 69 74 50 61 67 65 28 70 42 74 2c 20  ndInitPage(pBt, 
29710 70 67 6e 6f 4f 6c 64 5b 69 5d 2c 20 26 61 70 4f  pgnoOld[i], &apO
29720 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20  ld[i]);.    if( 
29730 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e 63  rc ) goto balanc
29740 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 2f  e_cleanup;.    /
29750 2a 20 61 70 4f 6c 64 5b 69 5d 2d 3e 69 64 78 50  * apOld[i]->idxP
29760 61 72 65 6e 74 20 3d 20 6b 3b 20 2a 2f 0a 20 20  arent = k; */.  
29770 20 20 61 70 43 6f 70 79 5b 69 5d 20 3d 20 30 3b    apCopy[i] = 0;
29780 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 3d 3d  .    assert( i==
29790 6e 4f 6c 64 20 29 3b 0a 20 20 20 20 6e 4f 6c 64  nOld );.    nOld
297a0 2b 2b 3b 0a 20 20 20 20 6e 4d 61 78 43 65 6c 6c  ++;.    nMaxCell
297b0 73 20 2b 3d 20 31 2b 61 70 4f 6c 64 5b 69 5d 2d  s += 1+apOld[i]-
297c0 3e 6e 43 65 6c 6c 2b 61 70 4f 6c 64 5b 69 5d 2d  >nCell+apOld[i]-
297d0 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 7d 0a  >nOverflow;.  }.
297e0 0a 20 20 2f 2a 20 4d 61 6b 65 20 6e 4d 61 78 43  .  /* Make nMaxC
297f0 65 6c 6c 73 20 61 20 6d 75 6c 74 69 70 6c 65 20  ells a multiple 
29800 6f 66 20 34 20 69 6e 20 6f 72 64 65 72 20 74 6f  of 4 in order to
29810 20 70 72 65 73 65 72 76 65 20 38 2d 62 79 74 65   preserve 8-byte
29820 0a 20 20 2a 2a 20 61 6c 69 67 6e 6d 65 6e 74 20  .  ** alignment 
29830 2a 2f 0a 20 20 6e 4d 61 78 43 65 6c 6c 73 20 3d  */.  nMaxCells =
29840 20 28 6e 4d 61 78 43 65 6c 6c 73 20 2b 20 33 29   (nMaxCells + 3)
29850 26 7e 33 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  &~3;..  /*.  ** 
29860 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  Allocate space f
29870 6f 72 20 6d 65 6d 6f 72 79 20 73 74 72 75 63 74  or memory struct
29880 75 72 65 73 0a 20 20 2a 2f 0a 20 20 73 7a 53 63  ures.  */.  szSc
29890 72 61 74 63 68 20 3d 0a 20 20 20 20 20 20 20 6e  ratch =.       n
298a0 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28  MaxCells*sizeof(
298b0 75 38 2a 29 20 20 20 20 20 20 20 20 20 20 20 20  u8*)            
298c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 70             /* ap
298d0 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 6e  Cell */.     + n
298e0 4d 61 78 43 65 6c 6c 73 2a 73 69 7a 65 6f 66 28  MaxCells*sizeof(
298f0 75 31 36 29 20 20 20 20 20 20 20 20 20 20 20 20  u16)            
29900 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 73 7a             /* sz
29910 43 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 2b 20 28  Cell */.     + (
29920 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65  ROUND8(sizeof(Me
29930 6d 50 61 67 65 29 29 2b 70 42 74 2d 3e 70 61 67  mPage))+pBt->pag
29940 65 53 69 7a 65 29 2a 4e 42 20 20 2f 2a 20 61 43  eSize)*NB  /* aC
29950 6f 70 79 20 2a 2f 0a 20 20 20 20 20 2b 20 70 42  opy */.     + pB
29960 74 2d 3e 70 61 67 65 53 69 7a 65 20 20 20 20 20  t->pageSize     
29970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29980 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 53 70            /* aSp
29990 61 63 65 31 20 2a 2f 0a 20 20 20 20 20 2b 20 28  ace1 */.     + (
299a0 49 53 41 55 54 4f 56 41 43 55 55 4d 20 3f 20 6e  ISAUTOVACUUM ? n
299b0 4d 61 78 43 65 6c 6c 73 20 3a 20 30 29 3b 20 20  MaxCells : 0);  
299c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 46             /* aF
299d0 72 6f 6d 20 2a 2f 0a 20 20 61 70 43 65 6c 6c 20  rom */.  apCell 
299e0 3d 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68  = sqlite3Scratch
299f0 4d 61 6c 6c 6f 63 28 20 73 7a 53 63 72 61 74 63  Malloc( szScratc
29a00 68 20 29 3b 20 0a 20 20 69 66 28 20 61 70 43 65  h ); .  if( apCe
29a10 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ll==0 ){.    rc 
29a20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
29a30 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
29a40 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20  _cleanup;.  }.  
29a50 73 7a 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26  szCell = (u16*)&
29a60 61 70 43 65 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73  apCell[nMaxCells
29a70 5d 3b 0a 20 20 61 43 6f 70 79 5b 30 5d 20 3d 20  ];.  aCopy[0] = 
29a80 28 75 38 2a 29 26 73 7a 43 65 6c 6c 5b 6e 4d 61  (u8*)&szCell[nMa
29a90 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 73 73 65 72  xCells];.  asser
29aa0 74 28 20 28 28 61 43 6f 70 79 5b 30 5d 20 2d 20  t( ((aCopy[0] - 
29ab0 28 75 38 2a 29 30 29 20 26 20 37 29 3d 3d 30 20  (u8*)0) & 7)==0 
29ac0 29 3b 20 2f 2a 20 38 2d 62 79 74 65 20 61 6c 69  ); /* 8-byte ali
29ad0 67 6e 6d 65 6e 74 20 72 65 71 75 69 72 65 64 20  gnment required 
29ae0 2a 2f 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  */.  for(i=1; i<
29af0 4e 42 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 43  NB; i++){.    aC
29b00 6f 70 79 5b 69 5d 20 3d 20 26 61 43 6f 70 79 5b  opy[i] = &aCopy[
29b10 69 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65 53 69  i-1][pBt->pageSi
29b20 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f 66  ze+ROUND8(sizeof
29b30 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20 20 20  (MemPage))];.   
29b40 20 61 73 73 65 72 74 28 20 28 28 61 43 6f 70 79   assert( ((aCopy
29b50 5b 69 5d 20 2d 20 28 75 38 2a 29 30 29 20 26 20  [i] - (u8*)0) & 
29b60 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79  7)==0 ); /* 8-by
29b70 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71  te alignment req
29b80 75 69 72 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 61  uired */.  }.  a
29b90 53 70 61 63 65 31 20 3d 20 26 61 43 6f 70 79 5b  Space1 = &aCopy[
29ba0 4e 42 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65 53  NB-1][pBt->pageS
29bb0 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f  ize+ROUND8(sizeo
29bc0 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20 20  f(MemPage))];.  
29bd0 61 73 73 65 72 74 28 20 28 28 61 53 70 61 63 65  assert( ((aSpace
29be0 31 20 2d 20 28 75 38 2a 29 30 29 20 26 20 37 29  1 - (u8*)0) & 7)
29bf0 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79 74 65  ==0 ); /* 8-byte
29c00 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71 75 69   alignment requi
29c10 72 65 64 20 2a 2f 0a 20 20 69 66 28 20 49 53 41  red */.  if( ISA
29c20 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
29c30 20 61 46 72 6f 6d 20 3d 20 26 61 53 70 61 63 65   aFrom = &aSpace
29c40 31 5b 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 5d  1[pBt->pageSize]
29c50 3b 0a 20 20 7d 0a 20 20 61 53 70 61 63 65 32 20  ;.  }.  aSpace2 
29c60 3d 20 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  = sqlite3PageMal
29c70 6c 6f 63 28 70 42 74 2d 3e 70 61 67 65 53 69 7a  loc(pBt->pageSiz
29c80 65 29 3b 0a 20 20 69 66 28 20 61 53 70 61 63 65  e);.  if( aSpace
29c90 32 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  2==0 ){.    rc =
29ca0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
29cb0 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f     goto balance_
29cc0 63 6c 65 61 6e 75 70 3b 0a 20 20 7d 0a 20 20 0a  cleanup;.  }.  .
29cd0 20 20 2f 2a 0a 20 20 2a 2a 20 4d 61 6b 65 20 63    /*.  ** Make c
29ce0 6f 70 69 65 73 20 6f 66 20 74 68 65 20 63 6f 6e  opies of the con
29cf0 74 65 6e 74 20 6f 66 20 70 50 61 67 65 20 61 6e  tent of pPage an
29d00 64 20 69 74 73 20 73 69 62 6c 69 6e 67 73 20 69  d its siblings i
29d10 6e 74 6f 20 61 4f 6c 64 5b 5d 2e 0a 20 20 2a 2a  nto aOld[]..  **
29d20 20 54 68 65 20 72 65 73 74 20 6f 66 20 74 68 69   The rest of thi
29d30 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20  s function will 
29d40 75 73 65 20 64 61 74 61 20 66 72 6f 6d 20 74 68  use data from th
29d50 65 20 63 6f 70 69 65 73 20 72 61 74 68 65 72 0a  e copies rather.
29d60 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 6f 72    ** that the or
29d70 69 67 69 6e 61 6c 20 70 61 67 65 73 20 73 69 6e  iginal pages sin
29d80 63 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  ce the original 
29d90 70 61 67 65 73 20 77 69 6c 6c 20 62 65 20 69 6e  pages will be in
29da0 20 74 68 65 0a 20 20 2a 2a 20 70 72 6f 63 65 73   the.  ** proces
29db0 73 20 6f 66 20 62 65 69 6e 67 20 6f 76 65 72 77  s of being overw
29dc0 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 66  ritten..  */.  f
29dd0 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20  or(i=0; i<nOld; 
29de0 69 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67  i++){.    MemPag
29df0 65 20 2a 70 20 3d 20 61 70 43 6f 70 79 5b 69 5d  e *p = apCopy[i]
29e00 20 3d 20 28 4d 65 6d 50 61 67 65 2a 29 61 43 6f   = (MemPage*)aCo
29e10 70 79 5b 69 5d 3b 0a 20 20 20 20 6d 65 6d 63 70  py[i];.    memcp
29e20 79 28 70 2c 20 61 70 4f 6c 64 5b 69 5d 2c 20 73  y(p, apOld[i], s
29e30 69 7a 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 3b  izeof(MemPage));
29e40 0a 20 20 20 20 70 2d 3e 61 44 61 74 61 20 3d 20  .    p->aData = 
29e50 28 76 6f 69 64 2a 29 26 70 5b 31 5d 3b 0a 20 20  (void*)&p[1];.  
29e60 20 20 6d 65 6d 63 70 79 28 70 2d 3e 61 44 61 74    memcpy(p->aDat
29e70 61 2c 20 61 70 4f 6c 64 5b 69 5d 2d 3e 61 44 61  a, apOld[i]->aDa
29e80 74 61 2c 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  ta, pBt->pageSiz
29e90 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20  e);.  }..  /*.  
29ea0 2a 2a 20 4c 6f 61 64 20 70 6f 69 6e 74 65 72 73  ** Load pointers
29eb0 20 74 6f 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e   to all cells on
29ec0 20 73 69 62 6c 69 6e 67 20 70 61 67 65 73 20 61   sibling pages a
29ed0 6e 64 20 74 68 65 20 64 69 76 69 64 65 72 20 63  nd the divider c
29ee0 65 6c 6c 73 0a 20 20 2a 2a 20 69 6e 74 6f 20 74  ells.  ** into t
29ef0 68 65 20 6c 6f 63 61 6c 20 61 70 43 65 6c 6c 5b  he local apCell[
29f00 5d 20 61 72 72 61 79 2e 20 20 4d 61 6b 65 20 63  ] array.  Make c
29f10 6f 70 69 65 73 20 6f 66 20 74 68 65 20 64 69 76  opies of the div
29f20 69 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20  ider cells.  ** 
29f30 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69  into space obtai
29f40 6e 65 64 20 66 6f 72 6d 20 61 53 70 61 63 65 31  ned form aSpace1
29f50 5b 5d 20 61 6e 64 20 72 65 6d 6f 76 65 20 74 68  [] and remove th
29f60 65 20 74 68 65 20 64 69 76 69 64 65 72 20 43 65  e the divider Ce
29f70 6c 6c 73 0a 20 20 2a 2a 20 66 72 6f 6d 20 70 50  lls.  ** from pP
29f80 61 72 65 6e 74 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  arent..  **.  **
29f90 20 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 73   If the siblings
29fa0 20 61 72 65 20 6f 6e 20 6c 65 61 66 20 70 61 67   are on leaf pag
29fb0 65 73 2c 20 74 68 65 6e 20 74 68 65 20 63 68 69  es, then the chi
29fc0 6c 64 20 70 6f 69 6e 74 65 72 73 20 6f 66 20 74  ld pointers of t
29fd0 68 65 0a 20 20 2a 2a 20 64 69 76 69 64 65 72 20  he.  ** divider 
29fe0 63 65 6c 6c 73 20 61 72 65 20 73 74 72 69 70 70  cells are stripp
29ff0 65 64 20 66 72 6f 6d 20 74 68 65 20 63 65 6c 6c  ed from the cell
2a000 73 20 62 65 66 6f 72 65 20 74 68 65 79 20 61 72  s before they ar
2a010 65 20 63 6f 70 69 65 64 0a 20 20 2a 2a 20 69 6e  e copied.  ** in
2a020 74 6f 20 61 53 70 61 63 65 31 5b 5d 2e 20 20 49  to aSpace1[].  I
2a030 6e 20 74 68 69 73 20 77 61 79 2c 20 61 6c 6c 20  n this way, all 
2a040 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b  cells in apCell[
2a050 5d 20 61 72 65 20 77 69 74 68 6f 75 74 0a 20 20  ] are without.  
2a060 2a 2a 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72  ** child pointer
2a070 73 2e 20 20 49 66 20 73 69 62 6c 69 6e 67 73 20  s.  If siblings 
2a080 61 72 65 20 6e 6f 74 20 6c 65 61 76 65 73 2c 20  are not leaves, 
2a090 74 68 65 6e 20 61 6c 6c 20 63 65 6c 6c 20 69 6e  then all cell in
2a0a0 0a 20 20 2a 2a 20 61 70 43 65 6c 6c 5b 5d 20 69  .  ** apCell[] i
2a0b0 6e 63 6c 75 64 65 20 63 68 69 6c 64 20 70 6f 69  nclude child poi
2a0c0 6e 74 65 72 73 2e 20 20 45 69 74 68 65 72 20 77  nters.  Either w
2a0d0 61 79 2c 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e  ay, all cells in
2a0e0 20 61 70 43 65 6c 6c 5b 5d 0a 20 20 2a 2a 20 61   apCell[].  ** a
2a0f0 72 65 20 61 6c 69 6b 65 2e 0a 20 20 2a 2a 0a 20  re alike..  **. 
2a100 20 2a 2a 20 6c 65 61 66 43 6f 72 72 65 63 74 69   ** leafCorrecti
2a110 6f 6e 3a 20 20 34 20 69 66 20 70 50 61 67 65 20  on:  4 if pPage 
2a120 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66  is a leaf.  0 if
2a130 20 70 50 61 67 65 20 69 73 20 6e 6f 74 20 61 20   pPage is not a 
2a140 6c 65 61 66 2e 0a 20 20 2a 2a 20 20 20 20 20 20  leaf..  **      
2a150 20 6c 65 61 66 44 61 74 61 3a 20 20 31 20 69 66   leafData:  1 if
2a160 20 70 50 61 67 65 20 68 6f 6c 64 73 20 6b 65 79   pPage holds key
2a170 2b 64 61 74 61 20 61 6e 64 20 70 50 61 72 65 6e  +data and pParen
2a180 74 20 68 6f 6c 64 73 20 6f 6e 6c 79 20 6b 65 79  t holds only key
2a190 73 2e 0a 20 20 2a 2f 0a 20 20 6e 43 65 6c 6c 20  s..  */.  nCell 
2a1a0 3d 20 30 3b 0a 20 20 6c 65 61 66 43 6f 72 72 65  = 0;.  leafCorre
2a1b0 63 74 69 6f 6e 20 3d 20 70 50 61 67 65 2d 3e 6c  ction = pPage->l
2a1c0 65 61 66 2a 34 3b 0a 20 20 6c 65 61 66 44 61 74  eaf*4;.  leafDat
2a1d0 61 20 3d 20 70 50 61 67 65 2d 3e 68 61 73 44 61  a = pPage->hasDa
2a1e0 74 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ta;.  for(i=0; i
2a1f0 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nOld; i++){.   
2a200 20 4d 65 6d 50 61 67 65 20 2a 70 4f 6c 64 20 3d   MemPage *pOld =
2a210 20 61 70 43 6f 70 79 5b 69 5d 3b 0a 20 20 20 20   apCopy[i];.    
2a220 69 6e 74 20 6c 69 6d 69 74 20 3d 20 70 4f 6c 64  int limit = pOld
2a230 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c 64 2d 3e 6e 4f  ->nCell+pOld->nO
2a240 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 66 6f 72  verflow;.    for
2a250 28 6a 3d 30 3b 20 6a 3c 6c 69 6d 69 74 3b 20 6a  (j=0; j<limit; j
2a260 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
2a270 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c  t( nCell<nMaxCel
2a280 6c 73 20 29 3b 0a 20 20 20 20 20 20 61 70 43 65  ls );.      apCe
2a290 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 66 69 6e 64  ll[nCell] = find
2a2a0 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 4f 6c  OverflowCell(pOl
2a2b0 64 2c 20 6a 29 3b 0a 20 20 20 20 20 20 73 7a 43  d, j);.      szC
2a2c0 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 63 65 6c  ell[nCell] = cel
2a2d0 6c 53 69 7a 65 50 74 72 28 70 4f 6c 64 2c 20 61  lSizePtr(pOld, a
2a2e0 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 29 3b 0a 20  pCell[nCell]);. 
2a2f0 20 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56       if( ISAUTOV
2a300 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 20  ACUUM ){.       
2a310 20 69 6e 74 20 61 3b 0a 20 20 20 20 20 20 20 20   int a;.        
2a320 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 28  aFrom[nCell] = (
2a330 75 38 29 69 3b 20 20 20 61 73 73 65 72 74 28 20  u8)i;   assert( 
2a340 69 3e 3d 30 20 26 26 20 69 3c 36 20 29 3b 0a 20  i>=0 && i<6 );. 
2a350 20 20 20 20 20 20 20 66 6f 72 28 61 3d 30 3b 20         for(a=0; 
2a360 61 3c 70 4f 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  a<pOld->nOverflo
2a370 77 3b 20 61 2b 2b 29 7b 0a 20 20 20 20 20 20 20  w; a++){.       
2a380 20 20 20 69 66 28 20 70 4f 6c 64 2d 3e 61 4f 76     if( pOld->aOv
2a390 66 6c 5b 61 5d 2e 70 43 65 6c 6c 3d 3d 61 70 43  fl[a].pCell==apC
2a3a0 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 29 7b 0a 20 20  ell[nCell] ){.  
2a3b0 20 20 20 20 20 20 20 20 20 20 61 46 72 6f 6d 5b            aFrom[
2a3c0 6e 43 65 6c 6c 5d 20 3d 20 30 78 46 46 3b 0a 20  nCell] = 0xFF;. 
2a3d0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2a3e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2a3f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2a400 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b 0a 20        nCell++;. 
2a410 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3c 6e     }.    if( i<n
2a420 4f 6c 64 2d 31 20 29 7b 0a 20 20 20 20 20 20 75  Old-1 ){.      u
2a430 31 36 20 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65  16 sz = cellSize
2a440 50 74 72 28 70 50 61 72 65 6e 74 2c 20 61 70 44  Ptr(pParent, apD
2a450 69 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66  iv[i]);.      if
2a460 28 20 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20  ( leafData ){.  
2a470 20 20 20 20 20 20 2f 2a 20 57 69 74 68 20 74 68        /* With th
2a480 65 20 4c 45 41 46 44 41 54 41 20 66 6c 61 67 2c  e LEAFDATA flag,
2a490 20 70 50 61 72 65 6e 74 20 63 65 6c 6c 73 20 68   pParent cells h
2a4a0 6f 6c 64 20 6f 6e 6c 79 20 49 4e 54 4b 45 59 73  old only INTKEYs
2a4b0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
2a4c0 20 61 72 65 20 64 75 70 6c 69 63 61 74 65 73 20   are duplicates 
2a4d0 6f 66 20 6b 65 79 73 20 6f 6e 20 74 68 65 20 63  of keys on the c
2a4e0 68 69 6c 64 20 70 61 67 65 73 2e 20 20 57 65 20  hild pages.  We 
2a4f0 6e 65 65 64 20 74 6f 20 72 65 6d 6f 76 65 0a 20  need to remove. 
2a500 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64 69         ** the di
2a510 76 69 64 65 72 20 63 65 6c 6c 73 20 66 72 6f 6d  vider cells from
2a520 20 70 50 61 72 65 6e 74 2c 20 62 75 74 20 74 68   pParent, but th
2a530 65 20 64 69 76 69 64 65 72 73 20 63 65 6c 6c 73  e dividers cells
2a540 20 61 72 65 20 6e 6f 74 0a 20 20 20 20 20 20 20   are not.       
2a550 20 2a 2a 20 61 64 64 65 64 20 74 6f 20 61 70 43   ** added to apC
2a560 65 6c 6c 5b 5d 20 62 65 63 61 75 73 65 20 74 68  ell[] because th
2a570 65 79 20 61 72 65 20 64 75 70 6c 69 63 61 74 65  ey are duplicate
2a580 73 20 6f 66 20 63 68 69 6c 64 20 63 65 6c 6c 73  s of child cells
2a590 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2a5a0 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50       dropCell(pP
2a5b0 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a  arent, nxDiv, sz
2a5c0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2a5d0 20 20 20 20 20 20 20 20 75 38 20 2a 70 54 65 6d          u8 *pTem
2a5e0 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  p;.        asser
2a5f0 74 28 20 6e 43 65 6c 6c 3c 6e 4d 61 78 43 65 6c  t( nCell<nMaxCel
2a600 6c 73 20 29 3b 0a 20 20 20 20 20 20 20 20 73 7a  ls );.        sz
2a610 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 73 7a  Cell[nCell] = sz
2a620 3b 0a 20 20 20 20 20 20 20 20 70 54 65 6d 70 20  ;.        pTemp 
2a630 3d 20 26 61 53 70 61 63 65 31 5b 69 53 70 61 63  = &aSpace1[iSpac
2a640 65 31 5d 3b 0a 20 20 20 20 20 20 20 20 69 53 70  e1];.        iSp
2a650 61 63 65 31 20 2b 3d 20 73 7a 3b 0a 20 20 20 20  ace1 += sz;.    
2a660 20 20 20 20 61 73 73 65 72 74 28 20 73 7a 3c 3d      assert( sz<=
2a670 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2f 34 20  pBt->pageSize/4 
2a680 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
2a690 74 28 20 69 53 70 61 63 65 31 3c 3d 70 42 74 2d  t( iSpace1<=pBt-
2a6a0 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20  >pageSize );.   
2a6b0 20 20 20 20 20 6d 65 6d 63 70 79 28 70 54 65 6d       memcpy(pTem
2a6c0 70 2c 20 61 70 44 69 76 5b 69 5d 2c 20 73 7a 29  p, apDiv[i], sz)
2a6d0 3b 0a 20 20 20 20 20 20 20 20 61 70 43 65 6c 6c  ;.        apCell
2a6e0 5b 6e 43 65 6c 6c 5d 20 3d 20 70 54 65 6d 70 2b  [nCell] = pTemp+
2a6f0 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b 0a  leafCorrection;.
2a700 20 20 20 20 20 20 20 20 69 66 28 20 49 53 41 55          if( ISAU
2a710 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20  TOVACUUM ){.    
2a720 20 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c        aFrom[nCel
2a730 6c 5d 20 3d 20 30 78 46 46 3b 0a 20 20 20 20 20  l] = 0xFF;.     
2a740 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64 72 6f     }.        dro
2a750 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e  pCell(pParent, n
2a760 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20  xDiv, sz);.     
2a770 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43     assert( leafC
2a780 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20 7c 7c 20  orrection==0 || 
2a790 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d  leafCorrection==
2a7a0 34 20 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43  4 );.        szC
2a7b0 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 2d 3d 20 28 75  ell[nCell] -= (u
2a7c0 31 36 29 6c 65 61 66 43 6f 72 72 65 63 74 69 6f  16)leafCorrectio
2a7d0 6e 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  n;.        asser
2a7e0 74 28 20 67 65 74 34 62 79 74 65 28 70 54 65 6d  t( get4byte(pTem
2a7f0 70 29 3d 3d 70 67 6e 6f 4f 6c 64 5b 69 5d 20 29  p)==pgnoOld[i] )
2a800 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  ;.        if( !p
2a810 4f 6c 64 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20  Old->leaf ){.   
2a820 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6c         assert( l
2a830 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30  eafCorrection==0
2a840 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   );.          /*
2a850 20 54 68 65 20 72 69 67 68 74 20 70 6f 69 6e 74   The right point
2a860 65 72 20 6f 66 20 74 68 65 20 63 68 69 6c 64 20  er of the child 
2a870 70 61 67 65 20 70 4f 6c 64 20 62 65 63 6f 6d 65  page pOld become
2a880 73 20 74 68 65 20 6c 65 66 74 0a 20 20 20 20 20  s the left.     
2a890 20 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72 20       ** pointer 
2a8a0 6f 66 20 74 68 65 20 64 69 76 69 64 65 72 20 63  of the divider c
2a8b0 65 6c 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ell */.         
2a8c0 20 6d 65 6d 63 70 79 28 61 70 43 65 6c 6c 5b 6e   memcpy(apCell[n
2a8d0 43 65 6c 6c 5d 2c 20 26 70 4f 6c 64 2d 3e 61 44  Cell], &pOld->aD
2a8e0 61 74 61 5b 70 4f 6c 64 2d 3e 68 64 72 4f 66 66  ata[pOld->hdrOff
2a8f0 73 65 74 2b 38 5d 2c 20 34 29 3b 0a 20 20 20 20  set+8], 4);.    
2a900 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a910 20 20 20 20 20 61 73 73 65 72 74 28 20 6c 65 61       assert( lea
2a920 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34 20 29  fCorrection==4 )
2a930 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
2a940 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 3c 34 20  szCell[nCell]<4 
2a950 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ){.            /
2a960 2a 20 44 6f 20 6e 6f 74 20 61 6c 6c 6f 77 20 61  * Do not allow a
2a970 6e 79 20 63 65 6c 6c 73 20 73 6d 61 6c 6c 65 72  ny cells smaller
2a980 20 74 68 61 6e 20 34 20 62 79 74 65 73 2e 20 2a   than 4 bytes. *
2a990 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a  /.            sz
2a9a0 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d 20 34 3b  Cell[nCell] = 4;
2a9b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2a9c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e       }.        n
2a9d0 43 65 6c 6c 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  Cell++;.      }.
2a9e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a      }.  }..  /*.
2a9f0 20 20 2a 2a 20 46 69 67 75 72 65 20 6f 75 74 20    ** Figure out 
2aa00 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
2aa10 67 65 73 20 6e 65 65 64 65 64 20 74 6f 20 68 6f  ges needed to ho
2aa20 6c 64 20 61 6c 6c 20 6e 43 65 6c 6c 20 63 65 6c  ld all nCell cel
2aa30 6c 73 2e 0a 20 20 2a 2a 20 53 74 6f 72 65 20 74  ls..  ** Store t
2aa40 68 69 73 20 6e 75 6d 62 65 72 20 69 6e 20 22 6b  his number in "k
2aa50 22 2e 20 20 41 6c 73 6f 20 63 6f 6d 70 75 74 65  ".  Also compute
2aa60 20 73 7a 4e 65 77 5b 5d 20 77 68 69 63 68 20 69   szNew[] which i
2aa70 73 20 74 68 65 20 74 6f 74 61 6c 0a 20 20 2a 2a  s the total.  **
2aa80 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
2aa90 6c 73 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 70  ls on the i-th p
2aaa0 61 67 65 20 61 6e 64 20 63 6e 74 4e 65 77 5b 5d  age and cntNew[]
2aab0 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e   which is the in
2aac0 64 65 78 0a 20 20 2a 2a 20 69 6e 20 61 70 43 65  dex.  ** in apCe
2aad0 6c 6c 5b 5d 20 6f 66 20 74 68 65 20 63 65 6c 6c  ll[] of the cell
2aae0 20 74 68 61 74 20 64 69 76 69 64 65 73 20 70 61   that divides pa
2aaf0 67 65 20 69 20 66 72 6f 6d 20 70 61 67 65 20 69  ge i from page i
2ab00 2b 31 2e 20 20 0a 20 20 2a 2a 20 63 6e 74 4e 65  +1.  .  ** cntNe
2ab10 77 5b 6b 5d 20 73 68 6f 75 6c 64 20 65 71 75 61  w[k] should equa
2ab20 6c 20 6e 43 65 6c 6c 2e 0a 20 20 2a 2a 0a 20 20  l nCell..  **.  
2ab30 2a 2a 20 56 61 6c 75 65 73 20 63 6f 6d 70 75 74  ** Values comput
2ab40 65 64 20 62 79 20 74 68 69 73 20 62 6c 6f 63 6b  ed by this block
2ab50 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
2ab60 20 20 20 20 20 20 6b 3a 20 54 68 65 20 74 6f 74        k: The tot
2ab70 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 62  al number of sib
2ab80 6c 69 6e 67 20 70 61 67 65 73 0a 20 20 2a 2a 20  ling pages.  ** 
2ab90 20 20 20 73 7a 4e 65 77 5b 69 5d 3a 20 53 70 61     szNew[i]: Spa
2aba0 63 65 64 20 75 73 65 64 20 6f 6e 20 74 68 65 20  ced used on the 
2abb0 69 2d 74 68 20 73 69 62 6c 69 6e 67 20 70 61 67  i-th sibling pag
2abc0 65 2e 0a 20 20 2a 2a 20 20 20 63 6e 74 4e 65 77  e..  **   cntNew
2abd0 5b 69 5d 3a 20 49 6e 64 65 78 20 69 6e 20 61 70  [i]: Index in ap
2abe0 43 65 6c 6c 5b 5d 20 61 6e 64 20 73 7a 43 65 6c  Cell[] and szCel
2abf0 6c 5b 5d 20 66 6f 72 20 74 68 65 20 66 69 72 73  l[] for the firs
2ac00 74 20 63 65 6c 6c 20 74 6f 0a 20 20 2a 2a 20 20  t cell to.  **  
2ac10 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
2ac20 72 69 67 68 74 20 6f 66 20 74 68 65 20 69 2d 74  right of the i-t
2ac30 68 20 73 69 62 6c 69 6e 67 20 70 61 67 65 2e 0a  h sibling page..
2ac40 20 20 2a 2a 20 75 73 61 62 6c 65 53 70 61 63 65    ** usableSpace
2ac50 3a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  : Number of byte
2ac60 73 20 6f 66 20 73 70 61 63 65 20 61 76 61 69 6c  s of space avail
2ac70 61 62 6c 65 20 6f 6e 20 65 61 63 68 20 73 69 62  able on each sib
2ac80 6c 69 6e 67 2e 0a 20 20 2a 2a 20 0a 20 20 2a 2f  ling..  ** .  */
2ac90 0a 20 20 75 73 61 62 6c 65 53 70 61 63 65 20 3d  .  usableSpace =
2aca0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
2acb0 20 2d 20 31 32 20 2b 20 6c 65 61 66 43 6f 72 72   - 12 + leafCorr
2acc0 65 63 74 69 6f 6e 3b 0a 20 20 66 6f 72 28 73 75  ection;.  for(su
2acd0 62 74 6f 74 61 6c 3d 6b 3d 69 3d 30 3b 20 69 3c  btotal=k=i=0; i<
2ace0 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
2acf0 20 61 73 73 65 72 74 28 20 69 3c 6e 4d 61 78 43   assert( i<nMaxC
2ad00 65 6c 6c 73 20 29 3b 0a 20 20 20 20 73 75 62 74  ells );.    subt
2ad10 6f 74 61 6c 20 2b 3d 20 73 7a 43 65 6c 6c 5b 69  otal += szCell[i
2ad20 5d 20 2b 20 32 3b 0a 20 20 20 20 69 66 28 20 73  ] + 2;.    if( s
2ad30 75 62 74 6f 74 61 6c 20 3e 20 75 73 61 62 6c 65  ubtotal > usable
2ad40 53 70 61 63 65 20 29 7b 0a 20 20 20 20 20 20 73  Space ){.      s
2ad50 7a 4e 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74  zNew[k] = subtot
2ad60 61 6c 20 2d 20 73 7a 43 65 6c 6c 5b 69 5d 3b 0a  al - szCell[i];.
2ad70 20 20 20 20 20 20 63 6e 74 4e 65 77 5b 6b 5d 20        cntNew[k] 
2ad80 3d 20 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6c  = i;.      if( l
2ad90 65 61 66 44 61 74 61 20 29 7b 20 69 2d 2d 3b 20  eafData ){ i--; 
2ada0 7d 0a 20 20 20 20 20 20 73 75 62 74 6f 74 61 6c  }.      subtotal
2adb0 20 3d 20 30 3b 0a 20 20 20 20 20 20 6b 2b 2b 3b   = 0;.      k++;
2adc0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 7a 4e  .    }.  }.  szN
2add0 65 77 5b 6b 5d 20 3d 20 73 75 62 74 6f 74 61 6c  ew[k] = subtotal
2ade0 3b 0a 20 20 63 6e 74 4e 65 77 5b 6b 5d 20 3d 20  ;.  cntNew[k] = 
2adf0 6e 43 65 6c 6c 3b 0a 20 20 6b 2b 2b 3b 0a 0a 20  nCell;.  k++;.. 
2ae00 20 2f 2a 0a 20 20 2a 2a 20 54 68 65 20 70 61 63   /*.  ** The pac
2ae10 6b 69 6e 67 20 63 6f 6d 70 75 74 65 64 20 62 79  king computed by
2ae20 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 62 6c   the previous bl
2ae30 6f 63 6b 20 69 73 20 62 69 61 73 65 64 20 74 6f  ock is biased to
2ae40 77 61 72 64 20 74 68 65 20 73 69 62 6c 69 6e 67  ward the sibling
2ae50 73 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6c 65  s.  ** on the le
2ae60 66 74 20 73 69 64 65 2e 20 20 54 68 65 20 6c 65  ft side.  The le
2ae70 66 74 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20  ft siblings are 
2ae80 61 6c 77 61 79 73 20 6e 65 61 72 6c 79 20 66 75  always nearly fu
2ae90 6c 6c 2c 20 77 68 69 6c 65 20 74 68 65 0a 20 20  ll, while the.  
2aea0 2a 2a 20 72 69 67 68 74 2d 6d 6f 73 74 20 73 69  ** right-most si
2aeb0 62 6c 69 6e 67 20 6d 69 67 68 74 20 62 65 20 6e  bling might be n
2aec0 65 61 72 6c 79 20 65 6d 70 74 79 2e 20 20 54 68  early empty.  Th
2aed0 69 73 20 62 6c 6f 63 6b 20 6f 66 20 63 6f 64 65  is block of code
2aee0 20 61 74 74 65 6d 70 74 73 0a 20 20 2a 2a 20 74   attempts.  ** t
2aef0 6f 20 61 64 6a 75 73 74 20 74 68 65 20 70 61 63  o adjust the pac
2af00 6b 69 6e 67 20 6f 66 20 73 69 62 6c 69 6e 67 73  king of siblings
2af10 20 74 6f 20 67 65 74 20 61 20 62 65 74 74 65 72   to get a better
2af20 20 62 61 6c 61 6e 63 65 2e 0a 20 20 2a 2a 0a 20   balance..  **. 
2af30 20 2a 2a 20 54 68 69 73 20 61 64 6a 75 73 74 6d   ** This adjustm
2af40 65 6e 74 20 69 73 20 6d 6f 72 65 20 74 68 61 6e  ent is more than
2af50 20 61 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   an optimization
2af60 2e 20 20 54 68 65 20 70 61 63 6b 69 6e 67 20 61  .  The packing a
2af70 62 6f 76 65 20 6d 69 67 68 74 0a 20 20 2a 2a 20  bove might.  ** 
2af80 62 65 20 73 6f 20 6f 75 74 20 6f 66 20 62 61 6c  be so out of bal
2af90 61 6e 63 65 20 61 73 20 74 6f 20 62 65 20 69 6c  ance as to be il
2afa0 6c 65 67 61 6c 2e 20 20 46 6f 72 20 65 78 61 6d  legal.  For exam
2afb0 70 6c 65 2c 20 74 68 65 20 72 69 67 68 74 2d 6d  ple, the right-m
2afc0 6f 73 74 0a 20 20 2a 2a 20 73 69 62 6c 69 6e 67  ost.  ** sibling
2afd0 20 6d 69 67 68 74 20 62 65 20 63 6f 6d 70 6c 65   might be comple
2afe0 74 65 6c 79 20 65 6d 70 74 79 2e 20 20 54 68 69  tely empty.  Thi
2aff0 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20  s adjustment is 
2b000 6e 6f 74 20 6f 70 74 69 6f 6e 61 6c 2e 0a 20 20  not optional..  
2b010 2a 2f 0a 20 20 66 6f 72 28 69 3d 6b 2d 31 3b 20  */.  for(i=k-1; 
2b020 69 3e 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  i>0; i--){.    i
2b030 6e 74 20 73 7a 52 69 67 68 74 20 3d 20 73 7a 4e  nt szRight = szN
2b040 65 77 5b 69 5d 3b 20 20 2f 2a 20 53 69 7a 65 20  ew[i];  /* Size 
2b050 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68  of sibling on th
2b060 65 20 72 69 67 68 74 20 2a 2f 0a 20 20 20 20 69  e right */.    i
2b070 6e 74 20 73 7a 4c 65 66 74 20 3d 20 73 7a 4e 65  nt szLeft = szNe
2b080 77 5b 69 2d 31 5d 3b 20 2f 2a 20 53 69 7a 65 20  w[i-1]; /* Size 
2b090 6f 66 20 73 69 62 6c 69 6e 67 20 6f 6e 20 74 68  of sibling on th
2b0a0 65 20 6c 65 66 74 20 2a 2f 0a 20 20 20 20 69 6e  e left */.    in
2b0b0 74 20 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  t r;            
2b0c0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 72 69    /* Index of ri
2b0d0 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 69 6e  ght-most cell in
2b0e0 20 6c 65 66 74 20 73 69 62 6c 69 6e 67 20 2a 2f   left sibling */
2b0f0 0a 20 20 20 20 69 6e 74 20 64 3b 20 20 20 20 20  .    int d;     
2b100 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
2b110 78 20 6f 66 20 66 69 72 73 74 20 63 65 6c 6c 20  x of first cell 
2b120 74 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 72  to the left of r
2b130 69 67 68 74 20 73 69 62 6c 69 6e 67 20 2a 2f 0a  ight sibling */.
2b140 0a 20 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b  .    r = cntNew[
2b150 69 2d 31 5d 20 2d 20 31 3b 0a 20 20 20 20 64 20  i-1] - 1;.    d 
2b160 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61  = r + 1 - leafDa
2b170 74 61 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ta;.    assert( 
2b180 64 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20  d<nMaxCells );. 
2b190 20 20 20 61 73 73 65 72 74 28 20 72 3c 6e 4d 61     assert( r<nMa
2b1a0 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 77 68  xCells );.    wh
2b1b0 69 6c 65 28 20 73 7a 52 69 67 68 74 3d 3d 30 20  ile( szRight==0 
2b1c0 7c 7c 20 73 7a 52 69 67 68 74 2b 73 7a 43 65 6c  || szRight+szCel
2b1d0 6c 5b 64 5d 2b 32 3c 3d 73 7a 4c 65 66 74 2d 28  l[d]+2<=szLeft-(
2b1e0 73 7a 43 65 6c 6c 5b 72 5d 2b 32 29 20 29 7b 0a  szCell[r]+2) ){.
2b1f0 20 20 20 20 20 20 73 7a 52 69 67 68 74 20 2b 3d        szRight +=
2b200 20 73 7a 43 65 6c 6c 5b 64 5d 20 2b 20 32 3b 0a   szCell[d] + 2;.
2b210 20 20 20 20 20 20 73 7a 4c 65 66 74 20 2d 3d 20        szLeft -= 
2b220 73 7a 43 65 6c 6c 5b 72 5d 20 2b 20 32 3b 0a 20  szCell[r] + 2;. 
2b230 20 20 20 20 20 63 6e 74 4e 65 77 5b 69 2d 31 5d       cntNew[i-1]
2b240 2d 2d 3b 0a 20 20 20 20 20 20 72 20 3d 20 63 6e  --;.      r = cn
2b250 74 4e 65 77 5b 69 2d 31 5d 20 2d 20 31 3b 0a 20  tNew[i-1] - 1;. 
2b260 20 20 20 20 20 64 20 3d 20 72 20 2b 20 31 20 2d       d = r + 1 -
2b270 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20 20 7d   leafData;.    }
2b280 0a 20 20 20 20 73 7a 4e 65 77 5b 69 5d 20 3d 20  .    szNew[i] = 
2b290 73 7a 52 69 67 68 74 3b 0a 20 20 20 20 73 7a 4e  szRight;.    szN
2b2a0 65 77 5b 69 2d 31 5d 20 3d 20 73 7a 4c 65 66 74  ew[i-1] = szLeft
2b2b0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 69 74 68  ;.  }..  /* Eith
2b2c0 65 72 20 77 65 20 66 6f 75 6e 64 20 6f 6e 65 20  er we found one 
2b2d0 6f 72 20 6d 6f 72 65 20 63 65 6c 6c 73 20 28 63  or more cells (c
2b2e0 6e 74 6e 65 77 5b 30 5d 29 3e 30 29 20 6f 72 20  ntnew[0])>0) or 
2b2f0 77 65 20 61 72 65 20 74 68 65 0a 20 20 2a 2a 20  we are the.  ** 
2b300 61 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70  a virtual root p
2b310 61 67 65 2e 20 20 41 20 76 69 72 74 75 61 6c 20  age.  A virtual 
2b320 72 6f 6f 74 20 70 61 67 65 20 69 73 20 77 68 65  root page is whe
2b330 6e 20 74 68 65 20 72 65 61 6c 20 72 6f 6f 74 0a  n the real root.
2b340 20 20 2a 2a 20 70 61 67 65 20 69 73 20 70 61 67    ** page is pag
2b350 65 20 31 20 61 6e 64 20 77 65 20 61 72 65 20 74  e 1 and we are t
2b360 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 6f 66  he only child of
2b370 20 74 68 61 74 20 70 61 67 65 2e 0a 20 20 2a 2f   that page..  */
2b380 0a 20 20 61 73 73 65 72 74 28 20 63 6e 74 4e 65  .  assert( cntNe
2b390 77 5b 30 5d 3e 30 20 7c 7c 20 28 70 50 61 72 65  w[0]>0 || (pPare
2b3a0 6e 74 2d 3e 70 67 6e 6f 3d 3d 31 20 26 26 20 70  nt->pgno==1 && p
2b3b0 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3d 3d 30  Parent->nCell==0
2b3c0 29 20 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  ) );..  /*.  ** 
2b3d0 41 6c 6c 6f 63 61 74 65 20 6b 20 6e 65 77 20 70  Allocate k new p
2b3e0 61 67 65 73 2e 20 20 52 65 75 73 65 20 6f 6c 64  ages.  Reuse old
2b3f0 20 70 61 67 65 73 20 77 68 65 72 65 20 70 6f 73   pages where pos
2b400 73 69 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73  sible..  */.  as
2b410 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70 67 6e  sert( pPage->pgn
2b420 6f 3e 31 20 29 3b 0a 20 20 70 61 67 65 46 6c 61  o>1 );.  pageFla
2b430 67 73 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74  gs = pPage->aDat
2b440 61 5b 30 5d 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  a[0];.  for(i=0;
2b450 20 69 3c 6b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<k; i++){.    
2b460 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 3b 0a 20  MemPage *pNew;. 
2b470 20 20 20 69 66 28 20 69 3c 6e 4f 6c 64 20 29 7b     if( i<nOld ){
2b480 0a 20 20 20 20 20 20 70 4e 65 77 20 3d 20 61 70  .      pNew = ap
2b490 4e 65 77 5b 69 5d 20 3d 20 61 70 4f 6c 64 5b 69  New[i] = apOld[i
2b4a0 5d 3b 0a 20 20 20 20 20 20 70 67 6e 6f 4e 65 77  ];.      pgnoNew
2b4b0 5b 69 5d 20 3d 20 70 67 6e 6f 4f 6c 64 5b 69 5d  [i] = pgnoOld[i]
2b4c0 3b 0a 20 20 20 20 20 20 61 70 4f 6c 64 5b 69 5d  ;.      apOld[i]
2b4d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d   = 0;.      rc =
2b4e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2b4f0 74 65 28 70 4e 65 77 2d 3e 70 44 62 50 61 67 65  te(pNew->pDbPage
2b500 29 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b  );.      nNew++;
2b510 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
2b520 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
2b530 61 6e 75 70 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  anup;.    }else{
2b540 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
2b550 3e 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  >0 );.      rc =
2b560 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50 61   allocateBtreePa
2b570 67 65 28 70 42 74 2c 20 26 70 4e 65 77 2c 20 26  ge(pBt, &pNew, &
2b580 70 67 6e 6f 4e 65 77 5b 69 5d 2c 20 70 67 6e 6f  pgnoNew[i], pgno
2b590 4e 65 77 5b 69 2d 31 5d 2c 20 30 29 3b 0a 20 20  New[i-1], 0);.  
2b5a0 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
2b5b0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
2b5c0 70 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69  p;.      apNew[i
2b5d0 5d 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  ] = pNew;.      
2b5e0 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  nNew++;.    }.  
2b5f0 7d 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79  }..  /* Free any
2b600 20 6f 6c 64 20 70 61 67 65 73 20 74 68 61 74 20   old pages that 
2b610 77 65 72 65 20 6e 6f 74 20 72 65 75 73 65 64 20  were not reused 
2b620 61 73 20 6e 65 77 20 70 61 67 65 73 2e 0a 20 20  as new pages..  
2b630 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69 3c 6e 4f  */.  while( i<nO
2b640 6c 64 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66  ld ){.    rc = f
2b650 72 65 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d  reePage(apOld[i]
2b660 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
2b670 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
2b680 61 6e 75 70 3b 0a 20 20 20 20 72 65 6c 65 61 73  anup;.    releas
2b690 65 50 61 67 65 28 61 70 4f 6c 64 5b 69 5d 29 3b  ePage(apOld[i]);
2b6a0 0a 20 20 20 20 61 70 4f 6c 64 5b 69 5d 20 3d 20  .    apOld[i] = 
2b6b0 30 3b 0a 20 20 20 20 69 2b 2b 3b 0a 20 20 7d 0a  0;.    i++;.  }.
2b6c0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 75 74 20 74  .  /*.  ** Put t
2b6d0 68 65 20 6e 65 77 20 70 61 67 65 73 20 69 6e 20  he new pages in 
2b6e0 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65 72 2e  accending order.
2b6f0 20 20 54 68 69 73 20 68 65 6c 70 73 20 74 6f 0a    This helps to.
2b700 20 20 2a 2a 20 6b 65 65 70 20 65 6e 74 72 69 65    ** keep entrie
2b710 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69  s in the disk fi
2b720 6c 65 20 69 6e 20 6f 72 64 65 72 20 73 6f 20 74  le in order so t
2b730 68 61 74 20 61 20 73 63 61 6e 0a 20 20 2a 2a 20  hat a scan.  ** 
2b740 6f 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  of the table is 
2b750 61 20 6c 69 6e 65 61 72 20 73 63 61 6e 20 74 68  a linear scan th
2b760 72 6f 75 67 68 20 74 68 65 20 66 69 6c 65 2e 20  rough the file. 
2b770 20 54 68 61 74 0a 20 20 2a 2a 20 69 6e 20 74 75   That.  ** in tu
2b780 72 6e 20 68 65 6c 70 73 20 74 68 65 20 6f 70 65  rn helps the ope
2b790 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 74 6f  rating system to
2b7a0 20 64 65 6c 69 76 65 72 20 70 61 67 65 73 0a 20   deliver pages. 
2b7b0 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 64 69 73   ** from the dis
2b7c0 6b 20 6d 6f 72 65 20 72 61 70 69 64 6c 79 2e 0a  k more rapidly..
2b7d0 20 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 4f 28 6e    **.  ** An O(n
2b7e0 5e 32 29 20 69 6e 73 65 72 74 69 6f 6e 20 73 6f  ^2) insertion so
2b7f0 72 74 20 61 6c 67 6f 72 69 74 68 6d 20 69 73 20  rt algorithm is 
2b800 75 73 65 64 2c 20 62 75 74 20 73 69 6e 63 65 0a  used, but since.
2b810 20 20 2a 2a 20 6e 20 69 73 20 6e 65 76 65 72 20    ** n is never 
2b820 6d 6f 72 65 20 74 68 61 6e 20 4e 42 20 28 61 20  more than NB (a 
2b830 73 6d 61 6c 6c 20 63 6f 6e 73 74 61 6e 74 29 2c  small constant),
2b840 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 20 20 2a   that should.  *
2b850 2a 20 6e 6f 74 20 62 65 20 61 20 70 72 6f 62 6c  * not be a probl
2b860 65 6d 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68  em..  **.  ** Wh
2b870 65 6e 20 4e 42 3d 3d 33 2c 20 74 68 69 73 20 6f  en NB==3, this o
2b880 6e 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  ne optimization 
2b890 6d 61 6b 65 73 20 74 68 65 20 64 61 74 61 62 61  makes the databa
2b8a0 73 65 0a 20 20 2a 2a 20 61 62 6f 75 74 20 32 35  se.  ** about 25
2b8b0 25 20 66 61 73 74 65 72 20 66 6f 72 20 6c 61 72  % faster for lar
2b8c0 67 65 20 69 6e 73 65 72 74 69 6f 6e 73 20 61 6e  ge insertions an
2b8d0 64 20 64 65 6c 65 74 69 6f 6e 73 2e 0a 20 20 2a  d deletions..  *
2b8e0 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b  /.  for(i=0; i<k
2b8f0 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  -1; i++){.    in
2b900 74 20 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77  t minV = pgnoNew
2b910 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6d 69 6e  [i];.    int min
2b920 49 20 3d 20 69 3b 0a 20 20 20 20 66 6f 72 28 6a  I = i;.    for(j
2b930 3d 69 2b 31 3b 20 6a 3c 6b 3b 20 6a 2b 2b 29 7b  =i+1; j<k; j++){
2b940 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 4e  .      if( pgnoN
2b950 65 77 5b 6a 5d 3c 28 75 6e 73 69 67 6e 65 64 29  ew[j]<(unsigned)
2b960 6d 69 6e 56 20 29 7b 0a 20 20 20 20 20 20 20 20  minV ){.        
2b970 6d 69 6e 49 20 3d 20 6a 3b 0a 20 20 20 20 20 20  minI = j;.      
2b980 20 20 6d 69 6e 56 20 3d 20 70 67 6e 6f 4e 65 77    minV = pgnoNew
2b990 5b 6a 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  [j];.      }.   
2b9a0 20 7d 0a 20 20 20 20 69 66 28 20 6d 69 6e 49 3e   }.    if( minI>
2b9b0 69 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 74  i ){.      int t
2b9c0 3b 0a 20 20 20 20 20 20 4d 65 6d 50 61 67 65 20  ;.      MemPage 
2b9d0 2a 70 54 3b 0a 20 20 20 20 20 20 74 20 3d 20 70  *pT;.      t = p
2b9e0 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20  gnoNew[i];.     
2b9f0 20 70 54 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a   pT = apNew[i];.
2ba00 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 69 5d        pgnoNew[i]
2ba10 20 3d 20 70 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d   = pgnoNew[minI]
2ba20 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 69 5d  ;.      apNew[i]
2ba30 20 3d 20 61 70 4e 65 77 5b 6d 69 6e 49 5d 3b 0a   = apNew[minI];.
2ba40 20 20 20 20 20 20 70 67 6e 6f 4e 65 77 5b 6d 69        pgnoNew[mi
2ba50 6e 49 5d 20 3d 20 74 3b 0a 20 20 20 20 20 20 61  nI] = t;.      a
2ba60 70 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 70 54 3b  pNew[minI] = pT;
2ba70 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 52 41  .    }.  }.  TRA
2ba80 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 6f 6c  CE(("BALANCE: ol
2ba90 64 3a 20 25 64 20 25 64 20 25 64 20 20 6e 65 77  d: %d %d %d  new
2baa0 3a 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  : %d(%d) %d(%d) 
2bab0 25 64 28 25 64 29 20 25 64 28 25 64 29 20 25 64  %d(%d) %d(%d) %d
2bac0 28 25 64 29 5c 6e 22 2c 0a 20 20 20 20 70 67 6e  (%d)\n",.    pgn
2bad0 6f 4f 6c 64 5b 30 5d 2c 20 0a 20 20 20 20 6e 4f  oOld[0], .    nO
2bae0 6c 64 3e 3d 32 20 3f 20 70 67 6e 6f 4f 6c 64 5b  ld>=2 ? pgnoOld[
2baf0 31 5d 20 3a 20 30 2c 0a 20 20 20 20 6e 4f 6c 64  1] : 0,.    nOld
2bb00 3e 3d 33 20 3f 20 70 67 6e 6f 4f 6c 64 5b 32 5d  >=3 ? pgnoOld[2]
2bb10 20 3a 20 30 2c 0a 20 20 20 20 70 67 6e 6f 4e 65   : 0,.    pgnoNe
2bb20 77 5b 30 5d 2c 20 73 7a 4e 65 77 5b 30 5d 2c 0a  w[0], szNew[0],.
2bb30 20 20 20 20 6e 4e 65 77 3e 3d 32 20 3f 20 70 67      nNew>=2 ? pg
2bb40 6e 6f 4e 65 77 5b 31 5d 20 3a 20 30 2c 20 6e 4e  noNew[1] : 0, nN
2bb50 65 77 3e 3d 32 20 3f 20 73 7a 4e 65 77 5b 31 5d  ew>=2 ? szNew[1]
2bb60 20 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d   : 0,.    nNew>=
2bb70 33 20 3f 20 70 67 6e 6f 4e 65 77 5b 32 5d 20 3a  3 ? pgnoNew[2] :
2bb80 20 30 2c 20 6e 4e 65 77 3e 3d 33 20 3f 20 73 7a   0, nNew>=3 ? sz
2bb90 4e 65 77 5b 32 5d 20 3a 20 30 2c 0a 20 20 20 20  New[2] : 0,.    
2bba0 6e 4e 65 77 3e 3d 34 20 3f 20 70 67 6e 6f 4e 65  nNew>=4 ? pgnoNe
2bbb0 77 5b 33 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d  w[3] : 0, nNew>=
2bbc0 34 20 3f 20 73 7a 4e 65 77 5b 33 5d 20 3a 20 30  4 ? szNew[3] : 0
2bbd0 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 35 20 3f 20  ,.    nNew>=5 ? 
2bbe0 70 67 6e 6f 4e 65 77 5b 34 5d 20 3a 20 30 2c 20  pgnoNew[4] : 0, 
2bbf0 6e 4e 65 77 3e 3d 35 20 3f 20 73 7a 4e 65 77 5b  nNew>=5 ? szNew[
2bc00 34 5d 20 3a 20 30 29 29 3b 0a 0a 20 20 2f 2a 0a  4] : 0));..  /*.
2bc10 20 20 2a 2a 20 45 76 65 6e 6c 79 20 64 69 73 74    ** Evenly dist
2bc20 72 69 62 75 74 65 20 74 68 65 20 64 61 74 61 20  ribute the data 
2bc30 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 61 63 72 6f  in apCell[] acro
2bc40 73 73 20 74 68 65 20 6e 65 77 20 70 61 67 65 73  ss the new pages
2bc50 2e 0a 20 20 2a 2a 20 49 6e 73 65 72 74 20 64 69  ..  ** Insert di
2bc60 76 69 64 65 72 20 63 65 6c 6c 73 20 69 6e 74 6f  vider cells into
2bc70 20 70 50 61 72 65 6e 74 20 61 73 20 6e 65 63 65   pParent as nece
2bc80 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20 20 6a 20  ssary..  */.  j 
2bc90 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  = 0;.  for(i=0; 
2bca0 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b 0a 20 20  i<nNew; i++){.  
2bcb0 20 20 2f 2a 20 41 73 73 65 6d 62 6c 65 20 74 68    /* Assemble th
2bcc0 65 20 6e 65 77 20 73 69 62 6c 69 6e 67 20 70 61  e new sibling pa
2bcd0 67 65 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61  ge. */.    MemPa
2bce0 67 65 20 2a 70 4e 65 77 20 3d 20 61 70 4e 65 77  ge *pNew = apNew
2bcf0 5b 69 5d 3b 0a 20 20 20 20 61 73 73 65 72 74 28  [i];.    assert(
2bd00 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a   j<nMaxCells );.
2bd10 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
2bd20 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 4e 65 77 5b  ->pgno==pgnoNew[
2bd30 69 5d 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61  i] );.    zeroPa
2bd40 67 65 28 70 4e 65 77 2c 20 70 61 67 65 46 6c 61  ge(pNew, pageFla
2bd50 67 73 29 3b 0a 20 20 20 20 61 73 73 65 6d 62 6c  gs);.    assembl
2bd60 65 50 61 67 65 28 70 4e 65 77 2c 20 63 6e 74 4e  ePage(pNew, cntN
2bd70 65 77 5b 69 5d 2d 6a 2c 20 26 61 70 43 65 6c 6c  ew[i]-j, &apCell
2bd80 5b 6a 5d 2c 20 26 73 7a 43 65 6c 6c 5b 6a 5d 29  [j], &szCell[j])
2bd90 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
2bda0 65 77 2d 3e 6e 43 65 6c 6c 3e 30 20 7c 7c 20 28  ew->nCell>0 || (
2bdb0 6e 4e 65 77 3d 3d 31 20 26 26 20 63 6e 74 4e 65  nNew==1 && cntNe
2bdc0 77 5b 30 5d 3d 3d 30 29 20 29 3b 0a 20 20 20 20  w[0]==0) );.    
2bdd0 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 4f  assert( pNew->nO
2bde0 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 0a 20  verflow==0 );.. 
2bdf0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
2be00 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
2be10 64 61 74 61 62 61 73 65 2c 20 75 70 64 61 74 65  database, update
2be20 20 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70   the pointer map
2be30 20 65 6e 74 72 69 65 73 0a 20 20 20 20 2a 2a 20   entries.    ** 
2be40 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 74 68  that point to th
2be50 65 20 73 69 62 6c 69 6e 67 73 20 74 68 61 74 20  e siblings that 
2be60 77 65 72 65 20 72 65 61 72 72 61 6e 67 65 64 2e  were rearranged.
2be70 20 54 68 65 73 65 20 63 61 6e 20 62 65 3a 20 6c   These can be: l
2be80 65 66 74 0a 20 20 20 20 2a 2a 20 63 68 69 6c 64  eft.    ** child
2be90 72 65 6e 20 6f 66 20 63 65 6c 6c 73 2c 20 74 68  ren of cells, th
2bea0 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66  e right-child of
2beb0 20 74 68 65 20 70 61 67 65 2c 20 6f 72 20 6f 76   the page, or ov
2bec0 65 72 66 6c 6f 77 20 70 61 67 65 73 0a 20 20 20  erflow pages.   
2bed0 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62   ** pointed to b
2bee0 79 20 63 65 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a  y cells..    */.
2bef0 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
2bf00 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 66 6f  CUUM ){.      fo
2bf10 72 28 6b 3d 6a 3b 20 6b 3c 63 6e 74 4e 65 77 5b  r(k=j; k<cntNew[
2bf20 69 5d 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; k++){.      
2bf30 20 20 61 73 73 65 72 74 28 20 6b 3c 6e 4d 61 78    assert( k<nMax
2bf40 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20 20 20  Cells );.       
2bf50 20 69 66 28 20 61 46 72 6f 6d 5b 6b 5d 3d 3d 30   if( aFrom[k]==0
2bf60 78 46 46 20 7c 7c 20 61 70 43 6f 70 79 5b 61 46  xFF || apCopy[aF
2bf70 72 6f 6d 5b 6b 5d 5d 2d 3e 70 67 6e 6f 21 3d 70  rom[k]]->pgno!=p
2bf80 4e 65 77 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  New->pgno ){.   
2bf90 20 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d         rc = ptrm
2bfa0 61 70 50 75 74 4f 76 66 6c 28 70 4e 65 77 2c 20  apPutOvfl(pNew, 
2bfb0 6b 2d 6a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  k-j);.          
2bfc0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2bfd0 4b 20 26 26 20 6c 65 61 66 43 6f 72 72 65 63 74  K && leafCorrect
2bfe0 69 6f 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ion==0 ){.      
2bff0 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
2c000 70 50 75 74 28 70 42 74 2c 20 67 65 74 34 62 79  pPut(pBt, get4by
2c010 74 65 28 61 70 43 65 6c 6c 5b 6b 5d 29 2c 20 50  te(apCell[k]), P
2c020 54 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e 65  TRMAP_BTREE, pNe
2c030 77 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  w->pgno);.      
2c040 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2c050 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2c060 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
2c070 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c   goto balance_cl
2c080 65 61 6e 75 70 3b 0a 20 20 20 20 20 20 20 20 20  eanup;.         
2c090 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2c0a0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2c0b0 6a 20 3d 20 63 6e 74 4e 65 77 5b 69 5d 3b 0a 0a  j = cntNew[i];..
2c0c0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 69      /* If the si
2c0d0 62 6c 69 6e 67 20 70 61 67 65 20 61 73 73 65 6d  bling page assem
2c0e0 62 6c 65 64 20 61 62 6f 76 65 20 77 61 73 20 6e  bled above was n
2c0f0 6f 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73  ot the right-mos
2c100 74 20 73 69 62 6c 69 6e 67 2c 0a 20 20 20 20 2a  t sibling,.    *
2c110 2a 20 69 6e 73 65 72 74 20 61 20 64 69 76 69 64  * insert a divid
2c120 65 72 20 63 65 6c 6c 20 69 6e 74 6f 20 74 68 65  er cell into the
2c130 20 70 61 72 65 6e 74 20 70 61 67 65 2e 0a 20 20   parent page..  
2c140 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 3c 6e    */.    if( i<n
2c150 4e 65 77 2d 31 20 26 26 20 6a 3c 6e 43 65 6c 6c  New-1 && j<nCell
2c160 20 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43   ){.      u8 *pC
2c170 65 6c 6c 3b 0a 20 20 20 20 20 20 75 38 20 2a 70  ell;.      u8 *p
2c180 54 65 6d 70 3b 0a 20 20 20 20 20 20 69 6e 74 20  Temp;.      int 
2c190 73 7a 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72  sz;..      asser
2c1a0 74 28 20 6a 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( j<nMaxCells )
2c1b0 3b 0a 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20  ;.      pCell = 
2c1c0 61 70 43 65 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20  apCell[j];.     
2c1d0 20 73 7a 20 3d 20 73 7a 43 65 6c 6c 5b 6a 5d 20   sz = szCell[j] 
2c1e0 2b 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  + leafCorrection
2c1f0 3b 0a 20 20 20 20 20 20 70 54 65 6d 70 20 3d 20  ;.      pTemp = 
2c200 26 61 53 70 61 63 65 32 5b 69 53 70 61 63 65 32  &aSpace2[iSpace2
2c210 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 4e  ];.      if( !pN
2c220 65 77 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ew->leaf ){.    
2c230 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77      memcpy(&pNew
2c240 2d 3e 61 44 61 74 61 5b 38 5d 2c 20 70 43 65 6c  ->aData[8], pCel
2c250 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 69  l, 4);.        i
2c260 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20  f( ISAUTOVACUUM 
2c270 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 61 46  .         && (aF
2c280 72 6f 6d 5b 6a 5d 3d 3d 30 78 46 46 20 7c 7c 20  rom[j]==0xFF || 
2c290 61 70 43 6f 70 79 5b 61 46 72 6f 6d 5b 6a 5d 5d  apCopy[aFrom[j]]
2c2a0 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67  ->pgno!=pNew->pg
2c2b0 6e 6f 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  no).        ){. 
2c2c0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74           rc = pt
2c2d0 72 6d 61 70 50 75 74 28 70 42 74 2c 20 67 65 74  rmapPut(pBt, get
2c2e0 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20 50 54  4byte(pCell), PT
2c2f0 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 4e 65 77  RMAP_BTREE, pNew
2c300 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20  ->pgno);.       
2c310 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2c320 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2c330 20 20 20 20 67 6f 74 6f 20 62 61 6c 61 6e 63 65      goto balance
2c340 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20 20 20  _cleanup;.      
2c350 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2c360 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2c370 6c 65 61 66 44 61 74 61 20 29 7b 0a 20 20 20 20  leafData ){.    
2c380 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 74 72      /* If the tr
2c390 65 65 20 69 73 20 61 20 6c 65 61 66 2d 64 61 74  ee is a leaf-dat
2c3a0 61 20 74 72 65 65 2c 20 61 6e 64 20 74 68 65 20  a tree, and the 
2c3b0 73 69 62 6c 69 6e 67 73 20 61 72 65 20 6c 65 61  siblings are lea
2c3c0 76 65 73 2c 20 0a 20 20 20 20 20 20 20 20 2a 2a  ves, .        **
2c3d0 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
2c3e0 6f 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  o divider cell i
2c3f0 6e 20 61 70 43 65 6c 6c 5b 5d 2e 20 49 6e 73 74  n apCell[]. Inst
2c400 65 61 64 2c 20 74 68 65 20 64 69 76 69 64 65 72  ead, the divider
2c410 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c   .        ** cel
2c420 6c 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 74 68  l consists of th
2c430 65 20 69 6e 74 65 67 65 72 20 6b 65 79 20 66 6f  e integer key fo
2c440 72 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  r the right-most
2c450 20 63 65 6c 6c 20 6f 66 20 0a 20 20 20 20 20 20   cell of .      
2c460 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69 6e 67    ** the sibling
2c470 2d 70 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20  -page assembled 
2c480 61 62 6f 76 65 20 6f 6e 6c 79 2e 0a 20 20 20 20  above only..    
2c490 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 43      */.        C
2c4a0 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20  ellInfo info;.  
2c4b0 20 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20        j--;.     
2c4c0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50     sqlite3BtreeP
2c4d0 61 72 73 65 43 65 6c 6c 50 74 72 28 70 4e 65 77  arseCellPtr(pNew
2c4e0 2c 20 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 69 6e  , apCell[j], &in
2c4f0 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 43 65  fo);.        pCe
2c500 6c 6c 20 3d 20 70 54 65 6d 70 3b 0a 20 20 20 20  ll = pTemp;.    
2c510 20 20 20 20 72 63 20 3d 20 66 69 6c 6c 49 6e 43      rc = fillInC
2c520 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 43 65  ell(pParent, pCe
2c530 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e 6e 4b 65 79  ll, 0, info.nKey
2c540 2c 20 30 2c 20 30 2c 20 30 2c 20 26 73 7a 29 3b  , 0, 0, 0, &sz);
2c550 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
2c560 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c570 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c          goto bal
2c580 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
2c590 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c5a0 70 54 65 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20  pTemp = 0;.     
2c5b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2c5c0 70 43 65 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20  pCell -= 4;.    
2c5d0 20 20 20 20 2f 2a 20 4f 62 73 63 75 72 65 20 63      /* Obscure c
2c5e0 61 73 65 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66  ase for non-leaf
2c5f0 2d 64 61 74 61 20 74 72 65 65 73 3a 20 49 66 20  -data trees: If 
2c600 74 68 65 20 63 65 6c 6c 20 61 74 20 70 43 65 6c  the cell at pCel
2c610 6c 20 77 61 73 0a 20 20 20 20 20 20 20 20 2a 2a  l was.        **
2c620 20 70 72 65 76 69 6f 75 73 6c 79 20 73 74 6f 72   previously stor
2c630 65 64 20 6f 6e 20 61 20 6c 65 61 66 20 6e 6f 64  ed on a leaf nod
2c640 65 2c 20 61 6e 64 20 69 74 73 20 72 65 70 6f 72  e, and its repor
2c650 74 65 64 20 73 69 7a 65 20 77 61 73 20 34 0a 20  ted size was 4. 
2c660 20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 2c         ** bytes,
2c670 20 74 68 65 6e 20 69 74 20 6d 61 79 20 61 63 74   then it may act
2c680 75 61 6c 6c 79 20 62 65 20 73 6d 61 6c 6c 65 72  ually be smaller
2c690 20 74 68 61 6e 20 74 68 69 73 20 0a 20 20 20 20   than this .    
2c6a0 20 20 20 20 2a 2a 20 28 73 65 65 20 73 71 6c 69      ** (see sqli
2c6b0 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
2c6c0 6c 50 74 72 28 29 2c 20 34 20 62 79 74 65 73 20  lPtr(), 4 bytes 
2c6d0 69 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 73  is the minimum s
2c6e0 69 7a 65 20 6f 66 0a 20 20 20 20 20 20 20 20 2a  ize of.        *
2c6f0 2a 20 61 6e 79 20 63 65 6c 6c 29 2e 20 42 75 74  * any cell). But
2c700 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   it is important
2c710 20 74 6f 20 70 61 73 73 20 74 68 65 20 63 6f 72   to pass the cor
2c720 72 65 63 74 20 73 69 7a 65 20 74 6f 20 0a 20 20  rect size to .  
2c730 20 20 20 20 20 20 2a 2a 20 69 6e 73 65 72 74 43        ** insertC
2c740 65 6c 6c 28 29 2c 20 73 6f 20 72 65 70 61 72 73  ell(), so repars
2c750 65 20 74 68 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a  e the cell now..
2c760 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
2c770 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
2c780 74 68 69 73 20 63 61 6e 20 6e 65 76 65 72 20 68  this can never h
2c790 61 70 70 65 6e 20 69 6e 20 61 6e 20 53 51 4c 69  appen in an SQLi
2c7a0 74 65 20 64 61 74 61 20 66 69 6c 65 2c 20 61 73  te data file, as
2c7b0 20 61 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20   all.        ** 
2c7c0 63 65 6c 6c 73 20 61 72 65 20 61 74 20 6c 65 61  cells are at lea
2c7d0 73 74 20 34 20 62 79 74 65 73 2e 20 49 74 20 6f  st 4 bytes. It o
2c7e0 6e 6c 79 20 68 61 70 70 65 6e 73 20 69 6e 20 62  nly happens in b
2c7f0 2d 74 72 65 65 73 20 75 73 65 64 0a 20 20 20 20  -trees used.    
2c800 20 20 20 20 2a 2a 20 74 6f 20 65 76 61 6c 75 61      ** to evalua
2c810 74 65 20 22 49 4e 20 28 53 45 4c 45 43 54 20 2e  te "IN (SELECT .
2c820 2e 2e 29 22 20 61 6e 64 20 73 69 6d 69 6c 61 72  ..)" and similar
2c830 20 63 6c 61 75 73 65 73 2e 0a 20 20 20 20 20 20   clauses..      
2c840 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
2c850 20 73 7a 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b   szCell[j]==4 ){
2c860 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
2c870 74 28 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e  t(leafCorrection
2c880 3d 3d 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ==4);.          
2c890 73 7a 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  sz = cellSizePtr
2c8a0 28 70 50 61 72 65 6e 74 2c 20 70 43 65 6c 6c 29  (pParent, pCell)
2c8b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2c8c0 20 20 7d 0a 20 20 20 20 20 20 69 53 70 61 63 65    }.      iSpace
2c8d0 32 20 2b 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61  2 += sz;.      a
2c8e0 73 73 65 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e  ssert( sz<=pBt->
2c8f0 70 61 67 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20  pageSize/4 );.  
2c900 20 20 20 20 61 73 73 65 72 74 28 20 69 53 70 61      assert( iSpa
2c910 63 65 32 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69  ce2<=pBt->pageSi
2c920 7a 65 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ze );.      rc =
2c930 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 72   insertCell(pPar
2c940 65 6e 74 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c  ent, nxDiv, pCel
2c950 6c 2c 20 73 7a 2c 20 70 54 65 6d 70 2c 20 34 29  l, sz, pTemp, 4)
2c960 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
2c970 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
2c980 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70   balance_cleanup
2c990 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2c9a0 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2c9b0 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d  iteable(pParent-
2c9c0 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 20  >pDbPage) );.   
2c9d0 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64     put4byte(find
2c9e0 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61  OverflowCell(pPa
2c9f0 72 65 6e 74 2c 6e 78 44 69 76 29 2c 20 70 4e 65  rent,nxDiv), pNe
2ca00 77 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 20  w->pgno);..     
2ca10 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
2ca20 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  n auto-vacuum da
2ca30 74 61 62 61 73 65 2c 20 61 6e 64 20 6e 6f 74 20  tabase, and not 
2ca40 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65  a leaf-data tree
2ca50 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20  ,.      ** then 
2ca60 75 70 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74  update the point
2ca70 65 72 20 6d 61 70 20 77 69 74 68 20 61 6e 20 65  er map with an e
2ca80 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65  ntry for the ove
2ca90 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20 20 20  rflow page.     
2caa0 20 2a 2a 20 74 68 61 74 20 74 68 65 20 63 65 6c   ** that the cel
2cab0 6c 20 6a 75 73 74 20 69 6e 73 65 72 74 65 64 20  l just inserted 
2cac0 70 6f 69 6e 74 73 20 74 6f 20 28 69 66 20 61 6e  points to (if an
2cad0 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  y)..      */.   
2cae0 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43     if( ISAUTOVAC
2caf0 55 55 4d 20 26 26 20 21 6c 65 61 66 44 61 74 61  UUM && !leafData
2cb00 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2cb10 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 70   ptrmapPutOvfl(p
2cb20 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 29 3b 0a  Parent, nxDiv);.
2cb30 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2cb40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2cb50 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61 6c 61         goto bala
2cb60 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20  nce_cleanup;.   
2cb70 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2cb80 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20 20       j++;.      
2cb90 6e 78 44 69 76 2b 2b 3b 0a 20 20 20 20 7d 0a 0a  nxDiv++;.    }..
2cba0 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 70      /* Set the p
2cbb0 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79  ointer-map entry
2cbc0 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73 69 62   for the new sib
2cbd0 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a 20 20  ling page. */.  
2cbe0 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
2cbf0 55 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  UM ){.      rc =
2cc00 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
2cc10 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d  pNew->pgno, PTRM
2cc20 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72 65 6e  AP_BTREE, pParen
2cc30 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  t->pgno);.      
2cc40 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2cc50 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
2cc60 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
2cc70 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  p;.      }.    }
2cc80 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6a  .  }.  assert( j
2cc90 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73 73  ==nCell );.  ass
2cca0 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b 0a 20  ert( nOld>0 );. 
2ccb0 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e 30 20   assert( nNew>0 
2ccc0 29 3b 0a 20 20 69 66 28 20 28 70 61 67 65 46 6c  );.  if( (pageFl
2ccd0 61 67 73 20 26 20 50 54 46 5f 4c 45 41 46 29 3d  ags & PTF_LEAF)=
2cce0 3d 30 20 29 7b 0a 20 20 20 20 75 38 20 2a 7a 43  =0 ){.    u8 *zC
2ccf0 68 69 6c 64 20 3d 20 26 61 70 43 6f 70 79 5b 6e  hild = &apCopy[n
2cd00 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b 38 5d  Old-1]->aData[8]
2cd10 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 61 70  ;.    memcpy(&ap
2cd20 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61 44 61  New[nNew-1]->aDa
2cd30 74 61 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c 20 34  ta[8], zChild, 4
2cd40 29 3b 0a 20 20 20 20 69 66 28 20 49 53 41 55 54  );.    if( ISAUT
2cd50 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 20  OVACUUM ){.     
2cd60 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
2cd70 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 7a 43  pBt, get4byte(zC
2cd80 68 69 6c 64 29 2c 20 50 54 52 4d 41 50 5f 42 54  hild), PTRMAP_BT
2cd90 52 45 45 2c 20 61 70 4e 65 77 5b 6e 4e 65 77 2d  REE, apNew[nNew-
2cda0 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  1]->pgno);.     
2cdb0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2cdc0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
2cdd0 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e  to balance_clean
2cde0 75 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  up;.      }.    
2cdf0 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
2ce00 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
2ce10 69 74 65 61 62 6c 65 28 70 50 61 72 65 6e 74 2d  iteable(pParent-
2ce20 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20 69  >pDbPage) );.  i
2ce30 66 28 20 6e 78 44 69 76 3d 3d 70 50 61 72 65 6e  f( nxDiv==pParen
2ce40 74 2d 3e 6e 43 65 6c 6c 2b 70 50 61 72 65 6e 74  t->nCell+pParent
2ce50 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20  ->nOverflow ){. 
2ce60 20 20 20 2f 2a 20 52 69 67 68 74 2d 6d 6f 73 74     /* Right-most
2ce70 20 73 69 62 6c 69 6e 67 20 69 73 20 74 68 65 20   sibling is the 
2ce80 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64  right-most child
2ce90 20 6f 66 20 70 50 61 72 65 6e 74 20 2a 2f 0a 20   of pParent */. 
2cea0 20 20 20 70 75 74 34 62 79 74 65 28 26 70 50 61     put4byte(&pPa
2ceb0 72 65 6e 74 2d 3e 61 44 61 74 61 5b 70 50 61 72  rent->aData[pPar
2cec0 65 6e 74 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  ent->hdrOffset+8
2ced0 5d 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d  ], pgnoNew[nNew-
2cee0 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  1]);.  }else{.  
2cef0 20 20 2f 2a 20 52 69 67 68 74 2d 6d 6f 73 74 20    /* Right-most 
2cf00 73 69 62 6c 69 6e 67 20 69 73 20 74 68 65 20 6c  sibling is the l
2cf10 65 66 74 20 63 68 69 6c 64 20 6f 66 20 74 68 65  eft child of the
2cf20 20 66 69 72 73 74 20 65 6e 74 72 79 20 69 6e 20   first entry in 
2cf30 70 50 61 72 65 6e 74 0a 20 20 20 20 2a 2a 20 70  pParent.    ** p
2cf40 61 73 74 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  ast the right-mo
2cf50 73 74 20 64 69 76 69 64 65 72 20 65 6e 74 72 79  st divider entry
2cf60 20 2a 2f 0a 20 20 20 20 70 75 74 34 62 79 74 65   */.    put4byte
2cf70 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c  (findOverflowCel
2cf80 6c 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76  l(pParent, nxDiv
2cf90 29 2c 20 70 67 6e 6f 4e 65 77 5b 6e 4e 65 77 2d  ), pgnoNew[nNew-
2cfa0 31 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  1]);.  }..  /*. 
2cfb0 20 2a 2a 20 42 61 6c 61 6e 63 65 20 74 68 65 20   ** Balance the 
2cfc0 70 61 72 65 6e 74 20 70 61 67 65 2e 20 20 4e 6f  parent page.  No
2cfd0 74 65 20 74 68 61 74 20 74 68 65 20 63 75 72 72  te that the curr
2cfe0 65 6e 74 20 70 61 67 65 20 28 70 50 61 67 65 29  ent page (pPage)
2cff0 20 6d 69 67 68 74 0a 20 20 2a 2a 20 68 61 76 65   might.  ** have
2d000 20 62 65 65 6e 20 61 64 64 65 64 20 74 6f 20 74   been added to t
2d010 68 65 20 66 72 65 65 6c 69 73 74 20 73 6f 20 69  he freelist so i
2d020 74 20 6d 69 67 68 74 20 6e 6f 20 6c 6f 6e 67 65  t might no longe
2d030 72 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  r be initialized
2d040 2e 0a 20 20 2a 2a 20 42 75 74 20 74 68 65 20 70  ..  ** But the p
2d050 61 72 65 6e 74 20 70 61 67 65 20 77 69 6c 6c 20  arent page will 
2d060 61 6c 77 61 79 73 20 62 65 20 69 6e 69 74 69 61  always be initia
2d070 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73  lized..  */.  as
2d080 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 69  sert( pParent->i
2d090 73 49 6e 69 74 20 29 3b 0a 20 20 73 71 6c 69 74  sInit );.  sqlit
2d0a0 65 33 53 63 72 61 74 63 68 46 72 65 65 28 61 70  e3ScratchFree(ap
2d0b0 43 65 6c 6c 29 3b 0a 20 20 61 70 43 65 6c 6c 20  Cell);.  apCell 
2d0c0 3d 20 30 3b 0a 20 20 54 52 41 43 45 28 28 22 42  = 0;.  TRACE(("B
2d0d0 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68 65 64  ALANCE: finished
2d0e0 20 77 69 74 68 20 25 64 3a 20 6f 6c 64 3d 25 64   with %d: old=%d
2d0f0 20 6e 65 77 3d 25 64 20 63 65 6c 6c 73 3d 25 64   new=%d cells=%d
2d100 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70  \n",.          p
2d110 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 6e 4f 6c 64  Page->pgno, nOld
2d120 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29 3b  , nNew, nCell));
2d130 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  .  pPage->nOverf
2d140 6c 6f 77 20 3d 20 30 3b 0a 20 20 72 65 6c 65 61  low = 0;.  relea
2d150 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  sePage(pPage);. 
2d160 20 70 43 75 72 2d 3e 69 50 61 67 65 2d 2d 3b 0a   pCur->iPage--;.
2d170 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 70    rc = balance(p
2d180 43 75 72 2c 20 30 29 3b 0a 20 20 0a 20 20 2f 2a  Cur, 0);.  .  /*
2d190 0a 20 20 2a 2a 20 43 6c 65 61 6e 75 70 20 62 65  .  ** Cleanup be
2d1a0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
2d1b0 20 20 2a 2f 0a 62 61 6c 61 6e 63 65 5f 63 6c 65    */.balance_cle
2d1c0 61 6e 75 70 3a 0a 20 20 73 71 6c 69 74 65 33 50  anup:.  sqlite3P
2d1d0 61 67 65 46 72 65 65 28 61 53 70 61 63 65 32 29  ageFree(aSpace2)
2d1e0 3b 0a 20 20 73 71 6c 69 74 65 33 53 63 72 61 74  ;.  sqlite3Scrat
2d1f0 63 68 46 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a  chFree(apCell);.
2d200 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4f 6c    for(i=0; i<nOl
2d210 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c  d; i++){.    rel
2d220 65 61 73 65 50 61 67 65 28 61 70 4f 6c 64 5b 69  easePage(apOld[i
2d230 5d 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  ]);.  }.  for(i=
2d240 30 3b 20 69 3c 6e 4e 65 77 3b 20 69 2b 2b 29 7b  0; i<nNew; i++){
2d250 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65  .    releasePage
2d260 28 61 70 4e 65 77 5b 69 5d 29 3b 0a 20 20 7d 0a  (apNew[i]);.  }.
2d270 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70    pCur->apPage[p
2d280 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 4f 76  Cur->iPage]->nOv
2d290 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a 20 20 72  erflow = 0;..  r
2d2a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2d2b0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2d2c0 69 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68  is called for th
2d2d0 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20 61  e root page of a
2d2e0 20 62 74 72 65 65 20 77 68 65 6e 20 74 68 65 20   btree when the 
2d2f0 72 6f 6f 74 0a 2a 2a 20 70 61 67 65 20 63 6f 6e  root.** page con
2d300 74 61 69 6e 73 20 6e 6f 20 63 65 6c 6c 73 2e 20  tains no cells. 
2d310 20 54 68 69 73 20 69 73 20 61 6e 20 6f 70 70 6f   This is an oppo
2d320 72 74 75 6e 69 74 79 20 74 6f 20 6d 61 6b 65 20  rtunity to make 
2d330 74 68 65 20 74 72 65 65 0a 2a 2a 20 73 68 61 6c  the tree.** shal
2d340 6c 6f 77 65 72 20 62 79 20 6f 6e 65 20 6c 65 76  lower by one lev
2d350 65 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  el..*/.static in
2d360 74 20 62 61 6c 61 6e 63 65 5f 73 68 61 6c 6c 6f  t balance_shallo
2d370 77 65 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  wer(BtCursor *pC
2d380 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  ur){.  MemPage *
2d390 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  pPage;          
2d3a0 20 20 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65      /* Root page
2d3b0 20 6f 66 20 42 2d 54 72 65 65 20 2a 2f 0a 20 20   of B-Tree */.  
2d3c0 4d 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 3b  MemPage *pChild;
2d3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2d3e0 54 68 65 20 6f 6e 6c 79 20 63 68 69 6c 64 20 70  The only child p
2d3f0 61 67 65 20 6f 66 20 70 50 61 67 65 20 2a 2f 0a  age of pPage */.
2d400 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68 69 6c 64    Pgno pgnoChild
2d410 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2d420 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  * Page number fo
2d430 72 20 70 43 68 69 6c 64 20 2a 2f 0a 20 20 69 6e  r pChild */.  in
2d440 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2d450 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  ;          /* Re
2d460 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73  turn code from s
2d470 75 62 70 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a  ubprocedures */.
2d480 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
2d490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d4a0 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 42 54    /* The main BT
2d4b0 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
2d4c0 0a 20 20 69 6e 74 20 6d 78 43 65 6c 6c 50 65 72  .  int mxCellPer
2d4d0 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
2d4e0 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  /* Maximum numbe
2d4f0 72 20 6f 66 20 63 65 6c 6c 73 20 70 65 72 20 70  r of cells per p
2d500 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 2a 61 70  age */.  u8 **ap
2d510 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  Cell;           
2d520 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 63 65 6c        /* All cel
2d530 6c 73 20 66 72 6f 6d 20 70 61 67 65 73 20 62 65  ls from pages be
2d540 69 6e 67 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a  ing balanced */.
2d550 20 20 75 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20    u16 *szCell;  
2d560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2d570 2a 20 4c 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20  * Local size of 
2d580 61 6c 6c 20 63 65 6c 6c 73 20 2a 2f 0a 0a 20 20  all cells */..  
2d590 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
2d5a0 61 67 65 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67  age==0 );.  pPag
2d5b0 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
2d5c0 5b 30 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  [0];..  assert( 
2d5d0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20  pPage->nCell==0 
2d5e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
2d5f0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
2d600 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
2d610 78 29 20 29 3b 0a 20 20 70 42 74 20 3d 20 70 50  x) );.  pBt = pP
2d620 61 67 65 2d 3e 70 42 74 3b 0a 20 20 6d 78 43 65  age->pBt;.  mxCe
2d630 6c 6c 50 65 72 50 61 67 65 20 3d 20 4d 58 5f 43  llPerPage = MX_C
2d640 45 4c 4c 28 70 42 74 29 3b 0a 20 20 61 70 43 65  ELL(pBt);.  apCe
2d650 6c 6c 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ll = sqlite3Mall
2d660 6f 63 28 20 6d 78 43 65 6c 6c 50 65 72 50 61 67  oc( mxCellPerPag
2d670 65 2a 28 73 69 7a 65 6f 66 28 75 38 2a 29 2b 73  e*(sizeof(u8*)+s
2d680 69 7a 65 6f 66 28 75 31 36 29 29 20 29 3b 0a 20  izeof(u16)) );. 
2d690 20 69 66 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29   if( apCell==0 )
2d6a0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2d6b0 4f 4d 45 4d 3b 0a 20 20 73 7a 43 65 6c 6c 20 3d  OMEM;.  szCell =
2d6c0 20 28 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6d   (u16*)&apCell[m
2d6d0 78 43 65 6c 6c 50 65 72 50 61 67 65 5d 3b 0a 20  xCellPerPage];. 
2d6e0 20 69 66 28 20 70 50 61 67 65 2d 3e 6c 65 61 66   if( pPage->leaf
2d6f0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 74   ){.    /* The t
2d700 61 62 6c 65 20 69 73 20 63 6f 6d 70 6c 65 74 65  able is complete
2d710 6c 79 20 65 6d 70 74 79 20 2a 2f 0a 20 20 20 20  ly empty */.    
2d720 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
2d730 20 65 6d 70 74 79 20 74 61 62 6c 65 20 25 64 5c   empty table %d\
2d740 6e 22 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29  n", pPage->pgno)
2d750 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
2d760 2f 2a 20 54 68 65 20 72 6f 6f 74 20 70 61 67 65  /* The root page
2d770 20 69 73 20 65 6d 70 74 79 20 62 75 74 20 68 61   is empty but ha
2d780 73 20 6f 6e 65 20 63 68 69 6c 64 2e 20 20 54 72  s one child.  Tr
2d790 61 6e 73 66 65 72 20 74 68 65 0a 20 20 20 20 2a  ansfer the.    *
2d7a0 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  * information fr
2d7b0 6f 6d 20 74 68 61 74 20 6f 6e 65 20 63 68 69 6c  om that one chil
2d7c0 64 20 69 6e 74 6f 20 74 68 65 20 72 6f 6f 74 20  d into the root 
2d7d0 70 61 67 65 20 69 66 20 69 74 20 0a 20 20 20 20  page if it .    
2d7e0 2a 2a 20 77 69 6c 6c 20 66 69 74 2e 20 20 54 68  ** will fit.  Th
2d7f0 69 73 20 72 65 64 75 63 65 73 20 74 68 65 20 64  is reduces the d
2d800 65 70 74 68 20 6f 66 20 74 68 65 20 74 72 65 65  epth of the tree
2d810 20 62 79 20 6f 6e 65 2e 0a 20 20 20 20 2a 2a 0a   by one..    **.
2d820 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 72 6f      ** If the ro
2d830 6f 74 20 70 61 67 65 20 69 73 20 70 61 67 65 20  ot page is page 
2d840 31 2c 20 69 74 20 68 61 73 20 6c 65 73 73 20 73  1, it has less s
2d850 70 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 74  pace available t
2d860 68 61 6e 0a 20 20 20 20 2a 2a 20 69 74 73 20 63  han.    ** its c
2d870 68 69 6c 64 20 28 64 75 65 20 74 6f 20 74 68 65  hild (due to the
2d880 20 31 30 30 20 62 79 74 65 20 68 65 61 64 65 72   100 byte header
2d890 20 74 68 61 74 20 6f 63 63 75 72 73 20 61 74 20   that occurs at 
2d8a0 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  the beginning.  
2d8b0 20 20 2a 2a 20 6f 66 20 74 68 65 20 64 61 74 61    ** of the data
2d8c0 62 61 73 65 20 66 6c 65 29 2c 20 73 6f 20 69 74  base fle), so it
2d8d0 20 6d 69 67 68 74 20 6e 6f 74 20 62 65 20 61 62   might not be ab
2d8e0 6c 65 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20 6f  le to hold all o
2d8f0 66 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 69 6e  f the .    ** in
2d900 66 6f 72 6d 61 74 69 6f 6e 20 63 75 72 72 65 6e  formation curren
2d910 74 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e  tly contained in
2d920 20 74 68 65 20 63 68 69 6c 64 2e 20 20 49 66 20   the child.  If 
2d930 74 68 69 73 20 69 73 20 74 68 65 20 0a 20 20 20  this is the .   
2d940 20 2a 2a 20 63 61 73 65 2c 20 74 68 65 6e 20 64   ** case, then d
2d950 6f 20 6e 6f 74 20 64 6f 20 74 68 65 20 74 72 61  o not do the tra
2d960 6e 73 66 65 72 2e 20 20 4c 65 61 76 65 20 70 61  nsfer.  Leave pa
2d970 67 65 20 31 20 65 6d 70 74 79 20 65 78 63 65 70  ge 1 empty excep
2d980 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65  t.    ** for the
2d990 20 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20 74   right-pointer t
2d9a0 6f 20 74 68 65 20 63 68 69 6c 64 20 70 61 67 65  o the child page
2d9b0 2e 20 20 54 68 65 20 63 68 69 6c 64 20 70 61 67  .  The child pag
2d9c0 65 20 62 65 63 6f 6d 65 73 0a 20 20 20 20 2a 2a  e becomes.    **
2d9d0 20 74 68 65 20 76 69 72 74 75 61 6c 20 72 6f 6f   the virtual roo
2d9e0 74 20 6f 66 20 74 68 65 20 74 72 65 65 2e 0a 20  t of the tree.. 
2d9f0 20 20 20 2a 2f 0a 20 20 20 20 56 56 41 5f 4f 4e     */.    VVA_ON
2da00 4c 59 28 20 70 43 75 72 2d 3e 70 61 67 65 73 53  LY( pCur->pagesS
2da10 68 75 66 66 6c 65 64 20 3d 20 31 20 29 3b 0a 20  huffled = 1 );. 
2da20 20 20 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67     pgnoChild = g
2da30 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
2da40 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
2da50 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
2da60 61 73 73 65 72 74 28 20 70 67 6e 6f 43 68 69 6c  assert( pgnoChil
2da70 64 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72  d>0 );.    asser
2da80 74 28 20 70 67 6e 6f 43 68 69 6c 64 3c 3d 70 61  t( pgnoChild<=pa
2da90 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
2daa0 67 65 2d 3e 70 42 74 29 20 29 3b 0a 20 20 20 20  ge->pBt) );.    
2dab0 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
2dac0 65 47 65 74 50 61 67 65 28 70 50 61 67 65 2d 3e  eGetPage(pPage->
2dad0 70 42 74 2c 20 70 67 6e 6f 43 68 69 6c 64 2c 20  pBt, pgnoChild, 
2dae0 26 70 43 68 69 6c 64 2c 20 30 29 3b 0a 20 20 20  &pChild, 0);.   
2daf0 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 65   if( rc ) goto e
2db00 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e  nd_shallow_balan
2db10 63 65 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ce;.    if( pPag
2db20 65 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  e->pgno==1 ){.  
2db30 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2db40 42 74 72 65 65 49 6e 69 74 50 61 67 65 28 70 43  BtreeInitPage(pC
2db50 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 69 66 28  hild);.      if(
2db60 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73   rc ) goto end_s
2db70 68 61 6c 6c 6f 77 5f 62 61 6c 61 6e 63 65 3b 0a  hallow_balance;.
2db80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 43        assert( pC
2db90 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  hild->nOverflow=
2dba0 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =0 );.      if( 
2dbb0 70 43 68 69 6c 64 2d 3e 6e 46 72 65 65 3e 3d 31  pChild->nFree>=1
2dbc0 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  00 ){.        /*
2dbd0 20 54 68 65 20 63 68 69 6c 64 20 69 6e 66 6f 72   The child infor
2dbe0 6d 61 74 69 6f 6e 20 77 69 6c 6c 20 66 69 74 20  mation will fit 
2dbf0 6f 6e 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  on the root page
2dc00 2c 20 73 6f 20 64 6f 20 74 68 65 0a 20 20 20 20  , so do the.    
2dc10 20 20 20 20 2a 2a 20 63 6f 70 79 20 2a 2f 0a 20      ** copy */. 
2dc20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
2dc30 20 20 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70        zeroPage(p
2dc40 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44  Page, pChild->aD
2dc50 61 74 61 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20  ata[0]);.       
2dc60 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 43 68 69   for(i=0; i<pChi
2dc70 6c 64 2d 3e 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ld->nCell; i++){
2dc80 0a 20 20 20 20 20 20 20 20 20 20 61 70 43 65 6c  .          apCel
2dc90 6c 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c 6c 28  l[i] = findCell(
2dca0 70 43 68 69 6c 64 2c 69 29 3b 0a 20 20 20 20 20  pChild,i);.     
2dcb0 20 20 20 20 20 73 7a 43 65 6c 6c 5b 69 5d 20 3d       szCell[i] =
2dcc0 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 43 68   cellSizePtr(pCh
2dcd0 69 6c 64 2c 20 61 70 43 65 6c 6c 5b 69 5d 29 3b  ild, apCell[i]);
2dce0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2dcf0 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28     assemblePage(
2dd00 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 6e  pPage, pChild->n
2dd10 43 65 6c 6c 2c 20 61 70 43 65 6c 6c 2c 20 73 7a  Cell, apCell, sz
2dd20 43 65 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 2f  Cell);.        /
2dd30 2a 20 43 6f 70 79 20 74 68 65 20 72 69 67 68 74  * Copy the right
2dd40 2d 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20  -pointer of the 
2dd50 63 68 69 6c 64 20 74 6f 20 74 68 65 20 70 61 72  child to the par
2dd60 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ent. */.        
2dd70 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
2dd80 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2dd90 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
2dda0 29 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62  );.        put4b
2ddb0 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2ddc0 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
2ddd0 65 74 2b 38 5d 2c 20 0a 20 20 20 20 20 20 20 20  et+8], .        
2dde0 20 20 20 20 67 65 74 34 62 79 74 65 28 26 70 43      get4byte(&pC
2ddf0 68 69 6c 64 2d 3e 61 44 61 74 61 5b 70 43 68 69  hild->aData[pChi
2de00 6c 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ld->hdrOffset+8]
2de10 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
2de20 20 66 72 65 65 50 61 67 65 28 70 43 68 69 6c 64   freePage(pChild
2de30 29 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  );.        TRACE
2de40 28 28 22 42 41 4c 41 4e 43 45 3a 20 63 68 69 6c  (("BALANCE: chil
2de50 64 20 25 64 20 74 72 61 6e 73 66 65 72 20 74 6f  d %d transfer to
2de60 20 70 61 67 65 20 31 5c 6e 22 2c 20 70 43 68 69   page 1\n", pChi
2de70 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  ld->pgno));.    
2de80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2de90 20 2f 2a 20 54 68 65 20 63 68 69 6c 64 20 68 61   /* The child ha
2dea0 73 20 6d 6f 72 65 20 69 6e 66 6f 72 6d 61 74 69  s more informati
2deb0 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 66 69 74  on that will fit
2dec0 20 6f 6e 20 74 68 65 20 72 6f 6f 74 2e 0a 20 20   on the root..  
2ded0 20 20 20 20 20 20 2a 2a 20 54 68 65 20 74 72 65        ** The tre
2dee0 65 20 69 73 20 61 6c 72 65 61 64 79 20 62 61 6c  e is already bal
2def0 61 6e 63 65 64 2e 20 20 44 6f 20 6e 6f 74 68 69  anced.  Do nothi
2df00 6e 67 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 54  ng. */.        T
2df10 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20  RACE(("BALANCE: 
2df20 63 68 69 6c 64 20 25 64 20 77 69 6c 6c 20 6e 6f  child %d will no
2df30 74 20 66 69 74 20 6f 6e 20 70 61 67 65 20 31 5c  t fit on page 1\
2df40 6e 22 2c 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f  n", pChild->pgno
2df50 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
2df60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d  }else{.      mem
2df70 63 70 79 28 70 50 61 67 65 2d 3e 61 44 61 74 61  cpy(pPage->aData
2df80 2c 20 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 2c  , pChild->aData,
2df90 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61   pPage->pBt->usa
2dfa0 62 6c 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  bleSize);.      
2dfb0 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
2dfc0 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
2dfd0 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
2dfe0 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ge(pPage);.     
2dff0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
2e000 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20  ITE_OK );.      
2e010 66 72 65 65 50 61 67 65 28 70 43 68 69 6c 64 29  freePage(pChild)
2e020 3b 0a 20 20 20 20 20 20 54 52 41 43 45 28 28 22  ;.      TRACE(("
2e030 42 41 4c 41 4e 43 45 3a 20 74 72 61 6e 73 66 65  BALANCE: transfe
2e040 72 20 63 68 69 6c 64 20 25 64 20 69 6e 74 6f 20  r child %d into 
2e050 72 6f 6f 74 20 25 64 5c 6e 22 2c 0a 20 20 20 20  root %d\n",.    
2e060 20 20 20 20 20 20 20 20 20 20 70 43 68 69 6c 64            pChild
2e070 2d 3e 70 67 6e 6f 2c 20 70 50 61 67 65 2d 3e 70  ->pgno, pPage->p
2e080 67 6e 6f 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  gno));.    }.   
2e090 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
2e0a0 6e 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a  nOverflow==0 );.
2e0b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2e0c0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
2e0d0 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43     if( ISAUTOVAC
2e0e0 55 55 4d 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  UUM && rc==SQLIT
2e0f0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
2e100 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61   = setChildPtrma
2e110 70 73 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d  ps(pPage);.    }
2e120 0a 23 65 6e 64 69 66 0a 20 20 20 20 72 65 6c 65  .#endif.    rele
2e130 61 73 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b  asePage(pChild);
2e140 0a 20 20 7d 0a 65 6e 64 5f 73 68 61 6c 6c 6f 77  .  }.end_shallow
2e150 5f 62 61 6c 61 6e 63 65 3a 0a 20 20 73 71 6c 69  _balance:.  sqli
2e160 74 65 33 5f 66 72 65 65 28 61 70 43 65 6c 6c 29  te3_free(apCell)
2e170 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
2e180 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f  .../*.** The roo
2e190 74 20 70 61 67 65 20 69 73 20 6f 76 65 72 66 75  t page is overfu
2e1a0 6c 6c 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  ll.**.** When th
2e1b0 69 73 20 68 61 70 70 65 6e 73 2c 20 43 72 65 61  is happens, Crea
2e1c0 74 65 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70  te a new child p
2e1d0 61 67 65 20 61 6e 64 20 63 6f 70 79 20 74 68 65  age and copy the
2e1e0 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  .** contents of 
2e1f0 74 68 65 20 72 6f 6f 74 20 69 6e 74 6f 20 74 68  the root into th
2e200 65 20 63 68 69 6c 64 2e 20 20 54 68 65 6e 20 6d  e child.  Then m
2e210 61 6b 65 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20  ake the root.** 
2e220 70 61 67 65 20 61 6e 20 65 6d 70 74 79 20 70 61  page an empty pa
2e230 67 65 20 77 69 74 68 20 72 69 67 68 74 43 68 69  ge with rightChi
2e240 6c 64 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74  ld pointing to t
2e250 68 65 20 6e 65 77 0a 2a 2a 20 63 68 69 6c 64 2e  he new.** child.
2e260 20 20 20 46 69 6e 61 6c 6c 79 2c 20 63 61 6c 6c     Finally, call
2e270 20 62 61 6c 61 6e 63 65 5f 69 6e 74 65 72 6e 61   balance_interna
2e280 6c 28 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 63  l() on the new c
2e290 68 69 6c 64 0a 2a 2a 20 74 6f 20 63 61 75 73 65  hild.** to cause
2e2a0 20 69 74 20 74 6f 20 73 70 6c 69 74 2e 0a 2a 2f   it to split..*/
2e2b0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
2e2c0 6e 63 65 5f 64 65 65 70 65 72 28 42 74 43 75 72  nce_deeper(BtCur
2e2d0 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e  sor *pCur){.  in
2e2e0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
2e2f0 20 20 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75    /* Return valu
2e300 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65 64  e from subproced
2e310 75 72 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ures */.  MemPag
2e320 65 20 2a 70 50 61 67 65 3b 20 20 20 20 20 2f 2a  e *pPage;     /*
2e330 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
2e340 72 6f 6f 74 20 70 61 67 65 20 2a 2f 0a 20 20 4d  root page */.  M
2e350 65 6d 50 61 67 65 20 2a 70 43 68 69 6c 64 3b 20  emPage *pChild; 
2e360 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
2e370 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67   a new child pag
2e380 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
2e390 43 68 69 6c 64 3b 20 20 20 20 20 2f 2a 20 50 61  Child;     /* Pa
2e3a0 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
2e3b0 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20   new child page 
2e3c0 2a 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70  */.  BtShared *p
2e3d0 42 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  Bt;         /* T
2e3e0 68 65 20 42 54 72 65 65 20 2a 2f 0a 20 20 69 6e  he BTree */.  in
2e3f0 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20  t usableSize;   
2e400 20 20 2f 2a 20 54 6f 74 61 6c 20 75 73 61 62 6c    /* Total usabl
2e410 65 20 73 69 7a 65 20 6f 66 20 61 20 70 61 67 65  e size of a page
2e420 20 2a 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20   */.  u8 *data; 
2e430 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
2e440 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 72 65  tent of the pare
2e450 6e 74 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  nt page */.  u8 
2e460 2a 63 64 61 74 61 3b 20 20 20 20 20 20 20 20 20  *cdata;         
2e470 20 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74   /* Content of t
2e480 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f  he child page */
2e490 0a 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20  .  int hdr;     
2e4a0 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
2e4b0 20 74 6f 20 70 61 67 65 20 68 65 61 64 65 72 20   to page header 
2e4c0 69 6e 20 70 61 72 65 6e 74 20 2a 2f 0a 20 20 69  in parent */.  i
2e4d0 6e 74 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20  nt cbrk;        
2e4e0 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20     /* Offset to 
2e4f0 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69 72 73 74  content of first
2e500 20 63 65 6c 6c 20 69 6e 20 70 61 72 65 6e 74 20   cell in parent 
2e510 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  */..  assert( pC
2e520 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 3b 0a  ur->iPage==0 );.
2e530 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
2e540 61 70 50 61 67 65 5b 30 5d 2d 3e 6e 4f 76 65 72  apPage[0]->nOver
2e550 66 6c 6f 77 3e 30 20 29 3b 0a 0a 20 20 56 56 41  flow>0 );..  VVA
2e560 5f 4f 4e 4c 59 28 20 70 43 75 72 2d 3e 70 61 67  _ONLY( pCur->pag
2e570 65 73 53 68 75 66 66 6c 65 64 20 3d 20 31 20 29  esShuffled = 1 )
2e580 3b 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75 72  ;.  pPage = pCur
2e590 2d 3e 61 70 50 61 67 65 5b 30 5d 3b 0a 20 20 70  ->apPage[0];.  p
2e5a0 42 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b  Bt = pPage->pBt;
2e5b0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
2e5c0 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
2e5d0 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  t->mutex) );.  a
2e5e0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
2e5f0 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
2e600 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
2e610 3b 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61 74  ;.  rc = allocat
2e620 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c 20  eBtreePage(pBt, 
2e630 26 70 43 68 69 6c 64 2c 20 26 70 67 6e 6f 43 68  &pChild, &pgnoCh
2e640 69 6c 64 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  ild, pPage->pgno
2e650 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
2e660 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 61 73   return rc;.  as
2e670 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67  sert( sqlite3Pag
2e680 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70 43  erIswriteable(pC
2e690 68 69 6c 64 2d 3e 70 44 62 50 61 67 65 29 20 29  hild->pDbPage) )
2e6a0 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
2e6b0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
2e6c0 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61 67 65  ;.  data = pPage
2e6d0 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72 20 3d  ->aData;.  hdr =
2e6e0 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65   pPage->hdrOffse
2e6f0 74 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65 74 32  t;.  cbrk = get2
2e700 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35  byte(&data[hdr+5
2e710 5d 29 3b 0a 20 20 63 64 61 74 61 20 3d 20 70 43  ]);.  cdata = pC
2e720 68 69 6c 64 2d 3e 61 44 61 74 61 3b 0a 20 20 6d  hild->aData;.  m
2e730 65 6d 63 70 79 28 63 64 61 74 61 2c 20 26 64 61  emcpy(cdata, &da
2e740 74 61 5b 68 64 72 5d 2c 20 70 50 61 67 65 2d 3e  ta[hdr], pPage->
2e750 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70 50 61  cellOffset+2*pPa
2e760 67 65 2d 3e 6e 43 65 6c 6c 2d 68 64 72 29 3b 0a  ge->nCell-hdr);.
2e770 20 20 6d 65 6d 63 70 79 28 26 63 64 61 74 61 5b    memcpy(&cdata[
2e780 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b 63 62 72  cbrk], &data[cbr
2e790 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65 2d 63  k], usableSize-c
2e7a0 62 72 6b 29 3b 0a 0a 20 20 61 73 73 65 72 74 28  brk);..  assert(
2e7b0 20 70 43 68 69 6c 64 2d 3e 69 73 49 6e 69 74 3d   pChild->isInit=
2e7c0 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  =0 );.  rc = sql
2e7d0 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
2e7e0 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 69 66 28  e(pChild);.  if(
2e7f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2e800 7b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 70 79 20  {.    int nCopy 
2e810 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  = pPage->nOverfl
2e820 6f 77 2a 73 69 7a 65 6f 66 28 70 50 61 67 65 2d  ow*sizeof(pPage-
2e830 3e 61 4f 76 66 6c 5b 30 5d 29 3b 0a 20 20 20 20  >aOvfl[0]);.    
2e840 6d 65 6d 63 70 79 28 70 43 68 69 6c 64 2d 3e 61  memcpy(pChild->a
2e850 4f 76 66 6c 2c 20 70 50 61 67 65 2d 3e 61 4f 76  Ovfl, pPage->aOv
2e860 66 6c 2c 20 6e 43 6f 70 79 29 3b 0a 20 20 20 20  fl, nCopy);.    
2e870 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f  pChild->nOverflo
2e880 77 20 3d 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72  w = pPage->nOver
2e890 66 6c 6f 77 3b 0a 20 20 20 20 69 66 28 20 70 43  flow;.    if( pC
2e8a0 68 69 6c 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20  hild->nOverflow 
2e8b0 29 7b 0a 20 20 20 20 20 20 70 43 68 69 6c 64 2d  ){.      pChild-
2e8c0 3e 6e 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20  >nFree = 0;.    
2e8d0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  }.    assert( pC
2e8e0 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3d 3d 70 50 61  hild->nCell==pPa
2e8f0 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20  ge->nCell );.   
2e900 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
2e910 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
2e920 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2e930 20 29 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65   );.    zeroPage
2e940 28 70 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e  (pPage, pChild->
2e950 61 44 61 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f  aData[0] & ~PTF_
2e960 4c 45 41 46 29 3b 0a 20 20 20 20 70 75 74 34 62  LEAF);.    put4b
2e970 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74  yte(&pPage->aDat
2e980 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73  a[pPage->hdrOffs
2e990 65 74 2b 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64  et+8], pgnoChild
2e9a0 29 3b 0a 20 20 20 20 54 52 41 43 45 28 28 22 42  );.    TRACE(("B
2e9b0 41 4c 41 4e 43 45 3a 20 63 6f 70 79 20 72 6f 6f  ALANCE: copy roo
2e9c0 74 20 25 64 20 69 6e 74 6f 20 25 64 5c 6e 22 2c  t %d into %d\n",
2e9d0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 43   pPage->pgno, pC
2e9e0 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20  hild->pgno));.  
2e9f0 20 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55    if( ISAUTOVACU
2ea00 55 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  UM ){.      rc =
2ea10 20 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20   ptrmapPut(pBt, 
2ea20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20 50 54  pChild->pgno, PT
2ea30 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 67  RMAP_BTREE, pPag
2ea40 65 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e 64 65  e->pgno);.#ifnde
2ea50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
2ea60 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69  TOVACUUM.      i
2ea70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ea80 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2ea90 20 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73   setChildPtrmaps
2eaa0 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20  (pChild);.      
2eab0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
2eac0 7b 0a 20 20 20 20 20 20 20 20 70 43 68 69 6c 64  {.        pChild
2ead0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b  ->nOverflow = 0;
2eae0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
2eaf0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
2eb00 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2eb10 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61 67  {.    pCur->iPag
2eb20 65 2b 2b 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61  e++;.    pCur->a
2eb30 70 50 61 67 65 5b 31 5d 20 3d 20 70 43 68 69 6c  pPage[1] = pChil
2eb40 64 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49  d;.    pCur->aiI
2eb50 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 72  dx[0] = 0;.    r
2eb60 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e 72  c = balance_nonr
2eb70 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 65 6c  oot(pCur);.  }el
2eb80 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  se{.    releaseP
2eb90 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 7d  age(pChild);.  }
2eba0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
2ebb0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ../*.** The page
2ebc0 20 74 68 61 74 20 70 43 75 72 20 63 75 72 72 65   that pCur curre
2ebd0 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20 68  ntly points to h
2ebe0 61 73 20 6a 75 73 74 20 62 65 65 6e 20 6d 6f 64  as just been mod
2ebf0 69 66 69 65 64 20 69 6e 0a 2a 2a 20 73 6f 6d 65  ified in.** some
2ec00 20 77 61 79 2e 20 54 68 69 73 20 66 75 6e 63 74   way. This funct
2ec10 69 6f 6e 20 66 69 67 75 72 65 73 20 6f 75 74 20  ion figures out 
2ec20 69 66 20 74 68 69 73 20 6d 6f 64 69 66 69 63 61  if this modifica
2ec30 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 65 0a 2a  tion means the.*
2ec40 2a 20 74 72 65 65 20 6e 65 65 64 73 20 74 6f 20  * tree needs to 
2ec50 62 65 20 62 61 6c 61 6e 63 65 64 2c 20 61 6e 64  be balanced, and
2ec60 20 69 66 20 73 6f 20 63 61 6c 6c 73 20 74 68 65   if so calls the
2ec70 20 61 70 70 72 6f 70 72 69 61 74 65 20 62 61 6c   appropriate bal
2ec80 61 6e 63 69 6e 67 20 0a 2a 2a 20 72 6f 75 74 69  ancing .** routi
2ec90 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 50 61 72 61 6d  ne..** .** Param
2eca0 65 74 65 72 20 69 73 49 6e 73 65 72 74 20 69 73  eter isInsert is
2ecb0 20 74 72 75 65 20 69 66 20 61 20 6e 65 77 20 63   true if a new c
2ecc0 65 6c 6c 20 77 61 73 20 6a 75 73 74 20 69 6e 73  ell was just ins
2ecd0 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 0a 2a  erted into the.*
2ece0 2a 20 70 61 67 65 2c 20 6f 72 20 66 61 6c 73 65  * page, or false
2ecf0 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
2ed00 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
2ed10 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  e(BtCursor *pCur
2ed20 2c 20 69 6e 74 20 69 73 49 6e 73 65 72 74 29 7b  , int isInsert){
2ed30 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
2ed40 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65  TE_OK;.  MemPage
2ed50 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e   *pPage = pCur->
2ed60 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
2ed70 67 65 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ge];..  assert( 
2ed80 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
2ed90 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
2eda0 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 70  utex) );.  if( p
2edb0 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 7b  Cur->iPage==0 ){
2edc0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2edd0 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
2ede0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
2edf0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2ee00 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f 76  OK && pPage->nOv
2ee10 65 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20 20  erflow>0 ){.    
2ee20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 64    rc = balance_d
2ee30 65 65 70 65 72 28 70 43 75 72 29 3b 0a 20 20 20  eeper(pCur);.   
2ee40 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
2ee50 3e 61 70 50 61 67 65 5b 30 5d 3d 3d 70 50 61 67  >apPage[0]==pPag
2ee60 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
2ee70 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
2ee80 6c 6f 77 3d 3d 30 20 7c 7c 20 72 63 21 3d 53 51  low==0 || rc!=SQ
2ee90 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 7d  LITE_OK );.    }
2eea0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2eeb0 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d  ITE_OK && pPage-
2eec0 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20  >nCell==0 ){.   
2eed0 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f     rc = balance_
2eee0 73 68 61 6c 6c 6f 77 65 72 28 70 43 75 72 29 3b  shallower(pCur);
2eef0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
2ef00 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 3d 3d  Cur->apPage[0]==
2ef10 70 50 61 67 65 20 29 3b 0a 20 20 20 20 20 20 61  pPage );.      a
2ef20 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
2ef30 76 65 72 66 6c 6f 77 3d 3d 30 20 7c 7c 20 72 63  verflow==0 || rc
2ef40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
2ef50 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2ef60 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 4f 76    if( pPage->nOv
2ef70 65 72 66 6c 6f 77 3e 30 20 7c 7c 20 0a 20 20 20  erflow>0 || .   
2ef80 20 20 20 20 20 28 21 69 73 49 6e 73 65 72 74 20       (!isInsert 
2ef90 26 26 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e  && pPage->nFree>
2efa0 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62  pPage->pBt->usab
2efb0 6c 65 53 69 7a 65 2a 32 2f 33 29 20 29 7b 0a 20  leSize*2/3) ){. 
2efc0 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63       rc = balanc
2efd0 65 5f 6e 6f 6e 72 6f 6f 74 28 70 43 75 72 29 3b  e_nonroot(pCur);
2efe0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2eff0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2f000 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
2f010 65 63 6b 73 20 61 6c 6c 20 63 75 72 73 6f 72 73  ecks all cursors
2f020 20 74 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 74   that point to t
2f030 61 62 6c 65 20 70 67 6e 6f 52 6f 6f 74 2e 0a 2a  able pgnoRoot..*
2f040 2a 20 49 66 20 61 6e 79 20 6f 66 20 74 68 6f 73  * If any of thos
2f050 65 20 63 75 72 73 6f 72 73 20 77 65 72 65 20 6f  e cursors were o
2f060 70 65 6e 65 64 20 77 69 74 68 20 77 72 46 6c 61  pened with wrFla
2f070 67 3d 3d 30 20 69 6e 20 61 20 64 69 66 66 65 72  g==0 in a differ
2f080 65 6e 74 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ent.** database 
2f090 63 6f 6e 6e 65 63 74 69 6f 6e 20 28 61 20 64 61  connection (a da
2f0a0 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2f0b0 6e 20 74 68 61 74 20 73 68 61 72 65 73 20 74 68  n that shares th
2f0c0 65 20 70 61 67 65 72 0a 2a 2a 20 63 61 63 68 65  e pager.** cache
2f0d0 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e   with the curren
2f0e0 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 29 20 61 6e  t connection) an
2f0f0 64 20 74 68 61 74 20 6f 74 68 65 72 20 63 6f 6e  d that other con
2f100 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 6e  nection .** is n
2f110 6f 74 20 69 6e 20 74 68 65 20 52 65 61 64 55 6e  ot in the ReadUn
2f120 63 6f 6d 6d 6d 69 74 74 65 64 20 73 74 61 74 65  commmitted state
2f130 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
2f140 69 6e 65 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  ine returns .** 
2f150 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 2e 0a 2a  SQLITE_LOCKED..*
2f160 2a 0a 2a 2a 20 41 73 20 77 65 6c 6c 20 61 73 20  *.** As well as 
2f170 63 75 72 73 6f 72 73 20 77 69 74 68 20 77 72 46  cursors with wrF
2f180 6c 61 67 3d 3d 30 2c 20 63 75 72 73 6f 72 73 20  lag==0, cursors 
2f190 77 69 74 68 20 0a 2a 2a 20 69 73 49 6e 63 72 62  with .** isIncrb
2f1a0 6c 6f 62 48 61 6e 64 6c 65 3d 3d 31 20 61 72 65  lobHandle==1 are
2f1b0 20 61 6c 73 6f 20 63 6f 6e 73 69 64 65 72 65 64   also considered
2f1c0 20 27 72 65 61 64 27 20 63 75 72 73 6f 72 73 20   'read' cursors 
2f1d0 62 65 63 61 75 73 65 0a 2a 2a 20 69 6e 63 72 65  because.** incre
2f1e0 6d 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73  mental blob curs
2f1f0 6f 72 73 20 61 72 65 20 75 73 65 64 20 66 6f 72  ors are used for
2f200 20 62 6f 74 68 20 72 65 61 64 69 6e 67 20 61 6e   both reading an
2f210 64 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a  d writing..**.**
2f220 20 57 68 65 6e 20 70 67 6e 6f 52 6f 6f 74 20 69   When pgnoRoot i
2f230 73 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20  s the root page 
2f240 6f 66 20 61 6e 20 69 6e 74 6b 65 79 20 74 61 62  of an intkey tab
2f250 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f  le, this functio
2f260 6e 20 69 73 20 61 6c 73 6f 0a 2a 2a 20 72 65 73  n is also.** res
2f270 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 69 6e 76  ponsible for inv
2f280 61 6c 69 64 61 74 69 6e 67 20 69 6e 63 72 65 6d  alidating increm
2f290 65 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f  ental blob curso
2f2a0 72 73 20 77 68 65 6e 20 74 68 65 20 74 61 62 6c  rs when the tabl
2f2b0 65 20 72 6f 77 0a 2a 2a 20 6f 6e 20 77 68 69 63  e row.** on whic
2f2c0 68 20 74 68 65 79 20 61 72 65 20 6f 70 65 6e 65  h they are opene
2f2d0 64 20 69 73 20 64 65 6c 65 74 65 64 20 6f 72 20  d is deleted or 
2f2e0 6d 6f 64 69 66 69 65 64 2e 20 43 75 72 73 6f 72  modified. Cursor
2f2f0 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
2f300 64 0a 2a 2a 20 61 63 63 6f 72 64 69 6e 67 20 74  d.** according t
2f310 6f 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  o the following 
2f320 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31  rules:.**.**   1
2f330 29 20 57 68 65 6e 20 42 74 72 65 65 43 6c 65 61  ) When BtreeClea
2f340 72 54 61 62 6c 65 28 29 20 69 73 20 63 61 6c 6c  rTable() is call
2f350 65 64 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79  ed to completely
2f360 20 64 65 6c 65 74 65 20 74 68 65 20 63 6f 6e 74   delete the cont
2f370 65 6e 74 73 0a 2a 2a 20 20 20 20 20 20 6f 66 20  ents.**      of 
2f380 61 20 42 2d 54 72 65 65 20 74 61 62 6c 65 2c 20  a B-Tree table, 
2f390 70 45 78 63 6c 75 64 65 20 69 73 20 73 65 74 20  pExclude is set 
2f3a0 74 6f 20 7a 65 72 6f 20 61 6e 64 20 70 61 72 61  to zero and para
2f3b0 6d 65 74 65 72 20 69 52 6f 77 20 69 73 20 0a 2a  meter iRow is .*
2f3c0 2a 20 20 20 20 20 20 73 65 74 20 74 6f 20 6e 6f  *      set to no
2f3d0 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74 68 69 73 20  n-zero. In this 
2f3e0 63 61 73 65 20 61 6c 6c 20 69 6e 63 72 65 6d 65  case all increme
2f3f0 6e 74 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72  ntal blob cursor
2f400 73 20 6f 70 65 6e 0a 2a 2a 20 20 20 20 20 20 6f  s open.**      o
2f410 6e 20 74 68 65 20 74 61 62 6c 65 20 72 6f 6f 74  n the table root
2f420 65 64 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20 61  ed at pgnoRoot a
2f430 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a  re invalidated..
2f440 2a 2a 0a 2a 2a 20 20 20 32 29 20 57 68 65 6e 20  **.**   2) When 
2f450 42 74 72 65 65 49 6e 73 65 72 74 28 29 2c 20 42  BtreeInsert(), B
2f460 74 72 65 65 44 65 6c 65 74 65 28 29 20 6f 72 20  treeDelete() or 
2f470 42 74 72 65 65 50 75 74 44 61 74 61 28 29 20 69  BtreePutData() i
2f480 73 20 63 61 6c 6c 65 64 20 74 6f 20 0a 2a 2a 20  s called to .** 
2f490 20 20 20 20 20 6d 6f 64 69 66 79 20 61 20 74 61       modify a ta
2f4a0 62 6c 65 20 72 6f 77 20 76 69 61 20 61 6e 20 53  ble row via an S
2f4b0 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20 70 45  QL statement, pE
2f4c0 78 63 6c 75 64 65 20 69 73 20 73 65 74 20 74 6f  xclude is set to
2f4d0 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 77 72   the .**      wr
2f4e0 69 74 65 20 63 75 72 73 6f 72 20 75 73 65 64 20  ite cursor used 
2f4f0 74 6f 20 64 6f 20 74 68 65 20 6d 6f 64 69 66 69  to do the modifi
2f500 63 61 74 69 6f 6e 20 61 6e 64 20 70 61 72 61 6d  cation and param
2f510 65 74 65 72 20 69 52 6f 77 20 69 73 20 73 65 74  eter iRow is set
2f520 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20  .**      to the 
2f530 69 6e 74 65 67 65 72 20 72 6f 77 20 69 64 20 6f  integer row id o
2f540 66 20 74 68 65 20 42 2d 54 72 65 65 20 65 6e 74  f the B-Tree ent
2f550 72 79 20 62 65 69 6e 67 20 6d 6f 64 69 66 69 65  ry being modifie
2f560 64 2e 20 55 6e 6c 65 73 73 0a 2a 2a 20 20 20 20  d. Unless.**    
2f570 20 20 70 45 78 63 6c 75 64 65 20 69 73 20 69 74    pExclude is it
2f580 73 65 6c 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e  self an incremen
2f590 74 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72 2c  tal blob cursor,
2f5a0 20 74 68 65 6e 20 61 6c 6c 20 69 6e 63 72 65 6d   then all increm
2f5b0 65 6e 74 61 6c 0a 2a 2a 20 20 20 20 20 20 62 6c  ental.**      bl
2f5c0 6f 62 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 20  ob cursors open 
2f5d0 6f 6e 20 72 6f 77 20 69 52 6f 77 20 6f 66 20 74  on row iRow of t
2f5e0 68 65 20 42 2d 54 72 65 65 20 61 72 65 20 69 6e  he B-Tree are in
2f5f0 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  validated..**.**
2f600 20 20 20 33 29 20 49 66 20 62 6f 74 68 20 70 45     3) If both pE
2f610 78 63 6c 75 64 65 20 61 6e 64 20 69 52 6f 77 20  xclude and iRow 
2f620 61 72 65 20 73 65 74 20 74 6f 20 7a 65 72 6f 2c  are set to zero,
2f630 20 6e 6f 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20   no incremental 
2f640 62 6c 6f 62 20 0a 2a 2a 20 20 20 20 20 20 63 75  blob .**      cu
2f650 72 73 6f 72 73 20 61 72 65 20 69 6e 76 61 6c 69  rsors are invali
2f660 64 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  dated..*/.static
2f670 20 69 6e 74 20 63 68 65 63 6b 46 6f 72 52 65 61   int checkForRea
2f680 64 43 6f 6e 66 6c 69 63 74 73 28 0a 20 20 42 74  dConflicts(.  Bt
2f690 72 65 65 20 2a 70 42 74 72 65 65 2c 20 20 20 20  ree *pBtree,    
2f6a0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
2f6b0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 68  abase file to ch
2f6c0 65 63 6b 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  eck */.  Pgno pg
2f6d0 6e 6f 52 6f 6f 74 2c 20 20 20 20 20 20 20 20 20  noRoot,         
2f6e0 20 2f 2a 20 4c 6f 6f 6b 20 66 6f 72 20 72 65 61   /* Look for rea
2f6f0 64 20 63 75 72 73 6f 72 73 20 6f 6e 20 74 68 69  d cursors on thi
2f700 73 20 62 74 72 65 65 20 2a 2f 0a 20 20 42 74 43  s btree */.  BtC
2f710 75 72 73 6f 72 20 2a 70 45 78 63 6c 75 64 65 2c  ursor *pExclude,
2f720 20 20 20 20 20 2f 2a 20 49 67 6e 6f 72 65 20 74       /* Ignore t
2f730 68 69 73 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20  his cursor */.  
2f740 69 36 34 20 69 52 6f 77 20 20 20 20 20 20 20 20  i64 iRow        
2f750 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
2f760 6f 77 69 64 20 74 68 61 74 20 6d 69 67 68 74 20  owid that might 
2f770 62 65 20 63 68 61 6e 67 69 6e 67 20 2a 2f 0a 29  be changing */.)
2f780 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
2f790 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2f7a0 20 3d 20 70 42 74 72 65 65 2d 3e 70 42 74 3b 0a   = pBtree->pBt;.
2f7b0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
2f7c0 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 61 73  pBtree->db;.  as
2f7d0 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72  sert( sqlite3Btr
2f7e0 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 42 74  eeHoldsMutex(pBt
2f7f0 72 65 65 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d  ree) );.  for(p=
2f800 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
2f810 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
2f820 20 20 69 66 28 20 70 3d 3d 70 45 78 63 6c 75 64    if( p==pExclud
2f830 65 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  e ) continue;.  
2f840 20 20 69 66 28 20 70 2d 3e 70 67 6e 6f 52 6f 6f    if( p->pgnoRoo
2f850 74 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 20 63 6f  t!=pgnoRoot ) co
2f860 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20  ntinue;.#ifndef 
2f870 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
2f880 42 4c 4f 42 0a 20 20 20 20 69 66 28 20 70 2d 3e  BLOB.    if( p->
2f890 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65  isIncrblobHandle
2f8a0 20 26 26 20 28 20 0a 20 20 20 20 20 20 20 20 20   && ( .         
2f8b0 28 21 70 45 78 63 6c 75 64 65 20 26 26 20 69 52  (!pExclude && iR
2f8c0 6f 77 29 0a 20 20 20 20 20 20 7c 7c 20 28 70 45  ow).      || (pE
2f8d0 78 63 6c 75 64 65 20 26 26 20 21 70 45 78 63 6c  xclude && !pExcl
2f8e0 75 64 65 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48  ude->isIncrblobH
2f8f0 61 6e 64 6c 65 20 26 26 20 70 2d 3e 69 6e 66 6f  andle && p->info
2f900 2e 6e 4b 65 79 3d 3d 69 52 6f 77 29 0a 20 20 20  .nKey==iRow).   
2f910 20 29 29 7b 0a 20 20 20 20 20 20 70 2d 3e 65 53   )){.      p->eS
2f920 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e  tate = CURSOR_IN
2f930 56 41 4c 49 44 3b 0a 20 20 20 20 7d 0a 23 65 6e  VALID;.    }.#en
2f940 64 69 66 0a 20 20 20 20 69 66 28 20 70 2d 3e 65  dif.    if( p->e
2f950 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 56 41  State!=CURSOR_VA
2f960 4c 49 44 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  LID ) continue;.
2f970 20 20 20 20 69 66 28 20 70 2d 3e 77 72 46 6c 61      if( p->wrFla
2f980 67 3d 3d 30 20 0a 23 69 66 6e 64 65 66 20 53 51  g==0 .#ifndef SQ
2f990 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c  LITE_OMIT_INCRBL
2f9a0 4f 42 0a 20 20 20 20 20 7c 7c 20 70 2d 3e 69 73  OB.     || p->is
2f9b0 49 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 0a 23  IncrblobHandle.#
2f9c0 65 6e 64 69 66 0a 20 20 20 20 29 7b 0a 20 20 20  endif.    ){.   
2f9d0 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 4f 74     sqlite3 *dbOt
2f9e0 68 65 72 20 3d 20 70 2d 3e 70 42 74 72 65 65 2d  her = p->pBtree-
2f9f0 3e 64 62 3b 0a 20 20 20 20 20 20 61 73 73 65 72  >db;.      asser
2fa00 74 28 64 62 4f 74 68 65 72 29 3b 0a 20 20 20 20  t(dbOther);.    
2fa10 20 20 69 66 28 20 64 62 4f 74 68 65 72 21 3d 64    if( dbOther!=d
2fa20 62 20 26 26 20 28 64 62 4f 74 68 65 72 2d 3e 66  b && (dbOther->f
2fa30 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 52 65  lags & SQLITE_Re
2fa40 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29 3d 3d  adUncommitted)==
2fa50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
2fa60 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 42 6c  ite3ConnectionBl
2fa70 6f 63 6b 65 64 28 64 62 2c 20 64 62 4f 74 68 65  ocked(db, dbOthe
2fa80 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  r);.        retu
2fa90 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  rn SQLITE_LOCKED
2faa0 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
2fab0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
2fac0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2fad0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73  OK;.}../*.** Ins
2fae0 65 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64  ert a new record
2faf0 20 69 6e 74 6f 20 74 68 65 20 42 54 72 65 65 2e   into the BTree.
2fb00 20 20 54 68 65 20 6b 65 79 20 69 73 20 67 69 76    The key is giv
2fb10 65 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79  en by (pKey,nKey
2fb20 29 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74  ).** and the dat
2fb30 61 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70  a is given by (p
2fb40 44 61 74 61 2c 6e 44 61 74 61 29 2e 20 20 54 68  Data,nData).  Th
2fb50 65 20 63 75 72 73 6f 72 20 69 73 20 75 73 65 64  e cursor is used
2fb60 20 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69   only to.** defi
2fb70 6e 65 20 77 68 61 74 20 74 61 62 6c 65 20 74 68  ne what table th
2fb80 65 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20  e record should 
2fb90 62 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  be inserted into
2fba0 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a  .  The cursor.**
2fbb0 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e   is left pointin
2fbc0 67 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f  g at a random lo
2fbd0 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f  cation..**.** Fo
2fbe0 72 20 61 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c  r an INTKEY tabl
2fbf0 65 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79  e, only the nKey
2fc00 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6b 65   value of the ke
2fc10 79 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79  y is used.  pKey
2fc20 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20   is.** ignored. 
2fc30 20 46 6f 72 20 61 20 5a 45 52 4f 44 41 54 41 20   For a ZERODATA 
2fc40 74 61 62 6c 65 2c 20 74 68 65 20 70 44 61 74 61  table, the pData
2fc50 20 61 6e 64 20 6e 44 61 74 61 20 61 72 65 20 62   and nData are b
2fc60 6f 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a  oth ignored..*/.
2fc70 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
2fc80 49 6e 73 65 72 74 28 0a 20 20 42 74 43 75 72 73  Insert(.  BtCurs
2fc90 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20  or *pCur,       
2fca0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65           /* Inse
2fcb0 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65  rt data into the
2fcc0 20 74 61 62 6c 65 20 6f 66 20 74 68 69 73 20 63   table of this c
2fcd0 75 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74  ursor */.  const
2fce0 20 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34   void *pKey, i64
2fcf0 20 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65   nKey,    /* The
2fd00 20 6b 65 79 20 6f 66 20 74 68 65 20 6e 65 77 20   key of the new 
2fd10 72 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73  record */.  cons
2fd20 74 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69  t void *pData, i
2fd30 6e 74 20 6e 44 61 74 61 2c 20 20 2f 2a 20 54 68  nt nData,  /* Th
2fd40 65 20 64 61 74 61 20 6f 66 20 74 68 65 20 6e 65  e data of the ne
2fd50 77 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e  w record */.  in
2fd60 74 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20  t nZero,        
2fd70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2fd80 4e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20  Number of extra 
2fd90 30 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e  0 bytes to appen
2fda0 64 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20 20 69  d to data */.  i
2fdb0 6e 74 20 61 70 70 65 6e 64 42 69 61 73 20 20 20  nt appendBias   
2fdc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2fdd0 20 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73   True if this is
2fde0 20 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70 65 6e   likely an appen
2fdf0 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  d */.){.  int rc
2fe00 3b 0a 20 20 69 6e 74 20 6c 6f 63 3b 0a 20 20 69  ;.  int loc;.  i
2fe10 6e 74 20 73 7a 4e 65 77 3b 0a 20 20 69 6e 74 20  nt szNew;.  int 
2fe20 69 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  idx;.  MemPage *
2fe30 70 50 61 67 65 3b 0a 20 20 42 74 72 65 65 20 2a  pPage;.  Btree *
2fe40 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65  p = pCur->pBtree
2fe50 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
2fe60 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e  t = p->pBt;.  un
2fe70 73 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c 64  signed char *old
2fe80 43 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e 65 64  Cell;.  unsigned
2fe90 20 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c 20 3d   char *newCell =
2fea0 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63   0;..  assert( c
2feb0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
2fec0 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
2fed0 74 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61  t( pBt->inTransa
2fee0 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f 57 52 49  ction==TRANS_WRI
2fef0 54 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TE );.  assert( 
2ff00 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29  !pBt->readOnly )
2ff10 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
2ff20 2d 3e 77 72 46 6c 61 67 20 29 3b 0a 20 20 72 63  ->wrFlag );.  rc
2ff30 20 3d 20 63 68 65 63 6b 46 6f 72 52 65 61 64 43   = checkForReadC
2ff40 6f 6e 66 6c 69 63 74 73 28 70 43 75 72 2d 3e 70  onflicts(pCur->p
2ff50 42 74 72 65 65 2c 20 70 43 75 72 2d 3e 70 67 6e  Btree, pCur->pgn
2ff60 6f 52 6f 6f 74 2c 20 70 43 75 72 2c 20 6e 4b 65  oRoot, pCur, nKe
2ff70 79 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 20  y);.  if( rc ){ 
2ff80 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20 20              .   
2ff90 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 70 43   /* The table pC
2ffa0 75 72 20 70 6f 69 6e 74 73 20 74 6f 20 68 61 73  ur points to has
2ffb0 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 2a 2f 0a   a read lock */.
2ffc0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d      assert( rc==
2ffd0 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
2ffe0 41 52 45 44 43 41 43 48 45 20 29 3b 0a 20 20 20  AREDCACHE );.   
2fff0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
30000 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
30010 74 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54  te==CURSOR_FAULT
30020 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
30030 43 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 0a  Cur->skip;.  }..
30040 20 20 2f 2a 20 53 61 76 65 20 74 68 65 20 70 6f    /* Save the po
30050 73 69 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f  sitions of any o
30060 74 68 65 72 20 63 75 72 73 6f 72 73 20 6f 70 65  ther cursors ope
30070 6e 20 6f 6e 20 74 68 69 73 20 74 61 62 6c 65 20  n on this table 
30080 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  */.  sqlite3Btre
30090 65 43 6c 65 61 72 43 75 72 73 6f 72 28 70 43 75  eClearCursor(pCu
300a0 72 29 3b 0a 20 20 69 66 28 20 0a 20 20 20 20 53  r);.  if( .    S
300b0 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
300c0 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
300d0 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
300e0 6f 74 2c 20 70 43 75 72 29 29 20 7c 7c 0a 20 20  ot, pCur)) ||.  
300f0 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63    SQLITE_OK!=(rc
30100 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4d   = sqlite3BtreeM
30110 6f 76 65 74 6f 28 70 43 75 72 2c 20 70 4b 65 79  oveto(pCur, pKey
30120 2c 20 6e 4b 65 79 2c 20 61 70 70 65 6e 64 42 69  , nKey, appendBi
30130 61 73 2c 20 26 6c 6f 63 29 29 0a 20 20 29 7b 0a  as, &loc)).  ){.
30140 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
30150 20 7d 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43   }..  pPage = pC
30160 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
30170 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73 73 65 72  >iPage];.  asser
30180 74 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  t( pPage->intKey
30190 20 7c 7c 20 6e 4b 65 79 3e 3d 30 20 29 3b 0a 20   || nKey>=0 );. 
301a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e   assert( pPage->
301b0 6c 65 61 66 20 7c 7c 20 21 70 50 61 67 65 2d 3e  leaf || !pPage->
301c0 69 6e 74 4b 65 79 20 29 3b 0a 20 20 54 52 41 43  intKey );.  TRAC
301d0 45 28 28 22 49 4e 53 45 52 54 3a 20 74 61 62 6c  E(("INSERT: tabl
301e0 65 3d 25 64 20 6e 6b 65 79 3d 25 6c 6c 64 20 6e  e=%d nkey=%lld n
301f0 64 61 74 61 3d 25 64 20 70 61 67 65 3d 25 64 20  data=%d page=%d 
30200 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\n",.         
30210 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c   pCur->pgnoRoot,
30220 20 6e 4b 65 79 2c 20 6e 44 61 74 61 2c 20 70 50   nKey, nData, pP
30230 61 67 65 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20  age->pgno,.     
30240 20 20 20 20 20 6c 6f 63 3d 3d 30 20 3f 20 22 6f       loc==0 ? "o
30250 76 65 72 77 72 69 74 65 22 20 3a 20 22 6e 65 77  verwrite" : "new
30260 20 65 6e 74 72 79 22 29 29 3b 0a 20 20 61 73 73   entry"));.  ass
30270 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49 6e  ert( pPage->isIn
30280 69 74 20 29 3b 0a 20 20 61 6c 6c 6f 63 61 74 65  it );.  allocate
30290 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
302a0 20 20 6e 65 77 43 65 6c 6c 20 3d 20 70 42 74 2d    newCell = pBt-
302b0 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 69 66  >pTmpSpace;.  if
302c0 28 20 6e 65 77 43 65 6c 6c 3d 3d 30 20 29 20 72  ( newCell==0 ) r
302d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
302e0 45 4d 3b 0a 20 20 72 63 20 3d 20 66 69 6c 6c 49  EM;.  rc = fillI
302f0 6e 43 65 6c 6c 28 70 50 61 67 65 2c 20 6e 65 77  nCell(pPage, new
30300 43 65 6c 6c 2c 20 70 4b 65 79 2c 20 6e 4b 65 79  Cell, pKey, nKey
30310 2c 20 70 44 61 74 61 2c 20 6e 44 61 74 61 2c 20  , pData, nData, 
30320 6e 5a 65 72 6f 2c 20 26 73 7a 4e 65 77 29 3b 0a  nZero, &szNew);.
30330 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
30340 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 61 73  end_insert;.  as
30350 73 65 72 74 28 20 73 7a 4e 65 77 3d 3d 63 65 6c  sert( szNew==cel
30360 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20  lSizePtr(pPage, 
30370 6e 65 77 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73  newCell) );.  as
30380 73 65 72 74 28 20 73 7a 4e 65 77 3c 3d 4d 58 5f  sert( szNew<=MX_
30390 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29  CELL_SIZE(pBt) )
303a0 3b 0a 20 20 69 64 78 20 3d 20 70 43 75 72 2d 3e  ;.  idx = pCur->
303b0 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
303c0 65 5d 3b 0a 20 20 69 66 28 20 6c 6f 63 3d 3d 30  e];.  if( loc==0
303d0 20 26 26 20 43 55 52 53 4f 52 5f 56 41 4c 49 44   && CURSOR_VALID
303e0 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
303f0 7b 0a 20 20 20 20 75 31 36 20 73 7a 4f 6c 64 3b  {.    u16 szOld;
30400 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
30410 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b  <pPage->nCell );
30420 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
30430 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
30440 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
30450 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
30460 20 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74   goto end_insert
30470 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 6c 64 43  ;.    }.    oldC
30480 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
30490 50 61 67 65 2c 20 69 64 78 29 3b 0a 20 20 20 20  Page, idx);.    
304a0 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66  if( !pPage->leaf
304b0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79   ){.      memcpy
304c0 28 6e 65 77 43 65 6c 6c 2c 20 6f 6c 64 43 65 6c  (newCell, oldCel
304d0 6c 2c 20 34 29 3b 0a 20 20 20 20 7d 0a 20 20 20  l, 4);.    }.   
304e0 20 73 7a 4f 6c 64 20 3d 20 63 65 6c 6c 53 69 7a   szOld = cellSiz
304f0 65 50 74 72 28 70 50 61 67 65 2c 20 6f 6c 64 43  ePtr(pPage, oldC
30500 65 6c 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 63  ell);.    rc = c
30510 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65 2c 20  learCell(pPage, 
30520 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 69 66  oldCell);.    if
30530 28 20 72 63 20 29 20 67 6f 74 6f 20 65 6e 64 5f  ( rc ) goto end_
30540 69 6e 73 65 72 74 3b 0a 20 20 20 20 72 63 20 3d  insert;.    rc =
30550 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c   dropCell(pPage,
30560 20 69 64 78 2c 20 73 7a 4f 6c 64 29 3b 0a 20 20   idx, szOld);.  
30570 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
30580 5f 4f 4b 20 29 20 7b 0a 20 20 20 20 20 20 67 6f  _OK ) {.      go
30590 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20  to end_insert;. 
305a0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
305b0 20 6c 6f 63 3c 30 20 26 26 20 70 50 61 67 65 2d   loc<0 && pPage-
305c0 3e 6e 43 65 6c 6c 3e 30 20 29 7b 0a 20 20 20 20  >nCell>0 ){.    
305d0 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6c  assert( pPage->l
305e0 65 61 66 20 29 3b 0a 20 20 20 20 69 64 78 20 3d  eaf );.    idx =
305f0 20 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70   ++pCur->aiIdx[p
30600 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20  Cur->iPage];.   
30610 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
30620 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  e = 0;.    pCur-
30630 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
30640 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
30650 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
30660 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 69   );.  }.  rc = i
30670 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67 65 2c  nsertCell(pPage,
30680 20 69 64 78 2c 20 6e 65 77 43 65 6c 6c 2c 20 73   idx, newCell, s
30690 7a 4e 65 77 2c 20 30 2c 20 30 29 3b 0a 20 20 69  zNew, 0, 0);.  i
306a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
306b0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 62 61 6c   ){.    rc = bal
306c0 61 6e 63 65 28 70 43 75 72 2c 20 31 29 3b 0a 20  ance(pCur, 1);. 
306d0 20 7d 0a 0a 20 20 2f 2a 20 4d 75 73 74 20 6d 61   }..  /* Must ma
306e0 6b 65 20 73 75 72 65 20 6e 4f 76 65 72 66 6c 6f  ke sure nOverflo
306f0 77 20 69 73 20 72 65 73 65 74 20 74 6f 20 7a 65  w is reset to ze
30700 72 6f 20 65 76 65 6e 20 69 66 20 74 68 65 20 62  ro even if the b
30710 61 6c 61 6e 63 65 28 29 0a 20 20 2a 2a 20 66 61  alance().  ** fa
30720 69 6c 73 2e 20 20 49 6e 74 65 72 6e 61 6c 20 64  ils.  Internal d
30730 61 74 61 20 73 74 72 75 63 74 75 72 65 20 63 6f  ata structure co
30740 72 72 75 70 74 69 6f 6e 20 77 69 6c 6c 20 72 65  rruption will re
30750 73 75 6c 74 20 6f 74 68 65 72 77 69 73 65 2e 20  sult otherwise. 
30760 2a 2f 0a 20 20 70 43 75 72 2d 3e 61 70 50 61 67  */.  pCur->apPag
30770 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e  e[pCur->iPage]->
30780 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 0a  nOverflow = 0;..
30790 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
307a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54  _OK ){.    moveT
307b0 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d  oRoot(pCur);.  }
307c0 0a 65 6e 64 5f 69 6e 73 65 72 74 3a 0a 20 20 72  .end_insert:.  r
307d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
307e0 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 65 6e  ** Delete the en
307f0 74 72 79 20 74 68 61 74 20 74 68 65 20 63 75 72  try that the cur
30800 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20  sor is pointing 
30810 74 6f 2e 20 20 54 68 65 20 63 75 72 73 6f 72 0a  to.  The cursor.
30820 2a 2a 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  ** is left point
30830 69 6e 67 20 61 74 20 61 20 61 72 62 69 74 72 61  ing at a arbitra
30840 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a  ry location..*/.
30850 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
30860 44 65 6c 65 74 65 28 42 74 43 75 72 73 6f 72 20  Delete(BtCursor 
30870 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67  *pCur){.  MemPag
30880 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
30890 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
308a0 61 67 65 5d 3b 0a 20 20 69 6e 74 20 69 64 78 3b  age];.  int idx;
308b0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
308c0 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e 74 20 72   *pCell;.  int r
308d0 63 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68  c;.  Pgno pgnoCh
308e0 69 6c 64 20 3d 20 30 3b 0a 20 20 42 74 72 65 65  ild = 0;.  Btree
308f0 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70 42 74 72   *p = pCur->pBtr
30900 65 65 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  ee;.  BtShared *
30910 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20  pBt = p->pBt;.. 
30920 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
30930 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
30940 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
30950 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20  ge->isInit );.  
30960 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54  assert( pBt->inT
30970 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
30980 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73  S_WRITE );.  ass
30990 65 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f  ert( !pBt->readO
309a0 6e 6c 79 20 29 3b 0a 20 20 69 66 28 20 70 43 75  nly );.  if( pCu
309b0 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
309c0 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20 72  R_FAULT ){.    r
309d0 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b 69 70  eturn pCur->skip
309e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4e 45 56 45  ;.  }.  if( NEVE
309f0 52 28 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  R(pCur->aiIdx[pC
30a00 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67  ur->iPage]>=pPag
30a10 65 2d 3e 6e 43 65 6c 6c 29 20 29 7b 0a 20 20 20  e->nCell) ){.   
30a20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
30a30 52 52 4f 52 3b 20 20 2f 2a 20 54 68 65 20 63 75  RROR;  /* The cu
30a40 72 73 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e  rsor is not poin
30a50 74 69 6e 67 20 74 6f 20 61 6e 79 74 68 69 6e 67  ting to anything
30a60 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   */.  }.  assert
30a70 28 20 70 43 75 72 2d 3e 77 72 46 6c 61 67 20 29  ( pCur->wrFlag )
30a80 3b 0a 20 20 72 63 20 3d 20 63 68 65 63 6b 46 6f  ;.  rc = checkFo
30a90 72 52 65 61 64 43 6f 6e 66 6c 69 63 74 73 28 70  rReadConflicts(p
30aa0 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74  , pCur->pgnoRoot
30ab0 2c 20 70 43 75 72 2c 20 70 43 75 72 2d 3e 69 6e  , pCur, pCur->in
30ac0 66 6f 2e 6e 4b 65 79 29 3b 0a 20 20 69 66 28 20  fo.nKey);.  if( 
30ad0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
30ae0 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c  .    /* The tabl
30af0 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74 6f  e pCur points to
30b00 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63 6b   has a read lock
30b10 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
30b20 72 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  rc==SQLITE_LOCKE
30b30 44 5f 53 48 41 52 45 44 43 41 43 48 45 20 29 3b  D_SHAREDCACHE );
30b40 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
30b50 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 74 6f 72    }..  /* Restor
30b60 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 75  e the current cu
30b70 72 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 28 61  rsor position (a
30b80 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65 20 63 75   no-op if the cu
30b90 72 73 6f 72 20 69 73 20 6e 6f 74 20 69 6e 20 0a  rsor is not in .
30ba0 20 20 2a 2a 20 43 55 52 53 4f 52 5f 52 45 51 55    ** CURSOR_REQU
30bb0 49 52 45 53 45 45 4b 20 73 74 61 74 65 29 20 61  IRESEEK state) a
30bc0 6e 64 20 73 61 76 65 20 74 68 65 20 70 6f 73 69  nd save the posi
30bd0 74 69 6f 6e 73 20 6f 66 20 61 6e 79 20 6f 74 68  tions of any oth
30be0 65 72 20 63 75 72 73 6f 72 73 20 0a 20 20 2a 2a  er cursors .  **
30bf0 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 73 61 6d   open on the sam
30c00 65 20 74 61 62 6c 65 2e 20 54 68 65 6e 20 63 61  e table. Then ca
30c10 6c 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  ll sqlite3PagerW
30c20 72 69 74 65 28 29 20 6f 6e 20 74 68 65 20 70 61  rite() on the pa
30c30 67 65 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65  ge.  ** that the
30c40 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 20 64   entry will be d
30c50 65 6c 65 74 65 64 20 66 72 6f 6d 2e 0a 20 20 2a  eleted from..  *
30c60 2f 0a 20 20 69 66 28 20 0a 20 20 20 20 28 72 63  /.  if( .    (rc
30c70 20 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72   = restoreCursor
30c80 50 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 29 21  Position(pCur))!
30c90 3d 30 20 7c 7c 0a 20 20 20 20 28 72 63 20 3d 20  =0 ||.    (rc = 
30ca0 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
30cb0 42 74 2c 20 70 43 75 72 2d 3e 70 67 6e 6f 52 6f  Bt, pCur->pgnoRo
30cc0 6f 74 2c 20 70 43 75 72 29 29 21 3d 30 20 7c 7c  ot, pCur))!=0 ||
30cd0 0a 20 20 20 20 28 72 63 20 3d 20 73 71 6c 69 74  .    (rc = sqlit
30ce0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
30cf0 67 65 2d 3e 70 44 62 50 61 67 65 29 29 21 3d 30  ge->pDbPage))!=0
30d00 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  .  ){.    return
30d10 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c   rc;.  }..  /* L
30d20 6f 63 61 74 65 20 74 68 65 20 63 65 6c 6c 20 77  ocate the cell w
30d30 69 74 68 69 6e 20 69 74 73 20 70 61 67 65 20 61  ithin its page a
30d40 6e 64 20 6c 65 61 76 65 20 70 43 65 6c 6c 20 70  nd leave pCell p
30d50 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65 0a 20  ointing to the. 
30d60 20 2a 2a 20 64 61 74 61 2e 20 54 68 65 20 63 6c   ** data. The cl
30d70 65 61 72 43 65 6c 6c 28 29 20 63 61 6c 6c 20 66  earCell() call f
30d80 72 65 65 73 20 61 6e 79 20 6f 76 65 72 66 6c 6f  rees any overflo
30d90 77 20 70 61 67 65 73 20 61 73 73 6f 63 69 61 74  w pages associat
30da0 65 64 20 77 69 74 68 20 74 68 65 0a 20 20 2a 2a  ed with the.  **
30db0 20 63 65 6c 6c 2e 20 54 68 65 20 63 65 6c 6c 20   cell. The cell 
30dc0 69 74 73 65 6c 66 20 69 73 20 73 74 69 6c 6c 20  itself is still 
30dd0 69 6e 74 61 63 74 2e 0a 20 20 2a 2f 0a 20 20 69  intact..  */.  i
30de0 64 78 20 3d 20 70 43 75 72 2d 3e 61 69 49 64 78  dx = pCur->aiIdx
30df0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
30e00 20 70 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c   pCell = findCel
30e10 6c 28 70 50 61 67 65 2c 20 69 64 78 29 3b 0a 20  l(pPage, idx);. 
30e20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
30e30 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 43 68 69  f ){.    pgnoChi
30e40 6c 64 20 3d 20 67 65 74 34 62 79 74 65 28 70 43  ld = get4byte(pC
30e50 65 6c 6c 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  ell);.  }.  rc =
30e60 20 63 6c 65 61 72 43 65 6c 6c 28 70 50 61 67 65   clearCell(pPage
30e70 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 69 66 28 20  , pCell);.  if( 
30e80 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
30e90 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   rc;.  }..  if( 
30ea0 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
30eb0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68      /*.    ** Th
30ec0 65 20 65 6e 74 72 79 20 77 65 20 61 72 65 20 61  e entry we are a
30ed0 62 6f 75 74 20 74 6f 20 64 65 6c 65 74 65 20 69  bout to delete i
30ee0 73 20 6e 6f 74 20 61 20 6c 65 61 66 20 73 6f 20  s not a leaf so 
30ef0 69 66 20 77 65 20 64 6f 20 6e 6f 74 0a 20 20 20  if we do not.   
30f00 20 2a 2a 20 64 6f 20 73 6f 6d 65 74 68 69 6e 67   ** do something
30f10 20 77 65 20 77 69 6c 6c 20 6c 65 61 76 65 20 61   we will leave a
30f20 20 68 6f 6c 65 20 6f 6e 20 61 6e 20 69 6e 74 65   hole on an inte
30f30 72 6e 61 6c 20 70 61 67 65 2e 0a 20 20 20 20 2a  rnal page..    *
30f40 2a 20 57 65 20 68 61 76 65 20 74 6f 20 66 69 6c  * We have to fil
30f50 6c 20 74 68 65 20 68 6f 6c 65 20 62 79 20 6d 6f  l the hole by mo
30f60 76 69 6e 67 20 69 6e 20 61 20 63 65 6c 6c 20 66  ving in a cell f
30f70 72 6f 6d 20 61 20 6c 65 61 66 2e 20 20 54 68 65  rom a leaf.  The
30f80 0a 20 20 20 20 2a 2a 20 6e 65 78 74 20 43 65 6c  .    ** next Cel
30f90 6c 20 61 66 74 65 72 20 74 68 65 20 6f 6e 65 20  l after the one 
30fa0 74 6f 20 62 65 20 64 65 6c 65 74 65 64 20 69 73  to be deleted is
30fb0 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 65   guaranteed to e
30fc0 78 69 73 74 20 61 6e 64 0a 20 20 20 20 2a 2a 20  xist and.    ** 
30fd0 74 6f 20 62 65 20 61 20 6c 65 61 66 20 73 6f 20  to be a leaf so 
30fe0 77 65 20 63 61 6e 20 75 73 65 20 69 74 2e 0a 20  we can use it.. 
30ff0 20 20 20 2a 2f 0a 20 20 20 20 42 74 43 75 72 73     */.    BtCurs
31000 6f 72 20 6c 65 61 66 43 75 72 3b 0a 20 20 20 20  or leafCur;.    
31010 4d 65 6d 50 61 67 65 20 2a 70 4c 65 61 66 50 61  MemPage *pLeafPa
31020 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 75 6e 73  ge = 0;..    uns
31030 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4e 65 78  igned char *pNex
31040 74 3b 0a 20 20 20 20 69 6e 74 20 6e 6f 74 55 73  t;.    int notUs
31050 65 64 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65 64  ed;.    unsigned
31060 20 63 68 61 72 20 2a 74 65 6d 70 43 65 6c 6c 20   char *tempCell 
31070 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
31080 20 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20   !pPage->intKey 
31090 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  );.    sqlite3Bt
310a0 72 65 65 47 65 74 54 65 6d 70 43 75 72 73 6f 72  reeGetTempCursor
310b0 28 70 43 75 72 2c 20 26 6c 65 61 66 43 75 72 29  (pCur, &leafCur)
310c0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
310d0 65 33 42 74 72 65 65 4e 65 78 74 28 26 6c 65 61  e3BtreeNext(&lea
310e0 66 43 75 72 2c 20 26 6e 6f 74 55 73 65 64 29 3b  fCur, &notUsed);
310f0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
31100 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
31110 61 73 73 65 72 74 28 20 6c 65 61 66 43 75 72 2e  assert( leafCur.
31120 61 69 49 64 78 5b 6c 65 61 66 43 75 72 2e 69 50  aiIdx[leafCur.iP
31130 61 67 65 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 20  age]==0 );.     
31140 20 70 4c 65 61 66 50 61 67 65 20 3d 20 6c 65 61   pLeafPage = lea
31150 66 43 75 72 2e 61 70 50 61 67 65 5b 6c 65 61 66  fCur.apPage[leaf
31160 43 75 72 2e 69 50 61 67 65 5d 3b 0a 20 20 20 20  Cur.iPage];.    
31170 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
31180 67 65 72 57 72 69 74 65 28 70 4c 65 61 66 50 61  gerWrite(pLeafPa
31190 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
311a0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
311b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
311c0 20 20 20 69 6e 74 20 6c 65 61 66 43 75 72 73 6f     int leafCurso
311d0 72 49 6e 76 61 6c 69 64 20 3d 20 30 3b 0a 20 20  rInvalid = 0;.  
311e0 20 20 20 20 75 31 36 20 73 7a 4e 65 78 74 3b 0a      u16 szNext;.
311f0 20 20 20 20 20 20 54 52 41 43 45 28 28 22 44 45        TRACE(("DE
31200 4c 45 54 45 3a 20 74 61 62 6c 65 3d 25 64 20 64  LETE: table=%d d
31210 65 6c 65 74 65 20 69 6e 74 65 72 6e 61 6c 20 66  elete internal f
31220 72 6f 6d 20 25 64 20 72 65 70 6c 61 63 65 20 66  rom %d replace f
31230 72 6f 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a  rom leaf %d\n",.
31240 20 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70           pCur->p
31250 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65 2d 3e  gnoRoot, pPage->
31260 70 67 6e 6f 2c 20 70 4c 65 61 66 50 61 67 65 2d  pgno, pLeafPage-
31270 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 64  >pgno));.      d
31280 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  ropCell(pPage, i
31290 64 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28  dx, cellSizePtr(
312a0 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a  pPage, pCell));.
312b0 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 66 69        pNext = fi
312c0 6e 64 43 65 6c 6c 28 70 4c 65 61 66 50 61 67 65  ndCell(pLeafPage
312d0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65  , 0);.      szNe
312e0 78 74 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72  xt = cellSizePtr
312f0 28 70 4c 65 61 66 50 61 67 65 2c 20 70 4e 65 78  (pLeafPage, pNex
31300 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
31310 28 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  ( MX_CELL_SIZE(p
31320 42 74 29 3e 3d 73 7a 4e 65 78 74 2b 34 20 29 3b  Bt)>=szNext+4 );
31330 0a 20 20 20 20 20 20 61 6c 6c 6f 63 61 74 65 54  .      allocateT
31340 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a 20  empSpace(pBt);. 
31350 20 20 20 20 20 74 65 6d 70 43 65 6c 6c 20 3d 20       tempCell = 
31360 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  pBt->pTmpSpace;.
31370 20 20 20 20 20 20 69 66 28 20 74 65 6d 70 43 65        if( tempCe
31380 6c 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ll==0 ){.       
31390 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
313a0 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  EM;.      }.    
313b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
313c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
313d0 63 20 3d 20 69 6e 73 65 72 74 43 65 6c 6c 28 70  c = insertCell(p
313e0 50 61 67 65 2c 20 69 64 78 2c 20 70 4e 65 78 74  Page, idx, pNext
313f0 2d 34 2c 20 73 7a 4e 65 78 74 2b 34 2c 20 74 65  -4, szNext+4, te
31400 6d 70 43 65 6c 6c 2c 20 30 29 3b 0a 20 20 20 20  mpCell, 0);.    
31410 20 20 7d 0a 0a 0a 20 20 20 20 20 20 2f 2a 20 54    }...      /* T
31420 68 65 20 22 69 66 22 20 73 74 61 74 65 6d 65 6e  he "if" statemen
31430 74 20 69 6e 20 74 68 65 20 6e 65 78 74 20 63 6f  t in the next co
31440 64 65 20 62 6c 6f 63 6b 20 69 73 20 63 72 69 74  de block is crit
31450 69 63 61 6c 2e 20 20 54 68 65 0a 20 20 20 20 20  ical.  The.     
31460 20 2a 2a 20 73 6c 69 67 68 74 65 73 74 20 65 72   ** slightest er
31470 72 6f 72 20 69 6e 20 74 68 61 74 20 73 74 61 74  ror in that stat
31480 65 6d 65 6e 74 20 77 6f 75 6c 64 20 61 6c 6c 6f  ement would allo
31490 77 20 53 51 4c 69 74 65 20 74 6f 20 6f 70 65 72  w SQLite to oper
314a0 61 74 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72  ate.      ** cor
314b0 72 65 63 74 6c 79 20 6d 6f 73 74 20 6f 66 20 74  rectly most of t
314c0 68 65 20 74 69 6d 65 20 62 75 74 20 70 72 6f 64  he time but prod
314d0 75 63 65 20 76 65 72 79 20 72 61 72 65 20 66 61  uce very rare fa
314e0 69 6c 75 72 65 73 2e 20 20 54 6f 0a 20 20 20 20  ilures.  To.    
314f0 20 20 2a 2a 20 67 75 61 72 64 20 61 67 61 69 6e    ** guard again
31500 73 74 20 74 68 69 73 2c 20 74 68 65 20 66 6f 6c  st this, the fol
31510 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 20 68 65  lowing macros he
31520 6c 70 20 74 6f 20 76 65 72 69 66 79 20 74 68 61  lp to verify tha
31530 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 22  t.      ** the "
31540 69 66 22 20 73 74 61 74 65 6d 65 6e 74 20 69 73  if" statement is
31550 20 77 65 6c 6c 20 74 65 73 74 65 64 2e 0a 20 20   well tested..  
31560 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 65 73      */.      tes
31570 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 4f  tcase( pPage->nO
31580 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20 70 50  verflow==0 && pP
31590 61 67 65 2d 3e 6e 46 72 65 65 3c 70 42 74 2d 3e  age->nFree<pBt->
315a0 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20 0a  usableSize*2/3 .
315b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
315c0 20 26 26 20 70 4c 65 61 66 50 61 67 65 2d 3e 6e   && pLeafPage->n
315d0 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74 20 3e 20  Free+2+szNext > 
315e0 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a  pBt->usableSize*
315f0 32 2f 33 20 29 3b 0a 20 20 20 20 20 20 74 65 73  2/3 );.      tes
31600 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 4f  tcase( pPage->nO
31610 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20 70 50  verflow==0 && pP
31620 61 67 65 2d 3e 6e 46 72 65 65 3d 3d 70 42 74 2d  age->nFree==pBt-
31630 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 20  >usableSize*2/3 
31640 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31650 20 20 26 26 20 70 4c 65 61 66 50 61 67 65 2d 3e    && pLeafPage->
31660 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74 20 3e  nFree+2+szNext >
31670 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
31680 2a 32 2f 33 20 29 3b 0a 20 20 20 20 20 20 74 65  *2/3 );.      te
31690 73 74 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e  stcase( pPage->n
316a0 4f 76 65 72 66 6c 6f 77 3d 3d 30 20 26 26 20 70  Overflow==0 && p
316b0 50 61 67 65 2d 3e 6e 46 72 65 65 3d 3d 70 42 74  Page->nFree==pBt
316c0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33  ->usableSize*2/3
316d0 2b 31 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  +1 .            
316e0 20 20 20 20 20 26 26 20 70 4c 65 61 66 50 61 67       && pLeafPag
316f0 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78  e->nFree+2+szNex
31700 74 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  t > pBt->usableS
31710 69 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20 20 20  ize*2/3 );.     
31720 20 74 65 73 74 63 61 73 65 28 20 70 50 61 67 65   testcase( pPage
31730 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 26 26  ->nOverflow>0 &&
31740 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3c 3d 70   pPage->nFree<=p
31750 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32  Bt->usableSize*2
31760 2f 33 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  /3.             
31770 20 20 20 20 26 26 20 70 4c 65 61 66 50 61 67 65      && pLeafPage
31780 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74  ->nFree+2+szNext
31790 20 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   > pBt->usableSi
317a0 7a 65 2a 32 2f 33 20 29 3b 0a 20 20 20 20 20 20  ze*2/3 );.      
317b0 74 65 73 74 63 61 73 65 28 20 28 70 50 61 67 65  testcase( (pPage
317c0 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c  ->nOverflow>0 ||
317d0 20 28 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3e   (pPage->nFree >
317e0 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
317f0 2a 32 2f 33 29 29 0a 20 20 20 20 20 20 20 20 20  *2/3)).         
31800 20 20 20 20 20 20 20 20 26 26 20 70 4c 65 61 66          && pLeaf
31810 50 61 67 65 2d 3e 6e 46 72 65 65 2b 32 2b 73 7a  Page->nFree+2+sz
31820 4e 65 78 74 20 3d 3d 20 70 42 74 2d 3e 75 73 61  Next == pBt->usa
31830 62 6c 65 53 69 7a 65 2a 32 2f 33 20 29 3b 0a 0a  bleSize*2/3 );..
31840 0a 20 20 20 20 20 20 69 66 28 20 28 70 50 61 67  .      if( (pPag
31850 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c  e->nOverflow>0 |
31860 7c 20 28 70 50 61 67 65 2d 3e 6e 46 72 65 65 20  | (pPage->nFree 
31870 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  > pBt->usableSiz
31880 65 2a 32 2f 33 29 29 20 26 26 0a 20 20 20 20 20  e*2/3)) &&.     
31890 20 20 20 20 20 28 70 4c 65 61 66 50 61 67 65 2d       (pLeafPage-
318a0 3e 6e 46 72 65 65 2b 32 2b 73 7a 4e 65 78 74 20  >nFree+2+szNext 
318b0 3e 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  > pBt->usableSiz
318c0 65 2a 32 2f 33 29 0a 20 20 20 20 20 20 29 7b 0a  e*2/3).      ){.
318d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20          /* This 
318e0 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65 6e 20  branch is taken 
318f0 69 66 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  if the internal 
31900 6e 6f 64 65 20 69 73 20 6e 6f 77 20 65 69 74 68  node is now eith
31910 65 72 20 6f 76 65 72 66 6c 6f 77 69 6e 67 0a 20  er overflowing. 
31920 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 75 6e 64         ** or und
31930 65 72 66 75 6c 6c 20 61 6e 64 20 74 68 65 20 6c  erfull and the l
31940 65 61 66 20 6e 6f 64 65 20 77 69 6c 6c 20 62 65  eaf node will be
31950 20 75 6e 64 65 72 66 75 6c 6c 20 61 66 74 65 72   underfull after
31960 20 74 68 65 20 6a 75 73 74 20 63 65 6c 6c 20 0a   the just cell .
31970 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 69 65          ** copie
31980 64 20 74 6f 20 74 68 65 20 69 6e 74 65 72 6e 61  d to the interna
31990 6c 20 6e 6f 64 65 20 69 73 20 64 65 6c 65 74 65  l node is delete
319a0 64 20 66 72 6f 6d 20 69 74 2e 20 54 68 69 73 20  d from it. This 
319b0 69 73 20 61 20 73 70 65 63 69 61 6c 0a 20 20 20  is a special.   
319c0 20 20 20 20 20 2a 2a 20 63 61 73 65 20 62 65 63       ** case bec
319d0 61 75 73 65 20 74 68 65 20 63 61 6c 6c 20 74 6f  ause the call to
319e0 20 62 61 6c 61 6e 63 65 28 29 20 74 6f 20 63 6f   balance() to co
319f0 72 72 65 63 74 20 74 68 65 20 69 6e 74 65 72 6e  rrect the intern
31a00 61 6c 20 6e 6f 64 65 0a 20 20 20 20 20 20 20 20  al node.        
31a10 2a 2a 20 6d 61 79 20 63 68 61 6e 67 65 20 74 68  ** may change th
31a20 65 20 74 72 65 65 20 73 74 72 75 63 74 75 72 65  e tree structure
31a30 20 61 6e 64 20 69 6e 76 61 6c 69 64 61 74 65 20   and invalidate 
31a40 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 0a  the contents of.
31a50 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6c          ** the l
31a60 65 61 66 43 75 72 2e 61 70 50 61 67 65 5b 5d 20  eafCur.apPage[] 
31a70 61 6e 64 20 6c 65 61 66 43 75 72 2e 61 69 49 64  and leafCur.aiId
31a80 78 5b 5d 20 61 72 72 61 79 73 2c 20 77 68 69 63  x[] arrays, whic
31a90 68 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20  h will be.      
31aa0 20 20 2a 2a 20 75 73 65 64 20 62 79 20 74 68 65    ** used by the
31ab0 20 62 61 6c 61 6e 63 65 28 29 20 72 65 71 75 69   balance() requi
31ac0 72 65 64 20 74 6f 20 63 6f 72 72 65 63 74 20 74  red to correct t
31ad0 68 65 20 75 6e 64 65 72 66 75 6c 6c 20 6c 65 61  he underfull lea
31ae0 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 6f 64  f.        ** nod
31af0 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  e..        **.  
31b00 20 20 20 20 20 20 2a 2a 20 54 68 65 20 66 6f 72        ** The for
31b10 6d 75 6c 61 20 75 73 65 64 20 69 6e 20 74 68 65  mula used in the
31b20 20 65 78 70 72 65 73 73 69 6f 6e 20 61 62 6f 76   expression abov
31b30 65 20 61 72 65 20 62 61 73 65 64 20 6f 6e 20 66  e are based on f
31b40 61 63 65 74 73 20 6f 66 0a 20 20 20 20 20 20 20  acets of.       
31b50 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20 66   ** the SQLite f
31b60 69 6c 65 2d 66 6f 72 6d 61 74 20 74 68 61 74 20  ile-format that 
31b70 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 6f 76  do not change ov
31b80 65 72 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20  er time..       
31b90 20 2a 2f 0a 20 20 20 20 20 20 20 20 74 65 73 74   */.        test
31ba0 63 61 73 65 28 20 70 50 61 67 65 2d 3e 6e 46 72  case( pPage->nFr
31bb0 65 65 3d 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53  ee==pBt->usableS
31bc0 69 7a 65 2a 32 2f 33 2b 31 20 29 3b 0a 20 20 20  ize*2/3+1 );.   
31bd0 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
31be0 4c 65 61 66 50 61 67 65 2d 3e 6e 46 72 65 65 2b  LeafPage->nFree+
31bf0 32 2b 73 7a 4e 65 78 74 3d 3d 70 42 74 2d 3e 75  2+szNext==pBt->u
31c00 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 2b 31 20  sableSize*2/3+1 
31c10 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 61 66 43  );.        leafC
31c20 75 72 73 6f 72 49 6e 76 61 6c 69 64 20 3d 20 31  ursorInvalid = 1
31c30 3b 0a 20 20 20 20 20 20 7d 20 20 20 20 20 20 20  ;.      }       
31c40 20 0a 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   ..      if( rc=
31c50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
31c60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73 71        assert( sq
31c70 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
31c80 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
31c90 50 61 67 65 29 20 29 3b 0a 20 20 20 20 20 20 20  Page) );.       
31ca0 20 70 75 74 34 62 79 74 65 28 66 69 6e 64 4f 76   put4byte(findOv
31cb0 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61 67 65  erflowCell(pPage
31cc0 2c 20 69 64 78 29 2c 20 70 67 6e 6f 43 68 69 6c  , idx), pgnoChil
31cd0 64 29 3b 0a 20 20 20 20 20 20 20 20 56 56 41 5f  d);.        VVA_
31ce0 4f 4e 4c 59 28 20 70 43 75 72 2d 3e 70 61 67 65  ONLY( pCur->page
31cf0 73 53 68 75 66 66 6c 65 64 20 3d 20 30 20 29 3b  sShuffled = 0 );
31d00 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 62 61  .        rc = ba
31d10 6c 61 6e 63 65 28 70 43 75 72 2c 20 30 29 3b 0a  lance(pCur, 0);.
31d20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
31d30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
31d40 20 26 26 20 6c 65 61 66 43 75 72 73 6f 72 49 6e   && leafCursorIn
31d50 76 61 6c 69 64 20 29 7b 0a 20 20 20 20 20 20 20  valid ){.       
31d60 20 2f 2a 20 54 68 65 20 6c 65 61 66 2d 6e 6f 64   /* The leaf-nod
31d70 65 20 69 73 20 6e 6f 77 20 75 6e 64 65 72 66 75  e is now underfu
31d80 6c 6c 20 61 6e 64 20 73 6f 20 74 68 65 20 74 72  ll and so the tr
31d90 65 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a  ee needs to be .
31da0 20 20 20 20 20 20 20 20 2a 2a 20 72 65 62 61 6c          ** rebal
31db0 61 6e 63 65 64 2e 20 48 6f 77 65 76 65 72 2c 20  anced. However, 
31dc0 74 68 65 20 62 61 6c 61 6e 63 65 28 29 20 6f 70  the balance() op
31dd0 65 72 61 74 69 6f 6e 20 6f 6e 20 74 68 65 20 69  eration on the i
31de0 6e 74 65 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  nternal.        
31df0 2a 2a 20 6e 6f 64 65 20 61 62 6f 76 65 20 6d 61  ** node above ma
31e00 79 20 68 61 76 65 20 6d 6f 64 69 66 69 65 64 20  y have modified 
31e10 74 68 65 20 73 74 72 75 63 74 75 72 65 20 6f 66  the structure of
31e20 20 74 68 65 20 42 2d 54 72 65 65 20 61 6e 64 0a   the B-Tree and.
31e30 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68          ** so th
31e40 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e  e current conten
31e50 74 73 20 6f 66 20 6c 65 61 66 43 75 72 2e 61 70  ts of leafCur.ap
31e60 50 61 67 65 5b 5d 20 61 6e 64 20 6c 65 61 66 43  Page[] and leafC
31e70 75 72 2e 61 69 49 64 78 5b 5d 0a 20 20 20 20 20  ur.aiIdx[].     
31e80 20 20 20 2a 2a 20 6d 61 79 20 6e 6f 74 20 62 65     ** may not be
31e90 20 74 72 75 73 74 65 64 2e 0a 20 20 20 20 20 20   trusted..      
31ea0 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
31eb0 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  It is not possib
31ec0 6c 65 20 74 6f 20 63 6f 70 79 20 74 68 65 20 61  le to copy the a
31ed0 6e 63 65 73 74 72 79 20 66 72 6f 6d 20 70 43 75  ncestry from pCu
31ee0 72 2c 20 61 73 20 74 68 65 20 73 61 6d 65 0a 20  r, as the same. 
31ef0 20 20 20 20 20 20 20 2a 2a 20 62 61 6c 61 6e 63         ** balanc
31f00 65 28 29 20 63 61 6c 6c 20 68 61 73 20 69 6e 76  e() call has inv
31f10 61 6c 69 64 61 74 65 64 20 74 68 65 20 70 43 75  alidated the pCu
31f20 72 2d 3e 61 70 50 61 67 65 5b 5d 20 61 6e 64 20  r->apPage[] and 
31f30 61 69 49 64 78 5b 5d 0a 20 20 20 20 20 20 20 20  aiIdx[].        
31f40 2a 2a 20 61 72 72 61 79 73 2e 20 0a 20 20 20 20  ** arrays. .    
31f50 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
31f60 2a 20 54 68 65 20 63 61 6c 6c 20 74 6f 20 73 61  * The call to sa
31f70 76 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  veCursorPosition
31f80 28 29 20 62 65 6c 6f 77 20 69 6e 74 65 72 6e 61  () below interna
31f90 6c 6c 79 20 73 61 76 65 73 20 74 68 65 20 0a 20  lly saves the . 
31fa0 20 20 20 20 20 20 20 2a 2a 20 6b 65 79 20 74 68         ** key th
31fb0 61 74 20 6c 65 61 66 43 75 72 20 69 73 20 63 75  at leafCur is cu
31fc0 72 72 65 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67  rrently pointing
31fd0 20 74 6f 2e 20 43 75 72 72 65 6e 74 6c 79 2c 20   to. Currently, 
31fe0 74 68 65 72 65 0a 20 20 20 20 20 20 20 20 2a 2a  there.        **
31ff0 20 61 72 65 20 74 77 6f 20 63 6f 70 69 65 73 20   are two copies 
32000 6f 66 20 74 68 61 74 20 6b 65 79 20 69 6e 20 74  of that key in t
32010 68 65 20 74 72 65 65 20 2d 20 6f 6e 65 20 68 65  he tree - one he
32020 72 65 20 6f 6e 20 74 68 65 20 6c 65 61 66 0a 20  re on the leaf. 
32030 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 61         ** page a
32040 6e 64 20 6f 6e 65 20 6f 6e 20 73 6f 6d 65 20 69  nd one on some i
32050 6e 74 65 72 6e 61 6c 20 6e 6f 64 65 20 69 6e 20  nternal node in 
32060 74 68 65 20 74 72 65 65 2e 20 54 68 65 20 63 6f  the tree. The co
32070 70 79 20 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a  py on.        **
32080 20 74 68 65 20 6c 65 61 66 20 6e 6f 64 65 20 69   the leaf node i
32090 73 20 61 6c 77 61 79 73 20 74 68 65 20 6e 65 78  s always the nex
320a0 74 20 6b 65 79 20 69 6e 20 74 72 65 65 2d 6f 72  t key in tree-or
320b0 64 65 72 20 61 66 74 65 72 20 74 68 65 20 0a 20  der after the . 
320c0 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f         ** copy o
320d0 6e 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e  n the internal n
320e0 6f 64 65 2e 20 53 6f 2c 20 74 68 65 20 63 61 6c  ode. So, the cal
320f0 6c 20 74 6f 20 73 71 6c 69 74 65 33 42 74 72 65  l to sqlite3Btre
32100 65 4e 65 78 74 28 29 0a 20 20 20 20 20 20 20 20  eNext().        
32110 2a 2a 20 63 61 6c 6c 73 20 72 65 73 74 6f 72 65  ** calls restore
32120 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29  CursorPosition()
32130 20 74 6f 20 70 6f 69 6e 74 20 74 68 65 20 63 75   to point the cu
32140 72 73 6f 72 20 74 6f 20 74 68 65 20 63 6f 70 79  rsor to the copy
32150 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  .        ** stor
32160 65 64 20 6f 6e 20 74 68 65 20 69 6e 74 65 72 6e  ed on the intern
32170 61 6c 20 6e 6f 64 65 2c 20 74 68 65 6e 20 61 64  al node, then ad
32180 76 61 6e 63 65 73 20 74 6f 20 74 68 65 20 6e 65  vances to the ne
32190 78 74 20 65 6e 74 72 79 2c 0a 20 20 20 20 20 20  xt entry,.      
321a0 20 20 2a 2a 20 77 68 69 63 68 20 68 61 70 70 65    ** which happe
321b0 6e 73 20 74 6f 20 62 65 20 74 68 65 20 63 6f 70  ns to be the cop
321c0 79 20 6f 66 20 74 68 65 20 6b 65 79 20 6f 6e 20  y of the key on 
321d0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 6e 6f 64  the internal nod
321e0 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4e 65  e..        ** Ne
321f0 74 20 65 66 66 65 63 74 3a 20 6c 65 61 66 43 75  t effect: leafCu
32200 72 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 62 61  r is pointing ba
32210 63 6b 20 74 6f 20 74 68 65 20 64 75 70 6c 69 63  ck to the duplic
32220 61 74 65 20 63 65 6c 6c 0a 20 20 20 20 20 20 20  ate cell.       
32230 20 2a 2a 20 74 68 61 74 20 6e 65 65 64 73 20 74   ** that needs t
32240 6f 20 62 65 20 72 65 6d 6f 76 65 64 2c 20 61 6e  o be removed, an
32250 64 20 74 68 65 20 6c 65 61 66 43 75 72 2e 61 70  d the leafCur.ap
32260 50 61 67 65 5b 5d 20 61 6e 64 0a 20 20 20 20 20  Page[] and.     
32270 20 20 20 2a 2a 20 6c 65 61 66 43 75 72 2e 61 69     ** leafCur.ai
32280 49 64 78 5b 5d 20 61 72 72 61 79 73 20 61 72 65  Idx[] arrays are
32290 20 63 6f 72 72 65 63 74 2e 0a 20 20 20 20 20 20   correct..      
322a0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 56 56 41    */.        VVA
322b0 5f 4f 4e 4c 59 28 20 50 67 6e 6f 20 6c 65 61 66  _ONLY( Pgno leaf
322c0 50 67 6e 6f 20 3d 20 70 4c 65 61 66 50 61 67 65  Pgno = pLeafPage
322d0 2d 3e 70 67 6e 6f 20 29 3b 0a 20 20 20 20 20 20  ->pgno );.      
322e0 20 20 72 63 20 3d 20 73 61 76 65 43 75 72 73 6f    rc = saveCurso
322f0 72 50 6f 73 69 74 69 6f 6e 28 26 6c 65 61 66 43  rPosition(&leafC
32300 75 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ur);.        if(
32310 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
32320 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
32330 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78   sqlite3BtreeNex
32340 74 28 26 6c 65 61 66 43 75 72 2c 20 26 6e 6f 74  t(&leafCur, &not
32350 55 73 65 64 29 3b 0a 20 20 20 20 20 20 20 20 7d  Used);.        }
32360 0a 20 20 20 20 20 20 20 20 70 4c 65 61 66 50 61  .        pLeafPa
32370 67 65 20 3d 20 6c 65 61 66 43 75 72 2e 61 70 50  ge = leafCur.apP
32380 61 67 65 5b 6c 65 61 66 43 75 72 2e 69 50 61 67  age[leafCur.iPag
32390 65 5d 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  e];.        asse
323a0 72 74 28 20 70 4c 65 61 66 50 61 67 65 2d 3e 70  rt( pLeafPage->p
323b0 67 6e 6f 3d 3d 6c 65 61 66 50 67 6e 6f 20 29 3b  gno==leafPgno );
323c0 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
323d0 20 6c 65 61 66 43 75 72 2e 61 69 49 64 78 5b 6c   leafCur.aiIdx[l
323e0 65 61 66 43 75 72 2e 69 50 61 67 65 5d 3d 3d 30  eafCur.iPage]==0
323f0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   );.      }..   
32400 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
32410 3d 3d 72 63 0a 20 20 20 20 20 20 20 26 26 20 53  ==rc.       && S
32420 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20  QLITE_OK==(rc = 
32430 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
32440 65 28 70 4c 65 61 66 50 61 67 65 2d 3e 70 44 62  e(pLeafPage->pDb
32450 50 61 67 65 29 29 20 0a 20 20 20 20 20 20 29 7b  Page)) .      ){
32460 0a 20 20 20 20 20 20 20 20 64 72 6f 70 43 65 6c  .        dropCel
32470 6c 28 70 4c 65 61 66 50 61 67 65 2c 20 30 2c 20  l(pLeafPage, 0, 
32480 73 7a 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 20  szNext);.       
32490 20 56 56 41 5f 4f 4e 4c 59 28 20 6c 65 61 66 43   VVA_ONLY( leafC
324a0 75 72 2e 70 61 67 65 73 53 68 75 66 66 6c 65 64  ur.pagesShuffled
324b0 20 3d 20 30 20 29 3b 0a 20 20 20 20 20 20 20 20   = 0 );.        
324c0 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 26 6c 65  rc = balance(&le
324d0 61 66 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20  afCur, 0);.     
324e0 20 20 20 61 73 73 65 72 74 28 20 6c 65 61 66 43     assert( leafC
324f0 75 72 73 6f 72 49 6e 76 61 6c 69 64 20 7c 7c 20  ursorInvalid || 
32500 21 6c 65 61 66 43 75 72 2e 70 61 67 65 73 53 68  !leafCur.pagesSh
32510 75 66 66 6c 65 64 0a 20 20 20 20 20 20 20 20 20  uffled.         
32520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32530 20 20 20 20 20 20 20 20 20 20 7c 7c 20 21 70 43            || !pC
32540 75 72 2d 3e 70 61 67 65 73 53 68 75 66 66 6c 65  ur->pagesShuffle
32550 64 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  d );.      }.   
32560 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74   }.    sqlite3Bt
32570 72 65 65 52 65 6c 65 61 73 65 54 65 6d 70 43 75  reeReleaseTempCu
32580 72 73 6f 72 28 26 6c 65 61 66 43 75 72 29 3b 0a  rsor(&leafCur);.
32590 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 52 41    }else{.    TRA
325a0 43 45 28 28 22 44 45 4c 45 54 45 3a 20 74 61 62  CE(("DELETE: tab
325b0 6c 65 3d 25 64 20 64 65 6c 65 74 65 20 66 72 6f  le=%d delete fro
325c0 6d 20 6c 65 61 66 20 25 64 5c 6e 22 2c 0a 20 20  m leaf %d\n",.  
325d0 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f 52       pCur->pgnoR
325e0 6f 6f 74 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f  oot, pPage->pgno
325f0 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 64 72 6f  ));.    rc = dro
32600 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78  pCell(pPage, idx
32610 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  , cellSizePtr(pP
32620 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20 20  age, pCell));.  
32630 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
32640 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
32650 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72 2c 20  = balance(pCur, 
32660 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  0);.    }.  }.  
32670 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
32680 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52  K ){.    moveToR
32690 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20  oot(pCur);.  }. 
326a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
326b0 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
326c0 77 20 42 54 72 65 65 20 74 61 62 6c 65 2e 20 20  w BTree table.  
326d0 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 54 61  Write into *piTa
326e0 62 6c 65 20 74 68 65 20 70 61 67 65 0a 2a 2a 20  ble the page.** 
326f0 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 72  number for the r
32700 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
32710 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  new table..**.**
32720 20 54 68 65 20 74 79 70 65 20 6f 66 20 74 79 70   The type of typ
32730 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  e is determined 
32740 62 79 20 74 68 65 20 66 6c 61 67 73 20 70 61 72  by the flags par
32750 61 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20 74 68  ameter.  Only th
32760 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 76  e.** following v
32770 61 6c 75 65 73 20 6f 66 20 66 6c 61 67 73 20 61  alues of flags a
32780 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  re currently in 
32790 75 73 65 2e 20 20 4f 74 68 65 72 20 76 61 6c 75  use.  Other valu
327a0 65 73 20 66 6f 72 0a 2a 2a 20 66 6c 61 67 73 20  es for.** flags 
327b0 6d 69 67 68 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a  might not work:.
327c0 2a 2a 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f  **.**     BTREE_
327d0 49 4e 54 4b 45 59 7c 42 54 52 45 45 5f 4c 45 41  INTKEY|BTREE_LEA
327e0 46 44 41 54 41 20 20 20 20 20 55 73 65 64 20 66  FDATA     Used f
327f0 6f 72 20 53 51 4c 20 74 61 62 6c 65 73 20 77 69  or SQL tables wi
32800 74 68 20 72 6f 77 69 64 20 6b 65 79 73 0a 2a 2a  th rowid keys.**
32810 20 20 20 20 20 42 54 52 45 45 5f 5a 45 52 4f 44       BTREE_ZEROD
32820 41 54 41 20 20 20 20 20 20 20 20 20 20 20 20 20  ATA             
32830 20 20 20 20 20 55 73 65 64 20 66 6f 72 20 53 51       Used for SQ
32840 4c 20 69 6e 64 69 63 65 73 0a 2a 2f 0a 73 74 61  L indices.*/.sta
32850 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 72 65  tic int btreeCre
32860 61 74 65 54 61 62 6c 65 28 42 74 72 65 65 20 2a  ateTable(Btree *
32870 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c  p, int *piTable,
32880 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 42   int flags){.  B
32890 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
328a0 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65  ->pBt;.  MemPage
328b0 20 2a 70 52 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20   *pRoot;.  Pgno 
328c0 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  pgnoRoot;.  int 
328d0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
328e0 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
328f0 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 61 73  Mutex(p) );.  as
32900 73 65 72 74 28 20 70 42 74 2d 3e 69 6e 54 72 61  sert( pBt->inTra
32910 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
32920 57 52 49 54 45 20 29 3b 0a 20 20 61 73 73 65 72  WRITE );.  asser
32930 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  t( !pBt->readOnl
32940 79 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  y );..#ifdef SQL
32950 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
32960 55 55 4d 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63  UUM.  rc = alloc
32970 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
32980 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f 52  , &pRoot, &pgnoR
32990 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 69 66  oot, 1, 0);.  if
329a0 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
329b0 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6c 73 65  rn rc;.  }.#else
329c0 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f  .  if( pBt->auto
329d0 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67  Vacuum ){.    Pg
329e0 6e 6f 20 70 67 6e 6f 4d 6f 76 65 3b 20 20 20 20  no pgnoMove;    
329f0 20 20 2f 2a 20 4d 6f 76 65 20 61 20 70 61 67 65    /* Move a page
32a00 20 68 65 72 65 20 74 6f 20 6d 61 6b 65 20 72 6f   here to make ro
32a10 6f 6d 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 2d  om for the root-
32a20 70 61 67 65 20 2a 2f 0a 20 20 20 20 4d 65 6d 50  page */.    MemP
32a30 61 67 65 20 2a 70 50 61 67 65 4d 6f 76 65 3b 20  age *pPageMove; 
32a40 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20 6d  /* The page to m
32a50 6f 76 65 20 74 6f 2e 20 2a 2f 0a 0a 20 20 20 20  ove to. */..    
32a60 2f 2a 20 43 72 65 61 74 69 6e 67 20 61 20 6e 65  /* Creating a ne
32a70 77 20 74 61 62 6c 65 20 6d 61 79 20 70 72 6f 62  w table may prob
32a80 61 62 6c 79 20 72 65 71 75 69 72 65 20 6d 6f 76  ably require mov
32a90 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e 67 20  ing an existing 
32aa0 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20  database.    ** 
32ab0 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f 72  to make room for
32ac0 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 73 20   the new tables 
32ad0 72 6f 6f 74 20 70 61 67 65 2e 20 49 6e 20 63 61  root page. In ca
32ae0 73 65 20 74 68 69 73 20 70 61 67 65 20 74 75 72  se this page tur
32af0 6e 73 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f  ns.    ** out to
32b00 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   be an overflow 
32b10 70 61 67 65 2c 20 64 65 6c 65 74 65 20 61 6c 6c  page, delete all
32b20 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6d   overflow page-m
32b30 61 70 20 63 61 63 68 65 73 0a 20 20 20 20 2a 2a  ap caches.    **
32b40 20 68 65 6c 64 20 62 79 20 6f 70 65 6e 20 63 75   held by open cu
32b50 72 73 6f 72 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  rsors..    */.  
32b60 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f    invalidateAllO
32b70 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42 74  verflowCache(pBt
32b80 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  );..    /* Read 
32b90 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 65 74  the value of met
32ba0 61 5b 33 5d 20 66 72 6f 6d 20 74 68 65 20 64 61  a[3] from the da
32bb0 74 61 62 61 73 65 20 74 6f 20 64 65 74 65 72 6d  tabase to determ
32bc0 69 6e 65 20 77 68 65 72 65 20 74 68 65 0a 20 20  ine where the.  
32bd0 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20 6f    ** root page o
32be0 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 20  f the new table 
32bf0 73 68 6f 75 6c 64 20 67 6f 2e 20 6d 65 74 61 5b  should go. meta[
32c00 33 5d 20 69 73 20 74 68 65 20 6c 61 72 67 65 73  3] is the larges
32c10 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  t root-page.    
32c20 2a 2a 20 63 72 65 61 74 65 64 20 73 6f 20 66 61  ** created so fa
32c30 72 2c 20 73 6f 20 74 68 65 20 6e 65 77 20 72 6f  r, so the new ro
32c40 6f 74 2d 70 61 67 65 20 69 73 20 28 6d 65 74 61  ot-page is (meta
32c50 5b 33 5d 2b 31 29 2e 0a 20 20 20 20 2a 2f 0a 20  [3]+1)..    */. 
32c60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
32c70 74 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20 34  treeGetMeta(p, 4
32c80 2c 20 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20  , &pgnoRoot);.  
32c90 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
32ca0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
32cb0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
32cc0 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a 20    pgnoRoot++;.. 
32cd0 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72 6f     /* The new ro
32ce0 6f 74 2d 70 61 67 65 20 6d 61 79 20 6e 6f 74 20  ot-page may not 
32cf0 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e 20  be allocated on 
32d00 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61  a pointer-map pa
32d10 67 65 2c 20 6f 72 20 74 68 65 0a 20 20 20 20 2a  ge, or the.    *
32d20 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 70  * PENDING_BYTE p
32d30 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
32d40 77 68 69 6c 65 28 20 70 67 6e 6f 52 6f 6f 74 3d  while( pgnoRoot=
32d50 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70  =PTRMAP_PAGENO(p
32d60 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 29 20 7c 7c  Bt, pgnoRoot) ||
32d70 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 52 6f 6f  .        pgnoRoo
32d80 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f  t==PENDING_BYTE_
32d90 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20  PAGE(pBt) ){.   
32da0 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 20     pgnoRoot++;. 
32db0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
32dc0 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20 29 3b 0a   pgnoRoot>=3 );.
32dd0 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  .    /* Allocate
32de0 20 61 20 70 61 67 65 2e 20 54 68 65 20 70 61 67   a page. The pag
32df0 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79  e that currently
32e00 20 72 65 73 69 64 65 73 20 61 74 20 70 67 6e 6f   resides at pgno
32e10 52 6f 6f 74 20 77 69 6c 6c 0a 20 20 20 20 2a 2a  Root will.    **
32e20 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 74 68 65   be moved to the
32e30 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65 20   allocated page 
32e40 28 75 6e 6c 65 73 73 20 74 68 65 20 61 6c 6c 6f  (unless the allo
32e50 63 61 74 65 64 20 70 61 67 65 20 68 61 70 70 65  cated page happe
32e60 6e 73 0a 20 20 20 20 2a 2a 20 74 6f 20 72 65 73  ns.    ** to res
32e70 69 64 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74 29  ide at pgnoRoot)
32e80 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
32e90 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65 50  = allocateBtreeP
32ea0 61 67 65 28 70 42 74 2c 20 26 70 50 61 67 65 4d  age(pBt, &pPageM
32eb0 6f 76 65 2c 20 26 70 67 6e 6f 4d 6f 76 65 2c 20  ove, &pgnoMove, 
32ec0 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 0a 20 20  pgnoRoot, 1);.  
32ed0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
32ee0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
32ef0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
32f00 20 20 20 69 66 28 20 70 67 6e 6f 4d 6f 76 65 21     if( pgnoMove!
32f10 3d 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20 20  =pgnoRoot ){.   
32f20 20 20 20 2f 2a 20 70 67 6e 6f 52 6f 6f 74 20 69     /* pgnoRoot i
32f30 73 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20  s the page that 
32f40 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f 72  will be used for
32f50 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20 6f   the root-page o
32f60 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e  f.      ** the n
32f70 65 77 20 74 61 62 6c 65 20 28 61 73 73 75 6d 69  ew table (assumi
32f80 6e 67 20 61 6e 20 65 72 72 6f 72 20 64 69 64 20  ng an error did 
32f90 6e 6f 74 20 6f 63 63 75 72 29 2e 20 42 75 74 20  not occur). But 
32fa0 77 65 20 77 65 72 65 0a 20 20 20 20 20 20 2a 2a  we were.      **
32fb0 20 61 6c 6c 6f 63 61 74 65 64 20 70 67 6e 6f 4d   allocated pgnoM
32fc0 6f 76 65 2e 20 49 66 20 72 65 71 75 69 72 65 64  ove. If required
32fd0 20 28 69 2e 65 2e 20 69 66 20 69 74 20 77 61 73   (i.e. if it was
32fe0 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 0a 20   not allocated. 
32ff0 20 20 20 20 20 2a 2a 20 62 79 20 65 78 74 65 6e       ** by exten
33000 64 69 6e 67 20 74 68 65 20 66 69 6c 65 29 2c 20  ding the file), 
33010 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
33020 20 61 74 20 70 6f 73 69 74 69 6f 6e 20 70 67 6e   at position pgn
33030 6f 4d 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20 69  oMove.      ** i
33040 73 20 61 6c 72 65 61 64 79 20 6a 6f 75 72 6e 61  s already journa
33050 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  led..      */.  
33060 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20 20      u8 eType;.  
33070 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67      Pgno iPtrPag
33080 65 3b 0a 0a 20 20 20 20 20 20 72 65 6c 65 61 73  e;..      releas
33090 65 50 61 67 65 28 70 50 61 67 65 4d 6f 76 65 29  ePage(pPageMove)
330a0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 6f 76 65  ;..      /* Move
330b0 20 74 68 65 20 70 61 67 65 20 63 75 72 72 65 6e   the page curren
330c0 74 6c 79 20 61 74 20 70 67 6e 6f 52 6f 6f 74 20  tly at pgnoRoot 
330d0 74 6f 20 70 67 6e 6f 4d 6f 76 65 2e 20 2a 2f 0a  to pgnoMove. */.
330e0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
330f0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
33100 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26 70  Bt, pgnoRoot, &p
33110 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Root, 0);.      
33120 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
33130 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
33140 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
33150 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
33160 70 47 65 74 28 70 42 74 2c 20 70 67 6e 6f 52 6f  pGet(pBt, pgnoRo
33170 6f 74 2c 20 26 65 54 79 70 65 2c 20 26 69 50 74  ot, &eType, &iPt
33180 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  rPage);.      if
33190 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
331a0 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  || eType==PTRMAP
331b0 5f 52 4f 4f 54 50 41 47 45 20 7c 7c 20 65 54 79  _ROOTPAGE || eTy
331c0 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45 50  pe==PTRMAP_FREEP
331d0 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72  AGE ){.        r
331e0 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
331f0 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
33200 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
33210 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79 70      assert( eTyp
33220 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41  e!=PTRMAP_ROOTPA
33230 47 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  GE );.      asse
33240 72 74 28 20 65 54 79 70 65 21 3d 50 54 52 4d 41  rt( eType!=PTRMA
33250 50 5f 46 52 45 45 50 41 47 45 20 29 3b 0a 20 20  P_FREEPAGE );.  
33260 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61 74      rc = relocat
33270 65 50 61 67 65 28 70 42 74 2c 20 70 52 6f 6f 74  ePage(pBt, pRoot
33280 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61 67  , eType, iPtrPag
33290 65 2c 20 70 67 6e 6f 4d 6f 76 65 2c 20 30 29 3b  e, pgnoMove, 0);
332a0 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
332b0 67 65 28 70 52 6f 6f 74 29 3b 0a 0a 20 20 20 20  ge(pRoot);..    
332c0 20 20 2f 2a 20 4f 62 74 61 69 6e 20 74 68 65 20    /* Obtain the 
332d0 70 61 67 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74  page at pgnoRoot
332e0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63   */.      if( rc
332f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
33300 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
33310 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
33320 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
33330 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70 67  eGetPage(pBt, pg
33340 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c 20  noRoot, &pRoot, 
33350 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
33360 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
33370 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
33380 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
33390 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
333a0 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70 44  rWrite(pRoot->pD
333b0 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
333c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
333d0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61  ){.        relea
333e0 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a 20  sePage(pRoot);. 
333f0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
33400 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
33410 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74  lse{.      pRoot
33420 20 3d 20 70 50 61 67 65 4d 6f 76 65 3b 0a 20 20   = pPageMove;.  
33430 20 20 7d 20 0a 0a 20 20 20 20 2f 2a 20 55 70 64    } ..    /* Upd
33440 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72 2d  ate the pointer-
33450 6d 61 70 20 61 6e 64 20 6d 65 74 61 2d 64 61 74  map and meta-dat
33460 61 20 77 69 74 68 20 74 68 65 20 6e 65 77 20 72  a with the new r
33470 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72 2e  oot-page number.
33480 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 74 72   */.    rc = ptr
33490 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e 6f  mapPut(pBt, pgno
334a0 52 6f 6f 74 2c 20 50 54 52 4d 41 50 5f 52 4f 4f  Root, PTRMAP_ROO
334b0 54 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20 69  TPAGE, 0);.    i
334c0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
334d0 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
334e0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
334f0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
33500 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 55   = sqlite3BtreeU
33510 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c 20  pdateMeta(p, 4, 
33520 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20 69  pgnoRoot);.    i
33530 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 72  f( rc ){.      r
33540 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f 74  eleasePage(pRoot
33550 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
33560 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c  rc;.    }..  }el
33570 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c 6c  se{.    rc = all
33580 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70  ocateBtreePage(p
33590 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e  Bt, &pRoot, &pgn
335a0 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20  oRoot, 1, 0);.  
335b0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
335c0 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
335d0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
335e0 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62  e3PagerIswriteab
335f0 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67  le(pRoot->pDbPag
33600 65 29 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67 65  e) );.  zeroPage
33610 28 70 52 6f 6f 74 2c 20 66 6c 61 67 73 20 7c 20  (pRoot, flags | 
33620 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 73 71 6c  PTF_LEAF);.  sql
33630 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
33640 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a  Root->pDbPage);.
33650 20 20 2a 70 69 54 61 62 6c 65 20 3d 20 28 69 6e    *piTable = (in
33660 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72 65  t)pgnoRoot;.  re
33670 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
33680 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  }.int sqlite3Btr
33690 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 42 74  eeCreateTable(Bt
336a0 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69 54  ree *p, int *piT
336b0 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  able, int flags)
336c0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
336d0 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
336e0 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 64 62  p);.  p->pBt->db
336f0 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d   = p->db;.  rc =
33700 20 62 74 72 65 65 43 72 65 61 74 65 54 61 62 6c   btreeCreateTabl
33710 65 28 70 2c 20 70 69 54 61 62 6c 65 2c 20 66 6c  e(p, piTable, fl
33720 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  ags);.  sqlite3B
33730 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
33740 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
33750 0a 2a 2a 20 45 72 61 73 65 20 74 68 65 20 67 69  .** Erase the gi
33760 76 65 6e 20 64 61 74 61 62 61 73 65 20 70 61 67  ven database pag
33770 65 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 63 68  e and all its ch
33780 69 6c 64 72 65 6e 2e 20 20 52 65 74 75 72 6e 0a  ildren.  Return.
33790 2a 2a 20 74 68 65 20 70 61 67 65 20 74 6f 20 74  ** the page to t
337a0 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2f 0a  he freelist..*/.
337b0 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61 72  static int clear
337c0 44 61 74 61 62 61 73 65 50 61 67 65 28 0a 20 20  DatabasePage(.  
337d0 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20  BtShared *pBt,  
337e0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
337f0 42 54 72 65 65 20 74 68 61 74 20 63 6f 6e 74 61  BTree that conta
33800 69 6e 73 20 74 68 65 20 74 61 62 6c 65 20 2a 2f  ins the table */
33810 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20  .  Pgno pgno,   
33820 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
33830 20 6e 75 6d 62 65 72 20 74 6f 20 63 6c 65 61 72   number to clear
33840 20 2a 2f 0a 20 20 69 6e 74 20 66 72 65 65 50 61   */.  int freePa
33850 67 65 46 6c 61 67 2c 20 20 20 20 20 2f 2a 20 44  geFlag,     /* D
33860 65 61 6c 6c 6f 63 61 74 65 20 70 61 67 65 20 69  eallocate page i
33870 66 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74 20  f true */.  int 
33880 2a 70 6e 43 68 61 6e 67 65 0a 29 7b 0a 20 20 4d  *pnChange.){.  M
33890 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20  emPage *pPage = 
338a0 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  0;.  int rc;.  u
338b0 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43  nsigned char *pC
338c0 65 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  ell;.  int i;.. 
338d0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
338e0 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d  _mutex_held(pBt-
338f0 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28  >mutex) );.  if(
33900 20 70 67 6e 6f 3e 70 61 67 65 72 50 61 67 65 63   pgno>pagerPagec
33910 6f 75 6e 74 28 70 42 74 29 20 29 7b 0a 20 20 20  ount(pBt) ){.   
33920 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
33930 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
33940 0a 0a 20 20 72 63 20 3d 20 67 65 74 41 6e 64 49  ..  rc = getAndI
33950 6e 69 74 50 61 67 65 28 70 42 74 2c 20 70 67 6e  nitPage(pBt, pgn
33960 6f 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 69 66  o, &pPage);.  if
33970 28 20 72 63 20 29 20 67 6f 74 6f 20 63 6c 65 61  ( rc ) goto clea
33980 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75  rdatabasepage_ou
33990 74 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  t;.  for(i=0; i<
339a0 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20 69 2b  pPage->nCell; i+
339b0 2b 29 7b 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20  +){.    pCell = 
339c0 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20  findCell(pPage, 
339d0 69 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61  i);.    if( !pPa
339e0 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
339f0 20 20 72 63 20 3d 20 63 6c 65 61 72 44 61 74 61    rc = clearData
33a00 62 61 73 65 50 61 67 65 28 70 42 74 2c 20 67 65  basePage(pBt, ge
33a10 74 34 62 79 74 65 28 70 43 65 6c 6c 29 2c 20 31  t4byte(pCell), 1
33a20 2c 20 70 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20  , pnChange);.   
33a30 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
33a40 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61   cleardatabasepa
33a50 67 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  ge_out;.    }.  
33a60 20 20 72 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c    rc = clearCell
33a70 28 70 50 61 67 65 2c 20 70 43 65 6c 6c 29 3b 0a  (pPage, pCell);.
33a80 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
33a90 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65 70  o cleardatabasep
33aa0 61 67 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69  age_out;.  }.  i
33ab0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
33ac0 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61  ){.    rc = clea
33ad0 72 44 61 74 61 62 61 73 65 50 61 67 65 28 70 42  rDatabasePage(pB
33ae0 74 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61  t, get4byte(&pPa
33af0 67 65 2d 3e 61 44 61 74 61 5b 38 5d 29 2c 20 31  ge->aData[8]), 1
33b00 2c 20 70 6e 43 68 61 6e 67 65 29 3b 0a 20 20 20  , pnChange);.   
33b10 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 63   if( rc ) goto c
33b20 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65  leardatabasepage
33b30 5f 6f 75 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66  _out;.  }else if
33b40 28 20 70 6e 43 68 61 6e 67 65 20 29 7b 0a 20 20  ( pnChange ){.  
33b50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
33b60 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20 2a  >intKey );.    *
33b70 70 6e 43 68 61 6e 67 65 20 2b 3d 20 70 50 61 67  pnChange += pPag
33b80 65 2d 3e 6e 43 65 6c 6c 3b 0a 20 20 7d 0a 20 20  e->nCell;.  }.  
33b90 69 66 28 20 66 72 65 65 50 61 67 65 46 6c 61 67  if( freePageFlag
33ba0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 66 72 65   ){.    rc = fre
33bb0 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
33bc0 7d 65 6c 73 65 20 69 66 28 20 28 72 63 20 3d 20  }else if( (rc = 
33bd0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
33be0 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65  e(pPage->pDbPage
33bf0 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 65 72  ))==0 ){.    zer
33c00 6f 50 61 67 65 28 70 50 61 67 65 2c 20 70 50 61  oPage(pPage, pPa
33c10 67 65 2d 3e 61 44 61 74 61 5b 30 5d 20 7c 20 50  ge->aData[0] | P
33c20 54 46 5f 4c 45 41 46 29 3b 0a 20 20 7d 0a 0a 63  TF_LEAF);.  }..c
33c30 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67 65  leardatabasepage
33c40 5f 6f 75 74 3a 0a 20 20 72 65 6c 65 61 73 65 50  _out:.  releaseP
33c50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 72 65  age(pPage);.  re
33c60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
33c70 2a 20 44 65 6c 65 74 65 20 61 6c 6c 20 69 6e 66  * Delete all inf
33c80 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20  ormation from a 
33c90 73 69 6e 67 6c 65 20 74 61 62 6c 65 20 69 6e 20  single table in 
33ca0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 69  the database.  i
33cb0 54 61 62 6c 65 20 69 73 0a 2a 2a 20 74 68 65 20  Table is.** the 
33cc0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
33cd0 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  he root of the t
33ce0 61 62 6c 65 2e 20 20 41 66 74 65 72 20 74 68 69  able.  After thi
33cf0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
33d00 73 2c 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70  s,.** the root p
33d10 61 67 65 20 69 73 20 65 6d 70 74 79 2c 20 62 75  age is empty, bu
33d20 74 20 73 74 69 6c 6c 20 65 78 69 73 74 73 2e 0a  t still exists..
33d30 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
33d40 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74  ne will fail wit
33d50 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20  h SQLITE_LOCKED 
33d60 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  if there are any
33d70 20 6f 70 65 6e 0a 2a 2a 20 72 65 61 64 20 63 75   open.** read cu
33d80 72 73 6f 72 73 20 6f 6e 20 74 68 65 20 74 61 62  rsors on the tab
33d90 6c 65 2e 20 20 4f 70 65 6e 20 77 72 69 74 65 20  le.  Open write 
33da0 63 75 72 73 6f 72 73 20 61 72 65 20 6d 6f 76 65  cursors are move
33db0 64 20 74 6f 20 74 68 65 0a 2a 2a 20 72 6f 6f 74  d to the.** root
33dc0 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a   of the table..*
33dd0 2a 0a 2a 2a 20 49 66 20 70 6e 43 68 61 6e 67 65  *.** If pnChange
33de0 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   is not NULL, th
33df0 65 6e 20 74 61 62 6c 65 20 69 54 61 62 6c 65 20  en table iTable 
33e00 6d 75 73 74 20 62 65 20 61 6e 20 69 6e 74 6b 65  must be an intke
33e10 79 20 74 61 62 6c 65 2e 20 54 68 65 0a 2a 2a 20  y table. The.** 
33e20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 70 6f  integer value po
33e30 69 6e 74 65 64 20 74 6f 20 62 79 20 70 6e 43 68  inted to by pnCh
33e40 61 6e 67 65 20 69 73 20 69 6e 63 72 65 6d 65 6e  ange is incremen
33e50 74 65 64 20 62 79 20 74 68 65 20 6e 75 6d 62 65  ted by the numbe
33e60 72 20 6f 66 0a 2a 2a 20 65 6e 74 72 69 65 73 20  r of.** entries 
33e70 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f  in the table..*/
33e80 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
33e90 65 43 6c 65 61 72 54 61 62 6c 65 28 42 74 72 65  eClearTable(Btre
33ea0 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65  e *p, int iTable
33eb0 2c 20 69 6e 74 20 2a 70 6e 43 68 61 6e 67 65 29  , int *pnChange)
33ec0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
33ed0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
33ee0 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42  >pBt;.  sqlite3B
33ef0 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
33f00 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
33f10 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e  .  assert( p->in
33f20 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49  Trans==TRANS_WRI
33f30 54 45 20 29 3b 0a 20 20 69 66 28 20 28 72 63 20  TE );.  if( (rc 
33f40 3d 20 63 68 65 63 6b 46 6f 72 52 65 61 64 43 6f  = checkForReadCo
33f50 6e 66 6c 69 63 74 73 28 70 2c 20 69 54 61 62 6c  nflicts(p, iTabl
33f60 65 2c 20 30 2c 20 31 29 29 21 3d 53 51 4c 49 54  e, 0, 1))!=SQLIT
33f70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 6e  E_OK ){.    /* n
33f80 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20 2a 2f 0a  othing to do */.
33f90 20 20 7d 65 6c 73 65 20 69 66 28 20 53 51 4c 49    }else if( SQLI
33fa0 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 61 76  TE_OK!=(rc = sav
33fb0 65 41 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c  eAllCursors(pBt,
33fc0 20 69 54 61 62 6c 65 2c 20 30 29 29 20 29 7b 0a   iTable, 0)) ){.
33fd0 20 20 20 20 2f 2a 20 6e 6f 74 68 69 6e 67 20 74      /* nothing t
33fe0 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  o do */.  }else{
33ff0 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72 44  .    rc = clearD
34000 61 74 61 62 61 73 65 50 61 67 65 28 70 42 74 2c  atabasePage(pBt,
34010 20 28 50 67 6e 6f 29 69 54 61 62 6c 65 2c 20 30   (Pgno)iTable, 0
34020 2c 20 70 6e 43 68 61 6e 67 65 29 3b 0a 20 20 7d  , pnChange);.  }
34030 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
34040 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
34050 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n rc;.}../*.** E
34060 72 61 73 65 20 61 6c 6c 20 69 6e 66 6f 72 6d 61  rase all informa
34070 74 69 6f 6e 20 69 6e 20 61 20 74 61 62 6c 65 20  tion in a table 
34080 61 6e 64 20 61 64 64 20 74 68 65 20 72 6f 6f 74  and add the root
34090 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f   of the table to
340a0 0a 2a 2a 20 74 68 65 20 66 72 65 65 6c 69 73 74  .** the freelist
340b0 2e 20 20 45 78 63 65 70 74 2c 20 74 68 65 20 72  .  Except, the r
340c0 6f 6f 74 20 6f 66 20 74 68 65 20 70 72 69 6e 63  oot of the princ
340d0 69 70 6c 65 20 74 61 62 6c 65 20 28 74 68 65 20  iple table (the 
340e0 6f 6e 65 20 6f 6e 0a 2a 2a 20 70 61 67 65 20 31  one on.** page 1
340f0 29 20 69 73 20 6e 65 76 65 72 20 61 64 64 65 64  ) is never added
34100 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74   to the freelist
34110 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
34120 74 69 6e 65 20 77 69 6c 6c 20 66 61 69 6c 20 77  tine will fail w
34130 69 74 68 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  ith SQLITE_LOCKE
34140 44 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  D if there are a
34150 6e 79 20 6f 70 65 6e 0a 2a 2a 20 63 75 72 73 6f  ny open.** curso
34160 72 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e  rs on the table.
34170 0a 2a 2a 0a 2a 2a 20 49 66 20 41 55 54 4f 56 41  .**.** If AUTOVA
34180 43 55 55 4d 20 69 73 20 65 6e 61 62 6c 65 64 20  CUUM is enabled 
34190 61 6e 64 20 74 68 65 20 70 61 67 65 20 61 74 20  and the page at 
341a0 69 54 61 62 6c 65 20 69 73 20 6e 6f 74 20 74 68  iTable is not th
341b0 65 20 6c 61 73 74 0a 2a 2a 20 72 6f 6f 74 20 70  e last.** root p
341c0 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  age in the datab
341d0 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74  ase file, then t
341e0 68 65 20 6c 61 73 74 20 72 6f 6f 74 20 70 61 67  he last root pag
341f0 65 20 0a 2a 2a 20 69 6e 20 74 68 65 20 64 61 74  e .** in the dat
34200 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6d 6f  abase file is mo
34210 76 65 64 20 69 6e 74 6f 20 74 68 65 20 73 6c 6f  ved into the slo
34220 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70  t formerly occup
34230 69 65 64 20 62 79 0a 2a 2a 20 69 54 61 62 6c 65  ied by.** iTable
34240 20 61 6e 64 20 74 68 61 74 20 6c 61 73 74 20 73   and that last s
34250 6c 6f 74 20 66 6f 72 6d 65 72 6c 79 20 6f 63 63  lot formerly occ
34260 75 70 69 65 64 20 62 79 20 74 68 65 20 6c 61 73  upied by the las
34270 74 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2a 20 69  t root page.** i
34280 73 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66  s added to the f
34290 72 65 65 6c 69 73 74 20 69 6e 73 74 65 61 64 20  reelist instead 
342a0 6f 66 20 69 54 61 62 6c 65 2e 20 20 49 6e 20 74  of iTable.  In t
342b0 68 69 73 20 73 61 79 2c 20 61 6c 6c 0a 2a 2a 20  his say, all.** 
342c0 72 6f 6f 74 20 70 61 67 65 73 20 61 72 65 20 6b  root pages are k
342d0 65 70 74 20 61 74 20 74 68 65 20 62 65 67 69 6e  ept at the begin
342e0 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61  ning of the data
342f0 62 61 73 65 20 66 69 6c 65 2c 20 77 68 69 63 68  base file, which
34300 0a 2a 2a 20 69 73 20 6e 65 63 65 73 73 61 72 79  .** is necessary
34310 20 66 6f 72 20 41 55 54 4f 56 41 43 55 55 4d 20   for AUTOVACUUM 
34320 74 6f 20 77 6f 72 6b 20 72 69 67 68 74 2e 20 20  to work right.  
34330 2a 70 69 4d 6f 76 65 64 20 69 73 20 73 65 74 20  *piMoved is set 
34340 74 6f 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20  to the .** page 
34350 6e 75 6d 62 65 72 20 74 68 61 74 20 75 73 65 64  number that used
34360 20 74 6f 20 62 65 20 74 68 65 20 6c 61 73 74 20   to be the last 
34370 72 6f 6f 74 20 70 61 67 65 20 69 6e 20 74 68 65  root page in the
34380 20 66 69 6c 65 20 62 65 66 6f 72 65 0a 2a 2a 20   file before.** 
34390 74 68 65 20 6d 6f 76 65 2e 20 20 49 66 20 6e 6f  the move.  If no
343a0 20 70 61 67 65 20 67 65 74 73 20 6d 6f 76 65 64   page gets moved
343b0 2c 20 2a 70 69 4d 6f 76 65 64 20 69 73 20 73 65  , *piMoved is se
343c0 74 20 74 6f 20 30 2e 0a 2a 2a 20 54 68 65 20 6c  t to 0..** The l
343d0 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20 69 73  ast root page is
343e0 20 72 65 63 6f 72 64 65 64 20 69 6e 20 6d 65 74   recorded in met
343f0 61 5b 33 5d 20 61 6e 64 20 74 68 65 20 76 61 6c  a[3] and the val
34400 75 65 20 6f 66 0a 2a 2a 20 6d 65 74 61 5b 33 5d  ue of.** meta[3]
34410 20 69 73 20 75 70 64 61 74 65 64 20 62 79 20 74   is updated by t
34420 68 69 73 20 70 72 6f 63 65 64 75 72 65 2e 0a 2a  his procedure..*
34430 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74 72  /.static int btr
34440 65 65 44 72 6f 70 54 61 62 6c 65 28 42 74 72 65  eeDropTable(Btre
34450 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c  e *p, Pgno iTabl
34460 65 2c 20 69 6e 74 20 2a 70 69 4d 6f 76 65 64 29  e, int *piMoved)
34470 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 4d 65  {.  int rc;.  Me
34480 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
34490 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  ;.  BtShared *pB
344a0 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 61  t = p->pBt;..  a
344b0 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
344c0 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
344d0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
344e0 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
344f0 57 52 49 54 45 20 29 3b 0a 0a 20 20 2f 2a 20 49  WRITE );..  /* I
34500 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20  t is illegal to 
34510 64 72 6f 70 20 61 20 74 61 62 6c 65 20 69 66 20  drop a table if 
34520 61 6e 79 20 63 75 72 73 6f 72 73 20 61 72 65 20  any cursors are 
34530 6f 70 65 6e 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  open on the.  **
34540 20 64 61 74 61 62 61 73 65 2e 20 54 68 69 73 20   database. This 
34550 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 61 75  is because in au
34560 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64 65 20 74  to-vacuum mode t
34570 68 65 20 62 61 63 6b 65 6e 64 20 6d 61 79 0a 20  he backend may. 
34580 20 2a 2a 20 6e 65 65 64 20 74 6f 20 6d 6f 76 65   ** need to move
34590 20 61 6e 6f 74 68 65 72 20 72 6f 6f 74 2d 70 61   another root-pa
345a0 67 65 20 74 6f 20 66 69 6c 6c 20 61 20 67 61 70  ge to fill a gap
345b0 20 6c 65 66 74 20 62 79 20 74 68 65 20 64 65 6c   left by the del
345c0 65 74 65 64 0a 20 20 2a 2a 20 72 6f 6f 74 20 70  eted.  ** root p
345d0 61 67 65 2e 20 49 66 20 61 6e 20 6f 70 65 6e 20  age. If an open 
345e0 63 75 72 73 6f 72 20 77 61 73 20 75 73 69 6e 67  cursor was using
345f0 20 74 68 69 73 20 70 61 67 65 20 61 20 70 72 6f   this page a pro
34600 62 6c 65 6d 20 77 6f 75 6c 64 20 0a 20 20 2a 2a  blem would .  **
34610 20 6f 63 63 75 72 2e 0a 20 20 2a 2f 0a 20 20 69   occur..  */.  i
34620 66 28 20 70 42 74 2d 3e 70 43 75 72 73 6f 72 20  f( pBt->pCursor 
34630 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f  ){.    sqlite3Co
34640 6e 6e 65 63 74 69 6f 6e 42 6c 6f 63 6b 65 64 28  nnectionBlocked(
34650 70 2d 3e 64 62 2c 20 70 42 74 2d 3e 70 43 75 72  p->db, pBt->pCur
34660 73 6f 72 2d 3e 70 42 74 72 65 65 2d 3e 64 62 29  sor->pBtree->db)
34670 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
34680 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
34690 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 72  DCACHE;.  }..  r
346a0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
346b0 47 65 74 50 61 67 65 28 70 42 74 2c 20 28 50 67  GetPage(pBt, (Pg
346c0 6e 6f 29 69 54 61 62 6c 65 2c 20 26 70 50 61 67  no)iTable, &pPag
346d0 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20  e, 0);.  if( rc 
346e0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
346f0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
34700 43 6c 65 61 72 54 61 62 6c 65 28 70 2c 20 69 54  ClearTable(p, iT
34710 61 62 6c 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  able, 0);.  if( 
34720 72 63 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  rc ){.    releas
34730 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
34740 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
34750 0a 0a 20 20 2a 70 69 4d 6f 76 65 64 20 3d 20 30  ..  *piMoved = 0
34760 3b 0a 0a 20 20 69 66 28 20 69 54 61 62 6c 65 3e  ;..  if( iTable>
34770 31 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  1 ){.#ifdef SQLI
34780 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
34790 55 4d 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65  UM.    rc = free
347a0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
347b0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61   releasePage(pPa
347c0 67 65 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 69  ge);.#else.    i
347d0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
347e0 75 6d 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  um ){.      Pgno
347f0 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a 20 20   maxRootPgno;.  
34800 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
34810 42 74 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20  BtreeGetMeta(p, 
34820 34 2c 20 26 6d 61 78 52 6f 6f 74 50 67 6e 6f 29  4, &maxRootPgno)
34830 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
34840 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
34850 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
34860 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
34870 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
34880 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 69    }..      if( i
34890 54 61 62 6c 65 3d 3d 6d 61 78 52 6f 6f 74 50 67  Table==maxRootPg
348a0 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  no ){.        /*
348b0 20 49 66 20 74 68 65 20 74 61 62 6c 65 20 62 65   If the table be
348c0 69 6e 67 20 64 72 6f 70 70 65 64 20 69 73 20 74  ing dropped is t
348d0 68 65 20 74 61 62 6c 65 20 77 69 74 68 20 74 68  he table with th
348e0 65 20 6c 61 72 67 65 73 74 20 72 6f 6f 74 2d 70  e largest root-p
348f0 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e  age.        ** n
34900 75 6d 62 65 72 20 69 6e 20 74 68 65 20 64 61 74  umber in the dat
34910 61 62 61 73 65 2c 20 70 75 74 20 74 68 65 20 72  abase, put the r
34920 6f 6f 74 20 70 61 67 65 20 6f 6e 20 74 68 65 20  oot page on the 
34930 66 72 65 65 20 6c 69 73 74 2e 20 0a 20 20 20 20  free list. .    
34940 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72      */.        r
34950 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61  c = freePage(pPa
34960 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 6c  ge);.        rel
34970 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
34980 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
34990 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
349a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
349b0 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
349c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
349d0 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62    /* The table b
349e0 65 69 6e 67 20 64 72 6f 70 70 65 64 20 64 6f 65  eing dropped doe
349f0 73 20 6e 6f 74 20 68 61 76 65 20 74 68 65 20 6c  s not have the l
34a00 61 72 67 65 73 74 20 72 6f 6f 74 2d 70 61 67 65  argest root-page
34a10 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  .        ** numb
34a20 65 72 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  er in the databa
34a30 73 65 2e 20 53 6f 20 6d 6f 76 65 20 74 68 65 20  se. So move the 
34a40 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 69  page that does i
34a50 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 20 20 20  nto the .       
34a60 20 2a 2a 20 67 61 70 20 6c 65 66 74 20 62 79 20   ** gap left by 
34a70 74 68 65 20 64 65 6c 65 74 65 64 20 72 6f 6f 74  the deleted root
34a80 2d 70 61 67 65 2e 0a 20 20 20 20 20 20 20 20 2a  -page..        *
34a90 2f 0a 20 20 20 20 20 20 20 20 4d 65 6d 50 61 67  /.        MemPag
34aa0 65 20 2a 70 4d 6f 76 65 3b 0a 20 20 20 20 20 20  e *pMove;.      
34ab0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
34ac0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 72 63  age);.        rc
34ad0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
34ae0 65 74 50 61 67 65 28 70 42 74 2c 20 6d 61 78 52  etPage(pBt, maxR
34af0 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65 2c  ootPgno, &pMove,
34b00 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   0);.        if(
34b10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
34b20 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
34b30 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
34b40 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65  .        rc = re
34b50 6c 6f 63 61 74 65 50 61 67 65 28 70 42 74 2c 20  locatePage(pBt, 
34b60 70 4d 6f 76 65 2c 20 50 54 52 4d 41 50 5f 52 4f  pMove, PTRMAP_RO
34b70 4f 54 50 41 47 45 2c 20 30 2c 20 69 54 61 62 6c  OTPAGE, 0, iTabl
34b80 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72  e, 0);.        r
34b90 65 6c 65 61 73 65 50 61 67 65 28 70 4d 6f 76 65  eleasePage(pMove
34ba0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
34bb0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
34bc0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
34bd0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
34be0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
34bf0 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
34c00 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f  pBt, maxRootPgno
34c10 2c 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a 20 20  , &pMove, 0);.  
34c20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
34c30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
34c40 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
34c50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
34c60 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28    rc = freePage(
34c70 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20 20 20 20  pMove);.        
34c80 72 65 6c 65 61 73 65 50 61 67 65 28 70 4d 6f 76  releasePage(pMov
34c90 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
34ca0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
34cb0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
34cc0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n rc;.        }.
34cd0 20 20 20 20 20 20 20 20 2a 70 69 4d 6f 76 65 64          *piMoved
34ce0 20 3d 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 3b 0a   = maxRootPgno;.
34cf0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
34d00 2a 20 53 65 74 20 74 68 65 20 6e 65 77 20 27 6d  * Set the new 'm
34d10 61 78 2d 72 6f 6f 74 2d 70 61 67 65 27 20 76 61  ax-root-page' va
34d20 6c 75 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  lue in the datab
34d30 61 73 65 20 68 65 61 64 65 72 2e 20 54 68 69 73  ase header. This
34d40 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 74 68 65  .      ** is the
34d50 20 6f 6c 64 20 76 61 6c 75 65 20 6c 65 73 73 20   old value less 
34d60 6f 6e 65 2c 20 6c 65 73 73 20 6f 6e 65 20 6d 6f  one, less one mo
34d70 72 65 20 69 66 20 74 68 61 74 20 68 61 70 70 65  re if that happe
34d80 6e 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 62  ns to.      ** b
34d90 65 20 61 20 72 6f 6f 74 2d 70 61 67 65 20 6e 75  e a root-page nu
34da0 6d 62 65 72 2c 20 6c 65 73 73 20 6f 6e 65 20 61  mber, less one a
34db0 67 61 69 6e 20 69 66 20 74 68 61 74 20 69 73 20  gain if that is 
34dc0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 50 45 4e  the.      ** PEN
34dd0 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 2e 0a  DING_BYTE_PAGE..
34de0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 6d        */.      m
34df0 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20  axRootPgno--;.  
34e00 20 20 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50      if( maxRootP
34e10 67 6e 6f 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54  gno==PENDING_BYT
34e20 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20  E_PAGE(pBt) ){. 
34e30 20 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67         maxRootPg
34e40 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  no--;.      }.  
34e50 20 20 20 20 69 66 28 20 6d 61 78 52 6f 6f 74 50      if( maxRootP
34e60 67 6e 6f 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45  gno==PTRMAP_PAGE
34e70 4e 4f 28 70 42 74 2c 20 6d 61 78 52 6f 6f 74 50  NO(pBt, maxRootP
34e80 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20  gno) ){.        
34e90 6d 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20  maxRootPgno--;. 
34ea0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
34eb0 65 72 74 28 20 6d 61 78 52 6f 6f 74 50 67 6e 6f  ert( maxRootPgno
34ec0 21 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50  !=PENDING_BYTE_P
34ed0 41 47 45 28 70 42 74 29 20 29 3b 0a 0a 20 20 20  AGE(pBt) );..   
34ee0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
34ef0 74 72 65 65 55 70 64 61 74 65 4d 65 74 61 28 70  treeUpdateMeta(p
34f00 2c 20 34 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f  , 4, maxRootPgno
34f10 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
34f20 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67      rc = freePag
34f30 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
34f40 72 65 6c 65 61 73 65 50 61 67 65 28 70 50 61 67  releasePage(pPag
34f50 65 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  e);.    }.#endif
34f60 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
34f70 20 49 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   If sqlite3Btree
34f80 44 72 6f 70 54 61 62 6c 65 20 77 61 73 20 63 61  DropTable was ca
34f90 6c 6c 65 64 20 6f 6e 20 70 61 67 65 20 31 2e 20  lled on page 1. 
34fa0 2a 2f 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28  */.    zeroPage(
34fb0 70 50 61 67 65 2c 20 50 54 46 5f 49 4e 54 4b 45  pPage, PTF_INTKE
34fc0 59 7c 50 54 46 5f 4c 45 41 46 20 29 3b 0a 20 20  Y|PTF_LEAF );.  
34fd0 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
34fe0 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  age);.  }.  retu
34ff0 72 6e 20 72 63 3b 20 20 0a 7d 0a 69 6e 74 20 73  rn rc;  .}.int s
35000 71 6c 69 74 65 33 42 74 72 65 65 44 72 6f 70 54  qlite3BtreeDropT
35010 61 62 6c 65 28 42 74 72 65 65 20 2a 70 2c 20 69  able(Btree *p, i
35020 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e 74 20 2a  nt iTable, int *
35030 70 69 4d 6f 76 65 64 29 7b 0a 20 20 69 6e 74 20  piMoved){.  int 
35040 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
35050 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d  eeEnter(p);.  p-
35060 3e 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62  >pBt->db = p->db
35070 3b 0a 20 20 72 63 20 3d 20 62 74 72 65 65 44 72  ;.  rc = btreeDr
35080 6f 70 54 61 62 6c 65 28 70 2c 20 69 54 61 62 6c  opTable(p, iTabl
35090 65 2c 20 70 69 4d 6f 76 65 64 29 3b 0a 20 20 73  e, piMoved);.  s
350a0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
350b0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
350c0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  ;.}.../*.** Read
350d0 20 74 68 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d   the meta-inform
350e0 61 74 69 6f 6e 20 6f 75 74 20 6f 66 20 61 20 64  ation out of a d
350f0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4d  atabase file.  M
35100 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20 74 68 65  eta[0].** is the
35110 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 65 65 20   number of free 
35120 70 61 67 65 73 20 63 75 72 72 65 6e 74 6c 79 20  pages currently 
35130 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  in the database.
35140 20 20 4d 65 74 61 5b 31 5d 0a 2a 2a 20 74 68 72    Meta[1].** thr
35150 6f 75 67 68 20 6d 65 74 61 5b 31 35 5d 20 61 72  ough meta[15] ar
35160 65 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  e available for 
35170 75 73 65 20 62 79 20 68 69 67 68 65 72 20 6c 61  use by higher la
35180 79 65 72 73 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a  yers.  Meta[0].*
35190 2a 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 2c 20  * is read-only, 
351a0 74 68 65 20 6f 74 68 65 72 73 20 61 72 65 20 72  the others are r
351b0 65 61 64 2f 77 72 69 74 65 2e 0a 2a 2a 20 0a 2a  ead/write..** .*
351c0 2a 20 54 68 65 20 73 63 68 65 6d 61 20 6c 61 79  * The schema lay
351d0 65 72 20 6e 75 6d 62 65 72 73 20 6d 65 74 61 20  er numbers meta 
351e0 76 61 6c 75 65 73 20 64 69 66 66 65 72 65 6e 74  values different
351f0 6c 79 2e 20 20 41 74 20 74 68 65 20 73 63 68 65  ly.  At the sche
35200 6d 61 0a 2a 2a 20 6c 61 79 65 72 20 28 61 6e 64  ma.** layer (and
35210 20 74 68 65 20 53 65 74 43 6f 6f 6b 69 65 20 61   the SetCookie a
35220 6e 64 20 52 65 61 64 43 6f 6f 6b 69 65 20 6f 70  nd ReadCookie op
35230 63 6f 64 65 73 29 20 74 68 65 20 6e 75 6d 62 65  codes) the numbe
35240 72 20 6f 66 0a 2a 2a 20 66 72 65 65 20 70 61 67  r of.** free pag
35250 65 73 20 69 73 20 6e 6f 74 20 76 69 73 69 62 6c  es is not visibl
35260 65 2e 20 20 53 6f 20 43 6f 6f 6b 69 65 5b 30 5d  e.  So Cookie[0]
35270 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
35280 4d 65 74 61 5b 31 5d 2e 0a 2a 2f 0a 69 6e 74 20  Meta[1]..*/.int 
35290 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 4d  sqlite3BtreeGetM
352a0 65 74 61 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  eta(Btree *p, in
352b0 74 20 69 64 78 2c 20 75 33 32 20 2a 70 4d 65 74  t idx, u32 *pMet
352c0 61 29 7b 0a 20 20 44 62 50 61 67 65 20 2a 70 44  a){.  DbPage *pD
352d0 62 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 6e 74  bPage = 0;.  int
352e0 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20   rc;.  unsigned 
352f0 63 68 61 72 20 2a 70 50 31 3b 0a 20 20 42 74 53  char *pP1;.  BtS
35300 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
35310 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42  pBt;..  sqlite3B
35320 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
35330 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
35340 0a 0a 20 20 2f 2a 20 52 65 61 64 69 6e 67 20 61  ..  /* Reading a
35350 20 6d 65 74 61 2d 64 61 74 61 20 76 61 6c 75 65   meta-data value
35360 20 72 65 71 75 69 72 65 73 20 61 20 72 65 61 64   requires a read
35370 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67 65 20 31 20  -lock on page 1 
35380 28 61 6e 64 20 68 65 6e 63 65 0a 20 20 2a 2a 20  (and hence.  ** 
35390 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
353a0 72 20 74 61 62 6c 65 2e 20 57 65 20 67 72 61 62  r table. We grab
353b0 20 74 68 69 73 20 6c 6f 63 6b 20 72 65 67 61 72   this lock regar
353c0 64 6c 65 73 73 20 6f 66 20 77 68 65 74 68 65 72  dless of whether
353d0 20 6f 72 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65   or.  ** not the
353e0 20 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f   SQLITE_ReadUnco
353f0 6d 6d 69 74 74 65 64 20 66 6c 61 67 20 69 73 20  mmitted flag is 
35400 73 65 74 20 28 74 68 65 20 74 61 62 6c 65 20 72  set (the table r
35410 6f 6f 74 65 64 20 61 74 20 70 61 67 65 0a 20 20  ooted at page.  
35420 2a 2a 20 31 20 69 73 20 74 72 65 61 74 65 64 20  ** 1 is treated 
35430 61 73 20 61 20 73 70 65 63 69 61 6c 20 63 61 73  as a special cas
35440 65 20 62 79 20 71 75 65 72 79 53 68 61 72 65 64  e by queryShared
35450 43 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 29  CacheTableLock()
35460 0a 20 20 2a 2a 20 61 6e 64 20 73 65 74 53 68 61  .  ** and setSha
35470 72 65 64 43 61 63 68 65 54 61 62 6c 65 4c 6f 63  redCacheTableLoc
35480 6b 28 29 29 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  k())..  */.  rc 
35490 3d 20 71 75 65 72 79 53 68 61 72 65 64 43 61 63  = querySharedCac
354a0 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 31  heTableLock(p, 1
354b0 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20  , READ_LOCK);.  
354c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
354d0 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
354e0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
354f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
35500 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64 78  }..  assert( idx
35510 3e 3d 30 20 26 26 20 69 64 78 3c 3d 31 35 20 29  >=0 && idx<=15 )
35520 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 50 61  ;.  if( pBt->pPa
35530 67 65 31 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ge1 ){.    /* Th
35540 65 20 62 2d 74 72 65 65 20 69 73 20 61 6c 72 65  e b-tree is alre
35550 61 64 79 20 68 6f 6c 64 69 6e 67 20 61 20 72 65  ady holding a re
35560 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
35570 31 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  1 of the databas
35580 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 49  e.    ** file. I
35590 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
355a0 72 65 71 75 69 72 65 64 20 6d 65 74 61 2d 64 61  required meta-da
355b0 74 61 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20  ta value can be 
355c0 72 65 61 64 20 64 69 72 65 63 74 6c 79 0a 20 20  read directly.  
355d0 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 70 61    ** from the pa
355e0 67 65 20 64 61 74 61 20 6f 66 20 74 68 69 73 20  ge data of this 
355f0 72 65 66 65 72 65 6e 63 65 2e 20 54 68 69 73 20  reference. This 
35600 69 73 20 73 6c 69 67 68 74 6c 79 20 66 61 73 74  is slightly fast
35610 65 72 20 74 68 61 6e 0a 20 20 20 20 2a 2a 20 72  er than.    ** r
35620 65 71 75 65 73 74 69 6e 67 20 61 20 6e 65 77 20  equesting a new 
35630 72 65 66 65 72 65 6e 63 65 20 66 72 6f 6d 20 74  reference from t
35640 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 2e 0a  he pager layer..
35650 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 31 20 3d      */.    pP1 =
35660 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
35670 2a 29 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  *)pBt->pPage1->a
35680 44 61 74 61 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Data;.  }else{. 
35690 20 20 20 2f 2a 20 54 68 65 20 62 2d 74 72 65 65     /* The b-tree
356a0 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 61   does not have a
356b0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61   reference to pa
356c0 67 65 20 31 20 6f 66 20 74 68 65 20 64 61 74 61  ge 1 of the data
356d0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
356e0 2a 20 4f 62 74 61 69 6e 20 6f 6e 65 20 66 72 6f  * Obtain one fro
356f0 6d 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  m the pager laye
35700 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  r..    */.    rc
35710 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
35720 65 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20  et(pBt->pPager, 
35730 31 2c 20 26 70 44 62 50 61 67 65 29 3b 0a 20 20  1, &pDbPage);.  
35740 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
35750 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
35760 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65  ave(p);.      re
35770 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
35780 20 20 20 70 50 31 20 3d 20 28 75 6e 73 69 67 6e     pP1 = (unsign
35790 65 64 20 63 68 61 72 20 2a 29 73 71 6c 69 74 65  ed char *)sqlite
357a0 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
357b0 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 2a 70  bPage);.  }.  *p
357c0 4d 65 74 61 20 3d 20 67 65 74 34 62 79 74 65 28  Meta = get4byte(
357d0 26 70 50 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d  &pP1[36 + idx*4]
357e0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
357f0 62 2d 74 72 65 65 20 69 73 20 6e 6f 74 20 68 6f  b-tree is not ho
35800 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e 63  lding a referenc
35810 65 20 74 6f 20 70 61 67 65 20 31 2c 20 74 68 65  e to page 1, the
35820 6e 20 6f 6e 65 20 77 61 73 20 0a 20 20 2a 2a 20  n one was .  ** 
35830 72 65 71 75 65 73 74 65 64 20 66 72 6f 6d 20 74  requested from t
35840 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 69  he pager layer i
35850 6e 20 74 68 65 20 61 62 6f 76 65 20 62 6c 6f 63  n the above bloc
35860 6b 2e 20 52 65 6c 65 61 73 65 20 69 74 20 6e 6f  k. Release it no
35870 77 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  w..  */.  if( !p
35880 42 74 2d 3e 70 50 61 67 65 31 20 29 7b 0a 20 20  Bt->pPage1 ){.  
35890 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
358a0 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
358b0 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 75 74 6f 76  }..  /* If autov
358c0 61 63 75 75 6d 65 64 20 69 73 20 64 69 73 61 62  acuumed is disab
358d0 6c 65 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c  led in this buil
358e0 64 20 62 75 74 20 77 65 20 61 72 65 20 74 72 79  d but we are try
358f0 69 6e 67 20 74 6f 20 0a 20 20 2a 2a 20 61 63 63  ing to .  ** acc
35900 65 73 73 20 61 6e 20 61 75 74 6f 76 61 63 75 75  ess an autovacuu
35910 6d 65 64 20 64 61 74 61 62 61 73 65 2c 20 74 68  med database, th
35920 65 6e 20 6d 61 6b 65 20 74 68 65 20 64 61 74 61  en make the data
35930 62 61 73 65 20 72 65 61 64 6f 6e 6c 79 2e 20 0a  base readonly. .
35940 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
35950 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
35960 55 4d 0a 20 20 69 66 28 20 69 64 78 3d 3d 34 20  UM.  if( idx==4 
35970 26 26 20 2a 70 4d 65 74 61 3e 30 20 29 20 70 42  && *pMeta>0 ) pB
35980 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 31 3b  t->readOnly = 1;
35990 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 47 72  .#endif..  /* Gr
359a0 61 62 20 74 68 65 20 72 65 61 64 2d 6c 6f 63 6b  ab the read-lock
359b0 20 6f 6e 20 70 61 67 65 20 31 2e 20 2a 2f 0a 20   on page 1. */. 
359c0 20 72 63 20 3d 20 73 65 74 53 68 61 72 65 64 43   rc = setSharedC
359d0 61 63 68 65 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  acheTableLock(p,
359e0 20 31 2c 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a   1, READ_LOCK);.
359f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
35a00 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
35a10 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   rc;.}../*.** Wr
35a20 69 74 65 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61  ite meta-informa
35a30 74 69 6f 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74  tion back into t
35a40 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 4d 65  he database.  Me
35a50 74 61 5b 30 5d 20 69 73 0a 2a 2a 20 72 65 61 64  ta[0] is.** read
35a60 2d 6f 6e 6c 79 20 61 6e 64 20 6d 61 79 20 6e 6f  -only and may no
35a70 74 20 62 65 20 77 72 69 74 74 65 6e 2e 0a 2a 2f  t be written..*/
35a80 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
35a90 65 55 70 64 61 74 65 4d 65 74 61 28 42 74 72 65  eUpdateMeta(Btre
35aa0 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 75  e *p, int idx, u
35ab0 33 32 20 69 4d 65 74 61 29 7b 0a 20 20 42 74 53  32 iMeta){.  BtS
35ac0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
35ad0 70 42 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  pBt;.  unsigned 
35ae0 63 68 61 72 20 2a 70 50 31 3b 0a 20 20 69 6e 74  char *pP1;.  int
35af0 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 69   rc;.  assert( i
35b00 64 78 3e 3d 31 20 26 26 20 69 64 78 3c 3d 31 35  dx>=1 && idx<=15
35b10 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
35b20 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42  eeEnter(p);.  pB
35b30 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  t->db = p->db;. 
35b40 20 61 73 73 65 72 74 28 20 70 2d 3e 69 6e 54 72   assert( p->inTr
35b50 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
35b60 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42   );.  assert( pB
35b70 74 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 3b 0a  t->pPage1!=0 );.
35b80 20 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61    pP1 = pBt->pPa
35b90 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72 63  ge1->aData;.  rc
35ba0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
35bb0 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65 31  rite(pBt->pPage1
35bc0 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66  ->pDbPage);.  if
35bd0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
35be0 29 7b 0a 20 20 20 20 70 75 74 34 62 79 74 65 28  ){.    put4byte(
35bf0 26 70 50 31 5b 33 36 20 2b 20 69 64 78 2a 34 5d  &pP1[36 + idx*4]
35c00 2c 20 69 4d 65 74 61 29 3b 0a 23 69 66 6e 64 65  , iMeta);.#ifnde
35c10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
35c20 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
35c30 20 69 64 78 3d 3d 37 20 29 7b 0a 20 20 20 20 20   idx==7 ){.     
35c40 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 61 75   assert( pBt->au
35c50 74 6f 56 61 63 75 75 6d 20 7c 7c 20 69 4d 65 74  toVacuum || iMet
35c60 61 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73  a==0 );.      as
35c70 73 65 72 74 28 20 69 4d 65 74 61 3d 3d 30 20 7c  sert( iMeta==0 |
35c80 7c 20 69 4d 65 74 61 3d 3d 31 20 29 3b 0a 20 20  | iMeta==1 );.  
35c90 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61 63      pBt->incrVac
35ca0 75 75 6d 20 3d 20 28 75 38 29 69 4d 65 74 61 3b  uum = (u8)iMeta;
35cb0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
35cc0 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
35cd0 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75  Leave(p);.  retu
35ce0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
35cf0 52 65 74 75 72 6e 20 74 68 65 20 66 6c 61 67 20  Return the flag 
35d00 62 79 74 65 20 61 74 20 74 68 65 20 62 65 67 69  byte at the begi
35d10 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 70 61 67  nning of the pag
35d20 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73 6f  e that the curso
35d30 72 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c  r.** is currentl
35d40 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a 2a  y pointing to..*
35d50 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
35d60 65 65 46 6c 61 67 73 28 42 74 43 75 72 73 6f 72  eeFlags(BtCursor
35d70 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54 4f   *pCur){.  /* TO
35d80 44 4f 3a 20 57 68 61 74 20 61 62 6f 75 74 20 43  DO: What about C
35d90 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45 45  URSOR_REQUIRESEE
35da0 4b 20 73 74 61 74 65 3f 20 50 72 6f 62 61 62 6c  K state? Probabl
35db0 79 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 0a 20  y need to call. 
35dc0 20 2a 2a 20 72 65 73 74 6f 72 65 43 75 72 73 6f   ** restoreCurso
35dd0 72 50 6f 73 69 74 69 6f 6e 28 29 20 68 65 72 65  rPosition() here
35de0 2e 0a 20 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  ..  */.  MemPage
35df0 20 2a 70 50 61 67 65 3b 0a 20 20 72 65 73 74 6f   *pPage;.  resto
35e00 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e  reCursorPosition
35e10 28 70 43 75 72 29 3b 0a 20 20 70 50 61 67 65 20  (pCur);.  pPage 
35e20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  = pCur->apPage[p
35e30 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61  Cur->iPage];.  a
35e40 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
35e50 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
35e60 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
35e70 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
35e80 20 70 50 61 67 65 2d 3e 70 42 74 3d 3d 70 43 75   pPage->pBt==pCu
35e90 72 2d 3e 70 42 74 20 29 3b 0a 20 20 72 65 74 75  r->pBt );.  retu
35ea0 72 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  rn pPage->aData[
35eb0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
35ec0 5d 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  ];.}..#ifndef SQ
35ed0 4c 49 54 45 5f 4f 4d 49 54 5f 42 54 52 45 45 43  LITE_OMIT_BTREEC
35ee0 4f 55 4e 54 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  OUNT./*.** The f
35ef0 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2c 20 70  irst argument, p
35f00 43 75 72 2c 20 69 73 20 61 20 63 75 72 73 6f 72  Cur, is a cursor
35f10 20 6f 70 65 6e 65 64 20 6f 6e 20 73 6f 6d 65 20   opened on some 
35f20 62 2d 74 72 65 65 2e 20 43 6f 75 6e 74 20 74 68  b-tree. Count th
35f30 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 65  e.** number of e
35f40 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 62 2d  ntries in the b-
35f50 74 72 65 65 20 61 6e 64 20 77 72 69 74 65 20 74  tree and write t
35f60 68 65 20 72 65 73 75 6c 74 20 74 6f 20 2a 70 6e  he result to *pn
35f70 45 6e 74 72 79 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  Entry..**.** SQL
35f80 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
35f90 65 64 20 69 66 20 74 68 65 20 6f 70 65 72 61 74  ed if the operat
35fa0 69 6f 6e 20 69 73 20 73 75 63 63 65 73 73 66 75  ion is successfu
35fb0 6c 6c 79 20 65 78 65 63 75 74 65 64 2e 20 0a 2a  lly executed. .*
35fc0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
35fd0 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
35fe0 75 6e 74 65 72 65 64 20 28 69 2e 65 2e 20 61 6e  untered (i.e. an
35ff0 20 49 4f 20 65 72 72 6f 72 20 6f 72 20 64 61 74   IO error or dat
36000 61 62 61 73 65 0a 2a 2a 20 63 6f 72 72 75 70 74  abase.** corrupt
36010 69 6f 6e 29 20 61 6e 20 53 51 4c 69 74 65 20 65  ion) an SQLite e
36020 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
36030 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
36040 6c 69 74 65 33 42 74 72 65 65 43 6f 75 6e 74 28  lite3BtreeCount(
36050 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20  BtCursor *pCur, 
36060 69 36 34 20 2a 70 6e 45 6e 74 72 79 29 7b 0a 20  i64 *pnEntry){. 
36070 20 69 36 34 20 6e 45 6e 74 72 79 20 3d 20 30 3b   i64 nEntry = 0;
36080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36090 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
360a0 6f 20 72 65 74 75 72 6e 20 69 6e 20 2a 70 6e 45  o return in *pnE
360b0 6e 74 72 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ntry */.  int rc
360c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
360d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
360e0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
360f0 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52 6f  .  rc = moveToRo
36100 6f 74 28 70 43 75 72 29 3b 0a 0a 20 20 2f 2a 20  ot(pCur);..  /* 
36110 55 6e 6c 65 73 73 20 61 6e 20 65 72 72 6f 72 20  Unless an error 
36120 6f 63 63 75 72 73 2c 20 74 68 65 20 66 6f 6c 6c  occurs, the foll
36130 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20  owing loop runs 
36140 6f 6e 65 20 69 74 65 72 61 74 69 6f 6e 20 66 6f  one iteration fo
36150 72 20 65 61 63 68 0a 20 20 2a 2a 20 70 61 67 65  r each.  ** page
36160 20 69 6e 20 74 68 65 20 42 2d 54 72 65 65 20 73   in the B-Tree s
36170 74 72 75 63 74 75 72 65 20 28 6e 6f 74 20 69 6e  tructure (not in
36180 63 6c 75 64 69 6e 67 20 6f 76 65 72 66 6c 6f 77  cluding overflow
36190 20 70 61 67 65 73 29 2e 20 0a 20 20 2a 2f 0a 20   pages). .  */. 
361a0 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
361b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
361c0 20 69 49 64 78 3b 20 20 20 20 20 20 20 20 20 20   iIdx;          
361d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
361e0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 68 69 6c  /* Index of chil
361f0 64 20 6e 6f 64 65 20 69 6e 20 70 61 72 65 6e 74  d node in parent
36200 20 2a 2f 0a 20 20 20 20 4d 65 6d 50 61 67 65 20   */.    MemPage 
36210 2a 70 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  *pPage;         
36220 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
36230 72 72 65 6e 74 20 70 61 67 65 20 6f 66 20 74 68  rrent page of th
36240 65 20 62 2d 74 72 65 65 20 2a 2f 0a 0a 20 20 20  e b-tree */..   
36250 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
36260 20 6c 65 61 66 20 70 61 67 65 20 6f 72 20 74 68   leaf page or th
36270 65 20 74 72 65 65 20 69 73 20 6e 6f 74 20 61 6e  e tree is not an
36280 20 69 6e 74 2d 6b 65 79 20 74 72 65 65 2c 20 74   int-key tree, t
36290 68 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 69 73  hen .    ** this
362a0 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63   page contains c
362b0 6f 75 6e 74 61 62 6c 65 20 65 6e 74 72 69 65 73  ountable entries
362c0 2e 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  . Increment the 
362d0 65 6e 74 72 79 20 63 6f 75 6e 74 65 72 0a 20 20  entry counter.  
362e0 20 20 2a 2a 20 61 63 63 6f 72 64 69 6e 67 6c 79    ** accordingly
362f0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
36300 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67  ge = pCur->apPag
36310 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a  e[pCur->iPage];.
36320 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 6c      if( pPage->l
36330 65 61 66 20 7c 7c 20 21 70 50 61 67 65 2d 3e 69  eaf || !pPage->i
36340 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 6e  ntKey ){.      n
36350 45 6e 74 72 79 20 2b 3d 20 70 50 61 67 65 2d 3e  Entry += pPage->
36360 6e 43 65 6c 6c 3b 0a 20 20 20 20 7d 0a 0a 20 20  nCell;.    }..  
36370 20 20 2f 2a 20 70 50 61 67 65 20 69 73 20 61 20    /* pPage is a 
36380 6c 65 61 66 20 6e 6f 64 65 2e 20 54 68 69 73 20  leaf node. This 
36390 6c 6f 6f 70 20 6e 61 76 69 67 61 74 65 73 20 74  loop navigates t
363a0 68 65 20 63 75 72 73 6f 72 20 73 6f 20 74 68 61  he cursor so tha
363b0 74 20 69 74 20 0a 20 20 20 20 2a 2a 20 70 6f 69  t it .    ** poi
363c0 6e 74 73 20 74 6f 20 74 68 65 20 66 69 72 73 74  nts to the first
363d0 20 69 6e 74 65 72 69 6f 72 20 63 65 6c 6c 20 74   interior cell t
363e0 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74 6f  hat it points to
363f0 20 74 68 65 20 70 61 72 65 6e 74 20 6f 66 0a 20   the parent of. 
36400 20 20 20 2a 2a 20 74 68 65 20 6e 65 78 74 20 70     ** the next p
36410 61 67 65 20 69 6e 20 74 68 65 20 74 72 65 65 20  age in the tree 
36420 74 68 61 74 20 68 61 73 20 6e 6f 74 20 79 65 74  that has not yet
36430 20 62 65 65 6e 20 76 69 73 69 74 65 64 2e 20 54   been visited. T
36440 68 65 0a 20 20 20 20 2a 2a 20 70 43 75 72 2d 3e  he.    ** pCur->
36450 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67  aiIdx[pCur->iPag
36460 65 5d 20 76 61 6c 75 65 20 69 73 20 73 65 74 20  e] value is set 
36470 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
36480 74 68 65 20 70 61 72 65 6e 74 20 63 65 6c 6c 0a  the parent cell.
36490 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 70 61      ** of the pa
364a0 67 65 2c 20 6f 72 20 74 6f 20 74 68 65 20 6e 75  ge, or to the nu
364b0 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e  mber of cells in
364c0 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65   the page if the
364d0 20 6e 65 78 74 20 70 61 67 65 0a 20 20 20 20 2a   next page.    *
364e0 2a 20 74 6f 20 76 69 73 69 74 20 69 73 20 74 68  * to visit is th
364f0 65 20 72 69 67 68 74 2d 63 68 69 6c 64 20 6f 66  e right-child of
36500 20 69 74 73 20 70 61 72 65 6e 74 2e 0a 20 20 20   its parent..   
36510 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 61 6c   **.    ** If al
36520 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 74  l pages in the t
36530 72 65 65 20 68 61 76 65 20 62 65 65 6e 20 76 69  ree have been vi
36540 73 69 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51  sited, return SQ
36550 4c 49 54 45 5f 4f 4b 20 74 6f 20 74 68 65 0a 20  LITE_OK to the. 
36560 20 20 20 2a 2a 20 63 61 6c 6c 65 72 2e 0a 20 20     ** caller..  
36570 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
36580 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ge->leaf ){.    
36590 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 69    do {.        i
365a0 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d  f( pCur->iPage==
365b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
365c0 2a 20 41 6c 6c 20 70 61 67 65 73 20 6f 66 20 74  * All pages of t
365d0 68 65 20 62 2d 74 72 65 65 20 68 61 76 65 20 62  he b-tree have b
365e0 65 65 6e 20 76 69 73 69 74 65 64 2e 20 52 65 74  een visited. Ret
365f0 75 72 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79  urn successfully
36600 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 2a  . */.          *
36610 70 6e 45 6e 74 72 79 20 3d 20 6e 45 6e 74 72 79  pnEntry = nEntry
36620 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
36630 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
36640 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
36650 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
36660 54 6f 50 61 72 65 6e 74 28 70 43 75 72 29 3b 0a  ToParent(pCur);.
36670 20 20 20 20 20 20 7d 77 68 69 6c 65 20 28 20 70        }while ( p
36680 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
36690 3e 69 50 61 67 65 5d 3e 3d 70 43 75 72 2d 3e 61  >iPage]>=pCur->a
366a0 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67  pPage[pCur->iPag
366b0 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 0a 20 20  e]->nCell );..  
366c0 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
366d0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2b 2b 3b 0a  pCur->iPage]++;.
366e0 20 20 20 20 20 20 70 50 61 67 65 20 3d 20 70 43        pPage = pC
366f0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
36700 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 7d 0a 0a  >iPage];.    }..
36710 20 20 20 20 2f 2a 20 44 65 73 63 65 6e 64 20 74      /* Descend t
36720 6f 20 74 68 65 20 63 68 69 6c 64 20 6e 6f 64 65  o the child node
36730 20 6f 66 20 74 68 65 20 63 65 6c 6c 20 74 68 61   of the cell tha
36740 74 20 74 68 65 20 63 75 72 73 6f 72 20 63 75 72  t the cursor cur
36750 72 65 6e 74 6c 79 20 0a 20 20 20 20 2a 2a 20 70  rently .    ** p
36760 6f 69 6e 74 73 20 61 74 2e 20 54 68 69 73 20 69  oints at. This i
36770 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69 6c  s the right-chil
36780 64 20 69 66 20 28 69 49 64 78 3d 3d 70 50 61 67  d if (iIdx==pPag
36790 65 2d 3e 6e 43 65 6c 6c 29 2e 0a 20 20 20 20 2a  e->nCell)..    *
367a0 2f 0a 20 20 20 20 69 49 64 78 20 3d 20 70 43 75  /.    iIdx = pCu
367b0 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69  r->aiIdx[pCur->i
367c0 50 61 67 65 5d 3b 0a 20 20 20 20 69 66 28 20 69  Page];.    if( i
367d0 49 64 78 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  Idx==pPage->nCel
367e0 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
367f0 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72  moveToChild(pCur
36800 2c 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67  , get4byte(&pPag
36810 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e  e->aData[pPage->
36820 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a  hdrOffset+8]));.
36830 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
36840 20 72 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c   rc = moveToChil
36850 64 28 70 43 75 72 2c 20 67 65 74 34 62 79 74 65  d(pCur, get4byte
36860 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c  (findCell(pPage,
36870 20 69 49 64 78 29 29 29 3b 0a 20 20 20 20 7d 0a   iIdx)));.    }.
36880 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 20 65 72 72    }..  /* An err
36890 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e  or has occurred.
368a0 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
368b0 20 63 6f 64 65 2e 20 2a 2f 0a 20 20 72 65 74 75   code. */.  retu
368c0 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
368d0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
368e0 65 20 70 61 67 65 72 20 61 73 73 6f 63 69 61 74  e pager associat
368f0 65 64 20 77 69 74 68 20 61 20 42 54 72 65 65 2e  ed with a BTree.
36900 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69    This routine i
36910 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65  s used for.** te
36920 73 74 69 6e 67 20 61 6e 64 20 64 65 62 75 67 67  sting and debugg
36930 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 50 61 67  ing only..*/.Pag
36940 65 72 20 2a 73 71 6c 69 74 65 33 42 74 72 65 65  er *sqlite3Btree
36950 50 61 67 65 72 28 42 74 72 65 65 20 2a 70 29 7b  Pager(Btree *p){
36960 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74  .  return p->pBt
36970 2d 3e 70 50 61 67 65 72 3b 0a 7d 0a 0a 23 69 66  ->pPager;.}..#if
36980 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
36990 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
369a0 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20  ./*.** Append a 
369b0 6d 65 73 73 61 67 65 20 74 6f 20 74 68 65 20 65  message to the e
369c0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72  rror message str
369d0 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
369e0 6f 69 64 20 63 68 65 63 6b 41 70 70 65 6e 64 4d  oid checkAppendM
369f0 73 67 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43  sg(.  IntegrityC
36a00 6b 20 2a 70 43 68 65 63 6b 2c 0a 20 20 63 68 61  k *pCheck,.  cha
36a10 72 20 2a 7a 4d 73 67 31 2c 0a 20 20 63 6f 6e 73  r *zMsg1,.  cons
36a20 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c  t char *zFormat,
36a30 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 76 61 5f 6c  .  ....){.  va_l
36a40 69 73 74 20 61 70 3b 0a 20 20 69 66 28 20 21 70  ist ap;.  if( !p
36a50 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20 29 20 72  Check->mxErr ) r
36a60 65 74 75 72 6e 3b 0a 20 20 70 43 68 65 63 6b 2d  eturn;.  pCheck-
36a70 3e 6d 78 45 72 72 2d 2d 3b 0a 20 20 70 43 68 65  >mxErr--;.  pChe
36a80 63 6b 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 76 61  ck->nErr++;.  va
36a90 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
36aa0 61 74 29 3b 0a 20 20 69 66 28 20 70 43 68 65 63  at);.  if( pChec
36ab0 6b 2d 3e 65 72 72 4d 73 67 2e 6e 43 68 61 72 20  k->errMsg.nChar 
36ac0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 74  ){.    sqlite3St
36ad0 72 41 63 63 75 6d 41 70 70 65 6e 64 28 26 70 43  rAccumAppend(&pC
36ae0 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2c 20 22 5c  heck->errMsg, "\
36af0 6e 22 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 69 66  n", 1);.  }.  if
36b00 28 20 7a 4d 73 67 31 20 29 7b 0a 20 20 20 20 73  ( zMsg1 ){.    s
36b10 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 41 70  qlite3StrAccumAp
36b20 70 65 6e 64 28 26 70 43 68 65 63 6b 2d 3e 65 72  pend(&pCheck->er
36b30 72 4d 73 67 2c 20 7a 4d 73 67 31 2c 20 2d 31 29  rMsg, zMsg1, -1)
36b40 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56  ;.  }.  sqlite3V
36b50 58 50 72 69 6e 74 66 28 26 70 43 68 65 63 6b 2d  XPrintf(&pCheck-
36b60 3e 65 72 72 4d 73 67 2c 20 31 2c 20 7a 46 6f 72  >errMsg, 1, zFor
36b70 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
36b80 6e 64 28 61 70 29 3b 0a 20 20 69 66 28 20 70 43  nd(ap);.  if( pC
36b90 68 65 63 6b 2d 3e 65 72 72 4d 73 67 2e 6d 61 6c  heck->errMsg.mal
36ba0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
36bb0 20 70 43 68 65 63 6b 2d 3e 6d 61 6c 6c 6f 63 46   pCheck->mallocF
36bc0 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d  ailed = 1;.  }.}
36bd0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
36be0 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
36bf0 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64  _CHECK */..#ifnd
36c00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  ef SQLITE_OMIT_I
36c10 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f  NTEGRITY_CHECK./
36c20 2a 0a 2a 2a 20 41 64 64 20 31 20 74 6f 20 74 68  *.** Add 1 to th
36c30 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
36c40 74 20 66 6f 72 20 70 61 67 65 20 69 50 61 67 65  t for page iPage
36c50 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 74 68  .  If this is th
36c60 65 20 73 65 63 6f 6e 64 0a 2a 2a 20 72 65 66 65  e second.** refe
36c70 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67  rence to the pag
36c80 65 2c 20 61 64 64 20 61 6e 20 65 72 72 6f 72 20  e, add an error 
36c90 6d 65 73 73 61 67 65 20 74 6f 20 70 43 68 65 63  message to pChec
36ca0 6b 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2a 20 52  k->zErrMsg..** R
36cb0 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 72 65  eturn 1 if there
36cc0 20 61 72 65 20 32 20 6f 72 65 20 6d 6f 72 65 20   are 2 ore more 
36cd0 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
36ce0 65 20 70 61 67 65 20 61 6e 64 20 30 20 69 66 0a  e page and 0 if.
36cf0 2a 2a 20 69 66 20 74 68 69 73 20 69 73 20 74 68  ** if this is th
36d00 65 20 66 69 72 73 74 20 72 65 66 65 72 65 6e 63  e first referenc
36d10 65 20 74 6f 20 74 68 65 20 70 61 67 65 2e 0a 2a  e to the page..*
36d20 2a 0a 2a 2a 20 41 6c 73 6f 20 63 68 65 63 6b 20  *.** Also check 
36d30 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 75  that the page nu
36d40 6d 62 65 72 20 69 73 20 69 6e 20 62 6f 75 6e 64  mber is in bound
36d50 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
36d60 20 63 68 65 63 6b 52 65 66 28 49 6e 74 65 67 72   checkRef(Integr
36d70 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20 50  ityCk *pCheck, P
36d80 67 6e 6f 20 69 50 61 67 65 2c 20 63 68 61 72 20  gno iPage, char 
36d90 2a 7a 43 6f 6e 74 65 78 74 29 7b 0a 20 20 69 66  *zContext){.  if
36da0 28 20 69 50 61 67 65 3d 3d 30 20 29 20 72 65 74  ( iPage==0 ) ret
36db0 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 69 50 61  urn 1;.  if( iPa
36dc0 67 65 3e 70 43 68 65 63 6b 2d 3e 6e 50 61 67 65  ge>pCheck->nPage
36dd0 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70   ){.    checkApp
36de0 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a  endMsg(pCheck, z
36df0 43 6f 6e 74 65 78 74 2c 20 22 69 6e 76 61 6c 69  Context, "invali
36e00 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20 25 64  d page number %d
36e10 22 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 72  ", iPage);.    r
36e20 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
36e30 66 28 20 70 43 68 65 63 6b 2d 3e 61 6e 52 65 66  f( pCheck->anRef
36e40 5b 69 50 61 67 65 5d 3d 3d 31 20 29 7b 0a 20 20  [iPage]==1 ){.  
36e50 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
36e60 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78  (pCheck, zContex
36e70 74 2c 20 22 32 6e 64 20 72 65 66 65 72 65 6e 63  t, "2nd referenc
36e80 65 20 74 6f 20 70 61 67 65 20 25 64 22 2c 20 69  e to page %d", i
36e90 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72  Page);.    retur
36ea0 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
36eb0 6e 20 20 28 70 43 68 65 63 6b 2d 3e 61 6e 52 65  n  (pCheck->anRe
36ec0 66 5b 69 50 61 67 65 5d 2b 2b 29 3e 31 3b 0a 7d  f[iPage]++)>1;.}
36ed0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
36ee0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
36ef0 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61  ./*.** Check tha
36f00 74 20 74 68 65 20 65 6e 74 72 79 20 69 6e 20 74  t the entry in t
36f10 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 66  he pointer-map f
36f20 6f 72 20 70 61 67 65 20 69 43 68 69 6c 64 20 6d  or page iChild m
36f30 61 70 73 20 74 6f 20 0a 2a 2a 20 70 61 67 65 20  aps to .** page 
36f40 69 50 61 72 65 6e 74 2c 20 70 6f 69 6e 74 65 72  iParent, pointer
36f50 20 74 79 70 65 20 70 74 72 54 79 70 65 2e 20 49   type ptrType. I
36f60 66 20 6e 6f 74 2c 20 61 70 70 65 6e 64 20 61 6e  f not, append an
36f70 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a   error message.*
36f80 2a 20 74 6f 20 70 43 68 65 63 6b 2e 0a 2a 2f 0a  * to pCheck..*/.
36f90 73 74 61 74 69 63 20 76 6f 69 64 20 63 68 65 63  static void chec
36fa0 6b 50 74 72 6d 61 70 28 0a 20 20 49 6e 74 65 67  kPtrmap(.  Integ
36fb0 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c 20  rityCk *pCheck, 
36fc0 20 20 2f 2a 20 49 6e 74 65 67 72 69 74 79 20 63    /* Integrity c
36fd0 68 65 63 6b 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  heck context */.
36fe0 20 20 50 67 6e 6f 20 69 43 68 69 6c 64 2c 20 20    Pgno iChild,  
36ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 69 6c           /* Chil
37000 64 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  d page number */
37010 0a 20 20 75 38 20 65 54 79 70 65 2c 20 20 20 20  .  u8 eType,    
37020 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
37030 65 63 74 65 64 20 70 6f 69 6e 74 65 72 20 6d 61  ected pointer ma
37040 70 20 74 79 70 65 20 2a 2f 0a 20 20 50 67 6e 6f  p type */.  Pgno
37050 20 69 50 61 72 65 6e 74 2c 20 20 20 20 20 20 20   iParent,       
37060 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20 70     /* Expected p
37070 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 72 65 6e  ointer map paren
37080 74 20 70 61 67 65 20 6e 75 6d 62 65 72 20 2a 2f  t page number */
37090 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78  .  char *zContex
370a0 74 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  t         /* Con
370b0 74 65 78 74 20 64 65 73 63 72 69 70 74 69 6f 6e  text description
370c0 20 28 75 73 65 64 20 66 6f 72 20 65 72 72 6f 72   (used for error
370d0 20 6d 73 67 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e   msg) */.){.  in
370e0 74 20 72 63 3b 0a 20 20 75 38 20 65 50 74 72 6d  t rc;.  u8 ePtrm
370f0 61 70 54 79 70 65 3b 0a 20 20 50 67 6e 6f 20 69  apType;.  Pgno i
37100 50 74 72 6d 61 70 50 61 72 65 6e 74 3b 0a 0a 20  PtrmapParent;.. 
37110 20 72 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28   rc = ptrmapGet(
37120 70 43 68 65 63 6b 2d 3e 70 42 74 2c 20 69 43 68  pCheck->pBt, iCh
37130 69 6c 64 2c 20 26 65 50 74 72 6d 61 70 54 79 70  ild, &ePtrmapTyp
37140 65 2c 20 26 69 50 74 72 6d 61 70 50 61 72 65 6e  e, &iPtrmapParen
37150 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  t);.  if( rc!=SQ
37160 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
37170 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  f( rc==SQLITE_NO
37180 4d 45 4d 20 29 20 70 43 68 65 63 6b 2d 3e 6d 61  MEM ) pCheck->ma
37190 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
371a0 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d      checkAppendM
371b0 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74  sg(pCheck, zCont
371c0 65 78 74 2c 20 22 46 61 69 6c 65 64 20 74 6f 20  ext, "Failed to 
371d0 72 65 61 64 20 70 74 72 6d 61 70 20 6b 65 79 3d  read ptrmap key=
371e0 25 64 22 2c 20 69 43 68 69 6c 64 29 3b 0a 20 20  %d", iChild);.  
371f0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
37200 20 69 66 28 20 65 50 74 72 6d 61 70 54 79 70 65   if( ePtrmapType
37210 21 3d 65 54 79 70 65 20 7c 7c 20 69 50 74 72 6d  !=eType || iPtrm
37220 61 70 50 61 72 65 6e 74 21 3d 69 50 61 72 65 6e  apParent!=iParen
37230 74 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70  t ){.    checkAp
37240 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
37250 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20 20  zContext, .     
37260 20 22 42 61 64 20 70 74 72 20 6d 61 70 20 65 6e   "Bad ptr map en
37270 74 72 79 20 6b 65 79 3d 25 64 20 65 78 70 65 63  try key=%d expec
37280 74 65 64 3d 28 25 64 2c 25 64 29 20 67 6f 74 3d  ted=(%d,%d) got=
37290 28 25 64 2c 25 64 29 22 2c 20 0a 20 20 20 20 20  (%d,%d)", .     
372a0 20 69 43 68 69 6c 64 2c 20 65 54 79 70 65 2c 20   iChild, eType, 
372b0 69 50 61 72 65 6e 74 2c 20 65 50 74 72 6d 61 70  iParent, ePtrmap
372c0 54 79 70 65 2c 20 69 50 74 72 6d 61 70 50 61 72  Type, iPtrmapPar
372d0 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  ent);.  }.}.#end
372e0 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  if../*.** Check 
372f0 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6f 66  the integrity of
37300 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 6f 72   the freelist or
37310 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   of an overflow 
37320 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2a 20 56 65  page list..** Ve
37330 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e 75  rify that the nu
37340 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e  mber of pages on
37350 20 74 68 65 20 6c 69 73 74 20 69 73 20 4e 2e 0a   the list is N..
37360 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
37370 68 65 63 6b 4c 69 73 74 28 0a 20 20 49 6e 74 65  heckList(.  Inte
37380 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63 6b 2c  grityCk *pCheck,
37390 20 20 2f 2a 20 49 6e 74 65 67 72 69 74 79 20 63    /* Integrity c
373a0 68 65 63 6b 69 6e 67 20 63 6f 6e 74 65 78 74 20  hecking context 
373b0 2a 2f 0a 20 20 69 6e 74 20 69 73 46 72 65 65 4c  */.  int isFreeL
373c0 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20 54 72  ist,       /* Tr
373d0 75 65 20 66 6f 72 20 61 20 66 72 65 65 6c 69 73  ue for a freelis
373e0 74 2e 20 20 46 61 6c 73 65 20 66 6f 72 20 6f 76  t.  False for ov
373f0 65 72 66 6c 6f 77 20 70 61 67 65 20 6c 69 73 74  erflow page list
37400 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67 65 2c   */.  int iPage,
37410 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
37420 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 66  age number for f
37430 69 72 73 74 20 70 61 67 65 20 69 6e 20 74 68 65  irst page in the
37440 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74 20 4e   list */.  int N
37450 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
37460 20 2f 2a 20 45 78 70 65 63 74 65 64 20 6e 75 6d   /* Expected num
37470 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
37480 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 63 68  the list */.  ch
37490 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20 20 20  ar *zContext    
374a0 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 66      /* Context f
374b0 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  or error message
374c0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
374d0 0a 20 20 69 6e 74 20 65 78 70 65 63 74 65 64 20  .  int expected 
374e0 3d 20 4e 3b 0a 20 20 69 6e 74 20 69 46 69 72 73  = N;.  int iFirs
374f0 74 20 3d 20 69 50 61 67 65 3b 0a 20 20 77 68 69  t = iPage;.  whi
37500 6c 65 28 20 4e 2d 2d 20 3e 20 30 20 26 26 20 70  le( N-- > 0 && p
37510 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20 29 7b 0a  Check->mxErr ){.
37520 20 20 20 20 44 62 50 61 67 65 20 2a 70 4f 76 66      DbPage *pOvf
37530 6c 50 61 67 65 3b 0a 20 20 20 20 75 6e 73 69 67  lPage;.    unsig
37540 6e 65 64 20 63 68 61 72 20 2a 70 4f 76 66 6c 44  ned char *pOvflD
37550 61 74 61 3b 0a 20 20 20 20 69 66 28 20 69 50 61  ata;.    if( iPa
37560 67 65 3c 31 20 29 7b 0a 20 20 20 20 20 20 63 68  ge<1 ){.      ch
37570 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
37580 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20  eck, zContext,. 
37590 20 20 20 20 20 20 20 20 22 25 64 20 6f 66 20 25          "%d of %
375a0 64 20 70 61 67 65 73 20 6d 69 73 73 69 6e 67 20  d pages missing 
375b0 66 72 6f 6d 20 6f 76 65 72 66 6c 6f 77 20 6c 69  from overflow li
375c0 73 74 20 73 74 61 72 74 69 6e 67 20 61 74 20 25  st starting at %
375d0 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 4e 2b  d",.          N+
375e0 31 2c 20 65 78 70 65 63 74 65 64 2c 20 69 46 69  1, expected, iFi
375f0 72 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  rst);.      brea
37600 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
37610 20 63 68 65 63 6b 52 65 66 28 70 43 68 65 63 6b   checkRef(pCheck
37620 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78  , iPage, zContex
37630 74 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  t) ) break;.    
37640 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
37650 47 65 74 28 70 43 68 65 63 6b 2d 3e 70 50 61 67  Get(pCheck->pPag
37660 65 72 2c 20 28 50 67 6e 6f 29 69 50 61 67 65 2c  er, (Pgno)iPage,
37670 20 26 70 4f 76 66 6c 50 61 67 65 29 20 29 7b 0a   &pOvflPage) ){.
37680 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e        checkAppen
37690 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
376a0 6e 74 65 78 74 2c 20 22 66 61 69 6c 65 64 20 74  ntext, "failed t
376b0 6f 20 67 65 74 20 70 61 67 65 20 25 64 22 2c 20  o get page %d", 
376c0 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20 62 72  iPage);.      br
376d0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  eak;.    }.    p
376e0 4f 76 66 6c 44 61 74 61 20 3d 20 28 75 6e 73 69  OvflData = (unsi
376f0 67 6e 65 64 20 63 68 61 72 20 2a 29 73 71 6c 69  gned char *)sqli
37700 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
37710 70 4f 76 66 6c 50 61 67 65 29 3b 0a 20 20 20 20  pOvflPage);.    
37720 69 66 28 20 69 73 46 72 65 65 4c 69 73 74 20 29  if( isFreeList )
37730 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  {.      int n = 
37740 67 65 74 34 62 79 74 65 28 26 70 4f 76 66 6c 44  get4byte(&pOvflD
37750 61 74 61 5b 34 5d 29 3b 0a 23 69 66 6e 64 65 66  ata[4]);.#ifndef
37760 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
37770 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66  OVACUUM.      if
37780 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d 3e 61  ( pCheck->pBt->a
37790 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20  utoVacuum ){.   
377a0 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70       checkPtrmap
377b0 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65 2c 20  (pCheck, iPage, 
377c0 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c  PTRMAP_FREEPAGE,
377d0 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20   0, zContext);. 
377e0 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
377f0 20 20 20 20 69 66 28 20 6e 3e 70 43 68 65 63 6b      if( n>pCheck
37800 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
37810 65 2f 34 2d 32 20 29 7b 0a 20 20 20 20 20 20 20  e/4-2 ){.       
37820 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
37830 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74  pCheck, zContext
37840 2c 0a 20 20 20 20 20 20 20 20 20 20 20 22 66 72  ,.           "fr
37850 65 65 6c 69 73 74 20 6c 65 61 66 20 63 6f 75 6e  eelist leaf coun
37860 74 20 74 6f 6f 20 62 69 67 20 6f 6e 20 70 61 67  t too big on pag
37870 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20  e %d", iPage);. 
37880 20 20 20 20 20 20 20 4e 2d 2d 3b 0a 20 20 20 20         N--;.    
37890 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
378a0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69   for(i=0; i<n; i
378b0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  ++){.          P
378c0 67 6e 6f 20 69 46 72 65 65 50 61 67 65 20 3d 20  gno iFreePage = 
378d0 67 65 74 34 62 79 74 65 28 26 70 4f 76 66 6c 44  get4byte(&pOvflD
378e0 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 23 69 66  ata[8+i*4]);.#if
378f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
37900 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
37910 20 20 20 20 20 20 69 66 28 20 70 43 68 65 63 6b        if( pCheck
37920 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ->pBt->autoVacuu
37930 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  m ){.           
37940 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68   checkPtrmap(pCh
37950 65 63 6b 2c 20 69 46 72 65 65 50 61 67 65 2c 20  eck, iFreePage, 
37960 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c  PTRMAP_FREEPAGE,
37970 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20   0, zContext);. 
37980 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69           }.#endi
37990 66 0a 20 20 20 20 20 20 20 20 20 20 63 68 65 63  f.          chec
379a0 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69 46 72  kRef(pCheck, iFr
379b0 65 65 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74  eePage, zContext
379c0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
379d0 20 20 20 20 20 4e 20 2d 3d 20 6e 3b 0a 20 20 20       N -= n;.   
379e0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64     }.    }.#ifnd
379f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
37a00 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 65 6c  UTOVACUUM.    el
37a10 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  se{.      /* If 
37a20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 73 75  this database su
37a30 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63 75  pports auto-vacu
37a40 75 6d 20 61 6e 64 20 69 50 61 67 65 20 69 73 20  um and iPage is 
37a50 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 20 20 20  not the last.   
37a60 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68     ** page in th
37a70 69 73 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73 74  is overflow list
37a80 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  , check that the
37a90 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
37aa0 72 79 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20  ry for.      ** 
37ab0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 61  the following pa
37ac0 67 65 20 6d 61 74 63 68 65 73 20 69 50 61 67 65  ge matches iPage
37ad0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
37ae0 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74   if( pCheck->pBt
37af0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20  ->autoVacuum && 
37b00 4e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  N>0 ){.        i
37b10 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f 76 66   = get4byte(pOvf
37b20 6c 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20  lData);.        
37b30 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68 65  checkPtrmap(pChe
37b40 63 6b 2c 20 69 2c 20 50 54 52 4d 41 50 5f 4f 56  ck, i, PTRMAP_OV
37b50 45 52 46 4c 4f 57 32 2c 20 69 50 61 67 65 2c 20  ERFLOW2, iPage, 
37b60 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20  zContext);.     
37b70 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a   }.    }.#endif.
37b80 20 20 20 20 69 50 61 67 65 20 3d 20 67 65 74 34      iPage = get4
37b90 62 79 74 65 28 70 4f 76 66 6c 44 61 74 61 29 3b  byte(pOvflData);
37ba0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
37bb0 72 55 6e 72 65 66 28 70 4f 76 66 6c 50 61 67 65  rUnref(pOvflPage
37bc0 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20  );.  }.}.#endif 
37bd0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49  /* SQLITE_OMIT_I
37be0 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b 20 2a  NTEGRITY_CHECK *
37bf0 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
37c00 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49 54 59  E_OMIT_INTEGRITY
37c10 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 44 6f 20  _CHECK./*.** Do 
37c20 76 61 72 69 6f 75 73 20 73 61 6e 69 74 79 20 63  various sanity c
37c30 68 65 63 6b 73 20 6f 6e 20 61 20 73 69 6e 67 6c  hecks on a singl
37c40 65 20 70 61 67 65 20 6f 66 20 61 20 74 72 65 65  e page of a tree
37c50 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 68 65  .  Return.** the
37c60 20 74 72 65 65 20 64 65 70 74 68 2e 20 20 52 6f   tree depth.  Ro
37c70 6f 74 20 70 61 67 65 73 20 72 65 74 75 72 6e 20  ot pages return 
37c80 30 2e 20 20 50 61 72 65 6e 74 73 20 6f 66 20 72  0.  Parents of r
37c90 6f 6f 74 20 70 61 67 65 73 0a 2a 2a 20 72 65 74  oot pages.** ret
37ca0 75 72 6e 20 31 2c 20 61 6e 64 20 73 6f 20 66 6f  urn 1, and so fo
37cb0 72 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 73  rth..** .** Thes
37cc0 65 20 63 68 65 63 6b 73 20 61 72 65 20 64 6f 6e  e checks are don
37cd0 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 31 2e  e:.**.**      1.
37ce0 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68 61 74    Make sure that
37cf0 20 63 65 6c 6c 73 20 61 6e 64 20 66 72 65 65 62   cells and freeb
37d00 6c 6f 63 6b 73 20 64 6f 20 6e 6f 74 20 6f 76 65  locks do not ove
37d10 72 6c 61 70 0a 2a 2a 20 20 20 20 20 20 20 20 20  rlap.**         
37d20 20 62 75 74 20 63 6f 6d 62 69 6e 65 20 74 6f 20   but combine to 
37d30 63 6f 6d 70 6c 65 74 65 6c 79 20 63 6f 76 65 72  completely cover
37d40 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 20 4e   the page..**  N
37d50 4f 20 20 32 2e 20 20 4d 61 6b 65 20 73 75 72 65  O  2.  Make sure
37d60 20 63 65 6c 6c 20 6b 65 79 73 20 61 72 65 20 69   cell keys are i
37d70 6e 20 6f 72 64 65 72 2e 0a 2a 2a 20 20 4e 4f 20  n order..**  NO 
37d80 20 33 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 6e   3.  Make sure n
37d90 6f 20 6b 65 79 20 69 73 20 6c 65 73 73 20 74 68  o key is less th
37da0 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a  an or equal to z
37db0 4c 6f 77 65 72 42 6f 75 6e 64 2e 0a 2a 2a 20 20  LowerBound..**  
37dc0 4e 4f 20 20 34 2e 20 20 4d 61 6b 65 20 73 75 72  NO  4.  Make sur
37dd0 65 20 6e 6f 20 6b 65 79 20 69 73 20 67 72 65 61  e no key is grea
37de0 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71 75 61  ter than or equa
37df0 6c 20 74 6f 20 7a 55 70 70 65 72 42 6f 75 6e 64  l to zUpperBound
37e00 2e 0a 2a 2a 20 20 20 20 20 20 35 2e 20 20 43 68  ..**      5.  Ch
37e10 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74  eck the integrit
37e20 79 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20 70 61  y of overflow pa
37e30 67 65 73 2e 0a 2a 2a 20 20 20 20 20 20 36 2e 20  ges..**      6. 
37e40 20 52 65 63 75 72 73 69 76 65 6c 79 20 63 61 6c   Recursively cal
37e50 6c 20 63 68 65 63 6b 54 72 65 65 50 61 67 65 20  l checkTreePage 
37e60 6f 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 2e  on all children.
37e70 0a 2a 2a 20 20 20 20 20 20 37 2e 20 20 56 65 72  .**      7.  Ver
37e80 69 66 79 20 74 68 61 74 20 74 68 65 20 64 65 70  ify that the dep
37e90 74 68 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 72  th of all childr
37ea0 65 6e 20 69 73 20 74 68 65 20 73 61 6d 65 2e 0a  en is the same..
37eb0 2a 2a 20 20 20 20 20 20 38 2e 20 20 4d 61 6b 65  **      8.  Make
37ec0 20 73 75 72 65 20 74 68 69 73 20 70 61 67 65 20   sure this page 
37ed0 69 73 20 61 74 20 6c 65 61 73 74 20 33 33 25 20  is at least 33% 
37ee0 66 75 6c 6c 20 6f 72 20 65 6c 73 65 20 69 74 20  full or else it 
37ef0 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74  is.**          t
37f00 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  he root of the t
37f10 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ree..*/.static i
37f20 6e 74 20 63 68 65 63 6b 54 72 65 65 50 61 67 65  nt checkTreePage
37f30 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20  (.  IntegrityCk 
37f40 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20 43 6f 6e  *pCheck,  /* Con
37f50 74 65 78 74 20 66 6f 72 20 74 68 65 20 73 61 6e  text for the san
37f60 69 74 79 20 63 68 65 63 6b 20 2a 2f 0a 20 20 69  ity check */.  i
37f70 6e 74 20 69 50 61 67 65 2c 20 20 20 20 20 20 20  nt iPage,       
37f80 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
37f90 62 65 72 20 6f 66 20 74 68 65 20 70 61 67 65 20  ber of the page 
37fa0 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20 63 68  to check */.  ch
37fb0 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f 6e 74 65  ar *zParentConte
37fc0 78 74 20 20 2f 2a 20 50 61 72 65 6e 74 20 63 6f  xt  /* Parent co
37fd0 6e 74 65 78 74 20 2a 2f 0a 29 7b 0a 20 20 4d 65  ntext */.){.  Me
37fe0 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a 20 20  mPage *pPage;.  
37ff0 69 6e 74 20 69 2c 20 72 63 2c 20 64 65 70 74 68  int i, rc, depth
38000 2c 20 64 32 2c 20 70 67 6e 6f 2c 20 63 6e 74 3b  , d2, pgno, cnt;
38010 0a 20 20 69 6e 74 20 68 64 72 2c 20 63 65 6c 6c  .  int hdr, cell
38020 53 74 61 72 74 3b 0a 20 20 69 6e 74 20 6e 43 65  Start;.  int nCe
38030 6c 6c 3b 0a 20 20 75 38 20 2a 64 61 74 61 3b 0a  ll;.  u8 *data;.
38040 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b    BtShared *pBt;
38050 0a 20 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a  .  int usableSiz
38060 65 3b 0a 20 20 63 68 61 72 20 7a 43 6f 6e 74 65  e;.  char zConte
38070 78 74 5b 31 30 30 5d 3b 0a 20 20 63 68 61 72 20  xt[100];.  char 
38080 2a 68 69 74 20 3d 20 30 3b 0a 0a 20 20 73 71 6c  *hit = 0;..  sql
38090 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
380a0 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20  zeof(zContext), 
380b0 7a 43 6f 6e 74 65 78 74 2c 20 22 50 61 67 65 20  zContext, "Page 
380c0 25 64 3a 20 22 2c 20 69 50 61 67 65 29 3b 0a 0a  %d: ", iPage);..
380d0 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
380e0 74 68 65 20 70 61 67 65 20 65 78 69 73 74 73 0a  the page exists.
380f0 20 20 2a 2f 0a 20 20 70 42 74 20 3d 20 70 43 68    */.  pBt = pCh
38100 65 63 6b 2d 3e 70 42 74 3b 0a 20 20 75 73 61 62  eck->pBt;.  usab
38110 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75 73  leSize = pBt->us
38120 61 62 6c 65 53 69 7a 65 3b 0a 20 20 69 66 28 20  ableSize;.  if( 
38130 69 50 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72  iPage==0 ) retur
38140 6e 20 30 3b 0a 20 20 69 66 28 20 63 68 65 63 6b  n 0;.  if( check
38150 52 65 66 28 70 43 68 65 63 6b 2c 20 69 50 61 67  Ref(pCheck, iPag
38160 65 2c 20 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78  e, zParentContex
38170 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  t) ) return 0;. 
38180 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74   if( (rc = sqlit
38190 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
381a0 42 74 2c 20 28 50 67 6e 6f 29 69 50 61 67 65 2c  Bt, (Pgno)iPage,
381b0 20 26 70 50 61 67 65 2c 20 30 29 29 21 3d 30 20   &pPage, 0))!=0 
381c0 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ){.    if( rc==S
381d0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 70 43  QLITE_NOMEM ) pC
381e0 68 65 63 6b 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  heck->mallocFail
381f0 65 64 20 3d 20 31 3b 0a 20 20 20 20 63 68 65 63  ed = 1;.    chec
38200 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63  kAppendMsg(pChec
38210 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20  k, zContext,.   
38220 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 67      "unable to g
38230 65 74 20 74 68 65 20 70 61 67 65 2e 20 65 72 72  et the page. err
38240 6f 72 20 63 6f 64 65 3d 25 64 22 2c 20 72 63 29  or code=%d", rc)
38250 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
38260 20 20 7d 0a 20 20 69 66 28 20 28 72 63 20 3d 20    }.  if( (rc = 
38270 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
38280 50 61 67 65 28 70 50 61 67 65 29 29 21 3d 30 20  Page(pPage))!=0 
38290 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  ){.    assert( r
382a0 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  c==SQLITE_CORRUP
382b0 54 20 29 3b 20 20 2f 2a 20 54 68 65 20 6f 6e 6c  T );  /* The onl
382c0 79 20 70 6f 73 73 69 62 6c 65 20 65 72 72 6f 72  y possible error
382d0 20 66 72 6f 6d 20 49 6e 69 74 50 61 67 65 20 2a   from InitPage *
382e0 2f 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e  /.    checkAppen
382f0 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
38300 6e 74 65 78 74 2c 20 0a 20 20 20 20 20 20 20 20  ntext, .        
38310 20 20 20 20 20 20 20 20 20 20 20 22 73 71 6c 69             "sqli
38320 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67 65  te3BtreeInitPage
38330 28 29 20 72 65 74 75 72 6e 73 20 65 72 72 6f 72  () returns error
38340 20 63 6f 64 65 20 25 64 22 2c 20 72 63 29 3b 0a   code %d", rc);.
38350 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
38360 70 50 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75  pPage);.    retu
38370 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
38380 43 68 65 63 6b 20 6f 75 74 20 61 6c 6c 20 74 68  Check out all th
38390 65 20 63 65 6c 6c 73 2e 0a 20 20 2a 2f 0a 20 20  e cells..  */.  
383a0 64 65 70 74 68 20 3d 20 30 3b 0a 20 20 66 6f 72  depth = 0;.  for
383b0 28 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e  (i=0; i<pPage->n
383c0 43 65 6c 6c 20 26 26 20 70 43 68 65 63 6b 2d 3e  Cell && pCheck->
383d0 6d 78 45 72 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  mxErr; i++){.   
383e0 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20 20 20   u8 *pCell;.    
383f0 75 33 32 20 73 7a 3b 0a 20 20 20 20 43 65 6c 6c  u32 sz;.    Cell
38400 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 20 20  Info info;..    
38410 2f 2a 20 43 68 65 63 6b 20 70 61 79 6c 6f 61 64  /* Check payload
38420 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73 0a   overflow pages.
38430 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
38440 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
38450 6f 66 28 7a 43 6f 6e 74 65 78 74 29 2c 20 7a 43  o