/ Hex Artifact Content
Login

Artifact df02edb06f8fcb53d607a338d77434c4a3bffe7a:


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 32 30 20 32 30 30 38 2f 30  c,v 1.520 2008/0
0190: 39 2f 32 39 20 31 36 3a 34 31 3a 33 32 20 64 61  9/29 16:41:32 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: 52 65 61 64 4c 6f 63 6b 73 28 42 74 72 65 65 2a  ReadLocks(Btree*
07b0: 2c 20 50 67 6e 6f 2c 20 42 74 43 75 72 73 6f 72  , Pgno, BtCursor
07c0: 2a 2c 20 69 36 34 29 3b 0a 0a 0a 23 69 66 64 65  *, i64);...#ifde
07d0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48  f SQLITE_OMIT_SH
07e0: 41 52 45 44 5f 43 41 43 48 45 0a 20 20 2f 2a 0a  ARED_CACHE.  /*.
07f0: 20 20 2a 2a 20 54 68 65 20 66 75 6e 63 74 69 6f    ** The functio
0800: 6e 73 20 71 75 65 72 79 54 61 62 6c 65 4c 6f 63  ns queryTableLoc
0810: 6b 28 29 2c 20 6c 6f 63 6b 54 61 62 6c 65 28 29  k(), lockTable()
0820: 20 61 6e 64 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61   and unlockAllTa
0830: 62 6c 65 73 28 29 0a 20 20 2a 2a 20 6d 61 6e 69  bles().  ** mani
0840: 70 75 6c 61 74 65 20 65 6e 74 72 69 65 73 20 69  pulate entries i
0850: 6e 20 74 68 65 20 42 74 53 68 61 72 65 64 2e 70  n the BtShared.p
0860: 4c 6f 63 6b 20 6c 69 6e 6b 65 64 20 6c 69 73 74  Lock linked list
0870: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 0a 20   used to store. 
0880: 20 2a 2a 20 73 68 61 72 65 64 2d 63 61 63 68 65   ** shared-cache
0890: 20 74 61 62 6c 65 20 6c 65 76 65 6c 20 6c 6f 63   table level loc
08a0: 6b 73 2e 20 49 66 20 74 68 65 20 6c 69 62 72 61  ks. If the libra
08b0: 72 79 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 77  ry is compiled w
08c0: 69 74 68 20 74 68 65 0a 20 20 2a 2a 20 73 68 61  ith the.  ** sha
08d0: 72 65 64 2d 63 61 63 68 65 20 66 65 61 74 75 72  red-cache featur
08e0: 65 20 64 69 73 61 62 6c 65 64 2c 20 74 68 65 6e  e disabled, then
08f0: 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 65   there is only e
0900: 76 65 72 20 6f 6e 65 20 75 73 65 72 0a 20 20 2a  ver one user.  *
0910: 2a 20 6f 66 20 65 61 63 68 20 42 74 53 68 61 72  * of each BtShar
0920: 65 64 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  ed structure and
0930: 20 73 6f 20 74 68 69 73 20 6c 6f 63 6b 69 6e 67   so this locking
0940: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
0950: 79 2e 20 0a 20 20 2a 2a 20 53 6f 20 64 65 66 69  y. .  ** So defi
0960: 6e 65 20 74 68 65 20 6c 6f 63 6b 20 72 65 6c 61  ne the lock rela
0970: 74 65 64 20 66 75 6e 63 74 69 6f 6e 73 20 61 73  ted functions as
0980: 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2f 0a 20 20   no-ops..  */.  
0990: 23 64 65 66 69 6e 65 20 71 75 65 72 79 54 61 62  #define queryTab
09a0: 6c 65 4c 6f 63 6b 28 61 2c 62 2c 63 29 20 53 51  leLock(a,b,c) SQ
09b0: 4c 49 54 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e  LITE_OK.  #defin
09c0: 65 20 6c 6f 63 6b 54 61 62 6c 65 28 61 2c 62 2c  e lockTable(a,b,
09d0: 63 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23  c) SQLITE_OK.  #
09e0: 64 65 66 69 6e 65 20 75 6e 6c 6f 63 6b 41 6c 6c  define unlockAll
09f0: 54 61 62 6c 65 73 28 61 29 0a 23 65 6e 64 69 66  Tables(a).#endif
0a00: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
0a10: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
0a20: 48 45 0a 2f 2a 0a 2a 2a 20 51 75 65 72 79 20 74  HE./*.** Query t
0a30: 6f 20 73 65 65 20 69 66 20 62 74 72 65 65 20 68  o see if btree h
0a40: 61 6e 64 6c 65 20 70 20 6d 61 79 20 6f 62 74 61  andle p may obta
0a50: 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70  in a lock of typ
0a60: 65 20 65 4c 6f 63 6b 20 0a 2a 2a 20 28 52 45 41  e eLock .** (REA
0a70: 44 5f 4c 4f 43 4b 20 6f 72 20 57 52 49 54 45 5f  D_LOCK or WRITE_
0a80: 4c 4f 43 4b 29 20 6f 6e 20 74 68 65 20 74 61 62  LOCK) on the tab
0a90: 6c 65 20 77 69 74 68 20 72 6f 6f 74 2d 70 61 67  le with root-pag
0aa0: 65 20 69 54 61 62 2e 20 52 65 74 75 72 6e 0a 2a  e iTab. Return.*
0ab0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74  * SQLITE_OK if t
0ac0: 68 65 20 6c 6f 63 6b 20 6d 61 79 20 62 65 20 6f  he lock may be o
0ad0: 62 74 61 69 6e 65 64 20 28 62 79 20 63 61 6c 6c  btained (by call
0ae0: 69 6e 67 20 6c 6f 63 6b 54 61 62 6c 65 28 29 29  ing lockTable())
0af0: 2c 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c  , or.** SQLITE_L
0b00: 4f 43 4b 45 44 20 69 66 20 6e 6f 74 2e 0a 2a 2f  OCKED if not..*/
0b10: 0a 73 74 61 74 69 63 20 69 6e 74 20 71 75 65 72  .static int quer
0b20: 79 54 61 62 6c 65 4c 6f 63 6b 28 42 74 72 65 65  yTableLock(Btree
0b30: 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 2c 20   *p, Pgno iTab, 
0b40: 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20 42 74 53  u8 eLock){.  BtS
0b50: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
0b60: 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b 20 2a 70  pBt;.  BtLock *p
0b70: 49 74 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28  Iter;..  assert(
0b80: 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c   sqlite3BtreeHol
0b90: 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20  dsMutex(p) );.  
0ba0: 61 73 73 65 72 74 28 20 65 4c 6f 63 6b 3d 3d 52  assert( eLock==R
0bb0: 45 41 44 5f 4c 4f 43 4b 20 7c 7c 20 65 4c 6f 63  EAD_LOCK || eLoc
0bc0: 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20 29 3b  k==WRITE_LOCK );
0bd0: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 62  .  assert( p->db
0be0: 21 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 54  !=0 );.  .  /* T
0bf0: 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69  his is a no-op i
0c00: 66 20 74 68 65 20 73 68 61 72 65 64 2d 63 61 63  f the shared-cac
0c10: 68 65 20 69 73 20 6e 6f 74 20 65 6e 61 62 6c 65  he is not enable
0c20: 64 20 2a 2f 0a 20 20 69 66 28 20 21 70 2d 3e 73  d */.  if( !p->s
0c30: 68 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 72  harable ){.    r
0c40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
0c50: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 73 6f  .  }..  /* If so
0c60: 6d 65 20 6f 74 68 65 72 20 63 6f 6e 6e 65 63 74  me other connect
0c70: 69 6f 6e 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  ion is holding a
0c80: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
0c90: 2c 20 74 68 65 0a 20 20 2a 2a 20 72 65 71 75 65  , the.  ** reque
0ca0: 73 74 65 64 20 6c 6f 63 6b 20 6d 61 79 20 6e 6f  sted lock may no
0cb0: 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2e 0a 20  t be obtained.. 
0cc0: 20 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70   */.  if( pBt->p
0cd0: 45 78 63 6c 75 73 69 76 65 20 26 26 20 70 42 74  Exclusive && pBt
0ce0: 2d 3e 70 45 78 63 6c 75 73 69 76 65 21 3d 70 20  ->pExclusive!=p 
0cf0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
0d00: 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 7d  LITE_LOCKED;.  }
0d10: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 28 61 6c 6f  ..  /* This (alo
0d20: 6e 67 20 77 69 74 68 20 6c 6f 63 6b 54 61 62 6c  ng with lockTabl
0d30: 65 28 29 29 20 69 73 20 77 68 65 72 65 20 74 68  e()) is where th
0d40: 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  e ReadUncommitte
0d50: 64 20 66 6c 61 67 20 69 73 0a 20 20 2a 2a 20 64  d flag is.  ** d
0d60: 65 61 6c 74 20 77 69 74 68 2e 20 49 66 20 74 68  ealt with. If th
0d70: 65 20 63 61 6c 6c 65 72 20 69 73 20 71 75 65 72  e caller is quer
0d80: 79 69 6e 67 20 66 6f 72 20 61 20 72 65 61 64 2d  ying for a read-
0d90: 6c 6f 63 6b 20 61 6e 64 20 74 68 65 20 66 6c 61  lock and the fla
0da0: 67 20 69 73 0a 20 20 2a 2a 20 73 65 74 2c 20 69  g is.  ** set, i
0db0: 74 20 69 73 20 75 6e 63 6f 6e 64 69 74 69 6f 6e  t is uncondition
0dc0: 61 6c 6c 79 20 67 72 61 6e 74 65 64 20 2d 20 65  ally granted - e
0dd0: 76 65 6e 20 69 66 20 74 68 65 72 65 20 61 72 65  ven if there are
0de0: 20 77 72 69 74 65 2d 6c 6f 63 6b 73 0a 20 20 2a   write-locks.  *
0df0: 2a 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e 20  * on the table. 
0e00: 49 66 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  If a write-lock 
0e10: 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  is requested, th
0e20: 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65  e ReadUncommitte
0e30: 64 20 66 6c 61 67 0a 20 20 2a 2a 20 69 73 20 6e  d flag.  ** is n
0e40: 6f 74 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 20  ot considered.. 
0e50: 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 66 75 6e 63   **.  ** In func
0e60: 74 69 6f 6e 20 6c 6f 63 6b 54 61 62 6c 65 28 29  tion lockTable()
0e70: 2c 20 69 66 20 61 20 72 65 61 64 2d 6c 6f 63 6b  , if a read-lock
0e80: 20 69 73 20 64 65 6d 61 6e 64 65 64 20 61 6e 64   is demanded and
0e90: 20 74 68 65 20 0a 20 20 2a 2a 20 52 65 61 64 55   the .  ** ReadU
0ea0: 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67 20  ncommitted flag 
0eb0: 69 73 20 73 65 74 2c 20 6e 6f 20 65 6e 74 72 79  is set, no entry
0ec0: 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
0ed0: 20 6c 6f 63 6b 73 20 6c 69 73 74 20 0a 20 20 2a   locks list .  *
0ee0: 2a 20 28 42 74 53 68 61 72 65 64 2e 70 4c 6f 63  * (BtShared.pLoc
0ef0: 6b 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 6f  k)..  **.  ** To
0f00: 20 73 75 6d 6d 61 72 69 7a 65 3a 20 49 66 20 74   summarize: If t
0f10: 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74  he ReadUncommitt
0f20: 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  ed flag is set, 
0f30: 74 68 65 6e 20 72 65 61 64 20 63 75 72 73 6f 72  then read cursor
0f40: 73 20 64 6f 0a 20 20 2a 2a 20 6e 6f 74 20 63 72  s do.  ** not cr
0f50: 65 61 74 65 20 6f 72 20 72 65 73 70 65 63 74 20  eate or respect 
0f60: 74 61 62 6c 65 20 6c 6f 63 6b 73 2e 20 54 68 65  table locks. The
0f70: 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 63 65 64 75   locking procedu
0f80: 72 65 20 66 6f 72 20 61 20 0a 20 20 2a 2a 20 77  re for a .  ** w
0f90: 72 69 74 65 2d 63 75 72 73 6f 72 20 64 6f 65 73  rite-cursor does
0fa0: 20 6e 6f 74 20 63 68 61 6e 67 65 2e 0a 20 20 2a   not change..  *
0fb0: 2f 0a 20 20 69 66 28 20 0a 20 20 20 20 30 3d 3d  /.  if( .    0==
0fc0: 28 70 2d 3e 64 62 2d 3e 66 6c 61 67 73 26 53 51  (p->db->flags&SQ
0fd0: 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d 6d 69  LITE_ReadUncommi
0fe0: 74 74 65 64 29 20 7c 7c 20 0a 20 20 20 20 65 4c  tted) || .    eL
0ff0: 6f 63 6b 3d 3d 57 52 49 54 45 5f 4c 4f 43 4b 20  ock==WRITE_LOCK 
1000: 7c 7c 0a 20 20 20 20 69 54 61 62 3d 3d 4d 41 53  ||.    iTab==MAS
1010: 54 45 52 5f 52 4f 4f 54 0a 20 20 29 7b 0a 20 20  TER_ROOT.  ){.  
1020: 20 20 66 6f 72 28 70 49 74 65 72 3d 70 42 74 2d    for(pIter=pBt-
1030: 3e 70 4c 6f 63 6b 3b 20 70 49 74 65 72 3b 20 70  >pLock; pIter; p
1040: 49 74 65 72 3d 70 49 74 65 72 2d 3e 70 4e 65 78  Iter=pIter->pNex
1050: 74 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49  t){.      if( pI
1060: 74 65 72 2d 3e 70 42 74 72 65 65 21 3d 70 20 26  ter->pBtree!=p &
1070: 26 20 70 49 74 65 72 2d 3e 69 54 61 62 6c 65 3d  & pIter->iTable=
1080: 3d 69 54 61 62 20 26 26 20 0a 20 20 20 20 20 20  =iTab && .      
1090: 20 20 20 20 28 70 49 74 65 72 2d 3e 65 4c 6f 63      (pIter->eLoc
10a0: 6b 21 3d 65 4c 6f 63 6b 20 7c 7c 20 65 4c 6f 63  k!=eLock || eLoc
10b0: 6b 21 3d 52 45 41 44 5f 4c 4f 43 4b 29 20 29 7b  k!=READ_LOCK) ){
10c0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
10d0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20  SQLITE_LOCKED;. 
10e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
10f0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1100: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
1110: 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48   !SQLITE_OMIT_SH
1120: 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 23  ARED_CACHE */..#
1130: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1140: 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a  IT_SHARED_CACHE.
1150: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6c 6f 63 6b  /*.** Add a lock
1160: 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 69   on the table wi
1170: 74 68 20 72 6f 6f 74 2d 70 61 67 65 20 69 54 61  th root-page iTa
1180: 62 6c 65 20 74 6f 20 74 68 65 20 73 68 61 72 65  ble to the share
1190: 64 2d 62 74 72 65 65 20 75 73 65 64 0a 2a 2a 20  d-btree used.** 
11a0: 62 79 20 42 74 72 65 65 20 68 61 6e 64 6c 65 20  by Btree handle 
11b0: 70 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4c 6f  p. Parameter eLo
11c0: 63 6b 20 6d 75 73 74 20 62 65 20 65 69 74 68 65  ck must be eithe
11d0: 72 20 52 45 41 44 5f 4c 4f 43 4b 20 6f 72 20 0a  r READ_LOCK or .
11e0: 2a 2a 20 57 52 49 54 45 5f 4c 4f 43 4b 2e 0a 2a  ** WRITE_LOCK..*
11f0: 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
1200: 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68  s returned if th
1210: 65 20 6c 6f 63 6b 20 69 73 20 61 64 64 65 64 20  e lock is added 
1220: 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 51  successfully. SQ
1230: 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 0a 2a 2a  LITE_BUSY and.**
1240: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6d 61   SQLITE_NOMEM ma
1250: 79 20 61 6c 73 6f 20 62 65 20 72 65 74 75 72 6e  y also be return
1260: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1270: 74 20 6c 6f 63 6b 54 61 62 6c 65 28 42 74 72 65  t lockTable(Btre
1280: 65 20 2a 70 2c 20 50 67 6e 6f 20 69 54 61 62 6c  e *p, Pgno iTabl
1290: 65 2c 20 75 38 20 65 4c 6f 63 6b 29 7b 0a 20 20  e, u8 eLock){.  
12a0: 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20  BtShared *pBt = 
12b0: 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c 6f 63 6b  p->pBt;.  BtLock
12c0: 20 2a 70 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20 42   *pLock = 0;.  B
12d0: 74 4c 6f 63 6b 20 2a 70 49 74 65 72 3b 0a 0a 20  tLock *pIter;.. 
12e0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
12f0: 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28  BtreeHoldsMutex(
1300: 70 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  p) );.  assert( 
1310: 65 4c 6f 63 6b 3d 3d 52 45 41 44 5f 4c 4f 43 4b  eLock==READ_LOCK
1320: 20 7c 7c 20 65 4c 6f 63 6b 3d 3d 57 52 49 54 45   || eLock==WRITE
1330: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
1340: 74 28 20 70 2d 3e 64 62 21 3d 30 20 29 3b 0a 0a  t( p->db!=0 );..
1350: 20 20 2f 2a 20 54 68 69 73 20 69 73 20 61 20 6e    /* This is a n
1360: 6f 2d 6f 70 20 69 66 20 74 68 65 20 73 68 61 72  o-op if the shar
1370: 65 64 2d 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ed-cache is not 
1380: 65 6e 61 62 6c 65 64 20 2a 2f 0a 20 20 69 66 28  enabled */.  if(
1390: 20 21 70 2d 3e 73 68 61 72 61 62 6c 65 20 29 7b   !p->sharable ){
13a0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
13b0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 61 73  TE_OK;.  }..  as
13c0: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 4b 3d  sert( SQLITE_OK=
13d0: 3d 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28  =queryTableLock(
13e0: 70 2c 20 69 54 61 62 6c 65 2c 20 65 4c 6f 63 6b  p, iTable, eLock
13f0: 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ) );..  /* If th
1400: 65 20 72 65 61 64 2d 75 6e 63 6f 6d 6d 69 74 74  e read-uncommitt
1410: 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20 61  ed flag is set a
1420: 6e 64 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69  nd a read-lock i
1430: 73 20 72 65 71 75 65 73 74 65 64 2c 0a 20 20 2a  s requested,.  *
1440: 2a 20 72 65 74 75 72 6e 20 65 61 72 6c 79 20 77  * return early w
1450: 69 74 68 6f 75 74 20 61 64 64 69 6e 67 20 61 6e  ithout adding an
1460: 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 42 74   entry to the Bt
1470: 53 68 61 72 65 64 2e 70 4c 6f 63 6b 20 6c 69 73  Shared.pLock lis
1480: 74 2e 20 53 65 65 0a 20 20 2a 2a 20 63 6f 6d 6d  t. See.  ** comm
1490: 65 6e 74 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20  ent in function 
14a0: 71 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 29  queryTableLock()
14b0: 20 66 6f 72 20 6d 6f 72 65 20 69 6e 66 6f 20 6f   for more info o
14c0: 6e 20 68 61 6e 64 6c 69 6e 67 20 0a 20 20 2a 2a  n handling .  **
14d0: 20 74 68 65 20 52 65 61 64 55 6e 63 6f 6d 6d 69   the ReadUncommi
14e0: 74 74 65 64 20 66 6c 61 67 2e 0a 20 20 2a 2f 0a  tted flag..  */.
14f0: 20 20 69 66 28 20 0a 20 20 20 20 28 70 2d 3e 64    if( .    (p->d
1500: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
1510: 52 65 61 64 55 6e 63 6f 6d 6d 69 74 74 65 64 29  ReadUncommitted)
1520: 20 26 26 20 0a 20 20 20 20 28 65 4c 6f 63 6b 3d   && .    (eLock=
1530: 3d 52 45 41 44 5f 4c 4f 43 4b 29 20 26 26 0a 20  =READ_LOCK) &&. 
1540: 20 20 20 69 54 61 62 6c 65 21 3d 4d 41 53 54 45     iTable!=MASTE
1550: 52 5f 52 4f 4f 54 0a 20 20 29 7b 0a 20 20 20 20  R_ROOT.  ){.    
1560: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1570: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 72 73  ;.  }..  /* Firs
1580: 74 20 73 65 61 72 63 68 20 74 68 65 20 6c 69 73  t search the lis
1590: 74 20 66 6f 72 20 61 6e 20 65 78 69 73 74 69 6e  t for an existin
15a0: 67 20 6c 6f 63 6b 20 6f 6e 20 74 68 69 73 20 74  g lock on this t
15b0: 61 62 6c 65 2e 20 2a 2f 0a 20 20 66 6f 72 28 70  able. */.  for(p
15c0: 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f 63 6b 3b  Iter=pBt->pLock;
15d0: 20 70 49 74 65 72 3b 20 70 49 74 65 72 3d 70 49   pIter; pIter=pI
15e0: 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  ter->pNext){.   
15f0: 20 69 66 28 20 70 49 74 65 72 2d 3e 69 54 61 62   if( pIter->iTab
1600: 6c 65 3d 3d 69 54 61 62 6c 65 20 26 26 20 70 49  le==iTable && pI
1610: 74 65 72 2d 3e 70 42 74 72 65 65 3d 3d 70 20 29  ter->pBtree==p )
1620: 7b 0a 20 20 20 20 20 20 70 4c 6f 63 6b 20 3d 20  {.      pLock = 
1630: 70 49 74 65 72 3b 0a 20 20 20 20 20 20 62 72 65  pIter;.      bre
1640: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
1650: 20 2f 2a 20 49 66 20 74 68 65 20 61 62 6f 76 65   /* If the above
1660: 20 73 65 61 72 63 68 20 64 69 64 20 6e 6f 74 20   search did not 
1670: 66 69 6e 64 20 61 20 42 74 4c 6f 63 6b 20 73 74  find a BtLock st
1680: 72 75 63 74 20 61 73 73 6f 63 69 61 74 69 6e 67  ruct associating
1690: 20 42 74 72 65 65 20 70 0a 20 20 2a 2a 20 77 69   Btree p.  ** wi
16a0: 74 68 20 74 61 62 6c 65 20 69 54 61 62 6c 65 2c  th table iTable,
16b0: 20 61 6c 6c 6f 63 61 74 65 20 6f 6e 65 20 61 6e   allocate one an
16c0: 64 20 6c 69 6e 6b 20 69 74 20 69 6e 74 6f 20 74  d link it into t
16d0: 68 65 20 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  he list..  */.  
16e0: 69 66 28 20 21 70 4c 6f 63 6b 20 29 7b 0a 20 20  if( !pLock ){.  
16f0: 20 20 70 4c 6f 63 6b 20 3d 20 28 42 74 4c 6f 63    pLock = (BtLoc
1700: 6b 20 2a 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  k *)sqlite3Mallo
1710: 63 5a 65 72 6f 28 73 69 7a 65 6f 66 28 42 74 4c  cZero(sizeof(BtL
1720: 6f 63 6b 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ock));.    if( !
1730: 70 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 72  pLock ){.      r
1740: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
1750: 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  EM;.    }.    pL
1760: 6f 63 6b 2d 3e 69 54 61 62 6c 65 20 3d 20 69 54  ock->iTable = iT
1770: 61 62 6c 65 3b 0a 20 20 20 20 70 4c 6f 63 6b 2d  able;.    pLock-
1780: 3e 70 42 74 72 65 65 20 3d 20 70 3b 0a 20 20 20  >pBtree = p;.   
1790: 20 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 20 3d 20   pLock->pNext = 
17a0: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 20 20 20 20  pBt->pLock;.    
17b0: 70 42 74 2d 3e 70 4c 6f 63 6b 20 3d 20 70 4c 6f  pBt->pLock = pLo
17c0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ck;.  }..  /* Se
17d0: 74 20 74 68 65 20 42 74 4c 6f 63 6b 2e 65 4c 6f  t the BtLock.eLo
17e0: 63 6b 20 76 61 72 69 61 62 6c 65 20 74 6f 20 74  ck variable to t
17f0: 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 20 74 68  he maximum of th
1800: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 6b 0a 20  e current lock. 
1810: 20 2a 2a 20 61 6e 64 20 74 68 65 20 72 65 71 75   ** and the requ
1820: 65 73 74 65 64 20 6c 6f 63 6b 2e 20 54 68 69 73  ested lock. This
1830: 20 6d 65 61 6e 73 20 69 66 20 61 20 77 72 69 74   means if a writ
1840: 65 2d 6c 6f 63 6b 20 77 61 73 20 61 6c 72 65 61  e-lock was alrea
1850: 64 79 20 68 65 6c 64 0a 20 20 2a 2a 20 61 6e 64  dy held.  ** and
1860: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 72 65 71   a read-lock req
1870: 75 65 73 74 65 64 2c 20 77 65 20 64 6f 6e 27 74  uested, we don't
1880: 20 69 6e 63 6f 72 72 65 63 74 6c 79 20 64 6f 77   incorrectly dow
1890: 6e 67 72 61 64 65 20 74 68 65 20 6c 6f 63 6b 2e  ngrade the lock.
18a0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
18b0: 57 52 49 54 45 5f 4c 4f 43 4b 3e 52 45 41 44 5f  WRITE_LOCK>READ_
18c0: 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 65 4c  LOCK );.  if( eL
18d0: 6f 63 6b 3e 70 4c 6f 63 6b 2d 3e 65 4c 6f 63 6b  ock>pLock->eLock
18e0: 20 29 7b 0a 20 20 20 20 70 4c 6f 63 6b 2d 3e 65   ){.    pLock->e
18f0: 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20  Lock = eLock;.  
1900: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
1910: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
1920: 2f 2a 20 21 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  /* !SQLITE_OMIT_
1930: 53 48 41 52 45 44 5f 43 41 43 48 45 20 2a 2f 0a  SHARED_CACHE */.
1940: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1950: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
1960: 45 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  E./*.** Release 
1970: 61 6c 6c 20 74 68 65 20 74 61 62 6c 65 20 6c 6f  all the table lo
1980: 63 6b 73 20 28 6c 6f 63 6b 73 20 6f 62 74 61 69  cks (locks obtai
1990: 6e 65 64 20 76 69 61 20 63 61 6c 6c 73 20 74 6f  ned via calls to
19a0: 20 74 68 65 20 6c 6f 63 6b 54 61 62 6c 65 28 29   the lockTable()
19b0: 0a 2a 2a 20 70 72 6f 63 65 64 75 72 65 29 20 68  .** procedure) h
19c0: 65 6c 64 20 62 79 20 42 74 72 65 65 20 68 61 6e  eld by Btree han
19d0: 64 6c 65 20 70 2e 0a 2a 2f 0a 73 74 61 74 69 63  dle p..*/.static
19e0: 20 76 6f 69 64 20 75 6e 6c 6f 63 6b 41 6c 6c 54   void unlockAllT
19f0: 61 62 6c 65 73 28 42 74 72 65 65 20 2a 70 29 7b  ables(Btree *p){
1a00: 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
1a10: 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 42 74 4c   = p->pBt;.  BtL
1a20: 6f 63 6b 20 2a 2a 70 70 49 74 65 72 20 3d 20 26  ock **ppIter = &
1a30: 70 42 74 2d 3e 70 4c 6f 63 6b 3b 0a 0a 20 20 61  pBt->pLock;..  a
1a40: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 42 74  ssert( sqlite3Bt
1a50: 72 65 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29  reeHoldsMutex(p)
1a60: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
1a70: 3e 73 68 61 72 61 62 6c 65 20 7c 7c 20 30 3d 3d  >sharable || 0==
1a80: 2a 70 70 49 74 65 72 20 29 3b 0a 0a 20 20 77 68  *ppIter );..  wh
1a90: 69 6c 65 28 20 2a 70 70 49 74 65 72 20 29 7b 0a  ile( *ppIter ){.
1aa0: 20 20 20 20 42 74 4c 6f 63 6b 20 2a 70 4c 6f 63      BtLock *pLoc
1ab0: 6b 20 3d 20 2a 70 70 49 74 65 72 3b 0a 20 20 20  k = *ppIter;.   
1ac0: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 70 45   assert( pBt->pE
1ad0: 78 63 6c 75 73 69 76 65 3d 3d 30 20 7c 7c 20 70  xclusive==0 || p
1ae0: 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 3d 3d  Bt->pExclusive==
1af0: 70 4c 6f 63 6b 2d 3e 70 42 74 72 65 65 20 29 3b  pLock->pBtree );
1b00: 0a 20 20 20 20 69 66 28 20 70 4c 6f 63 6b 2d 3e  .    if( pLock->
1b10: 70 42 74 72 65 65 3d 3d 70 20 29 7b 0a 20 20 20  pBtree==p ){.   
1b20: 20 20 20 2a 70 70 49 74 65 72 20 3d 20 70 4c 6f     *ppIter = pLo
1b30: 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  ck->pNext;.     
1b40: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4c   sqlite3_free(pL
1b50: 6f 63 6b 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ock);.    }else{
1b60: 0a 20 20 20 20 20 20 70 70 49 74 65 72 20 3d 20  .      ppIter = 
1b70: 26 70 4c 6f 63 6b 2d 3e 70 4e 65 78 74 3b 0a 20  &pLock->pNext;. 
1b80: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
1b90: 70 42 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 3d  pBt->pExclusive=
1ba0: 3d 70 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70  =p ){.    pBt->p
1bb0: 45 78 63 6c 75 73 69 76 65 20 3d 20 30 3b 0a 20  Exclusive = 0;. 
1bc0: 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53   }.}.#endif /* S
1bd0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
1be0: 44 5f 43 41 43 48 45 20 2a 2f 0a 0a 73 74 61 74  D_CACHE */..stat
1bf0: 69 63 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50  ic void releaseP
1c00: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
1c10: 67 65 29 3b 20 20 2f 2a 20 46 6f 72 77 61 72 64  ge);  /* Forward
1c20: 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 0a 2f   reference */../
1c30: 2a 0a 2a 2a 20 56 65 72 69 66 79 20 74 68 61 74  *.** Verify that
1c40: 20 74 68 65 20 63 75 72 73 6f 72 20 68 6f 6c 64   the cursor hold
1c50: 73 20 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65  s a mutex on the
1c60: 20 42 74 53 68 61 72 65 64 0a 2a 2f 0a 23 69 66   BtShared.*/.#if
1c70: 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74 61 74  ndef NDEBUG.stat
1c80: 69 63 20 69 6e 74 20 63 75 72 73 6f 72 48 6f 6c  ic int cursorHol
1c90: 64 73 4d 75 74 65 78 28 42 74 43 75 72 73 6f 72  dsMutex(BtCursor
1ca0: 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 73   *p){.  return s
1cb0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
1cc0: 64 28 70 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  d(p->pBt->mutex)
1cd0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  ;.}.#endif...#if
1ce0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1cf0: 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a 2a 20  _INCRBLOB./*.** 
1d00: 49 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f  Invalidate the o
1d10: 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73  verflow page-lis
1d20: 74 20 63 61 63 68 65 20 66 6f 72 20 63 75 72 73  t cache for curs
1d30: 6f 72 20 70 43 75 72 2c 20 69 66 20 61 6e 79 2e  or pCur, if any.
1d40: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1d50: 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c  invalidateOverfl
1d60: 6f 77 43 61 63 68 65 28 42 74 43 75 72 73 6f 72  owCache(BtCursor
1d70: 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72   *pCur){.  asser
1d80: 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
1d90: 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73  tex(pCur) );.  s
1da0: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43 75 72  qlite3_free(pCur
1db0: 2d 3e 61 4f 76 65 72 66 6c 6f 77 29 3b 0a 20 20  ->aOverflow);.  
1dc0: 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
1dd0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  = 0;.}../*.** In
1de0: 76 61 6c 69 64 61 74 65 20 74 68 65 20 6f 76 65  validate the ove
1df0: 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69 73 74 20  rflow page-list 
1e00: 63 61 63 68 65 20 66 6f 72 20 61 6c 6c 20 63 75  cache for all cu
1e10: 72 73 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20  rsors opened.** 
1e20: 6f 6e 20 74 68 65 20 73 68 61 72 65 64 20 62 74  on the shared bt
1e30: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 70 42  ree structure pB
1e40: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
1e50: 64 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c 4f  d invalidateAllO
1e60: 76 65 72 66 6c 6f 77 43 61 63 68 65 28 42 74 53  verflowCache(BtS
1e70: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 42  hared *pBt){.  B
1e80: 74 43 75 72 73 6f 72 20 2a 70 3b 0a 20 20 61 73  tCursor *p;.  as
1e90: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
1ea0: 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75  tex_held(pBt->mu
1eb0: 74 65 78 29 20 29 3b 0a 20 20 66 6f 72 28 70 3d  tex) );.  for(p=
1ec0: 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b  pBt->pCursor; p;
1ed0: 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
1ee0: 20 20 69 6e 76 61 6c 69 64 61 74 65 4f 76 65 72    invalidateOver
1ef0: 66 6c 6f 77 43 61 63 68 65 28 70 29 3b 0a 20 20  flowCache(p);.  
1f00: 7d 0a 7d 0a 23 65 6c 73 65 0a 20 20 23 64 65 66  }.}.#else.  #def
1f10: 69 6e 65 20 69 6e 76 61 6c 69 64 61 74 65 4f 76  ine invalidateOv
1f20: 65 72 66 6c 6f 77 43 61 63 68 65 28 78 29 0a 20  erflowCache(x). 
1f30: 20 23 64 65 66 69 6e 65 20 69 6e 76 61 6c 69 64   #define invalid
1f40: 61 74 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61  ateAllOverflowCa
1f50: 63 68 65 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  che(x).#endif../
1f60: 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75  *.** Save the cu
1f70: 72 72 65 6e 74 20 63 75 72 73 6f 72 20 70 6f 73  rrent cursor pos
1f80: 69 74 69 6f 6e 20 69 6e 20 74 68 65 20 76 61 72  ition in the var
1f90: 69 61 62 6c 65 73 20 42 74 43 75 72 73 6f 72 2e  iables BtCursor.
1fa0: 6e 4b 65 79 20 0a 2a 2a 20 61 6e 64 20 42 74 43  nKey .** and BtC
1fb0: 75 72 73 6f 72 2e 70 4b 65 79 2e 20 54 68 65 20  ursor.pKey. The 
1fc0: 63 75 72 73 6f 72 27 73 20 73 74 61 74 65 20 69  cursor's state i
1fd0: 73 20 73 65 74 20 74 6f 20 43 55 52 53 4f 52 5f  s set to CURSOR_
1fe0: 52 45 51 55 49 52 45 53 45 45 4b 2e 0a 2a 2f 0a  REQUIRESEEK..*/.
1ff0: 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 43  static int saveC
2000: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 42 74  ursorPosition(Bt
2010: 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20  Cursor *pCur){. 
2020: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
2030: 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
2040: 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 20 29  ==pCur->eState )
2050: 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d 70  ;.  assert( 0==p
2060: 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a 20 20 61  Cur->pKey );.  a
2070: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
2080: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
2090: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
20a0: 42 74 72 65 65 4b 65 79 53 69 7a 65 28 70 43 75  BtreeKeySize(pCu
20b0: 72 2c 20 26 70 43 75 72 2d 3e 6e 4b 65 79 29 3b  r, &pCur->nKey);
20c0: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
20d0: 73 20 61 6e 20 69 6e 74 4b 65 79 20 74 61 62 6c  s an intKey tabl
20e0: 65 2c 20 74 68 65 6e 20 74 68 65 20 61 62 6f 76  e, then the abov
20f0: 65 20 63 61 6c 6c 20 74 6f 20 42 74 72 65 65 4b  e call to BtreeK
2100: 65 79 53 69 7a 65 28 29 0a 20 20 2a 2a 20 73 74  eySize().  ** st
2110: 6f 72 65 73 20 74 68 65 20 69 6e 74 65 67 65 72  ores the integer
2120: 20 6b 65 79 20 69 6e 20 70 43 75 72 2d 3e 6e 4b   key in pCur->nK
2130: 65 79 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ey. In this case
2140: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 0a 20   this value is. 
2150: 20 2a 2a 20 61 6c 6c 20 74 68 61 74 20 69 73 20   ** all that is 
2160: 72 65 71 75 69 72 65 64 2e 20 4f 74 68 65 72 77  required. Otherw
2170: 69 73 65 2c 20 69 66 20 70 43 75 72 20 69 73 20  ise, if pCur is 
2180: 6e 6f 74 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 69  not open on an i
2190: 6e 74 4b 65 79 0a 20 20 2a 2a 20 74 61 62 6c 65  ntKey.  ** table
21a0: 2c 20 74 68 65 6e 20 6d 61 6c 6c 6f 63 20 73 70  , then malloc sp
21b0: 61 63 65 20 66 6f 72 20 61 6e 64 20 73 74 6f 72  ace for and stor
21c0: 65 20 74 68 65 20 70 43 75 72 2d 3e 6e 4b 65 79  e the pCur->nKey
21d0: 20 62 79 74 65 73 20 6f 66 20 6b 65 79 20 0a 20   bytes of key . 
21e0: 20 2a 2a 20 64 61 74 61 2e 0a 20 20 2a 2f 0a 20   ** data..  */. 
21f0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2200: 4f 4b 20 26 26 20 30 3d 3d 70 43 75 72 2d 3e 61  OK && 0==pCur->a
2210: 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79  pPage[0]->intKey
2220: 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4b 65  ){.    void *pKe
2230: 79 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  y = sqlite3Mallo
2240: 63 28 70 43 75 72 2d 3e 6e 4b 65 79 29 3b 0a 20  c(pCur->nKey);. 
2250: 20 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a 20     if( pKey ){. 
2260: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2270: 33 42 74 72 65 65 4b 65 79 28 70 43 75 72 2c 20  3BtreeKey(pCur, 
2280: 30 2c 20 70 43 75 72 2d 3e 6e 4b 65 79 2c 20 70  0, pCur->nKey, p
2290: 4b 65 79 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Key);.      if( 
22a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
22b0: 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d 3e 70  .        pCur->p
22c0: 4b 65 79 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20  Key = pKey;.    
22d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
22e0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4b   sqlite3_free(pK
22f0: 65 79 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ey);.      }.   
2300: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
2310: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2320: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
2330: 65 72 74 28 20 21 70 43 75 72 2d 3e 61 70 50 61  ert( !pCur->apPa
2340: 67 65 5b 30 5d 2d 3e 69 6e 74 4b 65 79 20 7c 7c  ge[0]->intKey ||
2350: 20 21 70 43 75 72 2d 3e 70 4b 65 79 20 29 3b 0a   !pCur->pKey );.
2360: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
2370: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
2380: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
2390: 69 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20  i<=pCur->iPage; 
23a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  i++){.      rele
23b0: 61 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70  asePage(pCur->ap
23c0: 50 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 20 20  Page[i]);.      
23d0: 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 5d 20  pCur->apPage[i] 
23e0: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
23f0: 43 75 72 2d 3e 69 50 61 67 65 20 3d 20 2d 31 3b  Cur->iPage = -1;
2400: 0a 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74  .    pCur->eStat
2410: 65 20 3d 20 43 55 52 53 4f 52 5f 52 45 51 55 49  e = CURSOR_REQUI
2420: 52 45 53 45 45 4b 3b 0a 20 20 7d 0a 0a 20 20 69  RESEEK;.  }..  i
2430: 6e 76 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f  nvalidateOverflo
2440: 77 43 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20  wCache(pCur);.  
2450: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2460: 0a 2a 2a 20 53 61 76 65 20 74 68 65 20 70 6f 73  .** Save the pos
2470: 69 74 69 6f 6e 73 20 6f 66 20 61 6c 6c 20 63 75  itions of all cu
2480: 72 73 6f 72 73 20 65 78 63 65 70 74 20 70 45 78  rsors except pEx
2490: 63 65 70 74 20 6f 70 65 6e 20 6f 6e 20 74 68 65  cept open on the
24a0: 20 74 61 62 6c 65 20 0a 2a 2a 20 77 69 74 68 20   table .** with 
24b0: 72 6f 6f 74 2d 70 61 67 65 20 69 52 6f 6f 74 2e  root-page iRoot.
24c0: 20 55 73 75 61 6c 6c 79 2c 20 74 68 69 73 20 69   Usually, this i
24d0: 73 20 63 61 6c 6c 65 64 20 6a 75 73 74 20 62 65  s called just be
24e0: 66 6f 72 65 20 63 75 72 73 6f 72 0a 2a 2a 20 70  fore cursor.** p
24f0: 45 78 63 65 70 74 20 69 73 20 75 73 65 64 20 74  Except is used t
2500: 6f 20 6d 6f 64 69 66 79 20 74 68 65 20 74 61 62  o modify the tab
2510: 6c 65 20 28 42 74 72 65 65 44 65 6c 65 74 65 28  le (BtreeDelete(
2520: 29 20 6f 72 20 42 74 72 65 65 49 6e 73 65 72 74  ) or BtreeInsert
2530: 28 29 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ())..*/.static i
2540: 6e 74 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72  nt saveAllCursor
2550: 73 28 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c  s(BtShared *pBt,
2560: 20 50 67 6e 6f 20 69 52 6f 6f 74 2c 20 42 74 43   Pgno iRoot, BtC
2570: 75 72 73 6f 72 20 2a 70 45 78 63 65 70 74 29 7b  ursor *pExcept){
2580: 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b 0a  .  BtCursor *p;.
2590: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
25a0: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74  3_mutex_held(pBt
25b0: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73  ->mutex) );.  as
25c0: 73 65 72 74 28 20 70 45 78 63 65 70 74 3d 3d 30  sert( pExcept==0
25d0: 20 7c 7c 20 70 45 78 63 65 70 74 2d 3e 70 42 74   || pExcept->pBt
25e0: 3d 3d 70 42 74 20 29 3b 0a 20 20 66 6f 72 28 70  ==pBt );.  for(p
25f0: 3d 70 42 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70  =pBt->pCursor; p
2600: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
2610: 20 20 20 69 66 28 20 70 21 3d 70 45 78 63 65 70     if( p!=pExcep
2620: 74 20 26 26 20 28 30 3d 3d 69 52 6f 6f 74 20 7c  t && (0==iRoot |
2630: 7c 20 70 2d 3e 70 67 6e 6f 52 6f 6f 74 3d 3d 69  | p->pgnoRoot==i
2640: 52 6f 6f 74 29 20 26 26 20 0a 20 20 20 20 20 20  Root) && .      
2650: 20 20 70 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52    p->eState==CUR
2660: 53 4f 52 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20  SOR_VALID ){.   
2670: 20 20 20 69 6e 74 20 72 63 20 3d 20 73 61 76 65     int rc = save
2680: 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
2690: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  );.      if( SQL
26a0: 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20  ITE_OK!=rc ){.  
26b0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
26c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
26d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
26e0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
26f0: 43 6c 65 61 72 20 74 68 65 20 63 75 72 72 65 6e  Clear the curren
2700: 74 20 63 75 72 73 6f 72 20 70 6f 73 69 74 69 6f  t cursor positio
2710: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
2720: 64 20 63 6c 65 61 72 43 75 72 73 6f 72 50 6f 73  d clearCursorPos
2730: 69 74 69 6f 6e 28 42 74 43 75 72 73 6f 72 20 2a  ition(BtCursor *
2740: 70 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28  pCur){.  assert(
2750: 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
2760: 78 28 70 43 75 72 29 20 29 3b 0a 20 20 73 71 6c  x(pCur) );.  sql
2770: 69 74 65 33 5f 66 72 65 65 28 70 43 75 72 2d 3e  ite3_free(pCur->
2780: 70 4b 65 79 29 3b 0a 20 20 70 43 75 72 2d 3e 70  pKey);.  pCur->p
2790: 4b 65 79 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d  Key = 0;.  pCur-
27a0: 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52  >eState = CURSOR
27b0: 5f 49 4e 56 41 4c 49 44 3b 0a 7d 0a 0a 2f 2a 0a  _INVALID;.}../*.
27c0: 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 63  ** Restore the c
27d0: 75 72 73 6f 72 20 74 6f 20 74 68 65 20 70 6f 73  ursor to the pos
27e0: 69 74 69 6f 6e 20 69 74 20 77 61 73 20 69 6e 20  ition it was in 
27f0: 28 6f 72 20 61 73 20 63 6c 6f 73 65 20 74 6f 20  (or as close to 
2800: 61 73 20 70 6f 73 73 69 62 6c 65 29 0a 2a 2a 20  as possible).** 
2810: 77 68 65 6e 20 73 61 76 65 43 75 72 73 6f 72 50  when saveCursorP
2820: 6f 73 69 74 69 6f 6e 28 29 20 77 61 73 20 63 61  osition() was ca
2830: 6c 6c 65 64 2e 20 4e 6f 74 65 20 74 68 61 74 20  lled. Note that 
2840: 74 68 69 73 20 63 61 6c 6c 20 64 65 6c 65 74 65  this call delete
2850: 73 20 74 68 65 20 0a 2a 2a 20 73 61 76 65 64 20  s the .** saved 
2860: 70 6f 73 69 74 69 6f 6e 20 69 6e 66 6f 20 73 74  position info st
2870: 6f 72 65 64 20 62 79 20 73 61 76 65 43 75 72 73  ored by saveCurs
2880: 6f 72 50 6f 73 69 74 69 6f 6e 28 29 2c 20 73 6f  orPosition(), so
2890: 20 74 68 65 72 65 20 63 61 6e 20 62 65 0a 2a 2a   there can be.**
28a0: 20 61 74 20 6d 6f 73 74 20 6f 6e 65 20 65 66 66   at most one eff
28b0: 65 63 74 69 76 65 20 72 65 73 74 6f 72 65 43 75  ective restoreCu
28c0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 63  rsorPosition() c
28d0: 61 6c 6c 20 61 66 74 65 72 20 65 61 63 68 20 0a  all after each .
28e0: 2a 2a 20 73 61 76 65 43 75 72 73 6f 72 50 6f 73  ** saveCursorPos
28f0: 69 74 69 6f 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20  ition()..*/.int 
2900: 73 71 6c 69 74 65 33 42 74 72 65 65 52 65 73 74  sqlite3BtreeRest
2910: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
2920: 6e 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72  n(BtCursor *pCur
2930: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ){.  int rc;.  a
2940: 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c  ssert( cursorHol
2950: 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b  dsMutex(pCur) );
2960: 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
2970: 3e 65 53 74 61 74 65 3e 3d 43 55 52 53 4f 52 5f  >eState>=CURSOR_
2980: 52 45 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20  REQUIRESEEK );. 
2990: 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
29a0: 65 3d 3d 43 55 52 53 4f 52 5f 46 41 55 4c 54 20  e==CURSOR_FAULT 
29b0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 43  ){.    return pC
29c0: 75 72 2d 3e 73 6b 69 70 3b 0a 20 20 7d 0a 20 20  ur->skip;.  }.  
29d0: 70 43 75 72 2d 3e 65 53 74 61 74 65 20 3d 20 43  pCur->eState = C
29e0: 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
29f0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2a00: 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c 20 70  eeMoveto(pCur, p
2a10: 43 75 72 2d 3e 70 4b 65 79 2c 20 70 43 75 72 2d  Cur->pKey, pCur-
2a20: 3e 6e 4b 65 79 2c 20 30 2c 20 26 70 43 75 72 2d  >nKey, 0, &pCur-
2a30: 3e 73 6b 69 70 29 3b 0a 20 20 69 66 28 20 72 63  >skip);.  if( rc
2a40: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2a50: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2a60: 70 43 75 72 2d 3e 70 4b 65 79 29 3b 0a 20 20 20  pCur->pKey);.   
2a70: 20 70 43 75 72 2d 3e 70 4b 65 79 20 3d 20 30 3b   pCur->pKey = 0;
2a80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75  .    assert( pCu
2a90: 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
2aa0: 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d  R_VALID || pCur-
2ab0: 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
2ac0: 49 4e 56 41 4c 49 44 20 29 3b 0a 20 20 7d 0a 20  INVALID );.  }. 
2ad0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
2ae0: 64 65 66 69 6e 65 20 72 65 73 74 6f 72 65 43 75  define restoreCu
2af0: 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 29 20  rsorPosition(p) 
2b00: 5c 0a 20 20 28 70 2d 3e 65 53 74 61 74 65 3e 3d  \.  (p->eState>=
2b10: 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
2b20: 45 4b 20 3f 20 5c 0a 20 20 20 20 20 20 20 20 20  EK ? \.         
2b30: 73 71 6c 69 74 65 33 42 74 72 65 65 52 65 73 74  sqlite3BtreeRest
2b40: 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
2b50: 6e 28 70 29 20 3a 20 5c 0a 20 20 20 20 20 20 20  n(p) : \.       
2b60: 20 20 53 51 4c 49 54 45 5f 4f 4b 29 0a 0a 2f 2a    SQLITE_OK)../*
2b70: 0a 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 77 68  .** Determine wh
2b80: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 63  ether or not a c
2b90: 75 72 73 6f 72 20 68 61 73 20 6d 6f 76 65 64 20  ursor has moved 
2ba0: 66 72 6f 6d 20 74 68 65 20 70 6f 73 69 74 69 6f  from the positio
2bb0: 6e 20 69 74 0a 2a 2a 20 77 61 73 20 6c 61 73 74  n it.** was last
2bc0: 20 70 6c 61 63 65 64 20 61 74 2e 20 20 43 75 72   placed at.  Cur
2bd0: 73 6f 72 20 63 61 6e 20 6d 6f 76 65 20 77 68 65  sor can move whe
2be0: 6e 20 74 68 65 20 72 6f 77 20 74 68 65 79 20 61  n the row they a
2bf0: 72 65 20 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 61  re pointing.** a
2c00: 74 20 69 73 20 64 65 6c 65 74 65 64 20 6f 75 74  t is deleted out
2c10: 20 66 72 6f 6d 20 75 6e 64 65 72 20 74 68 65 6d   from under them
2c20: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
2c30: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 61 6e 20  tine returns an 
2c40: 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 73 6f  error code if so
2c50: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
2c60: 6e 67 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 74 65  ng.  The.** inte
2c70: 67 65 72 20 2a 70 48 61 73 4d 6f 76 65 64 20 69  ger *pHasMoved i
2c80: 73 20 73 65 74 20 74 6f 20 6f 6e 65 20 69 66 20  s set to one if 
2c90: 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6d  the cursor has m
2ca0: 6f 76 65 64 20 61 6e 64 20 30 20 69 66 20 6e 6f  oved and 0 if no
2cb0: 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
2cc0: 33 42 74 72 65 65 43 75 72 73 6f 72 48 61 73 4d  3BtreeCursorHasM
2cd0: 6f 76 65 64 28 42 74 43 75 72 73 6f 72 20 2a 70  oved(BtCursor *p
2ce0: 43 75 72 2c 20 69 6e 74 20 2a 70 48 61 73 4d 6f  Cur, int *pHasMo
2cf0: 76 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ved){.  int rc;.
2d00: 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65 43  .  rc = restoreC
2d10: 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70 43  ursorPosition(pC
2d20: 75 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ur);.  if( rc ){
2d30: 0a 20 20 20 20 2a 70 48 61 73 4d 6f 76 65 64 20  .    *pHasMoved 
2d40: 3d 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 1;.    return 
2d50: 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43  rc;.  }.  if( pC
2d60: 75 72 2d 3e 65 53 74 61 74 65 21 3d 43 55 52 53  ur->eState!=CURS
2d70: 4f 52 5f 56 41 4c 49 44 20 7c 7c 20 70 43 75 72  OR_VALID || pCur
2d80: 2d 3e 73 6b 69 70 21 3d 30 20 29 7b 0a 20 20 20  ->skip!=0 ){.   
2d90: 20 2a 70 48 61 73 4d 6f 76 65 64 20 3d 20 31 3b   *pHasMoved = 1;
2da0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 70  .  }else{.    *p
2db0: 48 61 73 4d 6f 76 65 64 20 3d 20 30 3b 0a 20 20  HasMoved = 0;.  
2dc0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
2dd0: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
2de0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2df0: 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 47 69  OVACUUM./*.** Gi
2e00: 76 65 6e 20 61 20 70 61 67 65 20 6e 75 6d 62 65  ven a page numbe
2e10: 72 20 6f 66 20 61 20 72 65 67 75 6c 61 72 20 64  r of a regular d
2e20: 61 74 61 62 61 73 65 20 70 61 67 65 2c 20 72 65  atabase page, re
2e30: 74 75 72 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a  turn the page.**
2e40: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
2e50: 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65  pointer-map page
2e60: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
2e70: 68 65 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  he entry for the
2e80: 0a 2a 2a 20 69 6e 70 75 74 20 70 61 67 65 20 6e  .** input page n
2e90: 75 6d 62 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  umber..*/.static
2ea0: 20 50 67 6e 6f 20 70 74 72 6d 61 70 50 61 67 65   Pgno ptrmapPage
2eb0: 6e 6f 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  no(BtShared *pBt
2ec0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
2ed0: 69 6e 74 20 6e 50 61 67 65 73 50 65 72 4d 61 70  int nPagesPerMap
2ee0: 50 61 67 65 2c 20 69 50 74 72 4d 61 70 2c 20 72  Page, iPtrMap, r
2ef0: 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  et;.  assert( sq
2f00: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
2f10: 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  (pBt->mutex) );.
2f20: 20 20 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61    nPagesPerMapPa
2f30: 67 65 20 3d 20 28 70 42 74 2d 3e 75 73 61 62 6c  ge = (pBt->usabl
2f40: 65 53 69 7a 65 2f 35 29 2b 31 3b 0a 20 20 69 50  eSize/5)+1;.  iP
2f50: 74 72 4d 61 70 20 3d 20 28 70 67 6e 6f 2d 32 29  trMap = (pgno-2)
2f60: 2f 6e 50 61 67 65 73 50 65 72 4d 61 70 50 61 67  /nPagesPerMapPag
2f70: 65 3b 0a 20 20 72 65 74 20 3d 20 28 69 50 74 72  e;.  ret = (iPtr
2f80: 4d 61 70 2a 6e 50 61 67 65 73 50 65 72 4d 61 70  Map*nPagesPerMap
2f90: 50 61 67 65 29 20 2b 20 32 3b 20 0a 20 20 69 66  Page) + 2; .  if
2fa0: 28 20 72 65 74 3d 3d 50 45 4e 44 49 4e 47 5f 42  ( ret==PENDING_B
2fb0: 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
2fc0: 0a 20 20 20 20 72 65 74 2b 2b 3b 0a 20 20 7d 0a  .    ret++;.  }.
2fd0: 20 20 72 65 74 75 72 6e 20 72 65 74 3b 0a 7d 0a    return ret;.}.
2fe0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 6e 20  ./*.** Write an 
2ff0: 65 6e 74 72 79 20 69 6e 74 6f 20 74 68 65 20 70  entry into the p
3000: 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a 0a 2a  ointer map..**.*
3010: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 75  * This routine u
3020: 70 64 61 74 65 73 20 74 68 65 20 70 6f 69 6e 74  pdates the point
3030: 65 72 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72  er map entry for
3040: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 6b 65   page number 'ke
3050: 79 27 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69 74  y'.** so that it
3060: 20 6d 61 70 73 20 74 6f 20 74 79 70 65 20 27 65   maps to type 'e
3070: 54 79 70 65 27 20 61 6e 64 20 70 61 72 65 6e 74  Type' and parent
3080: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 27 70 67   page number 'pg
3090: 6e 6f 27 2e 0a 2a 2a 20 41 6e 20 65 72 72 6f 72  no'..** An error
30a0: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
30b0: 64 20 69 66 20 73 6f 6d 65 74 68 69 6e 67 20 67  d if something g
30c0: 6f 65 73 20 77 72 6f 6e 67 2c 20 6f 74 68 65 72  oes wrong, other
30d0: 77 69 73 65 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  wise SQLITE_OK..
30e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 74  */.static int pt
30f0: 72 6d 61 70 50 75 74 28 42 74 53 68 61 72 65 64  rmapPut(BtShared
3100: 20 2a 70 42 74 2c 20 50 67 6e 6f 20 6b 65 79 2c   *pBt, Pgno key,
3110: 20 75 38 20 65 54 79 70 65 2c 20 50 67 6e 6f 20   u8 eType, Pgno 
3120: 70 61 72 65 6e 74 29 7b 0a 20 20 44 62 50 61 67  parent){.  DbPag
3130: 65 20 2a 70 44 62 50 61 67 65 3b 20 20 2f 2a 20  e *pDbPage;  /* 
3140: 54 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20  The pointer map 
3150: 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70 50  page */.  u8 *pP
3160: 74 72 6d 61 70 3b 20 20 20 20 20 20 2f 2a 20 54  trmap;      /* T
3170: 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 64  he pointer map d
3180: 61 74 61 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 50  ata */.  Pgno iP
3190: 74 72 6d 61 70 3b 20 20 20 20 20 2f 2a 20 54 68  trmap;     /* Th
31a0: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  e pointer map pa
31b0: 67 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  ge number */.  i
31c0: 6e 74 20 6f 66 66 73 65 74 3b 20 20 20 20 20 20  nt offset;      
31d0: 20 2f 2a 20 4f 66 66 73 65 74 20 69 6e 20 70 6f   /* Offset in po
31e0: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 2a  inter map page *
31f0: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  /.  int rc;..  a
3200: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
3210: 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d  utex_held(pBt->m
3220: 75 74 65 78 29 20 29 3b 0a 20 20 2f 2a 20 54 68  utex) );.  /* Th
3230: 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c  e master-journal
3240: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6d 75 73   page number mus
3250: 74 20 6e 65 76 65 72 20 62 65 20 75 73 65 64 20  t never be used 
3260: 61 73 20 61 20 70 6f 69 6e 74 65 72 20 6d 61 70  as a pointer map
3270: 20 70 61 67 65 20 2a 2f 0a 20 20 61 73 73 65 72   page */.  asser
3280: 74 28 20 30 3d 3d 50 54 52 4d 41 50 5f 49 53 50  t( 0==PTRMAP_ISP
3290: 41 47 45 28 70 42 74 2c 20 50 45 4e 44 49 4e 47  AGE(pBt, PENDING
32a0: 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 29  _BYTE_PAGE(pBt))
32b0: 20 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   );..  assert( p
32c0: 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29  Bt->autoVacuum )
32d0: 3b 0a 20 20 69 66 28 20 6b 65 79 3d 3d 30 20 29  ;.  if( key==0 )
32e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
32f0: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
3300: 3b 0a 20 20 7d 0a 20 20 69 50 74 72 6d 61 70 20  ;.  }.  iPtrmap 
3310: 3d 20 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  = PTRMAP_PAGENO(
3320: 70 42 74 2c 20 6b 65 79 29 3b 0a 20 20 72 63 20  pBt, key);.  rc 
3330: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
3340: 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 69  t(pBt->pPager, i
3350: 50 74 72 6d 61 70 2c 20 26 70 44 62 50 61 67 65  Ptrmap, &pDbPage
3360: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
3370: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
3380: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 6f  turn rc;.  }.  o
3390: 66 66 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50  ffset = PTRMAP_P
33a0: 54 52 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70  TROFFSET(iPtrmap
33b0: 2c 20 6b 65 79 29 3b 0a 20 20 70 50 74 72 6d 61  , key);.  pPtrma
33c0: 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65  p = (u8 *)sqlite
33d0: 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 44  3PagerGetData(pD
33e0: 62 50 61 67 65 29 3b 0a 0a 20 20 69 66 28 20 65  bPage);..  if( e
33f0: 54 79 70 65 21 3d 70 50 74 72 6d 61 70 5b 6f 66  Type!=pPtrmap[of
3400: 66 73 65 74 5d 20 7c 7c 20 67 65 74 34 62 79 74  fset] || get4byt
3410: 65 28 26 70 50 74 72 6d 61 70 5b 6f 66 66 73 65  e(&pPtrmap[offse
3420: 74 2b 31 5d 29 21 3d 70 61 72 65 6e 74 20 29 7b  t+1])!=parent ){
3430: 0a 20 20 20 20 54 52 41 43 45 28 28 22 50 54 52  .    TRACE(("PTR
3440: 4d 41 50 5f 55 50 44 41 54 45 3a 20 25 64 2d 3e  MAP_UPDATE: %d->
3450: 28 25 64 2c 25 64 29 5c 6e 22 2c 20 6b 65 79 2c  (%d,%d)\n", key,
3460: 20 65 54 79 70 65 2c 20 70 61 72 65 6e 74 29 29   eType, parent))
3470: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
3480: 65 33 50 61 67 65 72 57 72 69 74 65 28 70 44 62  e3PagerWrite(pDb
3490: 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
34a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
34b0: 20 20 20 20 20 20 70 50 74 72 6d 61 70 5b 6f 66        pPtrmap[of
34c0: 66 73 65 74 5d 20 3d 20 65 54 79 70 65 3b 0a 20  fset] = eType;. 
34d0: 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
34e0: 50 74 72 6d 61 70 5b 6f 66 66 73 65 74 2b 31 5d  Ptrmap[offset+1]
34f0: 2c 20 70 61 72 65 6e 74 29 3b 0a 20 20 20 20 7d  , parent);.    }
3500: 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 50  .  }..  sqlite3P
3510: 61 67 65 72 55 6e 72 65 66 28 70 44 62 50 61 67  agerUnref(pDbPag
3520: 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  e);.  return rc;
3530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
3540: 6e 20 65 6e 74 72 79 20 66 72 6f 6d 20 74 68 65  n entry from the
3550: 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e 0a 2a 2a   pointer map..**
3560: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
3570: 20 72 65 74 72 69 65 76 65 73 20 74 68 65 20 70   retrieves the p
3580: 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 79  ointer map entry
3590: 20 66 6f 72 20 70 61 67 65 20 27 6b 65 79 27 2c   for page 'key',
35a0: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
35b0: 74 79 70 65 20 61 6e 64 20 70 61 72 65 6e 74 20  type and parent 
35c0: 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 2a  page number to *
35d0: 70 45 54 79 70 65 20 61 6e 64 20 2a 70 50 67 6e  pEType and *pPgn
35e0: 6f 20 72 65 73 70 65 63 74 69 76 65 6c 79 2e 0a  o respectively..
35f0: 2a 2a 20 41 6e 20 65 72 72 6f 72 20 63 6f 64 65  ** An error code
3600: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
3610: 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77  something goes w
3620: 72 6f 6e 67 2c 20 6f 74 68 65 72 77 69 73 65 20  rong, otherwise 
3630: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74  SQLITE_OK..*/.st
3640: 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61 70 47  atic int ptrmapG
3650: 65 74 28 42 74 53 68 61 72 65 64 20 2a 70 42 74  et(BtShared *pBt
3660: 2c 20 50 67 6e 6f 20 6b 65 79 2c 20 75 38 20 2a  , Pgno key, u8 *
3670: 70 45 54 79 70 65 2c 20 50 67 6e 6f 20 2a 70 50  pEType, Pgno *pP
3680: 67 6e 6f 29 7b 0a 20 20 44 62 50 61 67 65 20 2a  gno){.  DbPage *
3690: 70 44 62 50 61 67 65 3b 20 20 20 2f 2a 20 54 68  pDbPage;   /* Th
36a0: 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 70 61  e pointer map pa
36b0: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 50 74 72  ge */.  int iPtr
36c0: 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20 50 6f  map;       /* Po
36d0: 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 69  inter map page i
36e0: 6e 64 65 78 20 2a 2f 0a 20 20 75 38 20 2a 70 50  ndex */.  u8 *pP
36f0: 74 72 6d 61 70 3b 20 20 20 20 20 20 20 2f 2a 20  trmap;       /* 
3700: 50 6f 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65  Pointer map page
3710: 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e 74 20 6f   data */.  int o
3720: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 2f 2a  ffset;        /*
3730: 20 4f 66 66 73 65 74 20 6f 66 20 65 6e 74 72 79   Offset of entry
3740: 20 69 6e 20 70 6f 69 6e 74 65 72 20 6d 61 70 20   in pointer map 
3750: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  */.  int rc;..  
3760: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
3770: 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
3780: 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 69 50 74  mutex) );..  iPt
3790: 72 6d 61 70 20 3d 20 50 54 52 4d 41 50 5f 50 41  rmap = PTRMAP_PA
37a0: 47 45 4e 4f 28 70 42 74 2c 20 6b 65 79 29 3b 0a  GENO(pBt, key);.
37b0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
37c0: 67 65 72 47 65 74 28 70 42 74 2d 3e 70 50 61 67  gerGet(pBt->pPag
37d0: 65 72 2c 20 69 50 74 72 6d 61 70 2c 20 26 70 44  er, iPtrmap, &pD
37e0: 62 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  bPage);.  if( rc
37f0: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
3800: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 74 72  n rc;.  }.  pPtr
3810: 6d 61 70 20 3d 20 28 75 38 20 2a 29 73 71 6c 69  map = (u8 *)sqli
3820: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
3830: 70 44 62 50 61 67 65 29 3b 0a 0a 20 20 6f 66 66  pDbPage);..  off
3840: 73 65 74 20 3d 20 50 54 52 4d 41 50 5f 50 54 52  set = PTRMAP_PTR
3850: 4f 46 46 53 45 54 28 69 50 74 72 6d 61 70 2c 20  OFFSET(iPtrmap, 
3860: 6b 65 79 29 3b 0a 20 20 61 73 73 65 72 74 28 20  key);.  assert( 
3870: 70 45 54 79 70 65 21 3d 30 20 29 3b 0a 20 20 2a  pEType!=0 );.  *
3880: 70 45 54 79 70 65 20 3d 20 70 50 74 72 6d 61 70  pEType = pPtrmap
3890: 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 69 66 28 20  [offset];.  if( 
38a0: 70 50 67 6e 6f 20 29 20 2a 70 50 67 6e 6f 20 3d  pPgno ) *pPgno =
38b0: 20 67 65 74 34 62 79 74 65 28 26 70 50 74 72 6d   get4byte(&pPtrm
38c0: 61 70 5b 6f 66 66 73 65 74 2b 31 5d 29 3b 0a 0a  ap[offset+1]);..
38d0: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
38e0: 72 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20  ref(pDbPage);.  
38f0: 69 66 28 20 2a 70 45 54 79 70 65 3c 31 20 7c 7c  if( *pEType<1 ||
3900: 20 2a 70 45 54 79 70 65 3e 35 20 29 20 72 65 74   *pEType>5 ) ret
3910: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
3920: 50 54 5f 42 4b 50 54 3b 0a 20 20 72 65 74 75 72  PT_BKPT;.  retur
3930: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
3940: 23 65 6c 73 65 20 2f 2a 20 69 66 20 64 65 66 69  #else /* if defi
3950: 6e 65 64 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned SQLITE_OMIT_
3960: 41 55 54 4f 56 41 43 55 55 4d 20 2a 2f 0a 20 20  AUTOVACUUM */.  
3970: 23 64 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75  #define ptrmapPu
3980: 74 28 77 2c 78 2c 79 2c 7a 29 20 53 51 4c 49 54  t(w,x,y,z) SQLIT
3990: 45 5f 4f 4b 0a 20 20 23 64 65 66 69 6e 65 20 70  E_OK.  #define p
39a0: 74 72 6d 61 70 47 65 74 28 77 2c 78 2c 79 2c 7a  trmapGet(w,x,y,z
39b0: 29 20 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 23 64  ) SQLITE_OK.  #d
39c0: 65 66 69 6e 65 20 70 74 72 6d 61 70 50 75 74 4f  efine ptrmapPutO
39d0: 76 66 6c 28 79 2c 7a 29 20 53 51 4c 49 54 45 5f  vfl(y,z) SQLITE_
39e0: 4f 4b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  OK.#endif../*.**
39f0: 20 47 69 76 65 6e 20 61 20 62 74 72 65 65 20 70   Given a btree p
3a00: 61 67 65 20 61 6e 64 20 61 20 63 65 6c 6c 20 69  age and a cell i
3a10: 6e 64 65 78 20 28 30 20 6d 65 61 6e 73 20 74 68  ndex (0 means th
3a20: 65 20 66 69 72 73 74 20 63 65 6c 6c 20 6f 6e 0a  e first cell on.
3a30: 2a 2a 20 74 68 65 20 70 61 67 65 2c 20 31 20 6d  ** the page, 1 m
3a40: 65 61 6e 73 20 74 68 65 20 73 65 63 6f 6e 64 20  eans the second 
3a50: 63 65 6c 6c 2c 20 61 6e 64 20 73 6f 20 66 6f 72  cell, and so for
3a60: 74 68 29 20 72 65 74 75 72 6e 20 61 20 70 6f 69  th) return a poi
3a70: 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 63  nter.** to the c
3a80: 65 6c 6c 20 63 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a  ell content..**.
3a90: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
3aa0: 77 6f 72 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 70  works only for p
3ab0: 61 67 65 73 20 74 68 61 74 20 64 6f 20 6e 6f 74  ages that do not
3ac0: 20 63 6f 6e 74 61 69 6e 20 6f 76 65 72 66 6c 6f   contain overflo
3ad0: 77 20 63 65 6c 6c 73 2e 0a 2a 2f 0a 23 64 65 66  w cells..*/.#def
3ae0: 69 6e 65 20 66 69 6e 64 43 65 6c 6c 28 50 2c 49  ine findCell(P,I
3af0: 29 20 5c 0a 20 20 28 28 50 29 2d 3e 61 44 61 74  ) \.  ((P)->aDat
3b00: 61 20 2b 20 28 28 50 29 2d 3e 6d 61 73 6b 50 61  a + ((P)->maskPa
3b10: 67 65 20 26 20 67 65 74 32 62 79 74 65 28 26 28  ge & get2byte(&(
3b20: 50 29 2d 3e 61 44 61 74 61 5b 28 50 29 2d 3e 63  P)->aData[(P)->c
3b30: 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 28 49 29 5d  ellOffset+2*(I)]
3b40: 29 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  )))../*.** This 
3b50: 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20 76  a more complex v
3b60: 65 72 73 69 6f 6e 20 6f 66 20 66 69 6e 64 43 65  ersion of findCe
3b70: 6c 6c 28 29 20 74 68 61 74 20 77 6f 72 6b 73 20  ll() that works 
3b80: 66 6f 72 0a 2a 2a 20 70 61 67 65 73 20 74 68 61  for.** pages tha
3b90: 74 20 64 6f 20 63 6f 6e 74 61 69 6e 20 6f 76 65  t do contain ove
3ba0: 72 66 6c 6f 77 20 63 65 6c 6c 73 2e 20 20 53 65  rflow cells.  Se
3bb0: 65 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 74 61 74  e insert.*/.stat
3bc0: 69 63 20 75 38 20 2a 66 69 6e 64 4f 76 65 72 66  ic u8 *findOverf
3bd0: 6c 6f 77 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20  lowCell(MemPage 
3be0: 2a 70 50 61 67 65 2c 20 69 6e 74 20 69 43 65 6c  *pPage, int iCel
3bf0: 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 61  l){.  int i;.  a
3c00: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
3c10: 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d  utex_held(pPage-
3c20: 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  >pBt->mutex) );.
3c30: 20 20 66 6f 72 28 69 3d 70 50 61 67 65 2d 3e 6e    for(i=pPage->n
3c40: 4f 76 65 72 66 6c 6f 77 2d 31 3b 20 69 3e 3d 30  Overflow-1; i>=0
3c50: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69 6e 74 20  ; i--){.    int 
3c60: 6b 3b 0a 20 20 20 20 73 74 72 75 63 74 20 5f 4f  k;.    struct _O
3c70: 76 66 6c 43 65 6c 6c 20 2a 70 4f 76 66 6c 3b 0a  vflCell *pOvfl;.
3c80: 20 20 20 20 70 4f 76 66 6c 20 3d 20 26 70 50 61      pOvfl = &pPa
3c90: 67 65 2d 3e 61 4f 76 66 6c 5b 69 5d 3b 0a 20 20  ge->aOvfl[i];.  
3ca0: 20 20 6b 20 3d 20 70 4f 76 66 6c 2d 3e 69 64 78    k = pOvfl->idx
3cb0: 3b 0a 20 20 20 20 69 66 28 20 6b 3c 3d 69 43 65  ;.    if( k<=iCe
3cc0: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ll ){.      if( 
3cd0: 6b 3d 3d 69 43 65 6c 6c 20 29 7b 0a 20 20 20 20  k==iCell ){.    
3ce0: 20 20 20 20 72 65 74 75 72 6e 20 70 4f 76 66 6c      return pOvfl
3cf0: 2d 3e 70 43 65 6c 6c 3b 0a 20 20 20 20 20 20 7d  ->pCell;.      }
3d00: 0a 20 20 20 20 20 20 69 43 65 6c 6c 2d 2d 3b 0a  .      iCell--;.
3d10: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
3d20: 72 6e 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67  rn findCell(pPag
3d30: 65 2c 20 69 43 65 6c 6c 29 3b 0a 7d 0a 0a 2f 2a  e, iCell);.}../*
3d40: 0a 2a 2a 20 50 61 72 73 65 20 61 20 63 65 6c 6c  .** Parse a cell
3d50: 20 63 6f 6e 74 65 6e 74 20 62 6c 6f 63 6b 20 61   content block a
3d60: 6e 64 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 43  nd fill in the C
3d70: 65 6c 6c 49 6e 66 6f 20 73 74 72 75 63 74 75 72  ellInfo structur
3d80: 65 2e 20 20 54 68 65 72 65 0a 2a 2a 20 61 72 65  e.  There.** are
3d90: 20 74 77 6f 20 76 65 72 73 69 6f 6e 73 20 6f 66   two versions of
3da0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
3db0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
3dc0: 73 65 43 65 6c 6c 28 29 20 74 61 6b 65 73 20 61  seCell() takes a
3dd0: 20 0a 2a 2a 20 63 65 6c 6c 20 69 6e 64 65 78 20   .** cell index 
3de0: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  as the second ar
3df0: 67 75 6d 65 6e 74 20 61 6e 64 20 73 71 6c 69 74  gument and sqlit
3e00: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
3e10: 50 74 72 28 29 20 0a 2a 2a 20 74 61 6b 65 73 20  Ptr() .** takes 
3e20: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
3e30: 20 62 6f 64 79 20 6f 66 20 74 68 65 20 63 65 6c   body of the cel
3e40: 6c 20 61 73 20 69 74 73 20 73 65 63 6f 6e 64 20  l as its second 
3e50: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20  argument..**.** 
3e60: 57 69 74 68 69 6e 20 74 68 69 73 20 66 69 6c 65  Within this file
3e70: 2c 20 74 68 65 20 70 61 72 73 65 43 65 6c 6c 28  , the parseCell(
3e80: 29 20 6d 61 63 72 6f 20 63 61 6e 20 62 65 20 63  ) macro can be c
3e90: 61 6c 6c 65 64 20 69 6e 73 74 65 61 64 20 6f 66  alled instead of
3ea0: 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
3eb0: 50 61 72 73 65 43 65 6c 6c 50 74 72 28 29 2e 20  ParseCellPtr(). 
3ec0: 55 73 69 6e 67 20 73 6f 6d 65 20 63 6f 6d 70 69  Using some compi
3ed0: 6c 65 72 73 2c 20 74 68 69 73 20 77 69 6c 6c 20  lers, this will 
3ee0: 62 65 20 66 61 73 74 65 72 2e 0a 2a 2f 0a 76 6f  be faster..*/.vo
3ef0: 69 64 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  id sqlite3BtreeP
3f00: 61 72 73 65 43 65 6c 6c 50 74 72 28 0a 20 20 4d  arseCellPtr(.  M
3f10: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20  emPage *pPage,  
3f20: 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63         /* Page c
3f30: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 65  ontaining the ce
3f40: 6c 6c 20 2a 2f 0a 20 20 75 38 20 2a 70 43 65 6c  ll */.  u8 *pCel
3f50: 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
3f60: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
3f70: 65 20 63 65 6c 6c 20 74 65 78 74 2e 20 2a 2f 0a  e cell text. */.
3f80: 20 20 43 65 6c 6c 49 6e 66 6f 20 2a 70 49 6e 66    CellInfo *pInf
3f90: 6f 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  o         /* Fil
3fa0: 6c 20 69 6e 20 74 68 69 73 20 73 74 72 75 63 74  l in this struct
3fb0: 75 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ure */.){.  int 
3fc0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
3fd0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 62 79      /* Number by
3fe0: 74 65 73 20 69 6e 20 63 65 6c 6c 20 63 6f 6e 74  tes in cell cont
3ff0: 65 6e 74 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  ent header */.  
4000: 75 33 32 20 6e 50 61 79 6c 6f 61 64 3b 20 20 20  u32 nPayload;   
4010: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4020: 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 63 65  r of bytes of ce
4030: 6c 6c 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 0a 20  ll payload */.. 
4040: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
4050: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
4060: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
4070: 3b 0a 0a 20 20 70 49 6e 66 6f 2d 3e 70 43 65 6c  ;..  pInfo->pCel
4080: 6c 20 3d 20 70 43 65 6c 6c 3b 0a 20 20 61 73 73  l = pCell;.  ass
4090: 65 72 74 28 20 70 50 61 67 65 2d 3e 6c 65 61 66  ert( pPage->leaf
40a0: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 2d 3e 6c 65  ==0 || pPage->le
40b0: 61 66 3d 3d 31 20 29 3b 0a 20 20 6e 20 3d 20 70  af==1 );.  n = p
40c0: 50 61 67 65 2d 3e 63 68 69 6c 64 50 74 72 53 69  Page->childPtrSi
40d0: 7a 65 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 3d  ze;.  assert( n=
40e0: 3d 34 2d 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66  =4-4*pPage->leaf
40f0: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   );.  if( pPage-
4100: 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 69  >intKey ){.    i
4110: 66 28 20 70 50 61 67 65 2d 3e 68 61 73 44 61 74  f( pPage->hasDat
4120: 61 20 29 7b 0a 20 20 20 20 20 20 6e 20 2b 3d 20  a ){.      n += 
4130: 67 65 74 56 61 72 69 6e 74 33 32 28 26 70 43 65  getVarint32(&pCe
4140: 6c 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29  ll[n], nPayload)
4150: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
4160: 20 20 20 6e 50 61 79 6c 6f 61 64 20 3d 20 30 3b     nPayload = 0;
4170: 0a 20 20 20 20 7d 0a 20 20 20 20 6e 20 2b 3d 20  .    }.    n += 
4180: 67 65 74 56 61 72 69 6e 74 28 26 70 43 65 6c 6c  getVarint(&pCell
4190: 5b 6e 5d 2c 20 28 75 36 34 2a 29 26 70 49 6e 66  [n], (u64*)&pInf
41a0: 6f 2d 3e 6e 4b 65 79 29 3b 0a 20 20 20 20 70 49  o->nKey);.    pI
41b0: 6e 66 6f 2d 3e 6e 44 61 74 61 20 3d 20 6e 50 61  nfo->nData = nPa
41c0: 79 6c 6f 61 64 3b 0a 20 20 7d 65 6c 73 65 7b 0a  yload;.  }else{.
41d0: 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 44 61 74 61      pInfo->nData
41e0: 20 3d 20 30 3b 0a 20 20 20 20 6e 20 2b 3d 20 67   = 0;.    n += g
41f0: 65 74 56 61 72 69 6e 74 33 32 28 26 70 43 65 6c  etVarint32(&pCel
4200: 6c 5b 6e 5d 2c 20 6e 50 61 79 6c 6f 61 64 29 3b  l[n], nPayload);
4210: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4b 65 79  .    pInfo->nKey
4220: 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 7d   = nPayload;.  }
4230: 0a 20 20 70 49 6e 66 6f 2d 3e 6e 50 61 79 6c 6f  .  pInfo->nPaylo
4240: 61 64 20 3d 20 6e 50 61 79 6c 6f 61 64 3b 0a 20  ad = nPayload;. 
4250: 20 70 49 6e 66 6f 2d 3e 6e 48 65 61 64 65 72 20   pInfo->nHeader 
4260: 3d 20 6e 3b 0a 20 20 69 66 28 20 6c 69 6b 65 6c  = n;.  if( likel
4270: 79 28 6e 50 61 79 6c 6f 61 64 3c 3d 70 50 61 67  y(nPayload<=pPag
4280: 65 2d 3e 6d 61 78 4c 6f 63 61 6c 29 20 29 7b 0a  e->maxLocal) ){.
4290: 20 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74      /* This is t
42a0: 68 65 20 28 65 61 73 79 29 20 63 6f 6d 6d 6f 6e  he (easy) common
42b0: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 20   case where the 
42c0: 65 6e 74 69 72 65 20 70 61 79 6c 6f 61 64 20 66  entire payload f
42d0: 69 74 73 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68  its.    ** on th
42e0: 65 20 6c 6f 63 61 6c 20 70 61 67 65 2e 20 20 4e  e local page.  N
42f0: 6f 20 6f 76 65 72 66 6c 6f 77 20 69 73 20 72 65  o overflow is re
4300: 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  quired..    */. 
4310: 20 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20     int nSize;   
4320: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
4330: 73 69 7a 65 20 6f 66 20 63 65 6c 6c 20 63 6f 6e  size of cell con
4340: 74 65 6e 74 20 69 6e 20 62 79 74 65 73 20 2a 2f  tent in bytes */
4350: 0a 20 20 20 20 6e 53 69 7a 65 20 3d 20 6e 50 61  .    nSize = nPa
4360: 79 6c 6f 61 64 20 2b 20 6e 3b 0a 20 20 20 20 70  yload + n;.    p
4370: 49 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 6e  Info->nLocal = n
4380: 50 61 79 6c 6f 61 64 3b 0a 20 20 20 20 70 49 6e  Payload;.    pIn
4390: 66 6f 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20  fo->iOverflow = 
43a0: 30 3b 0a 20 20 20 20 69 66 28 20 28 6e 53 69 7a  0;.    if( (nSiz
43b0: 65 20 26 20 7e 33 29 3d 3d 30 20 29 7b 0a 20 20  e & ~3)==0 ){.  
43c0: 20 20 20 20 6e 53 69 7a 65 20 3d 20 34 3b 20 20      nSize = 4;  
43d0: 20 20 20 20 20 20 2f 2a 20 4d 69 6e 69 6d 75 6d        /* Minimum
43e0: 20 63 65 6c 6c 20 73 69 7a 65 20 69 73 20 34 20   cell size is 4 
43f0: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e  */.    }.    pIn
4400: 66 6f 2d 3e 6e 53 69 7a 65 20 3d 20 6e 53 69 7a  fo->nSize = nSiz
4410: 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
4420: 2f 2a 20 49 66 20 74 68 65 20 70 61 79 6c 6f 61  /* If the payloa
4430: 64 20 77 69 6c 6c 20 6e 6f 74 20 66 69 74 20 63  d will not fit c
4440: 6f 6d 70 6c 65 74 65 6c 79 20 6f 6e 20 74 68 65  ompletely on the
4450: 20 6c 6f 63 61 6c 20 70 61 67 65 2c 20 77 65 20   local page, we 
4460: 68 61 76 65 0a 20 20 20 20 2a 2a 20 74 6f 20 64  have.    ** to d
4470: 65 63 69 64 65 20 68 6f 77 20 6d 75 63 68 20 74  ecide how much t
4480: 6f 20 73 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20  o store locally 
4490: 61 6e 64 20 68 6f 77 20 6d 75 63 68 20 74 6f 20  and how much to 
44a0: 73 70 69 6c 6c 20 6f 6e 74 6f 0a 20 20 20 20 2a  spill onto.    *
44b0: 2a 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  * overflow pages
44c0: 2e 20 20 54 68 65 20 73 74 72 61 74 65 67 79 20  .  The strategy 
44d0: 69 73 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 20 74  is to minimize t
44e0: 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 75 6e 75  he amount of unu
44f0: 73 65 64 0a 20 20 20 20 2a 2a 20 73 70 61 63 65  sed.    ** space
4500: 20 6f 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67   on overflow pag
4510: 65 73 20 77 68 69 6c 65 20 6b 65 65 70 69 6e 67  es while keeping
4520: 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c   the amount of l
4530: 6f 63 61 6c 20 73 74 6f 72 61 67 65 0a 20 20 20  ocal storage.   
4540: 20 2a 2a 20 69 6e 20 62 65 74 77 65 65 6e 20 6d   ** in between m
4550: 69 6e 4c 6f 63 61 6c 20 61 6e 64 20 6d 61 78 4c  inLocal and maxL
4560: 6f 63 61 6c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  ocal..    **.   
4570: 20 2a 2a 20 57 61 72 6e 69 6e 67 3a 20 20 63 68   ** Warning:  ch
4580: 61 6e 67 69 6e 67 20 74 68 65 20 77 61 79 20 6f  anging the way o
4590: 76 65 72 66 6c 6f 77 20 70 61 79 6c 6f 61 64 20  verflow payload 
45a0: 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20 69  is distributed i
45b0: 6e 20 61 6e 79 0a 20 20 20 20 2a 2a 20 77 61 79  n any.    ** way
45c0: 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e 20   will result in 
45d0: 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
45e0: 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 20 20 20  file format..   
45f0: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 69 6e 4c   */.    int minL
4600: 6f 63 61 6c 3b 20 20 2f 2a 20 4d 69 6e 69 6d 75  ocal;  /* Minimu
4610: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
4620: 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79  oad held locally
4630: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6d 61 78 4c   */.    int maxL
4640: 6f 63 61 6c 3b 20 20 2f 2a 20 4d 61 78 69 6d 75  ocal;  /* Maximu
4650: 6d 20 61 6d 6f 75 6e 74 20 6f 66 20 70 61 79 6c  m amount of payl
4660: 6f 61 64 20 68 65 6c 64 20 6c 6f 63 61 6c 6c 79  oad held locally
4670: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 75 72 70   */.    int surp
4680: 6c 75 73 3b 20 20 20 2f 2a 20 4f 76 65 72 66 6c  lus;   /* Overfl
4690: 6f 77 20 70 61 79 6c 6f 61 64 20 61 76 61 69 6c  ow payload avail
46a0: 61 62 6c 65 20 66 6f 72 20 6c 6f 63 61 6c 20 73  able for local s
46b0: 74 6f 72 61 67 65 20 2a 2f 0a 0a 20 20 20 20 6d  torage */..    m
46c0: 69 6e 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  inLocal = pPage-
46d0: 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 20 20 6d  >minLocal;.    m
46e0: 61 78 4c 6f 63 61 6c 20 3d 20 70 50 61 67 65 2d  axLocal = pPage-
46f0: 3e 6d 61 78 4c 6f 63 61 6c 3b 0a 20 20 20 20 73  >maxLocal;.    s
4700: 75 72 70 6c 75 73 20 3d 20 6d 69 6e 4c 6f 63 61  urplus = minLoca
4710: 6c 20 2b 20 28 6e 50 61 79 6c 6f 61 64 20 2d 20  l + (nPayload - 
4720: 6d 69 6e 4c 6f 63 61 6c 29 25 28 70 50 61 67 65  minLocal)%(pPage
4730: 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
4740: 65 20 2d 20 34 29 3b 0a 20 20 20 20 69 66 28 20  e - 4);.    if( 
4750: 73 75 72 70 6c 75 73 20 3c 3d 20 6d 61 78 4c 6f  surplus <= maxLo
4760: 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 70 49 6e  cal ){.      pIn
4770: 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 3d 20 73 75 72  fo->nLocal = sur
4780: 70 6c 75 73 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  plus;.    }else{
4790: 0a 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 4c  .      pInfo->nL
47a0: 6f 63 61 6c 20 3d 20 6d 69 6e 4c 6f 63 61 6c 3b  ocal = minLocal;
47b0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 49 6e 66 6f  .    }.    pInfo
47c0: 2d 3e 69 4f 76 65 72 66 6c 6f 77 20 3d 20 70 49  ->iOverflow = pI
47d0: 6e 66 6f 2d 3e 6e 4c 6f 63 61 6c 20 2b 20 6e 3b  nfo->nLocal + n;
47e0: 0a 20 20 20 20 70 49 6e 66 6f 2d 3e 6e 53 69 7a  .    pInfo->nSiz
47f0: 65 20 3d 20 70 49 6e 66 6f 2d 3e 69 4f 76 65 72  e = pInfo->iOver
4800: 66 6c 6f 77 20 2b 20 34 3b 0a 20 20 7d 0a 7d 0a  flow + 4;.  }.}.
4810: 23 64 65 66 69 6e 65 20 70 61 72 73 65 43 65 6c  #define parseCel
4820: 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c 2c 20  l(pPage, iCell, 
4830: 70 49 6e 66 6f 29 20 5c 0a 20 20 73 71 6c 69 74  pInfo) \.  sqlit
4840: 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c  e3BtreeParseCell
4850: 50 74 72 28 28 70 50 61 67 65 29 2c 20 66 69 6e  Ptr((pPage), fin
4860: 64 43 65 6c 6c 28 28 70 50 61 67 65 29 2c 20 28  dCell((pPage), (
4870: 69 43 65 6c 6c 29 29 2c 20 28 70 49 6e 66 6f 29  iCell)), (pInfo)
4880: 29 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 42 74  ).void sqlite3Bt
4890: 72 65 65 50 61 72 73 65 43 65 6c 6c 28 0a 20 20  reeParseCell(.  
48a0: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
48b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
48c0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63  containing the c
48d0: 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 43 65  ell */.  int iCe
48e0: 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ll,             
48f0: 20 2f 2a 20 54 68 65 20 63 65 6c 6c 20 69 6e 64   /* The cell ind
4900: 65 78 2e 20 20 46 69 72 73 74 20 63 65 6c 6c 20  ex.  First cell 
4910: 69 73 20 30 20 2a 2f 0a 20 20 43 65 6c 6c 49 6e  is 0 */.  CellIn
4920: 66 6f 20 2a 70 49 6e 66 6f 20 20 20 20 20 20 20  fo *pInfo       
4930: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 69    /* Fill in thi
4940: 73 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 29  s structure */.)
4950: 7b 0a 20 20 70 61 72 73 65 43 65 6c 6c 28 70 50  {.  parseCell(pP
4960: 61 67 65 2c 20 69 43 65 6c 6c 2c 20 70 49 6e 66  age, iCell, pInf
4970: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  o);.}../*.** Com
4980: 70 75 74 65 20 74 68 65 20 74 6f 74 61 6c 20 6e  pute the total n
4990: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 74  umber of bytes t
49a0: 68 61 74 20 61 20 43 65 6c 6c 20 6e 65 65 64 73  hat a Cell needs
49b0: 20 69 6e 20 74 68 65 20 63 65 6c 6c 0a 2a 2a 20   in the cell.** 
49c0: 64 61 74 61 20 61 72 65 61 20 6f 66 20 74 68 65  data area of the
49d0: 20 62 74 72 65 65 2d 70 61 67 65 2e 20 20 54 68   btree-page.  Th
49e0: 65 20 72 65 74 75 72 6e 20 6e 75 6d 62 65 72 20  e return number 
49f0: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 63 65 6c  includes the cel
4a00: 6c 0a 2a 2a 20 64 61 74 61 20 68 65 61 64 65 72  l.** data header
4a10: 20 61 6e 64 20 74 68 65 20 6c 6f 63 61 6c 20 70   and the local p
4a20: 61 79 6c 6f 61 64 2c 20 62 75 74 20 6e 6f 74 20  ayload, but not 
4a30: 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
4a40: 65 20 6f 72 0a 2a 2a 20 74 68 65 20 73 70 61 63  e or.** the spac
4a50: 65 20 75 73 65 64 20 62 79 20 74 68 65 20 63 65  e used by the ce
4a60: 6c 6c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 23  ll pointer..*/.#
4a70: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 73 74  ifndef NDEBUG.st
4a80: 61 74 69 63 20 75 31 36 20 63 65 6c 6c 53 69 7a  atic u16 cellSiz
4a90: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
4aa0: 2c 20 69 6e 74 20 69 43 65 6c 6c 29 7b 0a 20 20  , int iCell){.  
4ab0: 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
4ac0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
4ad0: 73 65 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 43  seCell(pPage, iC
4ae0: 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 72  ell, &info);.  r
4af0: 65 74 75 72 6e 20 69 6e 66 6f 2e 6e 53 69 7a 65  eturn info.nSize
4b00: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 73 74 61 74 69  ;.}.#endif.stati
4b10: 63 20 75 31 36 20 63 65 6c 6c 53 69 7a 65 50 74  c u16 cellSizePt
4b20: 72 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  r(MemPage *pPage
4b30: 2c 20 75 38 20 2a 70 43 65 6c 6c 29 7b 0a 20 20  , u8 *pCell){.  
4b40: 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
4b50: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
4b60: 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
4b70: 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
4b80: 20 20 72 65 74 75 72 6e 20 69 6e 66 6f 2e 6e 53    return info.nS
4b90: 69 7a 65 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  ize;.}..#ifndef 
4ba0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
4bb0: 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 49 66 20  VACUUM./*.** If 
4bc0: 74 68 65 20 63 65 6c 6c 20 70 43 65 6c 6c 2c 20  the cell pCell, 
4bd0: 70 61 72 74 20 6f 66 20 70 61 67 65 20 70 50 61  part of page pPa
4be0: 67 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 6f  ge contains a po
4bf0: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61 6e 20 6f  inter.** to an o
4c00: 76 65 72 66 6c 6f 77 20 70 61 67 65 2c 20 69 6e  verflow page, in
4c10: 73 65 72 74 20 61 6e 20 65 6e 74 72 79 20 69 6e  sert an entry in
4c20: 74 6f 20 74 68 65 20 70 6f 69 6e 74 65 72 2d 6d  to the pointer-m
4c30: 61 70 0a 2a 2a 20 66 6f 72 20 74 68 65 20 6f 76  ap.** for the ov
4c40: 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a 2a 2f 0a  erflow page..*/.
4c50: 73 74 61 74 69 63 20 69 6e 74 20 70 74 72 6d 61  static int ptrma
4c60: 70 50 75 74 4f 76 66 6c 50 74 72 28 4d 65 6d 50  pPutOvflPtr(MemP
4c70: 61 67 65 20 2a 70 50 61 67 65 2c 20 75 38 20 2a  age *pPage, u8 *
4c80: 70 43 65 6c 6c 29 7b 0a 20 20 43 65 6c 6c 49 6e  pCell){.  CellIn
4c90: 66 6f 20 69 6e 66 6f 3b 0a 20 20 61 73 73 65 72  fo info;.  asser
4ca0: 74 28 20 70 43 65 6c 6c 21 3d 30 20 29 3b 0a 20  t( pCell!=0 );. 
4cb0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
4cc0: 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67 65 2c  seCellPtr(pPage,
4cd0: 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a   pCell, &info);.
4ce0: 20 20 61 73 73 65 72 74 28 20 28 69 6e 66 6f 2e    assert( (info.
4cf0: 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e  nData+(pPage->in
4d00: 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79  tKey?0:info.nKey
4d10: 29 29 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ))==info.nPayloa
4d20: 64 20 29 3b 0a 20 20 69 66 28 20 28 69 6e 66 6f  d );.  if( (info
4d30: 2e 6e 44 61 74 61 2b 28 70 50 61 67 65 2d 3e 69  .nData+(pPage->i
4d40: 6e 74 4b 65 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65  ntKey?0:info.nKe
4d50: 79 29 29 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20  y))>info.nLocal 
4d60: 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6f 76 66 6c  ){.    Pgno ovfl
4d70: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 43 65   = get4byte(&pCe
4d80: 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  ll[info.iOverflo
4d90: 77 5d 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  w]);.    return 
4da0: 70 74 72 6d 61 70 50 75 74 28 70 50 61 67 65 2d  ptrmapPut(pPage-
4db0: 3e 70 42 74 2c 20 6f 76 66 6c 2c 20 50 54 52 4d  >pBt, ovfl, PTRM
4dc0: 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c 20 70 50  AP_OVERFLOW1, pP
4dd0: 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 20 20 7d 0a  age->pgno);.  }.
4de0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4df0: 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 49 66 20 74  OK;.}./*.** If t
4e00: 68 65 20 63 65 6c 6c 20 77 69 74 68 20 69 6e 64  he cell with ind
4e10: 65 78 20 69 43 65 6c 6c 20 6f 6e 20 70 61 67 65  ex iCell on page
4e20: 20 70 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20   pPage contains 
4e30: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
4e40: 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  an overflow page
4e50: 2c 20 69 6e 73 65 72 74 20 61 6e 20 65 6e 74 72  , insert an entr
4e60: 79 20 69 6e 74 6f 20 74 68 65 20 70 6f 69 6e 74  y into the point
4e70: 65 72 2d 6d 61 70 0a 2a 2a 20 66 6f 72 20 74 68  er-map.** for th
4e80: 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e  e overflow page.
4e90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
4ea0: 74 72 6d 61 70 50 75 74 4f 76 66 6c 28 4d 65 6d  trmapPutOvfl(Mem
4eb0: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
4ec0: 20 69 43 65 6c 6c 29 7b 0a 20 20 75 38 20 2a 70   iCell){.  u8 *p
4ed0: 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74 28 20  Cell;.  assert( 
4ee0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
4ef0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
4f00: 75 74 65 78 29 20 29 3b 0a 20 20 70 43 65 6c 6c  utex) );.  pCell
4f10: 20 3d 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43   = findOverflowC
4f20: 65 6c 6c 28 70 50 61 67 65 2c 20 69 43 65 6c 6c  ell(pPage, iCell
4f30: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 74 72 6d  );.  return ptrm
4f40: 61 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61  apPutOvflPtr(pPa
4f50: 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 7d 0a 23 65  ge, pCell);.}.#e
4f60: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 66  ndif.../*.** Def
4f70: 72 61 67 6d 65 6e 74 20 74 68 65 20 70 61 67 65  ragment the page
4f80: 20 67 69 76 65 6e 2e 20 20 41 6c 6c 20 43 65 6c   given.  All Cel
4f90: 6c 73 20 61 72 65 20 6d 6f 76 65 64 20 74 6f 20  ls are moved to 
4fa0: 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68  the.** end of th
4fb0: 65 20 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 66  e page and all f
4fc0: 72 65 65 20 73 70 61 63 65 20 69 73 20 63 6f 6c  ree space is col
4fd0: 6c 65 63 74 65 64 20 69 6e 74 6f 20 6f 6e 65 0a  lected into one.
4fe0: 2a 2a 20 62 69 67 20 46 72 65 65 42 6c 6b 20 74  ** big FreeBlk t
4ff0: 68 61 74 20 6f 63 63 75 72 73 20 69 6e 20 62 65  hat occurs in be
5000: 74 77 65 65 6e 20 74 68 65 20 68 65 61 64 65 72  tween the header
5010: 20 61 6e 64 20 63 65 6c 6c 0a 2a 2a 20 70 6f 69   and cell.** poi
5020: 6e 74 65 72 20 61 72 72 61 79 20 61 6e 64 20 74  nter array and t
5030: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
5040: 61 72 65 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  area..*/.static 
5050: 76 6f 69 64 20 64 65 66 72 61 67 6d 65 6e 74 50  void defragmentP
5060: 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  age(MemPage *pPa
5070: 67 65 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20  ge){.  int i;   
5080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5090: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
50a0: 72 20 2a 2f 0a 20 20 69 6e 74 20 70 63 3b 20 20  r */.  int pc;  
50b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50c0: 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20    /* Address of 
50d0: 61 20 69 2d 74 68 20 63 65 6c 6c 20 2a 2f 0a 20  a i-th cell */. 
50e0: 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20   int addr;      
50f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
5100: 66 66 73 65 74 20 6f 66 20 66 69 72 73 74 20 62  ffset of first b
5110: 79 74 65 20 61 66 74 65 72 20 63 65 6c 6c 20 70  yte after cell p
5120: 6f 69 6e 74 65 72 20 61 72 72 61 79 20 2a 2f 0a  ointer array */.
5130: 20 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20    int hdr;      
5140: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5150: 4f 66 66 73 65 74 20 74 6f 20 74 68 65 20 70 61  Offset to the pa
5160: 67 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69  ge header */.  i
5170: 6e 74 20 73 69 7a 65 3b 20 20 20 20 20 20 20 20  nt size;        
5180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
5190: 65 20 6f 66 20 61 20 63 65 6c 6c 20 2a 2f 0a 20  e of a cell */. 
51a0: 20 69 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b   int usableSize;
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
51c0: 75 6d 62 65 72 20 6f 66 20 75 73 61 62 6c 65 20  umber of usable 
51d0: 62 79 74 65 73 20 6f 6e 20 61 20 70 61 67 65 20  bytes on a page 
51e0: 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66  */.  int cellOff
51f0: 73 65 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  set;            
5200: 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 74 68 65  /* Offset to the
5210: 20 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72   cell pointer ar
5220: 72 61 79 20 2a 2f 0a 20 20 69 6e 74 20 63 62 72  ray */.  int cbr
5230: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
5240: 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f      /* Offset to
5250: 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
5260: 74 20 61 72 65 61 20 2a 2f 0a 20 20 69 6e 74 20  t area */.  int 
5270: 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  nCell;          
5280: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
5290: 20 6f 66 20 63 65 6c 6c 73 20 6f 6e 20 74 68 65   of cells on the
52a0: 20 70 61 67 65 20 2a 2f 0a 20 20 75 6e 73 69 67   page */.  unsig
52b0: 6e 65 64 20 63 68 61 72 20 2a 64 61 74 61 3b 20  ned char *data; 
52c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
52d0: 65 20 64 61 74 61 20 2a 2f 0a 20 20 75 6e 73 69  e data */.  unsi
52e0: 67 6e 65 64 20 63 68 61 72 20 2a 74 65 6d 70 3b  gned char *temp;
52f0: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 20 61         /* Temp a
5300: 72 65 61 20 66 6f 72 20 63 65 6c 6c 20 63 6f 6e  rea for cell con
5310: 74 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72  tent */..  asser
5320: 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 49  t( sqlite3PagerI
5330: 73 77 72 69 74 65 61 62 6c 65 28 70 50 61 67 65  swriteable(pPage
5340: 2d 3e 70 44 62 50 61 67 65 29 20 29 3b 0a 20 20  ->pDbPage) );.  
5350: 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 70  assert( pPage->p
5360: 42 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  Bt!=0 );.  asser
5370: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75  t( pPage->pBt->u
5380: 73 61 62 6c 65 53 69 7a 65 20 3c 3d 20 53 51 4c  sableSize <= SQL
5390: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
53a0: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  E );.  assert( p
53b0: 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d  Page->nOverflow=
53c0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
53d0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
53e0: 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d  ld(pPage->pBt->m
53f0: 75 74 65 78 29 20 29 3b 0a 20 20 74 65 6d 70 20  utex) );.  temp 
5400: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 65  = sqlite3PagerTe
5410: 6d 70 53 70 61 63 65 28 70 50 61 67 65 2d 3e 70  mpSpace(pPage->p
5420: 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 64  Bt->pPager);.  d
5430: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
5440: 74 61 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67  ta;.  hdr = pPag
5450: 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
5460: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 70 50 61  cellOffset = pPa
5470: 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 3b 0a  ge->cellOffset;.
5480: 20 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d    nCell = pPage-
5490: 3e 6e 43 65 6c 6c 3b 0a 20 20 61 73 73 65 72 74  >nCell;.  assert
54a0: 28 20 6e 43 65 6c 6c 3d 3d 67 65 74 32 62 79 74  ( nCell==get2byt
54b0: 65 28 26 64 61 74 61 5b 68 64 72 2b 33 5d 29 20  e(&data[hdr+3]) 
54c0: 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20  );.  usableSize 
54d0: 3d 20 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  = pPage->pBt->us
54e0: 61 62 6c 65 53 69 7a 65 3b 0a 20 20 63 62 72 6b  ableSize;.  cbrk
54f0: 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
5500: 61 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 6d 65 6d  a[hdr+5]);.  mem
5510: 63 70 79 28 26 74 65 6d 70 5b 63 62 72 6b 5d 2c  cpy(&temp[cbrk],
5520: 20 26 64 61 74 61 5b 63 62 72 6b 5d 2c 20 75 73   &data[cbrk], us
5530: 61 62 6c 65 53 69 7a 65 20 2d 20 63 62 72 6b 29  ableSize - cbrk)
5540: 3b 0a 20 20 63 62 72 6b 20 3d 20 75 73 61 62 6c  ;.  cbrk = usabl
5550: 65 53 69 7a 65 3b 0a 20 20 66 6f 72 28 69 3d 30  eSize;.  for(i=0
5560: 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
5570: 0a 20 20 20 20 75 38 20 2a 70 41 64 64 72 3b 20  .    u8 *pAddr; 
5580: 20 20 20 20 2f 2a 20 54 68 65 20 69 2d 74 68 20      /* The i-th 
5590: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  cell pointer */.
55a0: 20 20 20 20 70 41 64 64 72 20 3d 20 26 64 61 74      pAddr = &dat
55b0: 61 5b 63 65 6c 6c 4f 66 66 73 65 74 20 2b 20 69  a[cellOffset + i
55c0: 2a 32 5d 3b 0a 20 20 20 20 70 63 20 3d 20 67 65  *2];.    pc = ge
55d0: 74 32 62 79 74 65 28 70 41 64 64 72 29 3b 0a 20  t2byte(pAddr);. 
55e0: 20 20 20 61 73 73 65 72 74 28 20 70 63 3c 70 50     assert( pc<pP
55f0: 61 67 65 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65  age->pBt->usable
5600: 53 69 7a 65 20 29 3b 0a 20 20 20 20 73 69 7a 65  Size );.    size
5610: 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70   = cellSizePtr(p
5620: 50 61 67 65 2c 20 26 74 65 6d 70 5b 70 63 5d 29  Page, &temp[pc])
5630: 3b 0a 20 20 20 20 63 62 72 6b 20 2d 3d 20 73 69  ;.    cbrk -= si
5640: 7a 65 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  ze;.    memcpy(&
5650: 64 61 74 61 5b 63 62 72 6b 5d 2c 20 26 74 65 6d  data[cbrk], &tem
5660: 70 5b 70 63 5d 2c 20 73 69 7a 65 29 3b 0a 20 20  p[pc], size);.  
5670: 20 20 70 75 74 32 62 79 74 65 28 70 41 64 64 72    put2byte(pAddr
5680: 2c 20 63 62 72 6b 29 3b 0a 20 20 7d 0a 20 20 61  , cbrk);.  }.  a
5690: 73 73 65 72 74 28 20 63 62 72 6b 3e 3d 63 65 6c  ssert( cbrk>=cel
56a0: 6c 4f 66 66 73 65 74 2b 32 2a 6e 43 65 6c 6c 20  lOffset+2*nCell 
56b0: 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28 26 64  );.  put2byte(&d
56c0: 61 74 61 5b 68 64 72 2b 35 5d 2c 20 63 62 72 6b  ata[hdr+5], cbrk
56d0: 29 3b 0a 20 20 64 61 74 61 5b 68 64 72 2b 31 5d  );.  data[hdr+1]
56e0: 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b 68 64 72   = 0;.  data[hdr
56f0: 2b 32 5d 20 3d 20 30 3b 0a 20 20 64 61 74 61 5b  +2] = 0;.  data[
5700: 68 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 61 64  hdr+7] = 0;.  ad
5710: 64 72 20 3d 20 63 65 6c 6c 4f 66 66 73 65 74 2b  dr = cellOffset+
5720: 32 2a 6e 43 65 6c 6c 3b 0a 20 20 6d 65 6d 73 65  2*nCell;.  memse
5730: 74 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 30  t(&data[addr], 0
5740: 2c 20 63 62 72 6b 2d 61 64 64 72 29 3b 0a 7d 0a  , cbrk-addr);.}.
5750: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
5760: 6e 42 79 74 65 20 62 79 74 65 73 20 6f 66 20 73  nByte bytes of s
5770: 70 61 63 65 20 6f 6e 20 61 20 70 61 67 65 2e 0a  pace on a page..
5780: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
5790: 20 69 6e 64 65 78 20 69 6e 74 6f 20 70 50 61 67   index into pPag
57a0: 65 2d 3e 61 44 61 74 61 5b 5d 20 6f 66 20 74 68  e->aData[] of th
57b0: 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 0a  e first byte of.
57c0: 2a 2a 20 74 68 65 20 6e 65 77 20 61 6c 6c 6f 63  ** the new alloc
57d0: 61 74 69 6f 6e 2e 20 20 54 68 65 20 63 61 6c 6c  ation.  The call
57e0: 65 72 20 67 75 61 72 61 6e 74 65 65 73 20 74 68  er guarantees th
57f0: 61 74 20 74 68 65 72 65 20 69 73 20 65 6e 6f 75  at there is enou
5800: 67 68 0a 2a 2a 20 73 70 61 63 65 2e 20 20 54 68  gh.** space.  Th
5810: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
5820: 6e 65 76 65 72 20 66 61 69 6c 2e 0a 2a 2a 0a 2a  never fail..**.*
5830: 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 63 6f  * If the page co
5840: 6e 74 61 69 6e 73 20 6e 42 79 74 65 73 20 6f 66  ntains nBytes of
5850: 20 66 72 65 65 20 73 70 61 63 65 20 62 75 74 20   free space but 
5860: 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e  does not contain
5870: 0a 2a 2a 20 6e 42 79 74 65 73 20 6f 66 20 63 6f  .** nBytes of co
5880: 6e 74 69 67 75 6f 75 73 20 66 72 65 65 20 73 70  ntiguous free sp
5890: 61 63 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72  ace, then this r
58a0: 6f 75 74 69 6e 65 20 61 75 74 6f 6d 61 74 69 63  outine automatic
58b0: 61 6c 6c 79 0a 2a 2a 20 63 61 6c 6c 73 20 64 65  ally.** calls de
58c0: 66 72 61 67 65 6d 65 6e 74 50 61 67 65 28 29 20  fragementPage() 
58d0: 74 6f 20 63 6f 6e 73 6f 6c 69 64 61 74 65 20 61  to consolidate a
58e0: 6c 6c 20 66 72 65 65 20 73 70 61 63 65 20 62 65  ll free space be
58f0: 66 6f 72 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74  fore .** allocat
5900: 69 6e 67 20 74 68 65 20 6e 65 77 20 63 68 75 6e  ing the new chun
5910: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
5920: 20 61 6c 6c 6f 63 61 74 65 53 70 61 63 65 28 4d   allocateSpace(M
5930: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69  emPage *pPage, i
5940: 6e 74 20 6e 42 79 74 65 29 7b 0a 20 20 69 6e 74  nt nByte){.  int
5950: 20 61 64 64 72 2c 20 70 63 2c 20 68 64 72 3b 0a   addr, pc, hdr;.
5960: 20 20 69 6e 74 20 73 69 7a 65 3b 0a 20 20 69 6e    int size;.  in
5970: 74 20 6e 46 72 61 67 3b 0a 20 20 69 6e 74 20 74  t nFrag;.  int t
5980: 6f 70 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b  op;.  int nCell;
5990: 0a 20 20 69 6e 74 20 63 65 6c 6c 4f 66 66 73 65  .  int cellOffse
59a0: 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  t;.  unsigned ch
59b0: 61 72 20 2a 64 61 74 61 3b 0a 20 20 0a 20 20 64  ar *data;.  .  d
59c0: 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61  ata = pPage->aDa
59d0: 74 61 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ta;.  assert( sq
59e0: 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
59f0: 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
5a00: 50 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72  Page) );.  asser
5a10: 74 28 20 70 50 61 67 65 2d 3e 70 42 74 20 29 3b  t( pPage->pBt );
5a20: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
5a30: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
5a40: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
5a50: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6e 42   );.  assert( nB
5a60: 79 74 65 3e 3d 30 20 29 3b 20 20 2f 2a 20 4d 69  yte>=0 );  /* Mi
5a70: 6e 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20  nimum cell size 
5a80: 69 73 20 34 20 2a 2f 0a 20 20 61 73 73 65 72 74  is 4 */.  assert
5a90: 28 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 3e 3d  ( pPage->nFree>=
5aa0: 6e 42 79 74 65 20 29 3b 0a 20 20 61 73 73 65 72  nByte );.  asser
5ab0: 74 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66  t( pPage->nOverf
5ac0: 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 70 50 61 67  low==0 );.  pPag
5ad0: 65 2d 3e 6e 46 72 65 65 20 2d 3d 20 6e 42 79 74  e->nFree -= nByt
5ae0: 65 3b 0a 20 20 68 64 72 20 3d 20 70 50 61 67 65  e;.  hdr = pPage
5af0: 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 0a 20 20  ->hdrOffset;..  
5b00: 6e 46 72 61 67 20 3d 20 64 61 74 61 5b 68 64 72  nFrag = data[hdr
5b10: 2b 37 5d 3b 0a 20 20 69 66 28 20 6e 46 72 61 67  +7];.  if( nFrag
5b20: 3c 36 30 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65  <60 ){.    /* Se
5b30: 61 72 63 68 20 74 68 65 20 66 72 65 65 6c 69 73  arch the freelis
5b40: 74 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20  t looking for a 
5b50: 73 6c 6f 74 20 62 69 67 20 65 6e 6f 75 67 68 20  slot big enough 
5b60: 74 6f 20 73 61 74 69 73 66 79 20 74 68 65 0a 20  to satisfy the. 
5b70: 20 20 20 2a 2a 20 73 70 61 63 65 20 72 65 71 75     ** space requ
5b80: 65 73 74 2e 20 2a 2f 0a 20 20 20 20 61 64 64 72  est. */.    addr
5b90: 20 3d 20 68 64 72 2b 31 3b 0a 20 20 20 20 77 68   = hdr+1;.    wh
5ba0: 69 6c 65 28 20 28 70 63 20 3d 20 67 65 74 32 62  ile( (pc = get2b
5bb0: 79 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29  yte(&data[addr])
5bc0: 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 69 7a  )>0 ){.      siz
5bd0: 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
5be0: 74 61 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20  ta[pc+2]);.     
5bf0: 20 69 66 28 20 73 69 7a 65 3e 3d 6e 42 79 74 65   if( size>=nByte
5c00: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
5c10: 73 69 7a 65 3c 6e 42 79 74 65 2b 34 20 29 7b 0a  size<nByte+4 ){.
5c20: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
5c30: 28 26 64 61 74 61 5b 61 64 64 72 5d 2c 20 26 64  (&data[addr], &d
5c40: 61 74 61 5b 70 63 5d 2c 20 32 29 3b 0a 20 20 20  ata[pc], 2);.   
5c50: 20 20 20 20 20 20 20 64 61 74 61 5b 68 64 72 2b         data[hdr+
5c60: 37 5d 20 3d 20 6e 46 72 61 67 20 2b 20 73 69 7a  7] = nFrag + siz
5c70: 65 20 2d 20 6e 42 79 74 65 3b 0a 20 20 20 20 20  e - nByte;.     
5c80: 20 20 20 20 20 72 65 74 75 72 6e 20 70 63 3b 0a       return pc;.
5c90: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
5ca0: 20 20 20 20 20 20 20 20 20 70 75 74 32 62 79 74           put2byt
5cb0: 65 28 26 64 61 74 61 5b 70 63 2b 32 5d 2c 20 73  e(&data[pc+2], s
5cc0: 69 7a 65 2d 6e 42 79 74 65 29 3b 0a 20 20 20 20  ize-nByte);.    
5cd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 63 20        return pc 
5ce0: 2b 20 73 69 7a 65 20 2d 20 6e 42 79 74 65 3b 0a  + size - nByte;.
5cf0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5d00: 7d 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 70  }.      addr = p
5d10: 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  c;.    }.  }..  
5d20: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f  /* Allocate memo
5d30: 72 79 20 66 72 6f 6d 20 74 68 65 20 67 61 70 20  ry from the gap 
5d40: 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 63  in between the c
5d50: 65 6c 6c 20 70 6f 69 6e 74 65 72 20 61 72 72 61  ell pointer arra
5d60: 79 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 63  y.  ** and the c
5d70: 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 61 72 65 61  ell content area
5d80: 2e 0a 20 20 2a 2f 0a 20 20 74 6f 70 20 3d 20 67  ..  */.  top = g
5d90: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64  et2byte(&data[hd
5da0: 72 2b 35 5d 29 3b 0a 20 20 6e 43 65 6c 6c 20 3d  r+5]);.  nCell =
5db0: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
5dc0: 68 64 72 2b 33 5d 29 3b 0a 20 20 63 65 6c 6c 4f  hdr+3]);.  cellO
5dd0: 66 66 73 65 74 20 3d 20 70 50 61 67 65 2d 3e 63  ffset = pPage->c
5de0: 65 6c 6c 4f 66 66 73 65 74 3b 0a 20 20 69 66 28  ellOffset;.  if(
5df0: 20 6e 46 72 61 67 3e 3d 36 30 20 7c 7c 20 63 65   nFrag>=60 || ce
5e00: 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43 65  llOffset + 2*nCe
5e10: 6c 6c 20 3e 20 74 6f 70 20 2d 20 6e 42 79 74 65  ll > top - nByte
5e20: 20 29 7b 0a 20 20 20 20 64 65 66 72 61 67 6d 65   ){.    defragme
5e30: 6e 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  ntPage(pPage);. 
5e40: 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74     top = get2byt
5e50: 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b  e(&data[hdr+5]);
5e60: 0a 20 20 7d 0a 20 20 74 6f 70 20 2d 3d 20 6e 42  .  }.  top -= nB
5e70: 79 74 65 3b 0a 20 20 61 73 73 65 72 74 28 20 63  yte;.  assert( c
5e80: 65 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 6e 43  ellOffset + 2*nC
5e90: 65 6c 6c 20 3c 3d 20 74 6f 70 20 29 3b 0a 20 20  ell <= top );.  
5ea0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  put2byte(&data[h
5eb0: 64 72 2b 35 5d 2c 20 74 6f 70 29 3b 0a 20 20 72  dr+5], top);.  r
5ec0: 65 74 75 72 6e 20 74 6f 70 3b 0a 7d 0a 0a 2f 2a  eturn top;.}../*
5ed0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 65 63  .** Return a sec
5ee0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 50 61 67  tion of the pPag
5ef0: 65 2d 3e 61 44 61 74 61 20 74 6f 20 74 68 65 20  e->aData to the 
5f00: 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 20 54 68 65  freelist..** The
5f10: 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74   first byte of t
5f20: 68 65 20 6e 65 77 20 66 72 65 65 20 62 6c 6f 63  he new free bloc
5f30: 6b 20 69 73 20 70 50 61 67 65 2d 3e 61 44 69 73  k is pPage->aDis
5f40: 6b 5b 73 74 61 72 74 5d 0a 2a 2a 20 61 6e 64 20  k[start].** and 
5f50: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
5f60: 62 6c 6f 63 6b 20 69 73 20 22 73 69 7a 65 22 20  block is "size" 
5f70: 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 73  bytes..**.** Mos
5f80: 74 20 6f 66 20 74 68 65 20 65 66 66 6f 72 74 20  t of the effort 
5f90: 68 65 72 65 20 69 73 20 69 6e 76 6f 6c 76 65 64  here is involved
5fa0: 20 69 6e 20 63 6f 61 6c 65 73 69 6e 67 20 61 64   in coalesing ad
5fb0: 6a 61 63 65 6e 74 0a 2a 2a 20 66 72 65 65 20 62  jacent.** free b
5fc0: 6c 6f 63 6b 73 20 69 6e 74 6f 20 61 20 73 69 6e  locks into a sin
5fd0: 67 6c 65 20 62 69 67 20 66 72 65 65 20 62 6c 6f  gle big free blo
5fe0: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
5ff0: 69 64 20 66 72 65 65 53 70 61 63 65 28 4d 65 6d  id freeSpace(Mem
6000: 50 61 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74  Page *pPage, int
6010: 20 73 74 61 72 74 2c 20 69 6e 74 20 73 69 7a 65   start, int size
6020: 29 7b 0a 20 20 69 6e 74 20 61 64 64 72 2c 20 70  ){.  int addr, p
6030: 62 65 67 69 6e 2c 20 68 64 72 3b 0a 20 20 75 6e  begin, hdr;.  un
6040: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
6050: 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
6060: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
6070: 67 65 2d 3e 70 42 74 21 3d 30 20 29 3b 0a 20 20  ge->pBt!=0 );.  
6080: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
6090: 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
60a0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
60b0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 74 61  );.  assert( sta
60c0: 72 74 3e 3d 70 50 61 67 65 2d 3e 68 64 72 4f 66  rt>=pPage->hdrOf
60d0: 66 73 65 74 2b 36 2b 28 70 50 61 67 65 2d 3e 6c  fset+6+(pPage->l
60e0: 65 61 66 3f 30 3a 34 29 20 29 3b 0a 20 20 61 73  eaf?0:4) );.  as
60f0: 73 65 72 74 28 20 28 73 74 61 72 74 20 2b 20 73  sert( (start + s
6100: 69 7a 65 29 3c 3d 70 50 61 67 65 2d 3e 70 42 74  ize)<=pPage->pBt
6110: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 29 3b 0a  ->usableSize );.
6120: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
6130: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
6140: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
6150: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  );.  assert( siz
6160: 65 3e 3d 30 20 29 3b 20 20 20 2f 2a 20 4d 69 6e  e>=0 );   /* Min
6170: 69 6d 75 6d 20 63 65 6c 6c 20 73 69 7a 65 20 69  imum cell size i
6180: 73 20 34 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  s 4 */..#ifdef S
6190: 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
61a0: 45 54 45 0a 20 20 2f 2a 20 4f 76 65 72 77 72 69  ETE.  /* Overwri
61b0: 74 65 20 64 65 6c 65 74 65 64 20 69 6e 66 6f 72  te deleted infor
61c0: 6d 61 74 69 6f 6e 20 77 69 74 68 20 7a 65 72 6f  mation with zero
61d0: 73 20 77 68 65 6e 20 74 68 65 20 53 45 43 55 52  s when the SECUR
61e0: 45 5f 44 45 4c 45 54 45 20 0a 20 20 2a 2a 20 6f  E_DELETE .  ** o
61f0: 70 74 69 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64  ption is enabled
6200: 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
6210: 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 64 61   */.  memset(&da
6220: 74 61 5b 73 74 61 72 74 5d 2c 20 30 2c 20 73 69  ta[start], 0, si
6230: 7a 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  ze);.#endif..  /
6240: 2a 20 41 64 64 20 74 68 65 20 73 70 61 63 65 20  * Add the space 
6250: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 6c 69  back into the li
6260: 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 66 72 65  nked list of fre
6270: 65 62 6c 6f 63 6b 73 20 2a 2f 0a 20 20 68 64 72  eblocks */.  hdr
6280: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
6290: 73 65 74 3b 0a 20 20 61 64 64 72 20 3d 20 68 64  set;.  addr = hd
62a0: 72 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20  r + 1;.  while( 
62b0: 28 70 62 65 67 69 6e 20 3d 20 67 65 74 32 62 79  (pbegin = get2by
62c0: 74 65 28 26 64 61 74 61 5b 61 64 64 72 5d 29 29  te(&data[addr]))
62d0: 3c 73 74 61 72 74 20 26 26 20 70 62 65 67 69 6e  <start && pbegin
62e0: 3e 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  >0 ){.    assert
62f0: 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d  ( pbegin<=pPage-
6300: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
6310: 2d 34 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  -4 );.    assert
6320: 28 20 70 62 65 67 69 6e 3e 61 64 64 72 20 29 3b  ( pbegin>addr );
6330: 0a 20 20 20 20 61 64 64 72 20 3d 20 70 62 65 67  .    addr = pbeg
6340: 69 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  in;.  }.  assert
6350: 28 20 70 62 65 67 69 6e 3c 3d 70 50 61 67 65 2d  ( pbegin<=pPage-
6360: 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  >pBt->usableSize
6370: 2d 34 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  -4 );.  assert( 
6380: 70 62 65 67 69 6e 3e 61 64 64 72 20 7c 7c 20 70  pbegin>addr || p
6390: 62 65 67 69 6e 3d 3d 30 20 29 3b 0a 20 20 70 75  begin==0 );.  pu
63a0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 61 64 64  t2byte(&data[add
63b0: 72 5d 2c 20 73 74 61 72 74 29 3b 0a 20 20 70 75  r], start);.  pu
63c0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 73 74 61  t2byte(&data[sta
63d0: 72 74 5d 2c 20 70 62 65 67 69 6e 29 3b 0a 20 20  rt], pbegin);.  
63e0: 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 73  put2byte(&data[s
63f0: 74 61 72 74 2b 32 5d 2c 20 73 69 7a 65 29 3b 0a  tart+2], size);.
6400: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 2b    pPage->nFree +
6410: 3d 20 73 69 7a 65 3b 0a 0a 20 20 2f 2a 20 43 6f  = size;..  /* Co
6420: 61 6c 65 73 63 65 20 61 64 6a 61 63 65 6e 74 20  alesce adjacent 
6430: 66 72 65 65 20 62 6c 6f 63 6b 73 20 2a 2f 0a 20  free blocks */. 
6440: 20 61 64 64 72 20 3d 20 70 50 61 67 65 2d 3e 68   addr = pPage->h
6450: 64 72 4f 66 66 73 65 74 20 2b 20 31 3b 0a 20 20  drOffset + 1;.  
6460: 77 68 69 6c 65 28 20 28 70 62 65 67 69 6e 20 3d  while( (pbegin =
6470: 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b   get2byte(&data[
6480: 61 64 64 72 5d 29 29 3e 30 20 29 7b 0a 20 20 20  addr]))>0 ){.   
6490: 20 69 6e 74 20 70 6e 65 78 74 2c 20 70 73 69 7a   int pnext, psiz
64a0: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
64b0: 62 65 67 69 6e 3e 61 64 64 72 20 29 3b 0a 20 20  begin>addr );.  
64c0: 20 20 61 73 73 65 72 74 28 20 70 62 65 67 69 6e    assert( pbegin
64d0: 3c 3d 70 50 61 67 65 2d 3e 70 42 74 2d 3e 75 73  <=pPage->pBt->us
64e0: 61 62 6c 65 53 69 7a 65 2d 34 20 29 3b 0a 20 20  ableSize-4 );.  
64f0: 20 20 70 6e 65 78 74 20 3d 20 67 65 74 32 62 79    pnext = get2by
6500: 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 5d  te(&data[pbegin]
6510: 29 3b 0a 20 20 20 20 70 73 69 7a 65 20 3d 20 67  );.    psize = g
6520: 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70 62  et2byte(&data[pb
6530: 65 67 69 6e 2b 32 5d 29 3b 0a 20 20 20 20 69 66  egin+2]);.    if
6540: 28 20 70 62 65 67 69 6e 20 2b 20 70 73 69 7a 65  ( pbegin + psize
6550: 20 2b 20 33 20 3e 3d 20 70 6e 65 78 74 20 26 26   + 3 >= pnext &&
6560: 20 70 6e 65 78 74 3e 30 20 29 7b 0a 20 20 20 20   pnext>0 ){.    
6570: 20 20 69 6e 74 20 66 72 61 67 20 3d 20 70 6e 65    int frag = pne
6580: 78 74 20 2d 20 28 70 62 65 67 69 6e 2b 70 73 69  xt - (pbegin+psi
6590: 7a 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ze);.      asser
65a0: 74 28 20 66 72 61 67 3c 3d 64 61 74 61 5b 70 50  t( frag<=data[pP
65b0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 37  age->hdrOffset+7
65c0: 5d 20 29 3b 0a 20 20 20 20 20 20 64 61 74 61 5b  ] );.      data[
65d0: 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
65e0: 2b 37 5d 20 2d 3d 20 66 72 61 67 3b 0a 20 20 20  +7] -= frag;.   
65f0: 20 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74     put2byte(&dat
6600: 61 5b 70 62 65 67 69 6e 5d 2c 20 67 65 74 32 62  a[pbegin], get2b
6610: 79 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 5d  yte(&data[pnext]
6620: 29 29 3b 0a 20 20 20 20 20 20 70 75 74 32 62 79  ));.      put2by
6630: 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e 2b  te(&data[pbegin+
6640: 32 5d 2c 20 70 6e 65 78 74 2b 67 65 74 32 62 79  2], pnext+get2by
6650: 74 65 28 26 64 61 74 61 5b 70 6e 65 78 74 2b 32  te(&data[pnext+2
6660: 5d 29 2d 70 62 65 67 69 6e 29 3b 0a 20 20 20 20  ])-pbegin);.    
6670: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 64 64  }else{.      add
6680: 72 20 3d 20 70 62 65 67 69 6e 3b 0a 20 20 20 20  r = pbegin;.    
6690: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
66a0: 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20  he cell content 
66b0: 61 72 65 61 20 62 65 67 69 6e 73 20 77 69 74 68  area begins with
66c0: 20 61 20 66 72 65 65 62 6c 6f 63 6b 2c 20 72 65   a freeblock, re
66d0: 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 69 66  move it. */.  if
66e0: 28 20 64 61 74 61 5b 68 64 72 2b 31 5d 3d 3d 64  ( data[hdr+1]==d
66f0: 61 74 61 5b 68 64 72 2b 35 5d 20 26 26 20 64 61  ata[hdr+5] && da
6700: 74 61 5b 68 64 72 2b 32 5d 3d 3d 64 61 74 61 5b  ta[hdr+2]==data[
6710: 68 64 72 2b 36 5d 20 29 7b 0a 20 20 20 20 69 6e  hdr+6] ){.    in
6720: 74 20 74 6f 70 3b 0a 20 20 20 20 70 62 65 67 69  t top;.    pbegi
6730: 6e 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  n = get2byte(&da
6740: 74 61 5b 68 64 72 2b 31 5d 29 3b 0a 20 20 20 20  ta[hdr+1]);.    
6750: 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 68 64 72  memcpy(&data[hdr
6760: 2b 31 5d 2c 20 26 64 61 74 61 5b 70 62 65 67 69  +1], &data[pbegi
6770: 6e 5d 2c 20 32 29 3b 0a 20 20 20 20 74 6f 70 20  n], 2);.    top 
6780: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
6790: 5b 68 64 72 2b 35 5d 29 3b 0a 20 20 20 20 70 75  [hdr+5]);.    pu
67a0: 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
67b0: 2b 35 5d 2c 20 74 6f 70 20 2b 20 67 65 74 32 62  +5], top + get2b
67c0: 79 74 65 28 26 64 61 74 61 5b 70 62 65 67 69 6e  yte(&data[pbegin
67d0: 2b 32 5d 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  +2]));.  }.}../*
67e0: 0a 2a 2a 20 44 65 63 6f 64 65 20 74 68 65 20 66  .** Decode the f
67f0: 6c 61 67 73 20 62 79 74 65 20 28 74 68 65 20 66  lags byte (the f
6800: 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68 65  irst byte of the
6810: 20 68 65 61 64 65 72 29 20 66 6f 72 20 61 20 70   header) for a p
6820: 61 67 65 0a 2a 2a 20 61 6e 64 20 69 6e 69 74 69  age.** and initi
6830: 61 6c 69 7a 65 20 66 69 65 6c 64 73 20 6f 66 20  alize fields of 
6840: 74 68 65 20 4d 65 6d 50 61 67 65 20 73 74 72 75  the MemPage stru
6850: 63 74 75 72 65 20 61 63 63 6f 72 64 69 6e 67 6c  cture accordingl
6860: 79 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79 20 74 68  y..**.** Only th
6870: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 62  e following comb
6880: 69 6e 61 74 69 6f 6e 73 20 61 72 65 20 73 75 70  inations are sup
6890: 70 6f 72 74 65 64 2e 20 20 41 6e 79 74 68 69 6e  ported.  Anythin
68a0: 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a 20 69  g different.** i
68b0: 6e 64 69 63 61 74 65 73 20 61 20 63 6f 72 72 75  ndicates a corru
68c0: 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  pt database file
68d0: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20  s:.**.**        
68e0: 20 50 54 46 5f 5a 45 52 4f 44 41 54 41 0a 2a 2a   PTF_ZERODATA.**
68f0: 20 20 20 20 20 20 20 20 20 50 54 46 5f 5a 45 52           PTF_ZER
6900: 4f 44 41 54 41 20 7c 20 50 54 46 5f 4c 45 41 46  ODATA | PTF_LEAF
6910: 0a 2a 2a 20 20 20 20 20 20 20 20 20 50 54 46 5f  .**         PTF_
6920: 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46 5f 49  LEAFDATA | PTF_I
6930: 4e 54 4b 45 59 0a 2a 2a 20 20 20 20 20 20 20 20  NTKEY.**        
6940: 20 50 54 46 5f 4c 45 41 46 44 41 54 41 20 7c 20   PTF_LEAFDATA | 
6950: 50 54 46 5f 49 4e 54 4b 45 59 20 7c 20 50 54 46  PTF_INTKEY | PTF
6960: 5f 4c 45 41 46 0a 2a 2f 0a 73 74 61 74 69 63 20  _LEAF.*/.static 
6970: 69 6e 74 20 64 65 63 6f 64 65 46 6c 61 67 73 28  int decodeFlags(
6980: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
6990: 69 6e 74 20 66 6c 61 67 42 79 74 65 29 7b 0a 20  int flagByte){. 
69a0: 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20   BtShared *pBt; 
69b0: 20 20 20 20 2f 2a 20 41 20 63 6f 70 79 20 6f 66      /* A copy of
69c0: 20 70 50 61 67 65 2d 3e 70 42 74 20 2a 2f 0a 0a   pPage->pBt */..
69d0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
69e0: 3e 68 64 72 4f 66 66 73 65 74 3d 3d 28 70 50 61  >hdrOffset==(pPa
69f0: 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30  ge->pgno==1 ? 10
6a00: 30 20 3a 20 30 29 20 29 3b 0a 20 20 61 73 73 65  0 : 0) );.  asse
6a10: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
6a20: 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42  x_held(pPage->pB
6a30: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
6a40: 50 61 67 65 2d 3e 6c 65 61 66 20 3d 20 66 6c 61  Page->leaf = fla
6a50: 67 42 79 74 65 3e 3e 33 3b 20 20 61 73 73 65 72  gByte>>3;  asser
6a60: 74 28 20 50 54 46 5f 4c 45 41 46 20 3d 3d 20 31  t( PTF_LEAF == 1
6a70: 3c 3c 33 20 29 3b 0a 20 20 66 6c 61 67 42 79 74  <<3 );.  flagByt
6a80: 65 20 26 3d 20 7e 50 54 46 5f 4c 45 41 46 3b 0a  e &= ~PTF_LEAF;.
6a90: 20 20 70 50 61 67 65 2d 3e 63 68 69 6c 64 50 74    pPage->childPt
6aa0: 72 53 69 7a 65 20 3d 20 34 2d 34 2a 70 50 61 67  rSize = 4-4*pPag
6ab0: 65 2d 3e 6c 65 61 66 3b 0a 20 20 70 42 74 20 3d  e->leaf;.  pBt =
6ac0: 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69   pPage->pBt;.  i
6ad0: 66 28 20 66 6c 61 67 42 79 74 65 3d 3d 28 50 54  f( flagByte==(PT
6ae0: 46 5f 4c 45 41 46 44 41 54 41 20 7c 20 50 54 46  F_LEAFDATA | PTF
6af0: 5f 49 4e 54 4b 45 59 29 20 29 7b 0a 20 20 20 20  _INTKEY) ){.    
6b00: 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 3d 20  pPage->intKey = 
6b10: 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 68 61  1;.    pPage->ha
6b20: 73 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e 6c  sData = pPage->l
6b30: 65 61 66 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  eaf;.    pPage->
6b40: 6d 61 78 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e  maxLocal = pBt->
6b50: 6d 61 78 4c 65 61 66 3b 0a 20 20 20 20 70 50 61  maxLeaf;.    pPa
6b60: 67 65 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70  ge->minLocal = p
6b70: 42 74 2d 3e 6d 69 6e 4c 65 61 66 3b 0a 20 20 7d  Bt->minLeaf;.  }
6b80: 65 6c 73 65 20 69 66 28 20 66 6c 61 67 42 79 74  else if( flagByt
6b90: 65 3d 3d 50 54 46 5f 5a 45 52 4f 44 41 54 41 20  e==PTF_ZERODATA 
6ba0: 29 7b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 6e  ){.    pPage->in
6bb0: 74 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 70 50  tKey = 0;.    pP
6bc0: 61 67 65 2d 3e 68 61 73 44 61 74 61 20 3d 20 30  age->hasData = 0
6bd0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6d 61 78  ;.    pPage->max
6be0: 4c 6f 63 61 6c 20 3d 20 70 42 74 2d 3e 6d 61 78  Local = pBt->max
6bf0: 4c 6f 63 61 6c 3b 0a 20 20 20 20 70 50 61 67 65  Local;.    pPage
6c00: 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20 70 42 74  ->minLocal = pBt
6c10: 2d 3e 6d 69 6e 4c 6f 63 61 6c 3b 0a 20 20 7d 65  ->minLocal;.  }e
6c20: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
6c30: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
6c40: 4b 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  KPT;.  }.  retur
6c50: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
6c60: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
6c70: 20 74 68 65 20 61 75 78 69 6c 69 61 72 79 20 69   the auxiliary i
6c80: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61  nformation for a
6c90: 20 64 69 73 6b 20 62 6c 6f 63 6b 2e 0a 2a 2a 0a   disk block..**.
6ca0: 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
6cb0: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  _OK on success. 
6cc0: 20 49 66 20 77 65 20 73 65 65 20 74 68 61 74 20   If we see that 
6cd0: 74 68 65 20 70 61 67 65 20 64 6f 65 73 0a 2a 2a  the page does.**
6ce0: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 77   not contain a w
6cf0: 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62  ell-formed datab
6d00: 61 73 65 20 70 61 67 65 2c 20 74 68 65 6e 20 72  ase page, then r
6d10: 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45  eturn .** SQLITE
6d20: 5f 43 4f 52 52 55 50 54 2e 20 20 4e 6f 74 65 20  _CORRUPT.  Note 
6d30: 74 68 61 74 20 61 20 72 65 74 75 72 6e 20 6f 66  that a return of
6d40: 20 53 51 4c 49 54 45 5f 4f 4b 20 64 6f 65 73 20   SQLITE_OK does 
6d50: 6e 6f 74 0a 2a 2a 20 67 75 61 72 61 6e 74 65 65  not.** guarantee
6d60: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
6d70: 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20  s well-formed.  
6d80: 49 74 20 6f 6e 6c 79 20 73 68 6f 77 73 20 74 68  It only shows th
6d90: 61 74 0a 2a 2a 20 77 65 20 66 61 69 6c 65 64 20  at.** we failed 
6da0: 74 6f 20 64 65 74 65 63 74 20 61 6e 79 20 63 6f  to detect any co
6db0: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  rruption..*/.int
6dc0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69   sqlite3BtreeIni
6dd0: 74 50 61 67 65 28 4d 65 6d 50 61 67 65 20 2a 70  tPage(MemPage *p
6de0: 50 61 67 65 29 7b 0a 0a 20 20 61 73 73 65 72 74  Page){..  assert
6df0: 28 20 70 50 61 67 65 2d 3e 70 42 74 21 3d 30 20  ( pPage->pBt!=0 
6e00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
6e10: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
6e20: 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65  pPage->pBt->mute
6e30: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
6e40: 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 73 71 6c  pPage->pgno==sql
6e50: 69 74 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d  ite3PagerPagenum
6e60: 62 65 72 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ber(pPage->pDbPa
6e70: 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
6e80: 20 70 50 61 67 65 20 3d 3d 20 73 71 6c 69 74 65   pPage == sqlite
6e90: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
6ea0: 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20 29  Page->pDbPage) )
6eb0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
6ec0: 65 2d 3e 61 44 61 74 61 20 3d 3d 20 73 71 6c 69  e->aData == sqli
6ed0: 74 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28  te3PagerGetData(
6ee0: 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 20  pPage->pDbPage) 
6ef0: 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65  );..  if( !pPage
6f00: 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20  ->isInit ){.    
6f10: 69 6e 74 20 70 63 3b 20 20 20 20 20 20 20 20 20  int pc;         
6f20: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
6f30: 20 61 20 66 72 65 65 62 6c 6f 63 6b 20 77 69 74   a freeblock wit
6f40: 68 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74 61  hin pPage->aData
6f50: 5b 5d 20 2a 2f 0a 20 20 20 20 69 6e 74 20 68 64  [] */.    int hd
6f60: 72 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  r;           /* 
6f70: 4f 66 66 73 65 74 20 74 6f 20 62 65 67 69 6e 6e  Offset to beginn
6f80: 69 6e 67 20 6f 66 20 70 61 67 65 20 68 65 61 64  ing of page head
6f90: 65 72 20 2a 2f 0a 20 20 20 20 75 38 20 2a 64 61  er */.    u8 *da
6fa0: 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ta;          /* 
6fb0: 45 71 75 61 6c 20 74 6f 20 70 50 61 67 65 2d 3e  Equal to pPage->
6fc0: 61 44 61 74 61 20 2a 2f 0a 20 20 20 20 42 74 53  aData */.    BtS
6fd0: 68 61 72 65 64 20 2a 70 42 74 3b 20 20 20 20 20  hared *pBt;     
6fe0: 20 20 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 62     /* The main b
6ff0: 74 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a  tree structure *
7000: 2f 0a 20 20 20 20 69 6e 74 20 75 73 61 62 6c 65  /.    int usable
7010: 53 69 7a 65 3b 20 20 20 20 2f 2a 20 41 6d 6f 75  Size;    /* Amou
7020: 6e 74 20 6f 66 20 75 73 61 62 6c 65 20 73 70 61  nt of usable spa
7030: 63 65 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  ce on each page 
7040: 2a 2f 0a 20 20 20 20 69 6e 74 20 63 65 6c 6c 4f  */.    int cellO
7050: 66 66 73 65 74 3b 20 20 20 20 2f 2a 20 4f 66 66  ffset;    /* Off
7060: 73 65 74 20 66 72 6f 6d 20 73 74 61 72 74 20 6f  set from start o
7070: 66 20 70 61 67 65 20 74 6f 20 66 69 72 73 74 20  f page to first 
7080: 63 65 6c 6c 20 70 6f 69 6e 74 65 72 20 2a 2f 0a  cell pointer */.
7090: 20 20 20 20 69 6e 74 20 6e 46 72 65 65 3b 20 20      int nFree;  
70a0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
70b0: 20 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73   of unused bytes
70c0: 20 6f 6e 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   on the page */.
70d0: 20 20 20 20 69 6e 74 20 74 6f 70 3b 20 20 20 20      int top;    
70e0: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
70f0: 62 79 74 65 20 6f 66 20 74 68 65 20 63 65 6c 6c  byte of the cell
7100: 20 63 6f 6e 74 65 6e 74 20 61 72 65 61 20 2a 2f   content area */
7110: 0a 0a 20 20 20 20 70 42 74 20 3d 20 70 50 61 67  ..    pBt = pPag
7120: 65 2d 3e 70 42 74 3b 0a 0a 20 20 20 20 68 64 72  e->pBt;..    hdr
7130: 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
7140: 73 65 74 3b 0a 20 20 20 20 64 61 74 61 20 3d 20  set;.    data = 
7150: 70 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20  pPage->aData;.  
7160: 20 20 69 66 28 20 64 65 63 6f 64 65 46 6c 61 67    if( decodeFlag
7170: 73 28 70 50 61 67 65 2c 20 64 61 74 61 5b 68 64  s(pPage, data[hd
7180: 72 5d 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  r]) ) return SQL
7190: 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54  ITE_CORRUPT_BKPT
71a0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  ;.    assert( pB
71b0: 74 2d 3e 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  t->pageSize>=512
71c0: 20 26 26 20 70 42 74 2d 3e 70 61 67 65 53 69 7a   && pBt->pageSiz
71d0: 65 3c 3d 33 32 37 36 38 20 29 3b 0a 20 20 20 20  e<=32768 );.    
71e0: 70 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20  pPage->maskPage 
71f0: 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  = pBt->pageSize 
7200: 2d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e  - 1;.    pPage->
7210: 6e 4f 76 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20  nOverflow = 0;. 
7220: 20 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d 20     usableSize = 
7230: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
7240: 0a 20 20 20 20 70 50 61 67 65 2d 3e 63 65 6c 6c  .    pPage->cell
7250: 4f 66 66 73 65 74 20 3d 20 63 65 6c 6c 4f 66 66  Offset = cellOff
7260: 73 65 74 20 3d 20 68 64 72 20 2b 20 31 32 20 2d  set = hdr + 12 -
7270: 20 34 2a 70 50 61 67 65 2d 3e 6c 65 61 66 3b 0a   4*pPage->leaf;.
7280: 20 20 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79      top = get2by
7290: 74 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29  te(&data[hdr+5])
72a0: 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43 65  ;.    pPage->nCe
72b0: 6c 6c 20 3d 20 67 65 74 32 62 79 74 65 28 26 64  ll = get2byte(&d
72c0: 61 74 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20  ata[hdr+3]);.   
72d0: 20 69 66 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c   if( pPage->nCel
72e0: 6c 3e 4d 58 5f 43 45 4c 4c 28 70 42 74 29 20 29  l>MX_CELL(pBt) )
72f0: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 6f 20 6d 61  {.      /* To ma
7300: 6e 79 20 63 65 6c 6c 73 20 66 6f 72 20 61 20 73  ny cells for a s
7310: 69 6e 67 6c 65 20 70 61 67 65 2e 20 20 54 68 65  ingle page.  The
7320: 20 70 61 67 65 20 6d 75 73 74 20 62 65 20 63 6f   page must be co
7330: 72 72 75 70 74 20 2a 2f 0a 20 20 20 20 20 20 72  rrupt */.      r
7340: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
7350: 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d  RUPT_BKPT;.    }
7360: 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6f 6d 70 75  .  .    /* Compu
7370: 74 65 20 74 68 65 20 74 6f 74 61 6c 20 66 72 65  te the total fre
7380: 65 20 73 70 61 63 65 20 6f 6e 20 74 68 65 20 70  e space on the p
7390: 61 67 65 20 2a 2f 0a 20 20 20 20 70 63 20 3d 20  age */.    pc = 
73a0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 68  get2byte(&data[h
73b0: 64 72 2b 31 5d 29 3b 0a 20 20 20 20 6e 46 72 65  dr+1]);.    nFre
73c0: 65 20 3d 20 64 61 74 61 5b 68 64 72 2b 37 5d 20  e = data[hdr+7] 
73d0: 2b 20 74 6f 70 20 2d 20 28 63 65 6c 6c 4f 66 66  + top - (cellOff
73e0: 73 65 74 20 2b 20 32 2a 70 50 61 67 65 2d 3e 6e  set + 2*pPage->n
73f0: 43 65 6c 6c 29 3b 0a 20 20 20 20 77 68 69 6c 65  Cell);.    while
7400: 28 20 70 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  ( pc>0 ){.      
7410: 69 6e 74 20 6e 65 78 74 2c 20 73 69 7a 65 3b 0a  int next, size;.
7420: 20 20 20 20 20 20 69 66 28 20 70 63 3e 75 73 61        if( pc>usa
7430: 62 6c 65 53 69 7a 65 2d 34 20 29 7b 0a 20 20 20  bleSize-4 ){.   
7440: 20 20 20 20 20 2f 2a 20 46 72 65 65 20 62 6c 6f       /* Free blo
7450: 63 6b 20 69 73 20 6f 66 66 20 74 68 65 20 70 61  ck is off the pa
7460: 67 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65  ge */.        re
7470: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
7480: 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20  UPT_BKPT; .     
7490: 20 7d 0a 20 20 20 20 20 20 6e 65 78 74 20 3d 20   }.      next = 
74a0: 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  get2byte(&data[p
74b0: 63 5d 29 3b 0a 20 20 20 20 20 20 73 69 7a 65 20  c]);.      size 
74c0: 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74 61  = get2byte(&data
74d0: 5b 70 63 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69  [pc+2]);.      i
74e0: 66 28 20 6e 65 78 74 3e 30 20 26 26 20 6e 65 78  f( next>0 && nex
74f0: 74 3c 3d 70 63 2b 73 69 7a 65 2b 33 20 29 7b 0a  t<=pc+size+3 ){.
7500: 20 20 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20          /* Free 
7510: 62 6c 6f 63 6b 73 20 6d 75 73 74 20 62 65 20 69  blocks must be i
7520: 6e 20 61 63 63 65 6e 64 69 6e 67 20 6f 72 64 65  n accending orde
7530: 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 65 74  r */.        ret
7540: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
7550: 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20 20 20 20  PT_BKPT; .      
7560: 7d 0a 20 20 20 20 20 20 6e 46 72 65 65 20 2b 3d  }.      nFree +=
7570: 20 73 69 7a 65 3b 0a 20 20 20 20 20 20 70 63 20   size;.      pc 
7580: 3d 20 6e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  = next;.    }.  
7590: 20 20 70 50 61 67 65 2d 3e 6e 46 72 65 65 20 3d    pPage->nFree =
75a0: 20 6e 46 72 65 65 3b 0a 20 20 20 20 69 66 28 20   nFree;.    if( 
75b0: 6e 46 72 65 65 3e 3d 75 73 61 62 6c 65 53 69 7a  nFree>=usableSiz
75c0: 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 46 72  e ){.      /* Fr
75d0: 65 65 20 73 70 61 63 65 20 63 61 6e 6e 6f 74 20  ee space cannot 
75e0: 65 78 63 65 65 64 20 74 6f 74 61 6c 20 70 61 67  exceed total pag
75f0: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 20 20  e size */.      
7600: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
7610: 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20 20 20  RRUPT_BKPT; .   
7620: 20 7d 0a 0a 23 69 66 20 30 0a 20 20 2f 2a 20 43   }..#if 0.  /* C
7630: 68 65 63 6b 20 74 68 61 74 20 61 6c 6c 20 74 68  heck that all th
7640: 65 20 6f 66 66 73 65 74 73 20 69 6e 20 74 68 65  e offsets in the
7650: 20 63 65 6c 6c 20 6f 66 66 73 65 74 20 61 72 72   cell offset arr
7660: 61 79 20 61 72 65 20 77 69 74 68 69 6e 20 72 61  ay are within ra
7670: 6e 67 65 2e 20 0a 20 20 2a 2a 20 0a 20 20 2a 2a  nge. .  ** .  **
7680: 20 4f 6d 69 74 74 69 6e 67 20 74 68 69 73 20 63   Omitting this c
7690: 6f 6e 73 69 73 74 65 6e 63 79 20 63 68 65 63 6b  onsistency check
76a0: 20 61 6e 64 20 75 73 69 6e 67 20 74 68 65 20 70   and using the p
76b0: 50 61 67 65 2d 3e 6d 61 73 6b 50 61 67 65 20 6d  Page->maskPage m
76c0: 61 73 6b 0a 20 20 2a 2a 20 74 6f 20 70 72 65 76  ask.  ** to prev
76d0: 65 6e 74 20 6f 76 65 72 72 75 6e 6e 69 6e 67 20  ent overrunning 
76e0: 74 68 65 20 70 61 67 65 20 62 75 66 66 65 72 20  the page buffer 
76f0: 69 6e 20 66 69 6e 64 43 65 6c 6c 28 29 20 72 65  in findCell() re
7700: 73 75 6c 74 73 20 69 6e 20 61 0a 20 20 2a 2a 20  sults in a.  ** 
7710: 32 2e 35 25 20 70 65 72 66 6f 72 6d 61 6e 63 65  2.5% performance
7720: 20 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 7b 0a   gain..  */.  {.
7730: 20 20 20 20 75 38 20 2a 70 4f 66 66 3b 20 20 20      u8 *pOff;   
7740: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
7750: 20 75 73 65 64 20 74 6f 20 63 68 65 63 6b 20 61   used to check a
7760: 6c 6c 20 63 65 6c 6c 20 6f 66 66 73 65 74 73 20  ll cell offsets 
7770: 61 72 65 20 69 6e 20 72 61 6e 67 65 20 2a 2f 0a  are in range */.
7780: 20 20 20 20 75 38 20 2a 70 45 6e 64 3b 20 20 20      u8 *pEnd;   
7790: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
77a0: 74 6f 20 65 6e 64 20 6f 66 20 63 65 6c 6c 20 6f  to end of cell o
77b0: 66 66 73 65 74 20 61 72 72 61 79 20 2a 2f 0a 20  ffset array */. 
77c0: 20 20 20 75 38 20 6d 61 73 6b 3b 20 20 20 20 20     u8 mask;     
77d0: 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 62      /* Mask of b
77e0: 69 74 73 20 74 68 61 74 20 6d 75 73 74 20 62 65  its that must be
77f0: 20 7a 65 72 6f 20 69 6e 20 4d 53 42 20 6f 66 20   zero in MSB of 
7800: 63 65 6c 6c 20 6f 66 66 73 65 74 73 20 2a 2f 0a  cell offsets */.
7810: 20 20 20 20 6d 61 73 6b 20 3d 20 7e 28 28 28 75      mask = ~(((u
7820: 38 29 28 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  8)(pBt->pageSize
7830: 3e 3e 38 29 29 2d 31 29 3b 0a 20 20 20 20 70 45  >>8))-1);.    pE
7840: 6e 64 20 3d 20 26 64 61 74 61 5b 63 65 6c 6c 4f  nd = &data[cellO
7850: 66 66 73 65 74 20 2b 20 70 50 61 67 65 2d 3e 6e  ffset + pPage->n
7860: 43 65 6c 6c 2a 32 5d 3b 0a 20 20 20 20 66 6f 72  Cell*2];.    for
7870: 28 70 4f 66 66 3d 26 64 61 74 61 5b 63 65 6c 6c  (pOff=&data[cell
7880: 4f 66 66 73 65 74 5d 3b 20 70 4f 66 66 21 3d 70  Offset]; pOff!=p
7890: 45 6e 64 20 26 26 20 21 28 28 2a 70 4f 66 66 29  End && !((*pOff)
78a0: 26 6d 61 73 6b 29 3b 20 70 4f 66 66 2b 3d 32 29  &mask); pOff+=2)
78b0: 3b 0a 20 20 20 20 69 66 28 20 70 4f 66 66 21 3d  ;.    if( pOff!=
78c0: 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 72 65  pEnd ){.      re
78d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
78e0: 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a  UPT_BKPT;.    }.
78f0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
7900: 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20  pPage->isInit = 
7910: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
7920: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
7930: 0a 2a 2a 20 53 65 74 20 75 70 20 61 20 72 61 77  .** Set up a raw
7940: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 69 74   page so that it
7950: 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 64 61   looks like a da
7960: 74 61 62 61 73 65 20 70 61 67 65 20 68 6f 6c 64  tabase page hold
7970: 69 6e 67 0a 2a 2a 20 6e 6f 20 65 6e 74 72 69 65  ing.** no entrie
7980: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
7990: 64 20 7a 65 72 6f 50 61 67 65 28 4d 65 6d 50 61  d zeroPage(MemPa
79a0: 67 65 20 2a 70 50 61 67 65 2c 20 69 6e 74 20 66  ge *pPage, int f
79b0: 6c 61 67 73 29 7b 0a 20 20 75 6e 73 69 67 6e 65  lags){.  unsigne
79c0: 64 20 63 68 61 72 20 2a 64 61 74 61 20 3d 20 70  d char *data = p
79d0: 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 42  Page->aData;.  B
79e0: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
79f0: 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74  Page->pBt;.  int
7a00: 20 68 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64   hdr = pPage->hd
7a10: 72 4f 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 66  rOffset;.  int f
7a20: 69 72 73 74 3b 0a 0a 20 20 61 73 73 65 72 74 28  irst;..  assert(
7a30: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
7a40: 65 6e 75 6d 62 65 72 28 70 50 61 67 65 2d 3e 70  enumber(pPage->p
7a50: 44 62 50 61 67 65 29 3d 3d 70 50 61 67 65 2d 3e  DbPage)==pPage->
7a60: 70 67 6e 6f 20 29 3b 0a 20 20 61 73 73 65 72 74  pgno );.  assert
7a70: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  ( sqlite3PagerGe
7a80: 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e 70 44  tExtra(pPage->pD
7a90: 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69 64 2a  bPage) == (void*
7aa0: 29 70 50 61 67 65 20 29 3b 0a 20 20 61 73 73 65  )pPage );.  asse
7ab0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
7ac0: 47 65 74 44 61 74 61 28 70 50 61 67 65 2d 3e 70  GetData(pPage->p
7ad0: 44 62 50 61 67 65 29 20 3d 3d 20 64 61 74 61 20  DbPage) == data 
7ae0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
7af0: 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65  ite3PagerIswrite
7b00: 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50  able(pPage->pDbP
7b10: 61 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74  age) );.  assert
7b20: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
7b30: 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
7b40: 20 29 3b 0a 20 20 2f 2a 6d 65 6d 73 65 74 28 26   );.  /*memset(&
7b50: 64 61 74 61 5b 68 64 72 5d 2c 20 30 2c 20 70 42  data[hdr], 0, pB
7b60: 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20 2d 20  t->usableSize - 
7b70: 68 64 72 29 3b 2a 2f 0a 20 20 64 61 74 61 5b 68  hdr);*/.  data[h
7b80: 64 72 5d 20 3d 20 66 6c 61 67 73 3b 0a 20 20 66  dr] = flags;.  f
7b90: 69 72 73 74 20 3d 20 68 64 72 20 2b 20 38 20 2b  irst = hdr + 8 +
7ba0: 20 34 2a 28 28 66 6c 61 67 73 26 50 54 46 5f 4c   4*((flags&PTF_L
7bb0: 45 41 46 29 3d 3d 30 29 3b 0a 20 20 6d 65 6d 73  EAF)==0);.  mems
7bc0: 65 74 28 26 64 61 74 61 5b 68 64 72 2b 31 5d 2c  et(&data[hdr+1],
7bd0: 20 30 2c 20 34 29 3b 0a 20 20 64 61 74 61 5b 68   0, 4);.  data[h
7be0: 64 72 2b 37 5d 20 3d 20 30 3b 0a 20 20 70 75 74  dr+7] = 0;.  put
7bf0: 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72 2b  2byte(&data[hdr+
7c00: 35 5d 2c 20 70 42 74 2d 3e 75 73 61 62 6c 65 53  5], pBt->usableS
7c10: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e  ize);.  pPage->n
7c20: 46 72 65 65 20 3d 20 70 42 74 2d 3e 75 73 61 62  Free = pBt->usab
7c30: 6c 65 53 69 7a 65 20 2d 20 66 69 72 73 74 3b 0a  leSize - first;.
7c40: 20 20 64 65 63 6f 64 65 46 6c 61 67 73 28 70 50    decodeFlags(pP
7c50: 61 67 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70  age, flags);.  p
7c60: 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 20  Page->hdrOffset 
7c70: 3d 20 68 64 72 3b 0a 20 20 70 50 61 67 65 2d 3e  = hdr;.  pPage->
7c80: 63 65 6c 6c 4f 66 66 73 65 74 20 3d 20 66 69 72  cellOffset = fir
7c90: 73 74 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 4f 76  st;.  pPage->nOv
7ca0: 65 72 66 6c 6f 77 20 3d 20 30 3b 0a 20 20 61 73  erflow = 0;.  as
7cb0: 73 65 72 74 28 20 70 42 74 2d 3e 70 61 67 65 53  sert( pBt->pageS
7cc0: 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 42 74 2d  ize>=512 && pBt-
7cd0: 3e 70 61 67 65 53 69 7a 65 3c 3d 33 32 37 36 38  >pageSize<=32768
7ce0: 20 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6d 61 73   );.  pPage->mas
7cf0: 6b 50 61 67 65 20 3d 20 70 42 74 2d 3e 70 61 67  kPage = pBt->pag
7d00: 65 53 69 7a 65 20 2d 20 31 3b 0a 20 20 70 50 61  eSize - 1;.  pPa
7d10: 67 65 2d 3e 6e 43 65 6c 6c 20 3d 20 30 3b 0a 20  ge->nCell = 0;. 
7d20: 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d   pPage->isInit =
7d30: 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f   1;.}.../*.** Co
7d40: 6e 76 65 72 74 20 61 20 44 62 50 61 67 65 20 6f  nvert a DbPage o
7d50: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 74 68 65  btained from the
7d60: 20 70 61 67 65 72 20 69 6e 74 6f 20 61 20 4d 65   pager into a Me
7d70: 6d 50 61 67 65 20 75 73 65 64 20 62 79 0a 2a 2a  mPage used by.**
7d80: 20 74 68 65 20 62 74 72 65 65 20 6c 61 79 65 72   the btree layer
7d90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 4d 65 6d 50  ..*/.static MemP
7da0: 61 67 65 20 2a 62 74 72 65 65 50 61 67 65 46 72  age *btreePageFr
7db0: 6f 6d 44 62 50 61 67 65 28 44 62 50 61 67 65 20  omDbPage(DbPage 
7dc0: 2a 70 44 62 50 61 67 65 2c 20 50 67 6e 6f 20 70  *pDbPage, Pgno p
7dd0: 67 6e 6f 2c 20 42 74 53 68 61 72 65 64 20 2a 70  gno, BtShared *p
7de0: 42 74 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  Bt){.  MemPage *
7df0: 70 50 61 67 65 20 3d 20 28 4d 65 6d 50 61 67 65  pPage = (MemPage
7e00: 2a 29 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  *)sqlite3PagerGe
7e10: 74 45 78 74 72 61 28 70 44 62 50 61 67 65 29 3b  tExtra(pDbPage);
7e20: 0a 20 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  .  pPage->aData 
7e30: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
7e40: 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
7e50: 20 20 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65    pPage->pDbPage
7e60: 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 70 50   = pDbPage;.  pP
7e70: 61 67 65 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a  age->pBt = pBt;.
7e80: 20 20 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20    pPage->pgno = 
7e90: 70 67 6e 6f 3b 0a 20 20 70 50 61 67 65 2d 3e 68  pgno;.  pPage->h
7ea0: 64 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65  drOffset = pPage
7eb0: 2d 3e 70 67 6e 6f 3d 3d 31 20 3f 20 31 30 30 20  ->pgno==1 ? 100 
7ec0: 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  : 0;.  return pP
7ed0: 61 67 65 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  age; .}../*.** G
7ee0: 65 74 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  et a page from t
7ef0: 68 65 20 70 61 67 65 72 2e 20 20 49 6e 69 74 69  he pager.  Initi
7f00: 61 6c 69 7a 65 20 74 68 65 20 4d 65 6d 50 61 67  alize the MemPag
7f10: 65 2e 70 42 74 20 61 6e 64 0a 2a 2a 20 4d 65 6d  e.pBt and.** Mem
7f20: 50 61 67 65 2e 61 44 61 74 61 20 65 6c 65 6d 65  Page.aData eleme
7f30: 6e 74 73 20 69 66 20 6e 65 65 64 65 64 2e 0a 2a  nts if needed..*
7f40: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 6f 43 6f  *.** If the noCo
7f50: 6e 74 65 6e 74 20 66 6c 61 67 20 69 73 20 73 65  ntent flag is se
7f60: 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
7f70: 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
7f80: 61 62 6f 75 74 0a 2a 2a 20 74 68 65 20 63 6f 6e  about.** the con
7f90: 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
7fa0: 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 20   at this time.  
7fb0: 53 6f 20 64 6f 20 6e 6f 74 20 67 6f 20 74 6f 20  So do not go to 
7fc0: 74 68 65 20 64 69 73 6b 0a 2a 2a 20 74 6f 20 66  the disk.** to f
7fd0: 65 74 63 68 20 74 68 65 20 63 6f 6e 74 65 6e 74  etch the content
7fe0: 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20  .  Just fill in 
7ff0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 69 74 68  the content with
8000: 20 7a 65 72 6f 73 20 66 6f 72 20 6e 6f 77 2e 0a   zeros for now..
8010: 2a 2a 20 49 66 20 69 6e 20 74 68 65 20 66 75 74  ** If in the fut
8020: 75 72 65 20 77 65 20 63 61 6c 6c 20 73 71 6c 69  ure we call sqli
8030: 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 20  te3PagerWrite() 
8040: 6f 6e 20 74 68 69 73 20 70 61 67 65 2c 20 74 68  on this page, th
8050: 61 74 0a 2a 2a 20 6d 65 61 6e 73 20 77 65 20 68  at.** means we h
8060: 61 76 65 20 73 74 61 72 74 65 64 20 74 6f 20 62  ave started to b
8070: 65 20 63 6f 6e 63 65 72 6e 65 64 20 61 62 6f 75  e concerned abou
8080: 74 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68  t content and th
8090: 65 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 73  e disk.** read s
80a0: 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74  hould occur at t
80b0: 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e  hat point..*/.in
80c0: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  t sqlite3BtreeGe
80d0: 74 50 61 67 65 28 0a 20 20 42 74 53 68 61 72 65  tPage(.  BtShare
80e0: 64 20 2a 70 42 74 2c 20 20 20 20 20 20 20 2f 2a  d *pBt,       /*
80f0: 20 54 68 65 20 62 74 72 65 65 20 2a 2f 0a 20 20   The btree */.  
8100: 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
8110: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8120: 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 66 65  f the page to fe
8130: 74 63 68 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65  tch */.  MemPage
8140: 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
8150: 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
8160: 20 69 6e 20 74 68 69 73 20 70 61 72 61 6d 65 74   in this paramet
8170: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f  er */.  int noCo
8180: 6e 74 65 6e 74 20 20 20 20 20 20 20 20 2f 2a 20  ntent        /* 
8190: 44 6f 20 6e 6f 74 20 6c 6f 61 64 20 70 61 67 65  Do not load page
81a0: 20 63 6f 6e 74 65 6e 74 20 69 66 20 74 72 75 65   content if true
81b0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
81c0: 0a 20 20 44 62 50 61 67 65 20 2a 70 44 62 50 61  .  DbPage *pDbPa
81d0: 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ge;..  assert( s
81e0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
81f0: 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
8200: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
8210: 61 67 65 72 41 63 71 75 69 72 65 28 70 42 74 2d  agerAcquire(pBt-
8220: 3e 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 28  >pPager, pgno, (
8230: 44 62 50 61 67 65 2a 2a 29 26 70 44 62 50 61 67  DbPage**)&pDbPag
8240: 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20  e, noContent);. 
8250: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
8260: 20 72 63 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d   rc;.  *ppPage =
8270: 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d 44 62   btreePageFromDb
8280: 50 61 67 65 28 70 44 62 50 61 67 65 2c 20 70 67  Page(pDbPage, pg
8290: 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 72 65 74 75  no, pBt);.  retu
82a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
82b0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
82c0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  e size of the da
82d0: 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70  tabase file in p
82e0: 61 67 65 73 2e 20 20 4f 72 20 72 65 74 75 72 6e  ages.  Or return
82f0: 20 2d 31 20 69 66 0a 2a 2a 20 74 68 65 72 65 20   -1 if.** there 
8300: 69 73 20 61 6e 79 20 6b 69 6e 64 20 6f 66 20 65  is any kind of e
8310: 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
8320: 69 6e 74 20 70 61 67 65 72 50 61 67 65 63 6f 75  int pagerPagecou
8330: 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
8340: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
8350: 6e 74 20 6e 50 61 67 65 3b 0a 20 20 72 63 20 3d  nt nPage;.  rc =
8360: 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
8370: 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
8380: 6e 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e  nPage);.  return
8390: 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f   (rc==SQLITE_OK?
83a0: 6e 50 61 67 65 3a 2d 31 29 3b 0a 7d 0a 0a 2f 2a  nPage:-1);.}../*
83b0: 0a 2a 2a 20 47 65 74 20 61 20 70 61 67 65 20 66  .** Get a page f
83c0: 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20 61 6e  rom the pager an
83d0: 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 69 74 2e  d initialize it.
83e0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
83f0: 2a 20 69 73 20 6a 75 73 74 20 61 20 63 6f 6e 76  * is just a conv
8400: 65 6e 69 65 6e 63 65 20 77 72 61 70 70 65 72 20  enience wrapper 
8410: 61 72 6f 75 6e 64 20 73 65 70 61 72 61 74 65 20  around separate 
8420: 63 61 6c 6c 73 20 74 6f 0a 2a 2a 20 73 71 6c 69  calls to.** sqli
8430: 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
8440: 29 20 61 6e 64 20 73 71 6c 69 74 65 33 42 74 72  ) and sqlite3Btr
8450: 65 65 49 6e 69 74 50 61 67 65 28 29 2e 0a 2a 2f  eeInitPage()..*/
8460: 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 41  .static int getA
8470: 6e 64 49 6e 69 74 50 61 67 65 28 0a 20 20 42 74  ndInitPage(.  Bt
8480: 53 68 61 72 65 64 20 2a 70 42 74 2c 20 20 20 20  Shared *pBt,    
8490: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74        /* The dat
84a0: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
84b0: 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
84c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
84d0: 66 20 74 68 65 20 70 61 67 65 20 74 6f 20 67 65  f the page to ge
84e0: 74 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  t */.  MemPage *
84f0: 2a 70 70 50 61 67 65 20 20 20 20 20 2f 2a 20 57  *ppPage     /* W
8500: 72 69 74 65 20 74 68 65 20 70 61 67 65 20 70 6f  rite the page po
8510: 69 6e 74 65 72 20 68 65 72 65 20 2a 2f 0a 29 7b  inter here */.){
8520: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 44 62 50  .  int rc;.  DbP
8530: 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20  age *pDbPage;.  
8540: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 0a  MemPage *pPage;.
8550: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
8560: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 42  e3_mutex_held(pB
8570: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  t->mutex) );.  i
8580: 66 28 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  f( pgno==0 ){.  
8590: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
85a0: 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 20 0a 20  CORRUPT_BKPT; . 
85b0: 20 7d 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 6f   }..  /* It is o
85c0: 66 74 65 6e 20 74 68 65 20 63 61 73 65 20 74 68  ften the case th
85d0: 61 74 20 74 68 65 20 70 61 67 65 20 77 65 20 77  at the page we w
85e0: 61 6e 74 20 69 73 20 61 6c 72 65 61 64 79 20 69  ant is already i
85f0: 6e 20 63 61 63 68 65 2e 0a 20 20 2a 2a 20 49 66  n cache..  ** If
8600: 20 73 6f 2c 20 67 65 74 20 69 74 20 64 69 72 65   so, get it dire
8610: 63 74 6c 79 2e 20 20 54 68 69 73 20 73 61 76 65  ctly.  This save
8620: 73 20 75 73 20 66 72 6f 6d 20 68 61 76 69 6e 67  s us from having
8630: 20 74 6f 20 63 61 6c 6c 0a 20 20 2a 2a 20 70 61   to call.  ** pa
8640: 67 65 72 50 61 67 65 63 6f 75 6e 74 28 29 20 74  gerPagecount() t
8650: 6f 20 6d 61 6b 65 20 73 75 72 65 20 70 67 6e 6f  o make sure pgno
8660: 20 69 73 20 77 69 74 68 69 6e 20 6c 69 6d 69 74   is within limit
8670: 73 2c 20 77 68 69 63 68 20 72 65 73 75 6c 74 73  s, which results
8680: 0a 20 20 2a 2a 20 69 6e 20 61 20 6d 65 61 73 75  .  ** in a measu
8690: 72 65 61 62 6c 65 20 70 65 72 66 6f 72 6d 61 6e  reable performan
86a0: 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74 73 2e  ce improvements.
86b0: 0a 20 20 2a 2f 0a 20 20 70 44 62 50 61 67 65 20  .  */.  pDbPage 
86c0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  = sqlite3PagerLo
86d0: 6f 6b 75 70 28 70 42 74 2d 3e 70 50 61 67 65 72  okup(pBt->pPager
86e0: 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
86f0: 44 62 50 61 67 65 20 29 7b 0a 20 20 20 20 2f 2a  DbPage ){.    /*
8700: 20 50 61 67 65 20 69 73 20 61 6c 72 65 61 64 79   Page is already
8710: 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 20   in cache */.   
8720: 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67 65   *ppPage = pPage
8730: 20 3d 20 62 74 72 65 65 50 61 67 65 46 72 6f 6d   = btreePageFrom
8740: 44 62 50 61 67 65 28 70 44 62 50 61 67 65 2c 20  DbPage(pDbPage, 
8750: 70 67 6e 6f 2c 20 70 42 74 29 3b 0a 20 20 20 20  pgno, pBt);.    
8760: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
8770: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
8780: 50 61 67 65 20 6e 6f 74 20 69 6e 20 63 61 63 68  Page not in cach
8790: 65 2e 20 20 41 63 71 75 69 72 65 20 69 74 2e 20  e.  Acquire it. 
87a0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e  */.    if( pgno>
87b0: 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  pagerPagecount(p
87c0: 42 74 2d 3e 70 50 61 67 65 72 29 20 29 7b 0a 20  Bt->pPager) ){. 
87d0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
87e0: 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
87f0: 20 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d   .    }.    rc =
8800: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
8810: 50 61 67 65 28 70 42 74 2c 20 70 67 6e 6f 2c 20  Page(pBt, pgno, 
8820: 70 70 50 61 67 65 2c 20 30 29 3b 0a 20 20 20 20  ppPage, 0);.    
8830: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
8840: 72 63 3b 0a 20 20 20 20 70 50 61 67 65 20 3d 20  rc;.    pPage = 
8850: 2a 70 70 50 61 67 65 3b 0a 20 20 7d 0a 20 20 69  *ppPage;.  }.  i
8860: 66 28 20 21 70 50 61 67 65 2d 3e 69 73 49 6e 69  f( !pPage->isIni
8870: 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  t ){.    rc = sq
8880: 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
8890: 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  ge(pPage);.  }. 
88a0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
88b0: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 6c 65 61 73  OK ){.    releas
88c0: 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
88d0: 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
88e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
88f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
8900: 20 61 20 4d 65 6d 50 61 67 65 2e 20 20 54 68 69   a MemPage.  Thi
8910: 73 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  s should be call
8920: 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
8930: 20 70 72 69 6f 72 0a 2a 2a 20 63 61 6c 6c 20 74   prior.** call t
8940: 6f 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  o sqlite3BtreeGe
8950: 74 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  tPage..*/.static
8960: 20 76 6f 69 64 20 72 65 6c 65 61 73 65 50 61 67   void releasePag
8970: 65 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  e(MemPage *pPage
8980: 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 20 29  ){.  if( pPage )
8990: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
89a0: 61 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20  age->aData );.  
89b0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
89c0: 3e 70 42 74 20 29 3b 0a 20 20 20 20 61 73 73 65  >pBt );.    asse
89d0: 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  rt( sqlite3Pager
89e0: 47 65 74 45 78 74 72 61 28 70 50 61 67 65 2d 3e  GetExtra(pPage->
89f0: 70 44 62 50 61 67 65 29 20 3d 3d 20 28 76 6f 69  pDbPage) == (voi
8a00: 64 2a 29 70 50 61 67 65 20 29 3b 0a 20 20 20 20  d*)pPage );.    
8a10: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
8a20: 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61 67  agerGetData(pPag
8a30: 65 2d 3e 70 44 62 50 61 67 65 29 3d 3d 70 50 61  e->pDbPage)==pPa
8a40: 67 65 2d 3e 61 44 61 74 61 20 29 3b 0a 20 20 20  ge->aData );.   
8a50: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
8a60: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
8a70: 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
8a80: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
8a90: 65 72 55 6e 72 65 66 28 70 50 61 67 65 2d 3e 70  erUnref(pPage->p
8aa0: 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 7d 0a 0a  DbPage);.  }.}..
8ab0: 2f 2a 0a 2a 2a 20 44 75 72 69 6e 67 20 61 20 72  /*.** During a r
8ac0: 6f 6c 6c 62 61 63 6b 2c 20 77 68 65 6e 20 74 68  ollback, when th
8ad0: 65 20 70 61 67 65 72 20 72 65 6c 6f 61 64 73 20  e pager reloads 
8ae0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 74 6f  information into
8af0: 20 74 68 65 20 63 61 63 68 65 0a 2a 2a 20 73 6f   the cache.** so
8b00: 20 74 68 61 74 20 74 68 65 20 63 61 63 68 65 20   that the cache 
8b10: 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69  is restored to i
8b20: 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 74 61 74  ts original stat
8b30: 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  e at the start o
8b40: 66 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63  f.** the transac
8b50: 74 69 6f 6e 2c 20 66 6f 72 20 65 61 63 68 20 70  tion, for each p
8b60: 61 67 65 20 72 65 73 74 6f 72 65 64 20 74 68 69  age restored thi
8b70: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
8b80: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  led..**.** This 
8b90: 72 6f 75 74 69 6e 65 20 6e 65 65 64 73 20 74 6f  routine needs to
8ba0: 20 72 65 73 65 74 20 74 68 65 20 65 78 74 72 61   reset the extra
8bb0: 20 64 61 74 61 20 73 65 63 74 69 6f 6e 20 61 74   data section at
8bc0: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
8bd0: 2a 2a 20 70 61 67 65 20 74 6f 20 61 67 72 65 65  ** page to agree
8be0: 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f 72   with the restor
8bf0: 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74  ed data..*/.stat
8c00: 69 63 20 76 6f 69 64 20 70 61 67 65 52 65 69 6e  ic void pageRein
8c10: 69 74 28 44 62 50 61 67 65 20 2a 70 44 61 74 61  it(DbPage *pData
8c20: 29 7b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  ){.  MemPage *pP
8c30: 61 67 65 3b 0a 20 20 70 50 61 67 65 20 3d 20 28  age;.  pPage = (
8c40: 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69 74 65  MemPage *)sqlite
8c50: 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 70  3PagerGetExtra(p
8c60: 44 61 74 61 29 3b 0a 20 20 69 66 28 20 70 50 61  Data);.  if( pPa
8c70: 67 65 2d 3e 69 73 49 6e 69 74 20 29 7b 0a 20 20  ge->isInit ){.  
8c80: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8c90: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61  3_mutex_held(pPa
8ca0: 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20  ge->pBt->mutex) 
8cb0: 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 69 73  );.    pPage->is
8cc0: 49 6e 69 74 20 3d 20 30 3b 0a 20 20 20 20 69 66  Init = 0;.    if
8cd0: 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  ( sqlite3PagerPa
8ce0: 67 65 52 65 66 63 6f 75 6e 74 28 70 44 61 74 61  geRefcount(pData
8cf0: 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  )>0 ){.      sql
8d00: 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61 67  ite3BtreeInitPag
8d10: 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a  e(pPage);.    }.
8d20: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76    }.}../*.** Inv
8d30: 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e  oke the busy han
8d40: 64 6c 65 72 20 66 6f 72 20 61 20 62 74 72 65 65  dler for a btree
8d50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
8d60: 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 76 6f  sqlite3BtreeInvo
8d70: 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 76 6f  keBusyHandler(vo
8d80: 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 29  id *pArg, int n)
8d90: 7b 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  {.  BtShared *pB
8da0: 74 20 3d 20 28 42 74 53 68 61 72 65 64 2a 29 70  t = (BtShared*)p
8db0: 41 72 67 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Arg;.  assert( p
8dc0: 42 74 2d 3e 64 62 20 29 3b 0a 20 20 61 73 73 65  Bt->db );.  asse
8dd0: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
8de0: 78 5f 68 65 6c 64 28 70 42 74 2d 3e 64 62 2d 3e  x_held(pBt->db->
8df0: 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75  mutex) );.  retu
8e00: 72 6e 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  rn sqlite3Invoke
8e10: 42 75 73 79 48 61 6e 64 6c 65 72 28 26 70 42 74  BusyHandler(&pBt
8e20: 2d 3e 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65  ->db->busyHandle
8e30: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  r);.}../*.** Ope
8e40: 6e 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  n a database fil
8e50: 65 2e 0a 2a 2a 20 0a 2a 2a 20 7a 46 69 6c 65 6e  e..** .** zFilen
8e60: 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
8e70: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
8e80: 66 69 6c 65 2e 20 20 49 66 20 7a 46 69 6c 65 6e  file.  If zFilen
8e90: 61 6d 65 20 69 73 20 4e 55 4c 4c 0a 2a 2a 20 61  ame is NULL.** a
8ea0: 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 77 69   new database wi
8eb0: 74 68 20 61 20 72 61 6e 64 6f 6d 20 6e 61 6d 65  th a random name
8ec0: 20 69 73 20 63 72 65 61 74 65 64 2e 20 20 54 68   is created.  Th
8ed0: 69 73 20 72 61 6e 64 6f 6d 6c 79 20 6e 61 6d 65  is randomly name
8ee0: 64 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  d.** database fi
8ef0: 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74  le will be delet
8f00: 65 64 20 77 68 65 6e 20 73 71 6c 69 74 65 33 42  ed when sqlite3B
8f10: 74 72 65 65 43 6c 6f 73 65 28 29 20 69 73 20 63  treeClose() is c
8f20: 61 6c 6c 65 64 2e 0a 2a 2a 20 49 66 20 7a 46 69  alled..** If zFi
8f30: 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f  lename is ":memo
8f40: 72 79 3a 22 20 74 68 65 6e 20 61 6e 20 69 6e 2d  ry:" then an in-
8f50: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
8f60: 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 74 68  is created.** th
8f70: 61 74 20 69 73 20 61 75 74 6f 6d 61 74 69 63 61  at is automatica
8f80: 6c 6c 79 20 64 65 73 74 72 6f 79 65 64 20 77 68  lly destroyed wh
8f90: 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e  en it is closed.
8fa0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
8fb0: 74 72 65 65 4f 70 65 6e 28 0a 20 20 63 6f 6e 73  treeOpen(.  cons
8fc0: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
8fd0: 65 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e,  /* Name of t
8fe0: 68 65 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69  he file containi
8ff0: 6e 67 20 74 68 65 20 42 54 72 65 65 20 64 61 74  ng the BTree dat
9000: 61 62 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  abase */.  sqlit
9010: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
9020: 20 20 20 2f 2a 20 41 73 73 6f 63 69 61 74 65 64     /* Associated
9030: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
9040: 20 2a 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70   */.  Btree **pp
9050: 42 74 72 65 65 2c 20 20 20 20 20 20 20 20 2f 2a  Btree,        /*
9060: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
9070: 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69  Btree object wri
9080: 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 20 20 69  tten here */.  i
9090: 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
90a0: 20 20 20 20 20 20 20 2f 2a 20 4f 70 74 69 6f 6e         /* Option
90b0: 73 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c  s */.  int vfsFl
90c0: 61 67 73 20 20 20 20 20 20 20 20 20 20 20 20 2f  ags            /
90d0: 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
90e0: 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65  hrough to sqlite
90f0: 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
9100: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  .){.  sqlite3_vf
9110: 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 2f 2a  s *pVfs;      /*
9120: 20 54 68 65 20 56 46 53 20 74 6f 20 75 73 65 20   The VFS to use 
9130: 66 6f 72 20 74 68 69 73 20 62 74 72 65 65 20 2a  for this btree *
9140: 2f 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  /.  BtShared *pB
9150: 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 53  t = 0;      /* S
9160: 68 61 72 65 64 20 70 61 72 74 20 6f 66 20 62 74  hared part of bt
9170: 72 65 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f  ree structure */
9180: 0a 20 20 42 74 72 65 65 20 2a 70 3b 20 20 20 20  .  Btree *p;    
9190: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
91a0: 6e 64 6c 65 20 74 6f 20 72 65 74 75 72 6e 20 2a  ndle to return *
91b0: 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
91c0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 6e 52  ITE_OK;.  int nR
91d0: 65 73 65 72 76 65 3b 0a 20 20 75 6e 73 69 67 6e  eserve;.  unsign
91e0: 65 64 20 63 68 61 72 20 7a 44 62 48 65 61 64 65  ed char zDbHeade
91f0: 72 5b 31 30 30 5d 3b 0a 0a 20 20 2f 2a 20 53 65  r[100];..  /* Se
9200: 74 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 69  t the variable i
9210: 73 4d 65 6d 64 62 20 74 6f 20 74 72 75 65 20 66  sMemdb to true f
9220: 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
9230: 64 61 74 61 62 61 73 65 2c 20 6f 72 20 0a 20 20  database, or .  
9240: 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 61 20 66  ** false for a f
9250: 69 6c 65 2d 62 61 73 65 64 20 64 61 74 61 62 61  ile-based databa
9260: 73 65 2e 20 54 68 69 73 20 73 79 6d 62 6f 6c 20  se. This symbol 
9270: 69 73 20 6f 6e 6c 79 20 72 65 71 75 69 72 65 64  is only required
9280: 20 69 66 0a 20 20 2a 2a 20 65 69 74 68 65 72 20   if.  ** either 
9290: 6f 66 20 74 68 65 20 73 68 61 72 65 64 2d 64 61  of the shared-da
92a0: 74 61 20 6f 72 20 61 75 74 6f 76 61 63 75 75 6d  ta or autovacuum
92b0: 20 66 65 61 74 75 72 65 73 20 61 72 65 20 63 6f   features are co
92c0: 6d 70 69 6c 65 64 20 0a 20 20 2a 2a 20 69 6e 74  mpiled .  ** int
92d0: 6f 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 20  o the library.. 
92e0: 20 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64   */.#if !defined
92f0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
9300: 52 45 44 5f 43 41 43 48 45 29 20 7c 7c 20 21 64  RED_CACHE) || !d
9310: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
9320: 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 29 0a 20  IT_AUTOVACUUM). 
9330: 20 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f   #ifdef SQLITE_O
9340: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20  MIT_MEMORYDB.   
9350: 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 4d 65 6d   const int isMem
9360: 64 62 20 3d 20 30 3b 0a 20 20 23 65 6c 73 65 0a  db = 0;.  #else.
9370: 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73      const int is
9380: 4d 65 6d 64 62 20 3d 20 7a 46 69 6c 65 6e 61 6d  Memdb = zFilenam
9390: 65 20 26 26 20 21 73 74 72 63 6d 70 28 7a 46 69  e && !strcmp(zFi
93a0: 6c 65 6e 61 6d 65 2c 20 22 3a 6d 65 6d 6f 72 79  lename, ":memory
93b0: 3a 22 29 3b 0a 20 20 23 65 6e 64 69 66 0a 23 65  :");.  #endif.#e
93c0: 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20  ndif..  assert( 
93d0: 64 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  db!=0 );.  asser
93e0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
93f0: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
9400: 20 29 3b 0a 0a 20 20 70 56 66 73 20 3d 20 64 62   );..  pVfs = db
9410: 2d 3e 70 56 66 73 3b 0a 20 20 70 20 3d 20 73 71  ->pVfs;.  p = sq
9420: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
9430: 73 69 7a 65 6f 66 28 42 74 72 65 65 29 29 3b 0a  sizeof(Btree));.
9440: 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20    if( !p ){.    
9450: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
9460: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 69 6e  MEM;.  }.  p->in
9470: 54 72 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f  Trans = TRANS_NO
9480: 4e 45 3b 0a 20 20 70 2d 3e 64 62 20 3d 20 64 62  NE;.  p->db = db
9490: 3b 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  ;..#if !defined(
94a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52  SQLITE_OMIT_SHAR
94b0: 45 44 5f 43 41 43 48 45 29 20 26 26 20 21 64 65  ED_CACHE) && !de
94c0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
94d0: 54 5f 44 49 53 4b 49 4f 29 0a 20 20 2f 2a 0a 20  T_DISKIO).  /*. 
94e0: 20 2a 2a 20 49 66 20 74 68 69 73 20 42 74 72 65   ** If this Btre
94f0: 65 20 69 73 20 61 20 63 61 6e 64 69 64 61 74 65  e is a candidate
9500: 20 66 6f 72 20 73 68 61 72 65 64 20 63 61 63 68   for shared cach
9510: 65 2c 20 74 72 79 20 74 6f 20 66 69 6e 64 20 61  e, try to find a
9520: 6e 0a 20 20 2a 2a 20 65 78 69 73 74 69 6e 67 20  n.  ** existing 
9530: 42 74 53 68 61 72 65 64 20 6f 62 6a 65 63 74 20  BtShared object 
9540: 74 68 61 74 20 77 65 20 63 61 6e 20 73 68 61 72  that we can shar
9550: 65 20 77 69 74 68 0a 20 20 2a 2f 0a 20 20 69 66  e with.  */.  if
9560: 28 20 69 73 4d 65 6d 64 62 3d 3d 30 0a 20 20 20  ( isMemdb==0.   
9570: 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  && (db->flags & 
9580: 53 51 4c 49 54 45 5f 56 74 61 62 29 3d 3d 30 0a  SQLITE_Vtab)==0.
9590: 20 20 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 20     && zFilename 
95a0: 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 0a  && zFilename[0].
95b0: 20 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c    ){.    if( sql
95c0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
95d0: 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  .sharedCacheEnab
95e0: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  led ){.      int
95f0: 20 6e 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d   nFullPathname =
9600: 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
9610: 65 2b 31 3b 0a 20 20 20 20 20 20 63 68 61 72 20  e+1;.      char 
9620: 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d  *zFullPathname =
9630: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 6e   sqlite3Malloc(n
9640: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
9650: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
9660: 65 78 20 2a 6d 75 74 65 78 53 68 61 72 65 64 3b  ex *mutexShared;
9670: 0a 20 20 20 20 20 20 70 2d 3e 73 68 61 72 61 62  .      p->sharab
9680: 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 64 62  le = 1;.      db
9690: 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54  ->flags |= SQLIT
96a0: 45 5f 53 68 61 72 65 64 43 61 63 68 65 3b 0a 20  E_SharedCache;. 
96b0: 20 20 20 20 20 69 66 28 20 21 7a 46 75 6c 6c 50       if( !zFullP
96c0: 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  athname ){.     
96d0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
96e0: 70 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  p);.        retu
96f0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
9700: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
9710: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
9720: 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65  name(pVfs, zFile
9730: 6e 61 6d 65 2c 20 6e 46 75 6c 6c 50 61 74 68 6e  name, nFullPathn
9740: 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61  ame, zFullPathna
9750: 6d 65 29 3b 0a 20 20 20 20 20 20 6d 75 74 65 78  me);.      mutex
9760: 53 68 61 72 65 64 20 3d 20 73 71 6c 69 74 65 33  Shared = sqlite3
9770: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
9780: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
9790: 41 53 54 45 52 29 3b 0a 20 20 20 20 20 20 73 71  ASTER);.      sq
97a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
97b0: 72 28 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a  r(mutexShared);.
97c0: 20 20 20 20 20 20 66 6f 72 28 70 42 74 3d 47 4c        for(pBt=GL
97d0: 4f 42 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73  OBAL(BtShared*,s
97e0: 71 6c 69 74 65 33 53 68 61 72 65 64 43 61 63 68  qlite3SharedCach
97f0: 65 4c 69 73 74 29 3b 20 70 42 74 3b 20 70 42 74  eList); pBt; pBt
9800: 3d 70 42 74 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  =pBt->pNext){.  
9810: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42        assert( pB
9820: 74 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 20  t->nRef>0 );.   
9830: 20 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63       if( 0==strc
9840: 6d 70 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  mp(zFullPathname
9850: 2c 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  , sqlite3PagerFi
9860: 6c 65 6e 61 6d 65 28 70 42 74 2d 3e 70 50 61 67  lename(pBt->pPag
9870: 65 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 20  er)).           
9880: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
9890: 50 61 67 65 72 56 66 73 28 70 42 74 2d 3e 70 50  PagerVfs(pBt->pP
98a0: 61 67 65 72 29 3d 3d 70 56 66 73 20 29 7b 0a 20  ager)==pVfs ){. 
98b0: 20 20 20 20 20 20 20 20 20 70 2d 3e 70 42 74 20           p->pBt 
98c0: 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20 20  = pBt;.         
98d0: 20 70 42 74 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20   pBt->nRef++;.  
98e0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
98f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
9900: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
9910: 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
9920: 53 68 61 72 65 64 29 3b 0a 20 20 20 20 20 20 73  Shared);.      s
9930: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46 75 6c  qlite3_free(zFul
9940: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
9950: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
9960: 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a  DEBUG.    else{.
9970: 20 20 20 20 20 20 2f 2a 20 49 6e 20 64 65 62 75        /* In debu
9980: 67 20 6d 6f 64 65 2c 20 77 65 20 6d 61 72 6b 20  g mode, we mark 
9990: 61 6c 6c 20 70 65 72 73 69 73 74 65 6e 74 20 64  all persistent d
99a0: 61 74 61 62 61 73 65 73 20 61 73 20 73 68 61 72  atabases as shar
99b0: 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 65 76  able.      ** ev
99c0: 65 6e 20 77 68 65 6e 20 74 68 65 79 20 61 72 65  en when they are
99d0: 20 6e 6f 74 2e 20 20 54 68 69 73 20 65 78 65 72   not.  This exer
99e0: 63 69 73 65 73 20 74 68 65 20 6c 6f 63 6b 69 6e  cises the lockin
99f0: 67 20 63 6f 64 65 20 61 6e 64 0a 20 20 20 20 20  g code and.     
9a00: 20 2a 2a 20 67 69 76 65 73 20 6d 6f 72 65 20 6f   ** gives more o
9a10: 70 70 6f 72 74 75 6e 69 74 79 20 66 6f 72 20 61  pportunity for a
9a20: 73 73 65 72 74 73 28 73 71 6c 69 74 65 33 5f 6d  sserts(sqlite3_m
9a30: 75 74 65 78 5f 68 65 6c 64 28 29 29 0a 20 20 20  utex_held()).   
9a40: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73     ** statements
9a50: 20 74 6f 20 66 69 6e 64 20 6c 6f 63 6b 69 6e 67   to find locking
9a60: 20 70 72 6f 62 6c 65 6d 73 2e 0a 20 20 20 20 20   problems..     
9a70: 20 2a 2f 0a 20 20 20 20 20 20 70 2d 3e 73 68 61   */.      p->sha
9a80: 72 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d  rable = 1;.    }
9a90: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 23 65 6e 64  .#endif.  }.#end
9aa0: 69 66 0a 20 20 69 66 28 20 70 42 74 3d 3d 30 20  if.  if( pBt==0 
9ab0: 29 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  ){.    /*.    **
9ac0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   The following a
9ad0: 73 73 65 72 74 73 20 6d 61 6b 65 20 73 75 72 65  sserts make sure
9ae0: 20 74 68 61 74 20 73 74 72 75 63 74 75 72 65 73   that structures
9af0: 20 75 73 65 64 20 62 79 20 74 68 65 20 62 74 72   used by the btr
9b00: 65 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 74 68  ee are.    ** th
9b10: 65 20 72 69 67 68 74 20 73 69 7a 65 2e 20 20 54  e right size.  T
9b20: 68 69 73 20 69 73 20 74 6f 20 67 75 61 72 64 20  his is to guard 
9b30: 61 67 61 69 6e 73 74 20 73 69 7a 65 20 63 68 61  against size cha
9b40: 6e 67 65 73 20 74 68 61 74 20 72 65 73 75 6c 74  nges that result
9b50: 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 63 6f 6d  .    ** when com
9b60: 70 69 6c 69 6e 67 20 6f 6e 20 61 20 64 69 66 66  piling on a diff
9b70: 65 72 65 6e 74 20 61 72 63 68 69 74 65 63 74 75  erent architectu
9b80: 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  re..    */.    a
9b90: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 69 36  ssert( sizeof(i6
9ba0: 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28  4)==8 || sizeof(
9bb0: 69 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  i64)==4 );.    a
9bc0: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 36  ssert( sizeof(u6
9bd0: 34 29 3d 3d 38 20 7c 7c 20 73 69 7a 65 6f 66 28  4)==8 || sizeof(
9be0: 75 36 34 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61  u64)==4 );.    a
9bf0: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 75 33  ssert( sizeof(u3
9c00: 32 29 3d 3d 34 20 29 3b 0a 20 20 20 20 61 73 73  2)==4 );.    ass
9c10: 65 72 74 28 20 73 69 7a 65 6f 66 28 75 31 36 29  ert( sizeof(u16)
9c20: 3d 3d 32 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ==2 );.    asser
9c30: 74 28 20 73 69 7a 65 6f 66 28 50 67 6e 6f 29 3d  t( sizeof(Pgno)=
9c40: 3d 34 20 29 3b 0a 20 20 0a 20 20 20 20 70 42 74  =4 );.  .    pBt
9c50: 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
9c60: 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 2a 70 42  Zero( sizeof(*pB
9c70: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 42  t) );.    if( pB
9c80: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
9c90: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
9ca0: 0a 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65  .      goto btre
9cb0: 65 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20  e_open_out;.    
9cc0: 7d 0a 20 20 20 20 70 42 74 2d 3e 62 75 73 79 48  }.    pBt->busyH
9cd0: 64 72 2e 78 46 75 6e 63 20 3d 20 73 71 6c 69 74  dr.xFunc = sqlit
9ce0: 65 33 42 74 72 65 65 49 6e 76 6f 6b 65 42 75 73  e3BtreeInvokeBus
9cf0: 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20 20 70 42  yHandler;.    pB
9d00: 74 2d 3e 62 75 73 79 48 64 72 2e 70 41 72 67 20  t->busyHdr.pArg 
9d10: 3d 20 70 42 74 3b 0a 20 20 20 20 72 63 20 3d 20  = pBt;.    rc = 
9d20: 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
9d30: 28 70 56 66 73 2c 20 26 70 42 74 2d 3e 70 50 61  (pVfs, &pBt->pPa
9d40: 67 65 72 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 0a  ger, zFilename,.
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d60: 20 20 20 20 20 20 20 20 20 20 45 58 54 52 41 5f            EXTRA_
9d70: 53 49 5a 45 2c 20 66 6c 61 67 73 2c 20 76 66 73  SIZE, flags, vfs
9d80: 46 6c 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20  Flags);.    if( 
9d90: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
9da0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
9db0: 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65  te3PagerReadFile
9dc0: 68 65 61 64 65 72 28 70 42 74 2d 3e 70 50 61 67  header(pBt->pPag
9dd0: 65 72 2c 73 69 7a 65 6f 66 28 7a 44 62 48 65 61  er,sizeof(zDbHea
9de0: 64 65 72 29 2c 7a 44 62 48 65 61 64 65 72 29 3b  der),zDbHeader);
9df0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
9e00: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
9e10: 20 20 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65        goto btree
9e20: 5f 6f 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 7d  _open_out;.    }
9e30: 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
9e40: 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28  rSetBusyhandler(
9e50: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70 42  pBt->pPager, &pB
9e60: 74 2d 3e 62 75 73 79 48 64 72 29 3b 0a 20 20 20  t->busyHdr);.   
9e70: 20 70 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20   p->pBt = pBt;. 
9e80: 20 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67   .    sqlite3Pag
9e90: 65 72 53 65 74 52 65 69 6e 69 74 65 72 28 70 42  erSetReiniter(pB
9ea0: 74 2d 3e 70 50 61 67 65 72 2c 20 70 61 67 65 52  t->pPager, pageR
9eb0: 65 69 6e 69 74 29 3b 0a 20 20 20 20 70 42 74 2d  einit);.    pBt-
9ec0: 3e 70 43 75 72 73 6f 72 20 3d 20 30 3b 0a 20 20  >pCursor = 0;.  
9ed0: 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
9ee0: 30 3b 0a 20 20 20 20 70 42 74 2d 3e 72 65 61 64  0;.    pBt->read
9ef0: 4f 6e 6c 79 20 3d 20 73 71 6c 69 74 65 33 50 61  Only = sqlite3Pa
9f00: 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 70 42  gerIsreadonly(pB
9f10: 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
9f20: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20  pBt->pageSize = 
9f30: 67 65 74 32 62 79 74 65 28 26 7a 44 62 48 65 61  get2byte(&zDbHea
9f40: 64 65 72 5b 31 36 5d 29 3b 0a 20 20 20 20 69 66  der[16]);.    if
9f50: 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 3c  ( pBt->pageSize<
9f60: 35 31 32 20 7c 7c 20 70 42 74 2d 3e 70 61 67 65  512 || pBt->page
9f70: 53 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  Size>SQLITE_MAX_
9f80: 50 41 47 45 5f 53 49 5a 45 0a 20 20 20 20 20 20  PAGE_SIZE.      
9f90: 20 20 20 7c 7c 20 28 28 70 42 74 2d 3e 70 61 67     || ((pBt->pag
9fa0: 65 53 69 7a 65 2d 31 29 26 70 42 74 2d 3e 70 61  eSize-1)&pBt->pa
9fb0: 67 65 53 69 7a 65 29 21 3d 30 20 29 7b 0a 20 20  geSize)!=0 ){.  
9fc0: 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a      pBt->pageSiz
9fd0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  e = 0;.      sql
9fe0: 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67 65  ite3PagerSetPage
9ff0: 73 69 7a 65 28 70 42 74 2d 3e 70 50 61 67 65 72  size(pBt->pPager
a000: 2c 20 26 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  , &pBt->pageSize
a010: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
a020: 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
a030: 4d 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  M.      /* If th
a040: 65 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d  e magic name ":m
a050: 65 6d 6f 72 79 3a 22 20 77 69 6c 6c 20 63 72 65  emory:" will cre
a060: 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ate an in-memory
a070: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 6e 0a   database, then.
a080: 20 20 20 20 20 20 2a 2a 20 6c 65 61 76 65 20 74        ** leave t
a090: 68 65 20 61 75 74 6f 56 61 63 75 75 6d 20 6d 6f  he autoVacuum mo
a0a0: 64 65 20 61 74 20 30 20 28 64 6f 20 6e 6f 74 20  de at 0 (do not 
a0b0: 61 75 74 6f 2d 76 61 63 75 75 6d 29 2c 20 65 76  auto-vacuum), ev
a0c0: 65 6e 20 69 66 0a 20 20 20 20 20 20 2a 2a 20 53  en if.      ** S
a0d0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55  QLITE_DEFAULT_AU
a0e0: 54 4f 56 41 43 55 55 4d 20 69 73 20 74 72 75 65  TOVACUUM is true
a0f0: 2e 20 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68  . On the other h
a100: 61 6e 64 2c 20 69 66 0a 20 20 20 20 20 20 2a 2a  and, if.      **
a110: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
a120: 4f 52 59 44 42 20 68 61 73 20 62 65 65 6e 20 64  ORYDB has been d
a130: 65 66 69 6e 65 64 2c 20 74 68 65 6e 20 22 3a 6d  efined, then ":m
a140: 65 6d 6f 72 79 3a 22 20 69 73 20 6a 75 73 74 20  emory:" is just 
a150: 61 0a 20 20 20 20 20 20 2a 2a 20 72 65 67 75 6c  a.      ** regul
a160: 61 72 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 49 6e  ar file-name. In
a170: 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 61   this case the a
a180: 75 74 6f 2d 76 61 63 75 75 6d 20 61 70 70 6c 69  uto-vacuum appli
a190: 65 73 20 61 73 20 70 65 72 20 6e 6f 72 6d 61 6c  es as per normal
a1a0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
a1b0: 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26   if( zFilename &
a1c0: 26 20 21 69 73 4d 65 6d 64 62 20 29 7b 0a 20 20  & !isMemdb ){.  
a1d0: 20 20 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56        pBt->autoV
a1e0: 61 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f  acuum = (SQLITE_
a1f0: 44 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55  DEFAULT_AUTOVACU
a200: 55 4d 20 3f 20 31 20 3a 20 30 29 3b 0a 20 20 20  UM ? 1 : 0);.   
a210: 20 20 20 20 20 70 42 74 2d 3e 69 6e 63 72 56 61       pBt->incrVa
a220: 63 75 75 6d 20 3d 20 28 53 51 4c 49 54 45 5f 44  cuum = (SQLITE_D
a230: 45 46 41 55 4c 54 5f 41 55 54 4f 56 41 43 55 55  EFAULT_AUTOVACUU
a240: 4d 3d 3d 32 20 3f 20 31 20 3a 20 30 29 3b 0a 20  M==2 ? 1 : 0);. 
a250: 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
a260: 20 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 30      nReserve = 0
a270: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a280: 20 20 20 6e 52 65 73 65 72 76 65 20 3d 20 7a 44     nReserve = zD
a290: 62 48 65 61 64 65 72 5b 32 30 5d 3b 0a 20 20 20  bHeader[20];.   
a2a0: 20 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65     pBt->pageSize
a2b0: 46 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64  Fixed = 1;.#ifnd
a2c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
a2d0: 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
a2e0: 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20  pBt->autoVacuum 
a2f0: 3d 20 28 67 65 74 34 62 79 74 65 28 26 7a 44 62  = (get4byte(&zDb
a300: 48 65 61 64 65 72 5b 33 36 20 2b 20 34 2a 34 5d  Header[36 + 4*4]
a310: 29 3f 31 3a 30 29 3b 0a 20 20 20 20 20 20 70 42  )?1:0);.      pB
a320: 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20  t->incrVacuum = 
a330: 28 67 65 74 34 62 79 74 65 28 26 7a 44 62 48 65  (get4byte(&zDbHe
a340: 61 64 65 72 5b 33 36 20 2b 20 37 2a 34 5d 29 3f  ader[36 + 7*4])?
a350: 31 3a 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  1:0);.#endif.   
a360: 20 7d 0a 20 20 20 20 70 42 74 2d 3e 75 73 61 62   }.    pBt->usab
a370: 6c 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61  leSize = pBt->pa
a380: 67 65 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76  geSize - nReserv
a390: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  e;.    assert( (
a3a0: 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20 26 20  pBt->pageSize & 
a3b0: 37 29 3d 3d 30 20 29 3b 20 20 2f 2a 20 38 2d 62  7)==0 );  /* 8-b
a3c0: 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 6f 66  yte alignment of
a3d0: 20 70 61 67 65 53 69 7a 65 20 2a 2f 0a 20 20 20   pageSize */.   
a3e0: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
a3f0: 50 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50  Pagesize(pBt->pP
a400: 61 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65  ager, &pBt->page
a410: 53 69 7a 65 29 3b 0a 20 20 20 0a 23 69 66 20 21  Size);.   .#if !
a420: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
a430: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
a440: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
a450: 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
a460: 29 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65  ).    /* Add the
a470: 20 6e 65 77 20 42 74 53 68 61 72 65 64 20 6f 62   new BtShared ob
a480: 6a 65 63 74 20 74 6f 20 74 68 65 20 6c 69 6e 6b  ject to the link
a490: 65 64 20 6c 69 73 74 20 73 68 61 72 61 62 6c 65  ed list sharable
a4a0: 20 42 74 53 68 61 72 65 64 73 2e 0a 20 20 20 20   BtShareds..    
a4b0: 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 68  */.    if( p->sh
a4c0: 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
a4d0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d  sqlite3_mutex *m
a4e0: 75 74 65 78 53 68 61 72 65 64 3b 0a 20 20 20 20  utexShared;.    
a4f0: 20 20 70 42 74 2d 3e 6e 52 65 66 20 3d 20 31 3b    pBt->nRef = 1;
a500: 0a 20 20 20 20 20 20 6d 75 74 65 78 53 68 61 72  .      mutexShar
a510: 65 64 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ed = sqlite3Mute
a520: 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
a530: 54 45 58 5f 53 54 41 54 49 43 5f 4d 41 53 54 45  TEX_STATIC_MASTE
a540: 52 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51  R);.      if( SQ
a550: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 20  LITE_THREADSAFE 
a560: 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  && sqlite3Global
a570: 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
a580: 78 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42 74  x ){.        pBt
a590: 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  ->mutex = sqlite
a5a0: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
a5b0: 54 45 5f 4d 55 54 45 58 5f 46 41 53 54 29 3b 0a  TE_MUTEX_FAST);.
a5c0: 20 20 20 20 20 20 20 20 69 66 28 20 70 42 74 2d          if( pBt-
a5d0: 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  >mutex==0 ){.   
a5e0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
a5f0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
a600: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
a610: 69 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  iled = 0;.      
a620: 20 20 20 20 67 6f 74 6f 20 62 74 72 65 65 5f 6f      goto btree_o
a630: 70 65 6e 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  pen_out;.       
a640: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
a650: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
a660: 6e 74 65 72 28 6d 75 74 65 78 53 68 61 72 65 64  nter(mutexShared
a670: 29 3b 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 4e  );.      pBt->pN
a680: 65 78 74 20 3d 20 47 4c 4f 42 41 4c 28 42 74 53  ext = GLOBAL(BtS
a690: 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
a6a0: 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 3b 0a  aredCacheList);.
a6b0: 20 20 20 20 20 20 47 4c 4f 42 41 4c 28 42 74 53        GLOBAL(BtS
a6c0: 68 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68  hared*,sqlite3Sh
a6d0: 61 72 65 64 43 61 63 68 65 4c 69 73 74 29 20 3d  aredCacheList) =
a6e0: 20 70 42 74 3b 0a 20 20 20 20 20 20 73 71 6c 69   pBt;.      sqli
a6f0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
a700: 6d 75 74 65 78 53 68 61 72 65 64 29 3b 0a 20 20  mutexShared);.  
a710: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a    }.#endif.  }..
a720: 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
a730: 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f  ITE_OMIT_SHARED_
a740: 43 41 43 48 45 29 20 26 26 20 21 64 65 66 69 6e  CACHE) && !defin
a750: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ed(SQLITE_OMIT_D
a760: 49 53 4b 49 4f 29 0a 20 20 2f 2a 20 49 66 20 74  ISKIO).  /* If t
a770: 68 65 20 6e 65 77 20 42 74 72 65 65 20 75 73 65  he new Btree use
a780: 73 20 61 20 73 68 61 72 61 62 6c 65 20 70 42 74  s a sharable pBt
a790: 53 68 61 72 65 64 2c 20 74 68 65 6e 20 6c 69 6e  Shared, then lin
a7a0: 6b 20 74 68 65 20 6e 65 77 0a 20 20 2a 2a 20 42  k the new.  ** B
a7b0: 74 72 65 65 20 69 6e 74 6f 20 74 68 65 20 6c 69  tree into the li
a7c0: 73 74 20 6f 66 20 61 6c 6c 20 73 68 61 72 61 62  st of all sharab
a7d0: 6c 65 20 42 74 72 65 65 73 20 66 6f 72 20 74 68  le Btrees for th
a7e0: 65 20 73 61 6d 65 20 63 6f 6e 6e 65 63 74 69 6f  e same connectio
a7f0: 6e 2e 0a 20 20 2a 2a 20 54 68 65 20 6c 69 73 74  n..  ** The list
a800: 20 69 73 20 6b 65 70 74 20 69 6e 20 61 73 63 65   is kept in asce
a810: 6e 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70  nding order by p
a820: 42 74 20 61 64 64 72 65 73 73 2e 0a 20 20 2a 2f  Bt address..  */
a830: 0a 20 20 69 66 28 20 70 2d 3e 73 68 61 72 61 62  .  if( p->sharab
a840: 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  le ){.    int i;
a850: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 53 69 62  .    Btree *pSib
a860: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
a870: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
a880: 20 20 20 20 20 20 69 66 28 20 28 70 53 69 62 20        if( (pSib 
a890: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
a8a0: 29 21 3d 30 20 26 26 20 70 53 69 62 2d 3e 73 68  )!=0 && pSib->sh
a8b0: 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  arable ){.      
a8c0: 20 20 77 68 69 6c 65 28 20 70 53 69 62 2d 3e 70    while( pSib->p
a8d0: 50 72 65 76 20 29 7b 20 70 53 69 62 20 3d 20 70  Prev ){ pSib = p
a8e0: 53 69 62 2d 3e 70 50 72 65 76 3b 20 7d 0a 20 20  Sib->pPrev; }.  
a8f0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 42 74        if( p->pBt
a900: 3c 70 53 69 62 2d 3e 70 42 74 20 29 7b 0a 20 20  <pSib->pBt ){.  
a910: 20 20 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74          p->pNext
a920: 20 3d 20 70 53 69 62 3b 0a 20 20 20 20 20 20 20   = pSib;.       
a930: 20 20 20 70 2d 3e 70 50 72 65 76 20 3d 20 30 3b     p->pPrev = 0;
a940: 0a 20 20 20 20 20 20 20 20 20 20 70 53 69 62 2d  .          pSib-
a950: 3e 70 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20  >pPrev = p;.    
a960: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a970: 20 20 20 20 20 77 68 69 6c 65 28 20 70 53 69 62       while( pSib
a980: 2d 3e 70 4e 65 78 74 20 26 26 20 70 53 69 62 2d  ->pNext && pSib-
a990: 3e 70 4e 65 78 74 2d 3e 70 42 74 3c 70 2d 3e 70  >pNext->pBt<p->p
a9a0: 42 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  Bt ){.          
a9b0: 20 20 70 53 69 62 20 3d 20 70 53 69 62 2d 3e 70    pSib = pSib->p
a9c0: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Next;.          
a9d0: 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 70  }.          p->p
a9e0: 4e 65 78 74 20 3d 20 70 53 69 62 2d 3e 70 4e 65  Next = pSib->pNe
a9f0: 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 2d  xt;.          p-
aa00: 3e 70 50 72 65 76 20 3d 20 70 53 69 62 3b 0a 20  >pPrev = pSib;. 
aa10: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e           if( p->
aa20: 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20  pNext ){.       
aa30: 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 2d 3e 70       p->pNext->p
aa40: 50 72 65 76 20 3d 20 70 3b 0a 20 20 20 20 20 20  Prev = p;.      
aa50: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
aa60: 70 53 69 62 2d 3e 70 4e 65 78 74 20 3d 20 70 3b  pSib->pNext = p;
aa70: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
aa80: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
aa90: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64  }.    }.  }.#end
aaa0: 69 66 0a 20 20 2a 70 70 42 74 72 65 65 20 3d 20  if.  *ppBtree = 
aab0: 70 3b 0a 0a 62 74 72 65 65 5f 6f 70 65 6e 5f 6f  p;..btree_open_o
aac0: 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  ut:.  if( rc!=SQ
aad0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
aae0: 66 28 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70  f( pBt && pBt->p
aaf0: 50 61 67 65 72 20 29 7b 0a 20 20 20 20 20 20 73  Pager ){.      s
ab00: 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
ab10: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
ab20: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
ab30: 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 20 20  _free(pBt);.    
ab40: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
ab50: 0a 20 20 20 20 2a 70 70 42 74 72 65 65 20 3d 20  .    *ppBtree = 
ab60: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
ab70: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  rc;.}../*.** Dec
ab80: 72 65 6d 65 6e 74 20 74 68 65 20 42 74 53 68 61  rement the BtSha
ab90: 72 65 64 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72  red.nRef counter
aba0: 2e 20 20 57 68 65 6e 20 69 74 20 72 65 61 63 68  .  When it reach
abb0: 65 73 20 7a 65 72 6f 2c 0a 2a 2a 20 72 65 6d 6f  es zero,.** remo
abc0: 76 65 20 74 68 65 20 42 74 53 68 61 72 65 64 20  ve the BtShared 
abd0: 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d 20 74  structure from t
abe0: 68 65 20 73 68 61 72 69 6e 67 20 6c 69 73 74 2e  he sharing list.
abf0: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74 72 75 65    Return.** true
ac00: 20 69 66 20 74 68 65 20 42 74 53 68 61 72 65 64   if the BtShared
ac10: 2e 6e 52 65 66 20 63 6f 75 6e 74 65 72 20 72 65  .nRef counter re
ac20: 61 63 68 65 73 20 7a 65 72 6f 20 61 6e 64 20 72  aches zero and r
ac30: 65 74 75 72 6e 0a 2a 2a 20 66 61 6c 73 65 20 69  eturn.** false i
ac40: 66 20 69 74 20 69 73 20 73 74 69 6c 6c 20 70 6f  f it is still po
ac50: 73 69 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69  sitive..*/.stati
ac60: 63 20 69 6e 74 20 72 65 6d 6f 76 65 46 72 6f 6d  c int removeFrom
ac70: 53 68 61 72 69 6e 67 4c 69 73 74 28 42 74 53 68  SharingList(BtSh
ac80: 61 72 65 64 20 2a 70 42 74 29 7b 0a 23 69 66 6e  ared *pBt){.#ifn
ac90: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
aca0: 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 73  SHARED_CACHE.  s
acb0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 70 4d  qlite3_mutex *pM
acc0: 61 73 74 65 72 3b 0a 20 20 42 74 53 68 61 72 65  aster;.  BtShare
acd0: 64 20 2a 70 4c 69 73 74 3b 0a 20 20 69 6e 74 20  d *pList;.  int 
ace0: 72 65 6d 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20  removed = 0;..  
acf0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
ad00: 6d 75 74 65 78 5f 6e 6f 74 68 65 6c 64 28 70 42  mutex_notheld(pB
ad10: 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70  t->mutex) );.  p
ad20: 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Master = sqlite3
ad30: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
ad40: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d  E_MUTEX_STATIC_M
ad50: 41 53 54 45 52 29 3b 0a 20 20 73 71 6c 69 74 65  ASTER);.  sqlite
ad60: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d  3_mutex_enter(pM
ad70: 61 73 74 65 72 29 3b 0a 20 20 70 42 74 2d 3e 6e  aster);.  pBt->n
ad80: 52 65 66 2d 2d 3b 0a 20 20 69 66 28 20 70 42 74  Ref--;.  if( pBt
ad90: 2d 3e 6e 52 65 66 3c 3d 30 20 29 7b 0a 20 20 20  ->nRef<=0 ){.   
ada0: 20 69 66 28 20 47 4c 4f 42 41 4c 28 42 74 53 68   if( GLOBAL(BtSh
adb0: 61 72 65 64 2a 2c 73 71 6c 69 74 65 33 53 68 61  ared*,sqlite3Sha
adc0: 72 65 64 43 61 63 68 65 4c 69 73 74 29 3d 3d 70  redCacheList)==p
add0: 42 74 20 29 7b 0a 20 20 20 20 20 20 47 4c 4f 42  Bt ){.      GLOB
ade0: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
adf0: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
ae00: 69 73 74 29 20 3d 20 70 42 74 2d 3e 70 4e 65 78  ist) = pBt->pNex
ae10: 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
ae20: 20 20 20 20 70 4c 69 73 74 20 3d 20 47 4c 4f 42      pList = GLOB
ae30: 41 4c 28 42 74 53 68 61 72 65 64 2a 2c 73 71 6c  AL(BtShared*,sql
ae40: 69 74 65 33 53 68 61 72 65 64 43 61 63 68 65 4c  ite3SharedCacheL
ae50: 69 73 74 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  ist);.      whil
ae60: 65 28 20 41 4c 57 41 59 53 28 70 4c 69 73 74 29  e( ALWAYS(pList)
ae70: 20 26 26 20 70 4c 69 73 74 2d 3e 70 4e 65 78 74   && pList->pNext
ae80: 21 3d 70 42 74 20 29 7b 0a 20 20 20 20 20 20 20  !=pBt ){.       
ae90: 20 70 4c 69 73 74 3d 70 4c 69 73 74 2d 3e 70 4e   pList=pList->pN
aea0: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
aeb0: 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 4c     if( ALWAYS(pL
aec0: 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ist) ){.        
aed0: 70 4c 69 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70  pList->pNext = p
aee0: 42 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20  Bt->pNext;.     
aef0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
af00: 20 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41   SQLITE_THREADSA
af10: 46 45 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  FE ){.      sqli
af20: 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 70  te3_mutex_free(p
af30: 42 74 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  Bt->mutex);.    
af40: 7d 0a 20 20 20 20 72 65 6d 6f 76 65 64 20 3d 20  }.    removed = 
af50: 31 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  1;.  }.  sqlite3
af60: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61  _mutex_leave(pMa
af70: 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ster);.  return 
af80: 72 65 6d 6f 76 65 64 3b 0a 23 65 6c 73 65 0a 20  removed;.#else. 
af90: 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69   return 1;.#endi
afa0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  f.}../*.** Make 
afb0: 73 75 72 65 20 70 42 74 2d 3e 70 54 6d 70 53 70  sure pBt->pTmpSp
afc0: 61 63 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e  ace points to an
afd0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f 66 20 0a   allocation of .
afe0: 2a 2a 20 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28  ** MX_CELL_SIZE(
aff0: 70 42 74 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73  pBt) bytes..*/.s
b000: 74 61 74 69 63 20 76 6f 69 64 20 61 6c 6c 6f 63  tatic void alloc
b010: 61 74 65 54 65 6d 70 53 70 61 63 65 28 42 74 53  ateTempSpace(BtS
b020: 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 69  hared *pBt){.  i
b030: 66 28 20 21 70 42 74 2d 3e 70 54 6d 70 53 70 61  f( !pBt->pTmpSpa
b040: 63 65 20 29 7b 0a 20 20 20 20 70 42 74 2d 3e 70  ce ){.    pBt->p
b050: 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74  TmpSpace = sqlit
b060: 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 20 70 42  e3PageMalloc( pB
b070: 74 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20  t->pageSize );. 
b080: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65   }.}../*.** Free
b090: 20 74 68 65 20 70 42 74 2d 3e 70 54 6d 70 53 70   the pBt->pTmpSp
b0a0: 61 63 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  ace allocation.*
b0b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  /.static void fr
b0c0: 65 65 54 65 6d 70 53 70 61 63 65 28 42 74 53 68  eeTempSpace(BtSh
b0d0: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 73 71  ared *pBt){.  sq
b0e0: 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 20 70  lite3PageFree( p
b0f0: 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  Bt->pTmpSpace);.
b100: 20 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65    pBt->pTmpSpace
b110: 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   = 0;.}../*.** C
b120: 6c 6f 73 65 20 61 6e 20 6f 70 65 6e 20 64 61 74  lose an open dat
b130: 61 62 61 73 65 20 61 6e 64 20 69 6e 76 61 6c 69  abase and invali
b140: 64 61 74 65 20 61 6c 6c 20 63 75 72 73 6f 72 73  date all cursors
b150: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
b160: 42 74 72 65 65 43 6c 6f 73 65 28 42 74 72 65 65  BtreeClose(Btree
b170: 20 2a 70 29 7b 0a 20 20 42 74 53 68 61 72 65 64   *p){.  BtShared
b180: 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
b190: 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
b1a0: 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c  ;..  /* Close al
b1b0: 6c 20 63 75 72 73 6f 72 73 20 6f 70 65 6e 65 64  l cursors opened
b1c0: 20 76 69 61 20 74 68 69 73 20 68 61 6e 64 6c 65   via this handle
b1d0: 2e 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
b1e0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
b1f0: 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  ld(p->db->mutex)
b200: 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72   );.  sqlite3Btr
b210: 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 42  eeEnter(p);.  pB
b220: 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  t->db = p->db;. 
b230: 20 70 43 75 72 20 3d 20 70 42 74 2d 3e 70 43 75   pCur = pBt->pCu
b240: 72 73 6f 72 3b 0a 20 20 77 68 69 6c 65 28 20 70  rsor;.  while( p
b250: 43 75 72 20 29 7b 0a 20 20 20 20 42 74 43 75 72  Cur ){.    BtCur
b260: 73 6f 72 20 2a 70 54 6d 70 20 3d 20 70 43 75 72  sor *pTmp = pCur
b270: 3b 0a 20 20 20 20 70 43 75 72 20 3d 20 70 43 75  ;.    pCur = pCu
b280: 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 69 66  r->pNext;.    if
b290: 28 20 70 54 6d 70 2d 3e 70 42 74 72 65 65 3d 3d  ( pTmp->pBtree==
b2a0: 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
b2b0: 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72 73  e3BtreeCloseCurs
b2c0: 6f 72 28 70 54 6d 70 29 3b 0a 20 20 20 20 7d 0a  or(pTmp);.    }.
b2d0: 20 20 7d 0a 0a 20 20 2f 2a 20 52 6f 6c 6c 62 61    }..  /* Rollba
b2e0: 63 6b 20 61 6e 79 20 61 63 74 69 76 65 20 74 72  ck any active tr
b2f0: 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 66 72  ansaction and fr
b300: 65 65 20 74 68 65 20 68 61 6e 64 6c 65 20 73 74  ee the handle st
b310: 72 75 63 74 75 72 65 2e 0a 20 20 2a 2a 20 54 68  ructure..  ** Th
b320: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
b330: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29  3BtreeRollback()
b340: 20 64 72 6f 70 73 20 61 6e 79 20 74 61 62 6c 65   drops any table
b350: 2d 6c 6f 63 6b 73 20 68 65 6c 64 20 62 79 0a 20  -locks held by. 
b360: 20 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c 65 2e   ** this handle.
b370: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42  .  */.  sqlite3B
b380: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 29 3b  treeRollback(p);
b390: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
b3a0: 65 61 76 65 28 70 29 3b 0a 0a 20 20 2f 2a 20 49  eave(p);..  /* I
b3b0: 66 20 74 68 65 72 65 20 61 72 65 20 73 74 69 6c  f there are stil
b3c0: 6c 20 6f 74 68 65 72 20 6f 75 74 73 74 61 6e 64  l other outstand
b3d0: 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 20 74  ing references t
b3e0: 6f 20 74 68 65 20 73 68 61 72 65 64 2d 62 74 72  o the shared-btr
b3f0: 65 65 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72  ee.  ** structur
b400: 65 2c 20 72 65 74 75 72 6e 20 6e 6f 77 2e 20 54  e, return now. T
b410: 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
b420: 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 63  this procedure c
b430: 6c 65 61 6e 73 20 0a 20 20 2a 2a 20 75 70 20 74  leans .  ** up t
b440: 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65 2e  he shared-btree.
b450: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
b460: 70 2d 3e 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30  p->wantToLock==0
b470: 20 26 26 20 70 2d 3e 6c 6f 63 6b 65 64 3d 3d 30   && p->locked==0
b480: 20 29 3b 0a 20 20 69 66 28 20 21 70 2d 3e 73 68   );.  if( !p->sh
b490: 61 72 61 62 6c 65 20 7c 7c 20 72 65 6d 6f 76 65  arable || remove
b4a0: 46 72 6f 6d 53 68 61 72 69 6e 67 4c 69 73 74 28  FromSharingList(
b4b0: 70 42 74 29 20 29 7b 0a 20 20 20 20 2f 2a 20 54  pBt) ){.    /* T
b4c0: 68 65 20 70 42 74 20 69 73 20 6e 6f 20 6c 6f 6e  he pBt is no lon
b4d0: 67 65 72 20 6f 6e 20 74 68 65 20 73 68 61 72 69  ger on the shari
b4e0: 6e 67 20 6c 69 73 74 2c 20 73 6f 20 77 65 20 63  ng list, so we c
b4f0: 61 6e 20 61 63 63 65 73 73 0a 20 20 20 20 2a 2a  an access.    **
b500: 20 69 74 20 77 69 74 68 6f 75 74 20 68 61 76 69   it without havi
b510: 6e 67 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  ng to hold the m
b520: 75 74 65 78 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  utex..    **.   
b530: 20 2a 2a 20 43 6c 65 61 6e 20 6f 75 74 20 61 6e   ** Clean out an
b540: 64 20 64 65 6c 65 74 65 20 74 68 65 20 42 74 53  d delete the BtS
b550: 68 61 72 65 64 20 6f 62 6a 65 63 74 2e 0a 20 20  hared object..  
b560: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
b570: 20 21 70 42 74 2d 3e 70 43 75 72 73 6f 72 20 29   !pBt->pCursor )
b580: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
b590: 65 72 43 6c 6f 73 65 28 70 42 74 2d 3e 70 50 61  erClose(pBt->pPa
b5a0: 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 42  ger);.    if( pB
b5b0: 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61 20 26  t->xFreeSchema &
b5c0: 26 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 29  & pBt->pSchema )
b5d0: 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 78 46 72  {.      pBt->xFr
b5e0: 65 65 53 63 68 65 6d 61 28 70 42 74 2d 3e 70 53  eeSchema(pBt->pS
b5f0: 63 68 65 6d 61 29 3b 0a 20 20 20 20 7d 0a 20 20  chema);.    }.  
b600: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
b610: 42 74 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20 20  Bt->pSchema);.  
b620: 20 20 66 72 65 65 54 65 6d 70 53 70 61 63 65 28    freeTempSpace(
b630: 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  pBt);.    sqlite
b640: 33 5f 66 72 65 65 28 70 42 74 29 3b 0a 20 20 7d  3_free(pBt);.  }
b650: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
b660: 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43  _OMIT_SHARED_CAC
b670: 48 45 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  HE.  assert( p->
b680: 77 61 6e 74 54 6f 4c 6f 63 6b 3d 3d 30 20 29 3b  wantToLock==0 );
b690: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 6c 6f  .  assert( p->lo
b6a0: 63 6b 65 64 3d 3d 30 20 29 3b 0a 20 20 69 66 28  cked==0 );.  if(
b6b0: 20 70 2d 3e 70 50 72 65 76 20 29 20 70 2d 3e 70   p->pPrev ) p->p
b6c0: 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70 2d  Prev->pNext = p-
b6d0: 3e 70 4e 65 78 74 3b 0a 20 20 69 66 28 20 70 2d  >pNext;.  if( p-
b6e0: 3e 70 4e 65 78 74 20 29 20 70 2d 3e 70 4e 65 78  >pNext ) p->pNex
b6f0: 74 2d 3e 70 50 72 65 76 20 3d 20 70 2d 3e 70 50  t->pPrev = p->pP
b700: 72 65 76 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 73  rev;.#endif..  s
b710: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
b720: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b730: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  OK;.}../*.** Cha
b740: 6e 67 65 20 74 68 65 20 6c 69 6d 69 74 20 6f 6e  nge the limit on
b750: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
b760: 61 67 65 73 20 61 6c 6c 6f 77 65 64 20 69 6e 20  ages allowed in 
b770: 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a  the cache..**.**
b780: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   The maximum num
b790: 62 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67  ber of cache pag
b7a0: 65 73 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  es is set to the
b7b0: 20 61 62 73 6f 6c 75 74 65 0a 2a 2a 20 76 61 6c   absolute.** val
b7c0: 75 65 20 6f 66 20 6d 78 50 61 67 65 2e 20 20 49  ue of mxPage.  I
b7d0: 66 20 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61  f mxPage is nega
b7e0: 74 69 76 65 2c 20 74 68 65 20 70 61 67 65 72 20  tive, the pager 
b7f0: 77 69 6c 6c 0a 2a 2a 20 6f 70 65 72 61 74 65 20  will.** operate 
b800: 61 73 79 6e 63 68 72 6f 6e 6f 75 73 6c 79 20 2d  asynchronously -
b810: 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 73 74 6f   it will not sto
b820: 70 20 74 6f 20 64 6f 20 66 73 79 6e 63 28 29 73  p to do fsync()s
b830: 0a 2a 2a 20 74 6f 20 69 6e 73 75 72 65 20 64 61  .** to insure da
b840: 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
b850: 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61 63   the disk surfac
b860: 65 20 62 65 66 6f 72 65 0a 2a 2a 20 63 6f 6e 74  e before.** cont
b870: 69 6e 75 69 6e 67 2e 20 20 54 72 61 6e 73 61 63  inuing.  Transac
b880: 74 69 6f 6e 73 20 73 74 69 6c 6c 20 77 6f 72 6b  tions still work
b890: 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20   if synchronous 
b8a0: 69 73 20 6f 66 66 2c 0a 2a 2a 20 61 6e 64 20 74  is off,.** and t
b8b0: 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 6e  he database cann
b8c0: 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
b8d0: 69 66 20 74 68 69 73 20 70 72 6f 67 72 61 6d 0a  if this program.
b8e0: 2a 2a 20 63 72 61 73 68 65 73 2e 20 20 42 75 74  ** crashes.  But
b8f0: 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69 6e   if the operatin
b900: 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65 73  g system crashes
b910: 20 6f 72 20 74 68 65 72 65 20 69 73 0a 2a 2a 20   or there is.** 
b920: 61 6e 20 61 62 72 75 70 74 20 70 6f 77 65 72 20  an abrupt power 
b930: 66 61 69 6c 75 72 65 20 77 68 65 6e 20 73 79 6e  failure when syn
b940: 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 66 66 2c  chronous is off,
b950: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
b960: 20 63 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 69   could be left i
b970: 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65 6e  n an inconsisten
b980: 74 20 61 6e 64 20 75 6e 72 65 63 6f 76 65 72 61  t and unrecovera
b990: 62 6c 65 20 73 74 61 74 65 2e 0a 2a 2a 20 53 79  ble state..** Sy
b9a0: 6e 63 68 72 6f 6e 6f 75 73 20 69 73 20 6f 6e 20  nchronous is on 
b9b0: 62 79 20 64 65 66 61 75 6c 74 20 73 6f 20 64 61  by default so da
b9c0: 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
b9d0: 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 6e 6f 72 6d  n is not.** norm
b9e0: 61 6c 6c 79 20 61 20 77 6f 72 72 79 2e 0a 2a 2f  ally a worry..*/
b9f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65  .int sqlite3Btre
ba00: 65 53 65 74 43 61 63 68 65 53 69 7a 65 28 42 74  eSetCacheSize(Bt
ba10: 72 65 65 20 2a 70 2c 20 69 6e 74 20 6d 78 50 61  ree *p, int mxPa
ba20: 67 65 29 7b 0a 20 20 42 74 53 68 61 72 65 64 20  ge){.  BtShared 
ba30: 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20  *pBt = p->pBt;. 
ba40: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
ba50: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
ba60: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
ba70: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
ba80: 28 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  (p);.  sqlite3Pa
ba90: 67 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28  gerSetCachesize(
baa0: 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78 50  pBt->pPager, mxP
bab0: 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  age);.  sqlite3B
bac0: 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20  treeLeave(p);.  
bad0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
bae0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
baf0: 65 20 74 68 65 20 77 61 79 20 64 61 74 61 20 69  e the way data i
bb00: 73 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b  s synced to disk
bb10: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 63   in order to inc
bb20: 72 65 61 73 65 20 6f 72 20 64 65 63 72 65 61 73  rease or decreas
bb30: 65 0a 2a 2a 20 68 6f 77 20 77 65 6c 6c 20 74 68  e.** how well th
bb40: 65 20 64 61 74 61 62 61 73 65 20 72 65 73 69 73  e database resis
bb50: 74 73 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  ts damage due to
bb60: 20 4f 53 20 63 72 61 73 68 65 73 20 61 6e 64 20   OS crashes and 
bb70: 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65  power.** failure
bb80: 73 2e 20 20 4c 65 76 65 6c 20 31 20 69 73 20 74  s.  Level 1 is t
bb90: 68 65 20 73 61 6d 65 20 61 73 20 61 73 79 6e 63  he same as async
bba0: 68 72 6f 6e 6f 75 73 20 28 6e 6f 20 73 79 6e 63  hronous (no sync
bbb0: 73 28 29 20 6f 63 63 75 72 20 61 6e 64 0a 2a 2a  s() occur and.**
bbc0: 20 74 68 65 72 65 20 69 73 20 61 20 68 69 67 68   there is a high
bbd0: 20 70 72 6f 62 61 62 69 6c 69 74 79 20 6f 66 20   probability of 
bbe0: 64 61 6d 61 67 65 29 20 20 4c 65 76 65 6c 20 32  damage)  Level 2
bbf0: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e   is the default.
bc00: 20 20 54 68 65 72 65 0a 2a 2a 20 69 73 20 61 20    There.** is a 
bc10: 76 65 72 79 20 6c 6f 77 20 62 75 74 20 6e 6f 6e  very low but non
bc20: 2d 7a 65 72 6f 20 70 72 6f 62 61 62 69 6c 69 74  -zero probabilit
bc30: 79 20 6f 66 20 64 61 6d 61 67 65 2e 20 20 4c 65  y of damage.  Le
bc40: 76 65 6c 20 33 20 72 65 64 75 63 65 73 20 74 68  vel 3 reduces th
bc50: 65 0a 2a 2a 20 70 72 6f 62 61 62 69 6c 69 74 79  e.** probability
bc60: 20 6f 66 20 64 61 6d 61 67 65 20 74 6f 20 6e 65   of damage to ne
bc70: 61 72 20 7a 65 72 6f 20 62 75 74 20 77 69 74 68  ar zero but with
bc80: 20 61 20 77 72 69 74 65 20 70 65 72 66 6f 72 6d   a write perform
bc90: 61 6e 63 65 20 72 65 64 75 63 74 69 6f 6e 2e 0a  ance reduction..
bca0: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
bcb0: 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
bcc0: 47 4d 41 53 0a 69 6e 74 20 73 71 6c 69 74 65 33  GMAS.int sqlite3
bcd0: 42 74 72 65 65 53 65 74 53 61 66 65 74 79 4c 65  BtreeSetSafetyLe
bce0: 76 65 6c 28 42 74 72 65 65 20 2a 70 2c 20 69 6e  vel(Btree *p, in
bcf0: 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c  t level, int ful
bd00: 6c 53 79 6e 63 29 7b 0a 20 20 42 74 53 68 61 72  lSync){.  BtShar
bd10: 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
bd20: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
bd30: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70  te3_mutex_held(p
bd40: 2d 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  ->db->mutex) );.
bd50: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
bd60: 74 65 72 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ter(p);.  sqlite
bd70: 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c  3PagerSetSafetyL
bd80: 65 76 65 6c 28 70 42 74 2d 3e 70 50 61 67 65 72  evel(pBt->pPager
bd90: 2c 20 6c 65 76 65 6c 2c 20 66 75 6c 6c 53 79 6e  , level, fullSyn
bda0: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  c);.  sqlite3Btr
bdb0: 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
bdc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
bdd0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
bde0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
bdf0: 68 65 20 67 69 76 65 6e 20 62 74 72 65 65 20 69  he given btree i
be00: 73 20 73 65 74 20 74 6f 20 73 61 66 65 74 79 20  s set to safety 
be10: 6c 65 76 65 6c 20 31 2e 20 20 49 6e 20 6f 74 68  level 1.  In oth
be20: 65 72 0a 2a 2a 20 77 6f 72 64 73 2c 20 72 65 74  er.** words, ret
be30: 75 72 6e 20 54 52 55 45 20 69 66 20 6e 6f 20 73  urn TRUE if no s
be40: 79 6e 63 28 29 20 6f 63 63 75 72 73 20 6f 6e 20  ync() occurs on 
be50: 74 68 65 20 64 69 73 6b 20 66 69 6c 65 73 2e 0a  the disk files..
be60: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
be70: 72 65 65 53 79 6e 63 44 69 73 61 62 6c 65 64 28  reeSyncDisabled(
be80: 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 42 74 53  Btree *p){.  BtS
be90: 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
bea0: 70 42 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  pBt;.  int rc;. 
beb0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
bec0: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64  _mutex_held(p->d
bed0: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 20 20 0a 20  b->mutex) );  . 
bee0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
bef0: 65 72 28 70 29 3b 0a 20 20 61 73 73 65 72 74 28  er(p);.  assert(
bf00: 20 70 42 74 20 26 26 20 70 42 74 2d 3e 70 50 61   pBt && pBt->pPa
bf10: 67 65 72 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ger );.  rc = sq
bf20: 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79 6e 63  lite3PagerNosync
bf30: 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
bf40: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
bf50: 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  ve(p);.  return 
bf60: 72 63 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69  rc;.}..#if !defi
bf70: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
bf80: 50 41 47 45 52 5f 50 52 41 47 4d 41 53 29 20 7c  PAGER_PRAGMAS) |
bf90: 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  | !defined(SQLIT
bfa0: 45 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 29 0a 2f  E_OMIT_VACUUM)./
bfb0: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
bfc0: 64 65 66 61 75 6c 74 20 70 61 67 65 73 20 73 69  default pages si
bfd0: 7a 65 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65  ze and the numbe
bfe0: 72 20 6f 66 20 72 65 73 65 72 76 65 64 20 62 79  r of reserved by
bff0: 74 65 73 20 70 65 72 20 70 61 67 65 2e 0a 2a 2a  tes per page..**
c000: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a  .** The page siz
c010: 65 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65  e must be a powe
c020: 72 20 6f 66 20 32 20 62 65 74 77 65 65 6e 20 35  r of 2 between 5
c030: 31 32 20 61 6e 64 20 36 35 35 33 36 2e 20 20 49  12 and 65536.  I
c040: 66 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 73 69  f the page.** si
c050: 7a 65 20 73 75 70 70 6c 69 65 64 20 64 6f 65 73  ze supplied does
c060: 20 6e 6f 74 20 6d 65 65 74 20 74 68 69 73 20 63   not meet this c
c070: 6f 6e 73 74 72 61 69 6e 74 20 74 68 65 6e 20 74  onstraint then t
c080: 68 65 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  he page size is 
c090: 6e 6f 74 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 0a  not.** changed..
c0a0: 2a 2a 0a 2a 2a 20 50 61 67 65 20 73 69 7a 65 73  **.** Page sizes
c0b0: 20 61 72 65 20 63 6f 6e 73 74 72 61 69 6e 65 64   are constrained
c0c0: 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 20 6f   to be a power o
c0d0: 66 20 74 77 6f 20 73 6f 20 74 68 61 74 20 74 68  f two so that th
c0e0: 65 20 72 65 67 69 6f 6e 0a 2a 2a 20 6f 66 20 74  e region.** of t
c0f0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
c100: 20 75 73 65 64 20 66 6f 72 20 6c 6f 63 6b 69 6e   used for lockin
c110: 67 20 28 62 65 67 69 6e 6e 69 6e 67 20 61 74 20  g (beginning at 
c120: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 0a 2a 2a  PENDING_BYTE,.**
c130: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20   the first byte 
c140: 70 61 73 74 20 74 68 65 20 31 47 42 20 62 6f 75  past the 1GB bou
c150: 6e 64 61 72 79 2c 20 30 78 34 30 30 30 30 30 30  ndary, 0x4000000
c160: 30 29 20 6e 65 65 64 73 20 74 6f 20 6f 63 63 75  0) needs to occu
c170: 72 0a 2a 2a 20 61 74 20 74 68 65 20 62 65 67 69  r.** at the begi
c180: 6e 6e 69 6e 67 20 6f 66 20 61 20 70 61 67 65 2e  nning of a page.
c190: 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
c1a0: 74 65 72 20 6e 52 65 73 65 72 76 65 20 69 73 20  ter nReserve is 
c1b0: 6c 65 73 73 20 74 68 61 6e 20 7a 65 72 6f 2c 20  less than zero, 
c1c0: 74 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  then the number 
c1d0: 6f 66 20 72 65 73 65 72 76 65 64 0a 2a 2a 20 62  of reserved.** b
c1e0: 79 74 65 73 20 70 65 72 20 70 61 67 65 20 69 73  ytes per page is
c1f0: 20 6c 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e   left unchanged.
c200: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
c210: 74 72 65 65 53 65 74 50 61 67 65 53 69 7a 65 28  treeSetPageSize(
c220: 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 70 61  Btree *p, int pa
c230: 67 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73  geSize, int nRes
c240: 65 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20  erve){.  int rc 
c250: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42  = SQLITE_OK;.  B
c260: 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
c270: 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33  ->pBt;.  sqlite3
c280: 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
c290: 20 69 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69   if( pBt->pageSi
c2a0: 7a 65 46 69 78 65 64 20 29 7b 0a 20 20 20 20 73  zeFixed ){.    s
c2b0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
c2c0: 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  (p);.    return 
c2d0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
c2e0: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 52 65 73 65  .  }.  if( nRese
c2f0: 72 76 65 3c 30 20 29 7b 0a 20 20 20 20 6e 52 65  rve<0 ){.    nRe
c300: 73 65 72 76 65 20 3d 20 70 42 74 2d 3e 70 61 67  serve = pBt->pag
c310: 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61  eSize - pBt->usa
c320: 62 6c 65 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 69  bleSize;.  }.  i
c330: 66 28 20 70 61 67 65 53 69 7a 65 3e 3d 35 31 32  f( pageSize>=512
c340: 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53 51   && pageSize<=SQ
c350: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
c360: 5a 45 20 26 26 0a 20 20 20 20 20 20 20 20 28 28  ZE &&.        ((
c370: 70 61 67 65 53 69 7a 65 2d 31 29 26 70 61 67 65  pageSize-1)&page
c380: 53 69 7a 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Size)==0 ){.    
c390: 61 73 73 65 72 74 28 20 28 70 61 67 65 53 69 7a  assert( (pageSiz
c3a0: 65 20 26 20 37 29 3d 3d 30 20 29 3b 0a 20 20 20  e & 7)==0 );.   
c3b0: 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 70   assert( !pBt->p
c3c0: 50 61 67 65 31 20 26 26 20 21 70 42 74 2d 3e 70  Page1 && !pBt->p
c3d0: 43 75 72 73 6f 72 20 29 3b 0a 20 20 20 20 70 42  Cursor );.    pB
c3e0: 74 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  t->pageSize = pa
c3f0: 67 65 53 69 7a 65 3b 0a 20 20 20 20 66 72 65 65  geSize;.    free
c400: 54 65 6d 70 53 70 61 63 65 28 70 42 74 29 3b 0a  TempSpace(pBt);.
c410: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
c420: 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
c430: 28 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 26 70  (pBt->pPager, &p
c440: 42 74 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  Bt->pageSize);. 
c450: 20 7d 0a 20 20 70 42 74 2d 3e 75 73 61 62 6c 65   }.  pBt->usable
c460: 53 69 7a 65 20 3d 20 70 42 74 2d 3e 70 61 67 65  Size = pBt->page
c470: 53 69 7a 65 20 2d 20 6e 52 65 73 65 72 76 65 3b  Size - nReserve;
c480: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
c490: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
c4a0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
c4b0: 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
c4c0: 74 6c 79 20 64 65 66 69 6e 65 64 20 70 61 67 65  tly defined page
c4d0: 20 73 69 7a 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c   size.*/.int sql
c4e0: 69 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65  ite3BtreeGetPage
c4f0: 53 69 7a 65 28 42 74 72 65 65 20 2a 70 29 7b 0a  Size(Btree *p){.
c500: 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d    return p->pBt-
c510: 3e 70 61 67 65 53 69 7a 65 3b 0a 7d 0a 69 6e 74  >pageSize;.}.int
c520: 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
c530: 52 65 73 65 72 76 65 28 42 74 72 65 65 20 2a 70  Reserve(Btree *p
c540: 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 73 71  ){.  int n;.  sq
c550: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
c560: 70 29 3b 0a 20 20 6e 20 3d 20 70 2d 3e 70 42 74  p);.  n = p->pBt
c570: 2d 3e 70 61 67 65 53 69 7a 65 20 2d 20 70 2d 3e  ->pageSize - p->
c580: 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 3b  pBt->usableSize;
c590: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
c5a0: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
c5b0: 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n n;.}../*.** Se
c5c0: 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  t the maximum pa
c5d0: 67 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 64  ge count for a d
c5e0: 61 74 61 62 61 73 65 20 69 66 20 6d 78 50 61 67  atabase if mxPag
c5f0: 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 0a 2a  e is positive..*
c600: 2a 20 4e 6f 20 63 68 61 6e 67 65 73 20 61 72 65  * No changes are
c610: 20 6d 61 64 65 20 69 66 20 6d 78 50 61 67 65 20   made if mxPage 
c620: 69 73 20 30 20 6f 72 20 6e 65 67 61 74 69 76 65  is 0 or negative
c630: 2e 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  ..** Regardless 
c640: 6f 66 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  of the value of 
c650: 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
c660: 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  he maximum page 
c670: 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  count..*/.int sq
c680: 6c 69 74 65 33 42 74 72 65 65 4d 61 78 50 61 67  lite3BtreeMaxPag
c690: 65 43 6f 75 6e 74 28 42 74 72 65 65 20 2a 70 2c  eCount(Btree *p,
c6a0: 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
c6b0: 69 6e 74 20 6e 3b 0a 20 20 73 71 6c 69 74 65 33  int n;.  sqlite3
c6c0: 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
c6d0: 20 6e 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65   n = sqlite3Page
c6e0: 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 70 2d  rMaxPageCount(p-
c6f0: 3e 70 42 74 2d 3e 70 50 61 67 65 72 2c 20 6d 78  >pBt->pPager, mx
c700: 50 61 67 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  Page);.  sqlite3
c710: 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
c720: 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 23 65 6e   return n;.}.#en
c730: 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28  dif /* !defined(
c740: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45  SQLITE_OMIT_PAGE
c750: 52 5f 50 52 41 47 4d 41 53 29 20 7c 7c 20 21 64  R_PRAGMAS) || !d
c760: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
c770: 49 54 5f 56 41 43 55 55 4d 29 20 2a 2f 0a 0a 2f  IT_VACUUM) */../
c780: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
c790: 27 61 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72  'auto-vacuum' pr
c7a0: 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 64 61  operty of the da
c7b0: 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 20 27  tabase. If the '
c7c0: 61 75 74 6f 56 61 63 75 75 6d 27 0a 2a 2a 20 70  autoVacuum'.** p
c7d0: 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e 2d  arameter is non-
c7e0: 7a 65 72 6f 2c 20 74 68 65 6e 20 61 75 74 6f 2d  zero, then auto-
c7f0: 76 61 63 75 75 6d 20 6d 6f 64 65 20 69 73 20 65  vacuum mode is e
c800: 6e 61 62 6c 65 64 2e 20 49 66 20 7a 65 72 6f 2c  nabled. If zero,
c810: 20 69 74 0a 2a 2a 20 69 73 20 64 69 73 61 62 6c   it.** is disabl
c820: 65 64 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20  ed. The default 
c830: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 61 75  value for the au
c840: 74 6f 2d 76 61 63 75 75 6d 20 70 72 6f 70 65 72  to-vacuum proper
c850: 74 79 20 69 73 20 0a 2a 2a 20 64 65 74 65 72 6d  ty is .** determ
c860: 69 6e 65 64 20 62 79 20 74 68 65 20 53 51 4c 49  ined by the SQLI
c870: 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 56  TE_DEFAULT_AUTOV
c880: 41 43 55 55 4d 20 6d 61 63 72 6f 2e 0a 2a 2f 0a  ACUUM macro..*/.
c890: 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
c8a0: 53 65 74 41 75 74 6f 56 61 63 75 75 6d 28 42 74  SetAutoVacuum(Bt
c8b0: 72 65 65 20 2a 70 2c 20 69 6e 74 20 61 75 74 6f  ree *p, int auto
c8c0: 56 61 63 75 75 6d 29 7b 0a 23 69 66 64 65 66 20  Vacuum){.#ifdef 
c8d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
c8e0: 56 41 43 55 55 4d 0a 20 20 72 65 74 75 72 6e 20  VACUUM.  return 
c8f0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b  SQLITE_READONLY;
c900: 0a 23 65 6c 73 65 0a 20 20 42 74 53 68 61 72 65  .#else.  BtShare
c910: 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
c920: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
c930: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 61 76 20  TE_OK;.  int av 
c940: 3d 20 28 61 75 74 6f 56 61 63 75 75 6d 3f 31 3a  = (autoVacuum?1:
c950: 30 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 42 74  0);..  sqlite3Bt
c960: 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
c970: 66 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65  f( pBt->pageSize
c980: 46 69 78 65 64 20 26 26 20 61 76 21 3d 70 42 74  Fixed && av!=pBt
c990: 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
c9a0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
c9b0: 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 7d 65 6c 73  READONLY;.  }els
c9c0: 65 7b 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f  e{.    pBt->auto
c9d0: 56 61 63 75 75 6d 20 3d 20 61 76 3b 0a 20 20 7d  Vacuum = av;.  }
c9e0: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
c9f0: 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
ca00: 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  n rc;.#endif.}..
ca10: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
ca20: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 27 61   value of the 'a
ca30: 75 74 6f 2d 76 61 63 75 75 6d 27 20 70 72 6f 70  uto-vacuum' prop
ca40: 65 72 74 79 2e 20 49 66 20 61 75 74 6f 2d 76 61  erty. If auto-va
ca50: 63 75 75 6d 20 69 73 20 0a 2a 2a 20 65 6e 61 62  cuum is .** enab
ca60: 6c 65 64 20 31 20 69 73 20 72 65 74 75 72 6e 65  led 1 is returne
ca70: 64 2e 20 4f 74 68 65 72 77 69 73 65 20 30 2e 0a  d. Otherwise 0..
ca80: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
ca90: 72 65 65 47 65 74 41 75 74 6f 56 61 63 75 75 6d  reeGetAutoVacuum
caa0: 28 42 74 72 65 65 20 2a 70 29 7b 0a 23 69 66 64  (Btree *p){.#ifd
cab0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
cac0: 55 54 4f 56 41 43 55 55 4d 0a 20 20 72 65 74 75  UTOVACUUM.  retu
cad0: 72 6e 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43  rn BTREE_AUTOVAC
cae0: 55 55 4d 5f 4e 4f 4e 45 3b 0a 23 65 6c 73 65 0a  UUM_NONE;.#else.
caf0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
cb00: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
cb10: 3b 0a 20 20 72 63 20 3d 20 28 0a 20 20 20 20 28  ;.  rc = (.    (
cb20: 21 70 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  !p->pBt->autoVac
cb30: 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f 56  uum)?BTREE_AUTOV
cb40: 41 43 55 55 4d 5f 4e 4f 4e 45 3a 0a 20 20 20 20  ACUUM_NONE:.    
cb50: 28 21 70 2d 3e 70 42 74 2d 3e 69 6e 63 72 56 61  (!p->pBt->incrVa
cb60: 63 75 75 6d 29 3f 42 54 52 45 45 5f 41 55 54 4f  cuum)?BTREE_AUTO
cb70: 56 41 43 55 55 4d 5f 46 55 4c 4c 3a 0a 20 20 20  VACUUM_FULL:.   
cb80: 20 42 54 52 45 45 5f 41 55 54 4f 56 41 43 55 55   BTREE_AUTOVACUU
cb90: 4d 5f 49 4e 43 52 0a 20 20 29 3b 0a 20 20 73 71  M_INCR.  );.  sq
cba0: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
cbb0: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
cbc0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a  .#endif.}.../*.*
cbd0: 2a 20 47 65 74 20 61 20 72 65 66 65 72 65 6e 63  * Get a referenc
cbe0: 65 20 74 6f 20 70 50 61 67 65 31 20 6f 66 20 74  e to pPage1 of t
cbf0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
cc00: 2e 20 20 54 68 69 73 20 77 69 6c 6c 0a 2a 2a 20  .  This will.** 
cc10: 61 6c 73 6f 20 61 63 71 75 69 72 65 20 61 20 72  also acquire a r
cc20: 65 61 64 6c 6f 63 6b 20 6f 6e 20 74 68 61 74 20  eadlock on that 
cc30: 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49  file..**.** SQLI
cc40: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
cc50: 64 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 49  d on success.  I
cc60: 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f  f the file is no
cc70: 74 20 61 0a 2a 2a 20 77 65 6c 6c 2d 66 6f 72 6d  t a.** well-form
cc80: 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
cc90: 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 43 4f  , then SQLITE_CO
cca0: 52 52 55 50 54 20 69 73 20 72 65 74 75 72 6e 65  RRUPT is returne
ccb0: 64 2e 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53  d..** SQLITE_BUS
ccc0: 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  Y is returned if
ccd0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
cce0: 20 6c 6f 63 6b 65 64 2e 20 20 53 51 4c 49 54 45   locked.  SQLITE
ccf0: 5f 4e 4f 4d 45 4d 0a 2a 2a 20 69 73 20 72 65 74  _NOMEM.** is ret
cd00: 75 72 6e 65 64 20 69 66 20 77 65 20 72 75 6e 20  urned if we run 
cd10: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2e 20 0a  out of memory. .
cd20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
cd30: 63 6b 42 74 72 65 65 28 42 74 53 68 61 72 65 64  ckBtree(BtShared
cd40: 20 2a 70 42 74 29 7b 0a 20 20 69 6e 74 20 72 63   *pBt){.  int rc
cd50: 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61  ;.  MemPage *pPa
cd60: 67 65 31 3b 0a 20 20 69 6e 74 20 6e 50 61 67 65  ge1;.  int nPage
cd70: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
cd80: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
cd90: 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
cda0: 20 69 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31   if( pBt->pPage1
cdb0: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
cdc0: 5f 4f 4b 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  _OK;.  rc = sqli
cdd0: 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
cde0: 70 42 74 2c 20 31 2c 20 26 70 50 61 67 65 31 2c  pBt, 1, &pPage1,
cdf0: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   0);.  if( rc!=S
ce00: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
ce10: 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 44 6f 20 73  n rc;..  /* Do s
ce20: 6f 6d 65 20 63 68 65 63 6b 69 6e 67 20 74 6f 20  ome checking to 
ce30: 68 65 6c 70 20 69 6e 73 75 72 65 20 74 68 65 20  help insure the 
ce40: 66 69 6c 65 20 77 65 20 6f 70 65 6e 65 64 20 72  file we opened r
ce50: 65 61 6c 6c 79 20 69 73 0a 20 20 2a 2a 20 61 20  eally is.  ** a 
ce60: 76 61 6c 69 64 20 64 61 74 61 62 61 73 65 20 66  valid database f
ce70: 69 6c 65 2e 20 0a 20 20 2a 2f 0a 20 20 72 63 20  ile. .  */.  rc 
ce80: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
ce90: 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61  gecount(pBt->pPa
cea0: 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20 20  ger, &nPage);.  
ceb0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
cec0: 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 70 61  K ){.    goto pa
ced0: 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
cee0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 50 61  .  }else if( nPa
cef0: 67 65 3e 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  ge>0 ){.    int 
cf00: 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 69 6e  pageSize;.    in
cf10: 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20 20  t usableSize;.  
cf20: 20 20 75 38 20 2a 70 61 67 65 31 20 3d 20 70 50    u8 *page1 = pP
cf30: 61 67 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20  age1->aData;.   
cf40: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 54   rc = SQLITE_NOT
cf50: 41 44 42 3b 0a 20 20 20 20 69 66 28 20 6d 65 6d  ADB;.    if( mem
cf60: 63 6d 70 28 70 61 67 65 31 2c 20 7a 4d 61 67 69  cmp(page1, zMagi
cf70: 63 48 65 61 64 65 72 2c 20 31 36 29 21 3d 30 20  cHeader, 16)!=0 
cf80: 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61  ){.      goto pa
cf90: 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b  ge1_init_failed;
cfa0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
cfb0: 61 67 65 31 5b 31 38 5d 3e 31 20 29 7b 0a 20 20  age1[18]>1 ){.  
cfc0: 20 20 20 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c      pBt->readOnl
cfd0: 79 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  y = 1;.    }.   
cfe0: 20 69 66 28 20 70 61 67 65 31 5b 31 39 5d 3e 31   if( page1[19]>1
cff0: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70   ){.      goto p
d000: 61 67 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64  age1_init_failed
d010: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
d020: 54 68 65 20 6d 61 78 69 6d 75 6d 20 65 6d 62 65  The maximum embe
d030: 64 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75  dded fraction mu
d040: 73 74 20 62 65 20 65 78 61 63 74 6c 79 20 32 35  st be exactly 25
d050: 25 2e 20 20 41 6e 64 20 74 68 65 20 6d 69 6e 69  %.  And the mini
d060: 6d 75 6d 0a 20 20 20 20 2a 2a 20 65 6d 62 65 64  mum.    ** embed
d070: 64 65 64 20 66 72 61 63 74 69 6f 6e 20 6d 75 73  ded fraction mus
d080: 74 20 62 65 20 31 32 2e 35 25 20 66 6f 72 20 62  t be 12.5% for b
d090: 6f 74 68 20 6c 65 61 66 2d 64 61 74 61 20 61 6e  oth leaf-data an
d0a0: 64 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61 74 61 2e  d non-leaf-data.
d0b0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 6f 72 69 67  .    ** The orig
d0c0: 69 6e 61 6c 20 64 65 73 69 67 6e 20 61 6c 6c 6f  inal design allo
d0d0: 77 65 64 20 74 68 65 73 65 20 61 6d 6f 75 6e 74  wed these amount
d0e0: 73 20 74 6f 20 76 61 72 79 2c 20 62 75 74 20 61  s to vary, but a
d0f0: 73 20 6f 66 0a 20 20 20 20 2a 2a 20 76 65 72 73  s of.    ** vers
d100: 69 6f 6e 20 33 2e 36 2e 30 2c 20 77 65 20 72 65  ion 3.6.0, we re
d110: 71 75 69 72 65 20 74 68 65 6d 20 74 6f 20 62 65  quire them to be
d120: 20 66 69 78 65 64 2e 0a 20 20 20 20 2a 2f 0a 20   fixed..    */. 
d130: 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 26 70     if( memcmp(&p
d140: 61 67 65 31 5b 32 31 5d 2c 20 22 5c 31 30 30 5c  age1[21], "\100\
d150: 30 34 30 5c 30 34 30 22 2c 33 29 21 3d 30 20 29  040\040",3)!=0 )
d160: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67  {.      goto pag
d170: 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3b 0a  e1_init_failed;.
d180: 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 53 69      }.    pageSi
d190: 7a 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 70  ze = get2byte(&p
d1a0: 61 67 65 31 5b 31 36 5d 29 3b 0a 20 20 20 20 69  age1[16]);.    i
d1b0: 66 28 20 28 28 70 61 67 65 53 69 7a 65 2d 31 29  f( ((pageSize-1)
d1c0: 26 70 61 67 65 53 69 7a 65 29 21 3d 30 20 7c 7c  &pageSize)!=0 ||
d1d0: 20 70 61 67 65 53 69 7a 65 3c 35 31 32 20 7c 7c   pageSize<512 ||
d1e0: 0a 20 20 20 20 20 20 20 20 28 53 51 4c 49 54 45  .        (SQLITE
d1f0: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 3c 33  _MAX_PAGE_SIZE<3
d200: 32 37 36 38 20 26 26 20 70 61 67 65 53 69 7a 65  2768 && pageSize
d210: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  >SQLITE_MAX_PAGE
d220: 5f 53 49 5a 45 29 0a 20 20 20 20 29 7b 0a 20 20  _SIZE).    ){.  
d230: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
d240: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
d250: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  }.    assert( (p
d260: 61 67 65 53 69 7a 65 20 26 20 37 29 3d 3d 30 20  ageSize & 7)==0 
d270: 29 3b 0a 20 20 20 20 75 73 61 62 6c 65 53 69 7a  );.    usableSiz
d280: 65 20 3d 20 70 61 67 65 53 69 7a 65 20 2d 20 70  e = pageSize - p
d290: 61 67 65 31 5b 32 30 5d 3b 0a 20 20 20 20 69 66  age1[20];.    if
d2a0: 28 20 70 61 67 65 53 69 7a 65 21 3d 70 42 74 2d  ( pageSize!=pBt-
d2b0: 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
d2c0: 20 20 20 2f 2a 20 41 66 74 65 72 20 72 65 61 64     /* After read
d2d0: 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61  ing the first pa
d2e0: 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ge of the databa
d2f0: 73 65 20 61 73 73 75 6d 69 6e 67 20 61 20 70 61  se assuming a pa
d300: 67 65 20 73 69 7a 65 0a 20 20 20 20 20 20 2a 2a  ge size.      **
d310: 20 6f 66 20 42 74 53 68 61 72 65 64 2e 70 61 67   of BtShared.pag
d320: 65 53 69 7a 65 2c 20 77 65 20 68 61 76 65 20 64  eSize, we have d
d330: 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20 74  iscovered that t
d340: 68 65 20 70 61 67 65 2d 73 69 7a 65 20 69 73 0a  he page-size is.
d350: 20 20 20 20 20 20 2a 2a 20 61 63 74 75 61 6c 6c        ** actuall
d360: 79 20 70 61 67 65 53 69 7a 65 2e 20 55 6e 6c 6f  y pageSize. Unlo
d370: 63 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2c  ck the database,
d380: 20 6c 65 61 76 65 20 70 42 74 2d 3e 70 50 61 67   leave pBt->pPag
d390: 65 31 20 61 74 0a 20 20 20 20 20 20 2a 2a 20 7a  e1 at.      ** z
d3a0: 65 72 6f 20 61 6e 64 20 72 65 74 75 72 6e 20 53  ero and return S
d3b0: 51 4c 49 54 45 5f 4f 4b 2e 20 54 68 65 20 63 61  QLITE_OK. The ca
d3c0: 6c 6c 65 72 20 77 69 6c 6c 20 63 61 6c 6c 20 74  ller will call t
d3d0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20  his function.   
d3e0: 20 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68     ** again with
d3f0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 70 61 67   the correct pag
d400: 65 2d 73 69 7a 65 2e 0a 20 20 20 20 20 20 2a 2f  e-size..      */
d410: 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
d420: 67 65 28 70 50 61 67 65 31 29 3b 0a 20 20 20 20  ge(pPage1);.    
d430: 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a    pBt->usableSiz
d440: 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a  e = usableSize;.
d450: 20 20 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53        pBt->pageS
d460: 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
d470: 20 20 20 20 20 20 66 72 65 65 54 65 6d 70 53 70        freeTempSp
d480: 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20 20 20  ace(pBt);.      
d490: 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
d4a0: 61 67 65 73 69 7a 65 28 70 42 74 2d 3e 70 50 61  agesize(pBt->pPa
d4b0: 67 65 72 2c 20 26 70 42 74 2d 3e 70 61 67 65 53  ger, &pBt->pageS
d4c0: 69 7a 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ize);.      retu
d4d0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
d4e0: 20 20 7d 0a 20 20 20 20 69 66 28 20 75 73 61 62    }.    if( usab
d4f0: 6c 65 53 69 7a 65 3c 35 30 30 20 29 7b 0a 20 20  leSize<500 ){.  
d500: 20 20 20 20 67 6f 74 6f 20 70 61 67 65 31 5f 69      goto page1_i
d510: 6e 69 74 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20  nit_failed;.    
d520: 7d 0a 20 20 20 20 70 42 74 2d 3e 70 61 67 65 53  }.    pBt->pageS
d530: 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a  ize = pageSize;.
d540: 20 20 20 20 70 42 74 2d 3e 75 73 61 62 6c 65 53      pBt->usableS
d550: 69 7a 65 20 3d 20 75 73 61 62 6c 65 53 69 7a 65  ize = usableSize
d560: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
d570: 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
d580: 0a 20 20 20 20 70 42 74 2d 3e 61 75 74 6f 56 61  .    pBt->autoVa
d590: 63 75 75 6d 20 3d 20 28 67 65 74 34 62 79 74 65  cuum = (get4byte
d5a0: 28 26 70 61 67 65 31 5b 33 36 20 2b 20 34 2a 34  (&page1[36 + 4*4
d5b0: 5d 29 3f 31 3a 30 29 3b 0a 20 20 20 20 70 42 74  ])?1:0);.    pBt
d5c0: 2d 3e 69 6e 63 72 56 61 63 75 75 6d 20 3d 20 28  ->incrVacuum = (
d5d0: 67 65 74 34 62 79 74 65 28 26 70 61 67 65 31 5b  get4byte(&page1[
d5e0: 33 36 20 2b 20 37 2a 34 5d 29 3f 31 3a 30 29 3b  36 + 7*4])?1:0);
d5f0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20 20 2f  .#endif.  }..  /
d600: 2a 20 6d 61 78 4c 6f 63 61 6c 20 69 73 20 74 68  * maxLocal is th
d610: 65 20 6d 61 78 69 6d 75 6d 20 61 6d 6f 75 6e 74  e maximum amount
d620: 20 6f 66 20 70 61 79 6c 6f 61 64 20 74 6f 20 73   of payload to s
d630: 74 6f 72 65 20 6c 6f 63 61 6c 6c 79 20 66 6f 72  tore locally for
d640: 0a 20 20 2a 2a 20 61 20 63 65 6c 6c 2e 20 20 4d  .  ** a cell.  M
d650: 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 73  ake sure it is s
d660: 6d 61 6c 6c 20 65 6e 6f 75 67 68 20 73 6f 20 74  mall enough so t
d670: 68 61 74 20 61 74 20 6c 65 61 73 74 20 6d 69 6e  hat at least min
d680: 46 61 6e 6f 75 74 0a 20 20 2a 2a 20 63 65 6c 6c  Fanout.  ** cell
d690: 73 20 63 61 6e 20 77 69 6c 6c 20 66 69 74 20 6f  s can will fit o
d6a0: 6e 20 6f 6e 65 20 70 61 67 65 2e 20 20 57 65 20  n one page.  We 
d6b0: 61 73 73 75 6d 65 20 61 20 31 30 2d 62 79 74 65  assume a 10-byte
d6c0: 20 70 61 67 65 20 68 65 61 64 65 72 2e 0a 20 20   page header..  
d6d0: 2a 2a 20 42 65 73 69 64 65 73 20 74 68 65 20 70  ** Besides the p
d6e0: 61 79 6c 6f 61 64 2c 20 74 68 65 20 63 65 6c 6c  ayload, the cell
d6f0: 20 6d 75 73 74 20 73 74 6f 72 65 3a 0a 20 20 2a   must store:.  *
d700: 2a 20 20 20 20 20 32 2d 62 79 74 65 20 70 6f 69  *     2-byte poi
d710: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 65 6c 6c  nter to the cell
d720: 0a 20 20 2a 2a 20 20 20 20 20 34 2d 62 79 74 65  .  **     4-byte
d730: 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 0a 20   child pointer. 
d740: 20 2a 2a 20 20 20 20 20 39 2d 62 79 74 65 20 6e   **     9-byte n
d750: 4b 65 79 20 76 61 6c 75 65 0a 20 20 2a 2a 20 20  Key value.  **  
d760: 20 20 20 34 2d 62 79 74 65 20 6e 44 61 74 61 20     4-byte nData 
d770: 76 61 6c 75 65 0a 20 20 2a 2a 20 20 20 20 20 34  value.  **     4
d780: 2d 62 79 74 65 20 6f 76 65 72 66 6c 6f 77 20 70  -byte overflow p
d790: 61 67 65 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a  age pointer.  **
d7a0: 20 53 6f 20 61 20 63 65 6c 6c 20 63 6f 6e 73 69   So a cell consi
d7b0: 73 74 73 20 6f 66 20 61 20 32 2d 62 79 74 65 20  sts of a 2-byte 
d7c0: 70 6f 69 6e 65 72 2c 20 61 20 68 65 61 64 65 72  poiner, a header
d7d0: 20 77 68 69 63 68 20 69 73 20 61 73 20 6d 75 63   which is as muc
d7e0: 68 20 61 73 0a 20 20 2a 2a 20 31 37 20 62 79 74  h as.  ** 17 byt
d7f0: 65 73 20 6c 6f 6e 67 2c 20 30 20 74 6f 20 4e 20  es long, 0 to N 
d800: 62 79 74 65 73 20 6f 66 20 70 61 79 6c 6f 61 64  bytes of payload
d810: 2c 20 61 6e 64 20 61 6e 20 6f 70 74 69 6f 6e 61  , and an optiona
d820: 6c 20 34 20 62 79 74 65 20 6f 76 65 72 66 6c 6f  l 4 byte overflo
d830: 77 0a 20 20 2a 2a 20 70 61 67 65 20 70 6f 69 6e  w.  ** page poin
d840: 74 65 72 2e 0a 20 20 2a 2f 0a 20 20 70 42 74 2d  ter..  */.  pBt-
d850: 3e 6d 61 78 4c 6f 63 61 6c 20 3d 20 28 70 42 74  >maxLocal = (pBt
d860: 2d 3e 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29  ->usableSize-12)
d870: 2a 36 34 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20  *64/255 - 23;.  
d880: 70 42 74 2d 3e 6d 69 6e 4c 6f 63 61 6c 20 3d 20  pBt->minLocal = 
d890: 28 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65  (pBt->usableSize
d8a0: 2d 31 32 29 2a 33 32 2f 32 35 35 20 2d 20 32 33  -12)*32/255 - 23
d8b0: 3b 0a 20 20 70 42 74 2d 3e 6d 61 78 4c 65 61 66  ;.  pBt->maxLeaf
d8c0: 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
d8d0: 7a 65 20 2d 20 33 35 3b 0a 20 20 70 42 74 2d 3e  ze - 35;.  pBt->
d8e0: 6d 69 6e 4c 65 61 66 20 3d 20 28 70 42 74 2d 3e  minLeaf = (pBt->
d8f0: 75 73 61 62 6c 65 53 69 7a 65 2d 31 32 29 2a 33  usableSize-12)*3
d900: 32 2f 32 35 35 20 2d 20 32 33 3b 0a 20 20 61 73  2/255 - 23;.  as
d910: 73 65 72 74 28 20 70 42 74 2d 3e 6d 61 78 4c 65  sert( pBt->maxLe
d920: 61 66 20 2b 20 32 33 20 3c 3d 20 4d 58 5f 43 45  af + 23 <= MX_CE
d930: 4c 4c 5f 53 49 5a 45 28 70 42 74 29 20 29 3b 0a  LL_SIZE(pBt) );.
d940: 20 20 70 42 74 2d 3e 70 50 61 67 65 31 20 3d 20    pBt->pPage1 = 
d950: 70 50 61 67 65 31 3b 0a 20 20 72 65 74 75 72 6e  pPage1;.  return
d960: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 70 61 67   SQLITE_OK;..pag
d970: 65 31 5f 69 6e 69 74 5f 66 61 69 6c 65 64 3a 0a  e1_init_failed:.
d980: 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
d990: 61 67 65 31 29 3b 0a 20 20 70 42 74 2d 3e 70 50  age1);.  pBt->pP
d9a0: 61 67 65 31 20 3d 20 30 3b 0a 20 20 72 65 74 75  age1 = 0;.  retu
d9b0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
d9c0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72  This routine wor
d9d0: 6b 73 20 6c 69 6b 65 20 6c 6f 63 6b 42 74 72 65  ks like lockBtre
d9e0: 65 28 29 20 65 78 63 65 70 74 20 74 68 61 74 20  e() except that 
d9f0: 69 74 20 61 6c 73 6f 20 69 6e 76 6f 6b 65 73 20  it also invokes 
da00: 74 68 65 0a 2a 2a 20 62 75 73 79 20 63 61 6c 6c  the.** busy call
da10: 62 61 63 6b 20 69 66 20 74 68 65 72 65 20 69 73  back if there is
da20: 20 6c 6f 63 6b 20 63 6f 6e 74 65 6e 74 69 6f 6e   lock contention
da30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
da40: 6c 6f 63 6b 42 74 72 65 65 57 69 74 68 52 65 74  lockBtreeWithRet
da50: 72 79 28 42 74 72 65 65 20 2a 70 52 65 66 29 7b  ry(Btree *pRef){
da60: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
da70: 54 45 5f 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74  TE_OK;..  assert
da80: 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
da90: 6c 64 73 4d 75 74 65 78 28 70 52 65 66 29 20 29  ldsMutex(pRef) )
daa0: 3b 0a 20 20 69 66 28 20 70 52 65 66 2d 3e 69 6e  ;.  if( pRef->in
dab0: 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 4e 4f 4e  Trans==TRANS_NON
dac0: 45 20 29 7b 0a 20 20 20 20 75 38 20 69 6e 54 72  E ){.    u8 inTr
dad0: 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70 52 65 66  ansaction = pRef
dae0: 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ->pBt->inTransac
daf0: 74 69 6f 6e 3b 0a 20 20 20 20 62 74 72 65 65 49  tion;.    btreeI
db00: 6e 74 65 67 72 69 74 79 28 70 52 65 66 29 3b 0a  ntegrity(pRef);.
db10: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
db20: 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e 73 28  BtreeBeginTrans(
db30: 70 52 65 66 2c 20 30 29 3b 0a 20 20 20 20 70 52  pRef, 0);.    pR
db40: 65 66 2d 3e 70 42 74 2d 3e 69 6e 54 72 61 6e 73  ef->pBt->inTrans
db50: 61 63 74 69 6f 6e 20 3d 20 69 6e 54 72 61 6e 73  action = inTrans
db60: 61 63 74 69 6f 6e 3b 0a 20 20 20 20 70 52 65 66  action;.    pRef
db70: 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54 52 41 4e  ->inTrans = TRAN
db80: 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 69 66 28 20  S_NONE;.    if( 
db90: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
dba0: 0a 20 20 20 20 20 20 70 52 65 66 2d 3e 70 42 74  .      pRef->pBt
dbb0: 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d  ->nTransaction--
dbc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 74 72 65  ;.    }.    btre
dbd0: 65 49 6e 74 65 67 72 69 74 79 28 70 52 65 66 29  eIntegrity(pRef)
dbe0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
dbf0: 63 3b 0a 7d 0a 20 20 20 20 20 20 20 0a 0a 2f 2a  c;.}.       ../*
dc00: 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 61 72 65  .** If there are
dc10: 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
dc20: 63 75 72 73 6f 72 73 20 61 6e 64 20 77 65 20 61  cursors and we a
dc30: 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 6d 69  re not in the mi
dc40: 64 64 6c 65 0a 2a 2a 20 6f 66 20 61 20 74 72 61  ddle.** of a tra
dc50: 6e 73 61 63 74 69 6f 6e 20 62 75 74 20 74 68 65  nsaction but the
dc60: 72 65 20 69 73 20 61 20 72 65 61 64 20 6c 6f 63  re is a read loc
dc70: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
dc80: 65 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20  e, then.** this 
dc90: 72 6f 75 74 69 6e 65 20 75 6e 72 65 66 73 20 74  routine unrefs t
dca0: 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
dcb0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
dcc0: 6c 65 20 77 68 69 63 68 20 0a 2a 2a 20 68 61 73  le which .** has
dcd0: 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 72   the effect of r
dce0: 65 6c 65 61 73 69 6e 67 20 74 68 65 20 72 65 61  eleasing the rea
dcf0: 64 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  d lock..**.** If
dd00: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f   there are any o
dd10: 75 74 73 74 61 6e 64 69 6e 67 20 63 75 72 73 6f  utstanding curso
dd20: 72 73 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  rs, this routine
dd30: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
dd40: 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61  ** If there is a
dd50: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20   transaction in 
dd60: 70 72 6f 67 72 65 73 73 2c 20 74 68 69 73 20 72  progress, this r
dd70: 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f  outine is a no-o
dd80: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  p..*/.static voi
dd90: 64 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55  d unlockBtreeIfU
dda0: 6e 75 73 65 64 28 42 74 53 68 61 72 65 64 20 2a  nused(BtShared *
ddb0: 70 42 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20  pBt){.  assert( 
ddc0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
ddd0: 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
dde0: 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54  ;.  if( pBt->inT
ddf0: 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e  ransaction==TRAN
de00: 53 5f 4e 4f 4e 45 20 26 26 20 70 42 74 2d 3e 70  S_NONE && pBt->p
de10: 43 75 72 73 6f 72 3d 3d 30 20 26 26 20 70 42 74  Cursor==0 && pBt
de20: 2d 3e 70 50 61 67 65 31 21 3d 30 20 29 7b 0a 20  ->pPage1!=0 ){. 
de30: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
de40: 67 65 72 52 65 66 63 6f 75 6e 74 28 70 42 74 2d  gerRefcount(pBt-
de50: 3e 70 50 61 67 65 72 29 3e 3d 31 20 29 7b 0a 20  >pPager)>=1 ){. 
de60: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
de70: 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 20  ->pPage1->aData 
de80: 29 3b 0a 23 69 66 20 30 0a 20 20 20 20 20 20 69  );.#if 0.      i
de90: 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e  f( pBt->pPage1->
dea0: 61 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20  aData==0 ){.    
deb0: 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
dec0: 67 65 20 3d 20 70 42 74 2d 3e 70 50 61 67 65 31  ge = pBt->pPage1
ded0: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 2d  ;.        pPage-
dee0: 3e 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33  >aData = sqlite3
def0: 50 61 67 65 72 47 65 74 44 61 74 61 28 70 50 61  PagerGetData(pPa
df00: 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
df10: 20 20 20 20 20 20 70 50 61 67 65 2d 3e 70 42 74        pPage->pBt
df20: 20 3d 20 70 42 74 3b 0a 20 20 20 20 20 20 20 20   = pBt;.        
df30: 70 50 61 67 65 2d 3e 70 67 6e 6f 20 3d 20 31 3b  pPage->pgno = 1;
df40: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
df50: 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
df60: 65 28 70 42 74 2d 3e 70 50 61 67 65 31 29 3b 0a  e(pBt->pPage1);.
df70: 20 20 20 20 7d 0a 20 20 20 20 70 42 74 2d 3e 70      }.    pBt->p
df80: 50 61 67 65 31 20 3d 20 30 3b 0a 20 20 20 20 70  Page1 = 0;.    p
df90: 42 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  Bt->inStmt = 0;.
dfa0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65    }.}../*.** Cre
dfb0: 61 74 65 20 61 20 6e 65 77 20 64 61 74 61 62 61  ate a new databa
dfc0: 73 65 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69  se by initializi
dfd0: 6e 67 20 74 68 65 20 66 69 72 73 74 20 70 61 67  ng the first pag
dfe0: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65  e of the.** file
dff0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e000: 6e 65 77 44 61 74 61 62 61 73 65 28 42 74 53 68  newDatabase(BtSh
e010: 61 72 65 64 20 2a 70 42 74 29 7b 0a 20 20 4d 65  ared *pBt){.  Me
e020: 6d 50 61 67 65 20 2a 70 50 31 3b 0a 20 20 75 6e  mPage *pP1;.  un
e030: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 64 61 74  signed char *dat
e040: 61 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  a;.  int rc;.  i
e050: 6e 74 20 6e 50 61 67 65 3b 0a 0a 20 20 61 73 73  nt nPage;..  ass
e060: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
e070: 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74  ex_held(pBt->mut
e080: 65 78 29 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ex) );.  rc = sq
e090: 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
e0a0: 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 2c  unt(pBt->pPager,
e0b0: 20 26 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20   &nPage);.  if( 
e0c0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
e0d0: 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20   nPage>0 ){.    
e0e0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
e0f0: 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67   pP1 = pBt->pPag
e100: 65 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  e1;.  assert( pP
e110: 31 21 3d 30 20 29 3b 0a 20 20 64 61 74 61 20 3d  1!=0 );.  data =
e120: 20 70 50 31 2d 3e 61 44 61 74 61 3b 0a 20 20 72   pP1->aData;.  r
e130: 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
e140: 57 72 69 74 65 28 70 50 31 2d 3e 70 44 62 50 61  Write(pP1->pDbPa
e150: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ge);.  if( rc ) 
e160: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6d 65 6d  return rc;.  mem
e170: 63 70 79 28 64 61 74 61 2c 20 7a 4d 61 67 69 63  cpy(data, zMagic
e180: 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28 7a  Header, sizeof(z
e190: 4d 61 67 69 63 48 65 61 64 65 72 29 29 3b 0a 20  MagicHeader));. 
e1a0: 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
e1b0: 7a 4d 61 67 69 63 48 65 61 64 65 72 29 3d 3d 31  zMagicHeader)==1
e1c0: 36 20 29 3b 0a 20 20 70 75 74 32 62 79 74 65 28  6 );.  put2byte(
e1d0: 26 64 61 74 61 5b 31 36 5d 2c 20 70 42 74 2d 3e  &data[16], pBt->
e1e0: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 64 61 74  pageSize);.  dat
e1f0: 61 5b 31 38 5d 20 3d 20 31 3b 0a 20 20 64 61 74  a[18] = 1;.  dat
e200: 61 5b 31 39 5d 20 3d 20 31 3b 0a 20 20 64 61 74  a[19] = 1;.  dat
e210: 61 5b 32 30 5d 20 3d 20 70 42 74 2d 3e 70 61 67  a[20] = pBt->pag
e220: 65 53 69 7a 65 20 2d 20 70 42 74 2d 3e 75 73 61  eSize - pBt->usa
e230: 62 6c 65 53 69 7a 65 3b 0a 20 20 64 61 74 61 5b  bleSize;.  data[
e240: 32 31 5d 20 3d 20 36 34 3b 0a 20 20 64 61 74 61  21] = 64;.  data
e250: 5b 32 32 5d 20 3d 20 33 32 3b 0a 20 20 64 61 74  [22] = 32;.  dat
e260: 61 5b 32 33 5d 20 3d 20 33 32 3b 0a 20 20 6d 65  a[23] = 32;.  me
e270: 6d 73 65 74 28 26 64 61 74 61 5b 32 34 5d 2c 20  mset(&data[24], 
e280: 30 2c 20 31 30 30 2d 32 34 29 3b 0a 20 20 7a 65  0, 100-24);.  ze
e290: 72 6f 50 61 67 65 28 70 50 31 2c 20 50 54 46 5f  roPage(pP1, PTF_
e2a0: 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45 41 46 7c  INTKEY|PTF_LEAF|
e2b0: 50 54 46 5f 4c 45 41 46 44 41 54 41 20 29 3b 0a  PTF_LEAFDATA );.
e2c0: 20 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 46    pBt->pageSizeF
e2d0: 69 78 65 64 20 3d 20 31 3b 0a 23 69 66 6e 64 65  ixed = 1;.#ifnde
e2e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
e2f0: 54 4f 56 41 43 55 55 4d 0a 20 20 61 73 73 65 72  TOVACUUM.  asser
e300: 74 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  t( pBt->autoVacu
e310: 75 6d 3d 3d 31 20 7c 7c 20 70 42 74 2d 3e 61 75  um==1 || pBt->au
e320: 74 6f 56 61 63 75 75 6d 3d 3d 30 20 29 3b 0a 20  toVacuum==0 );. 
e330: 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
e340: 63 72 56 61 63 75 75 6d 3d 3d 31 20 7c 7c 20 70  crVacuum==1 || p
e350: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 3d 3d  Bt->incrVacuum==
e360: 30 20 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28  0 );.  put4byte(
e370: 26 64 61 74 61 5b 33 36 20 2b 20 34 2a 34 5d 2c  &data[36 + 4*4],
e380: 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d   pBt->autoVacuum
e390: 29 3b 0a 20 20 70 75 74 34 62 79 74 65 28 26 64  );.  put4byte(&d
e3a0: 61 74 61 5b 33 36 20 2b 20 37 2a 34 5d 2c 20 70  ata[36 + 7*4], p
e3b0: 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d 29 3b  Bt->incrVacuum);
e3c0: 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
e3d0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
e3e0: 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
e3f0: 73 74 61 72 74 20 61 20 6e 65 77 20 74 72 61 6e  start a new tran
e400: 73 61 63 74 69 6f 6e 2e 20 41 20 77 72 69 74 65  saction. A write
e410: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20  -transaction.** 
e420: 69 73 20 73 74 61 72 74 65 64 20 69 66 20 74 68  is started if th
e430: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
e440: 74 20 69 73 20 6e 6f 6e 7a 65 72 6f 2c 20 6f 74  t is nonzero, ot
e450: 68 65 72 77 69 73 65 20 61 20 72 65 61 64 2d 0a  herwise a read-.
e460: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
e470: 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
e480: 72 67 75 6d 65 6e 74 20 69 73 20 32 20 6f 72 20  rgument is 2 or 
e490: 6d 6f 72 65 20 61 6e 64 20 65 78 63 6c 75 73 69  more and exclusi
e4a0: 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  ve.** transactio
e4b0: 6e 20 69 73 20 73 74 61 72 74 65 64 2c 20 6d 65  n is started, me
e4c0: 61 6e 69 6e 67 20 74 68 61 74 20 6e 6f 20 6f 74  aning that no ot
e4d0: 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 61  her process is a
e4e0: 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20 61 63 63  llowed.** to acc
e4f0: 65 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ess the database
e500: 2e 20 20 41 20 70 72 65 65 78 69 73 74 69 6e 67  .  A preexisting
e510: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 61 79   transaction may
e520: 20 6e 6f 74 20 62 65 0a 2a 2a 20 75 70 67 72 61   not be.** upgra
e530: 64 65 64 20 74 6f 20 65 78 63 6c 75 73 69 76 65  ded to exclusive
e540: 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73   by calling this
e550: 20 72 6f 75 74 69 6e 65 20 61 20 73 65 63 6f 6e   routine a secon
e560: 64 20 74 69 6d 65 20 2d 20 74 68 65 0a 2a 2a 20  d time - the.** 
e570: 65 78 63 6c 75 73 69 76 69 74 79 20 66 6c 61 67  exclusivity flag
e580: 20 6f 6e 6c 79 20 77 6f 72 6b 73 20 66 6f 72 20   only works for 
e590: 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f  a new transactio
e5a0: 6e 2e 0a 2a 2a 0a 2a 2a 20 41 20 77 72 69 74 65  n..**.** A write
e5b0: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73  -transaction mus
e5c0: 74 20 62 65 20 73 74 61 72 74 65 64 20 62 65 66  t be started bef
e5d0: 6f 72 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61  ore attempting a
e5e0: 6e 79 20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ny .** changes t
e5f0: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  o the database. 
e600: 20 4e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c   None of the fol
e610: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20  lowing routines 
e620: 0a 2a 2a 20 77 69 6c 6c 20 77 6f 72 6b 20 75 6e  .** will work un
e630: 6c 65 73 73 20 61 20 74 72 61 6e 73 61 63 74 69  less a transacti
e640: 6f 6e 20 69 73 20 73 74 61 72 74 65 64 20 66 69  on is started fi
e650: 72 73 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  rst:.**.**      
e660: 73 71 6c 69 74 65 33 42 74 72 65 65 43 72 65 61  sqlite3BtreeCrea
e670: 74 65 54 61 62 6c 65 28 29 0a 2a 2a 20 20 20 20  teTable().**    
e680: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 72    sqlite3BtreeCr
e690: 65 61 74 65 49 6e 64 65 78 28 29 0a 2a 2a 20 20  eateIndex().**  
e6a0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
e6b0: 43 6c 65 61 72 54 61 62 6c 65 28 29 0a 2a 2a 20  ClearTable().** 
e6c0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
e6d0: 65 44 72 6f 70 54 61 62 6c 65 28 29 0a 2a 2a 20  eDropTable().** 
e6e0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
e6f0: 65 49 6e 73 65 72 74 28 29 0a 2a 2a 20 20 20 20  eInsert().**    
e700: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 44 65    sqlite3BtreeDe
e710: 6c 65 74 65 28 29 0a 2a 2a 20 20 20 20 20 20 73  lete().**      s
e720: 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61 74  qlite3BtreeUpdat
e730: 65 4d 65 74 61 28 29 0a 2a 2a 0a 2a 2a 20 49 66  eMeta().**.** If
e740: 20 61 6e 20 69 6e 69 74 69 61 6c 20 61 74 74 65   an initial atte
e750: 6d 70 74 20 74 6f 20 61 63 71 75 69 72 65 20 74  mpt to acquire t
e760: 68 65 20 6c 6f 63 6b 20 66 61 69 6c 73 20 62 65  he lock fails be
e770: 63 61 75 73 65 20 6f 66 20 6c 6f 63 6b 20 63 6f  cause of lock co
e780: 6e 74 65 6e 74 69 6f 6e 0a 2a 2a 20 61 6e 64 20  ntention.** and 
e790: 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73  the database was
e7a0: 20 70 72 65 76 69 6f 75 73 6c 79 20 75 6e 6c 6f   previously unlo
e7b0: 63 6b 65 64 2c 20 74 68 65 6e 20 69 6e 76 6f 6b  cked, then invok
e7c0: 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
e7d0: 65 72 0a 2a 2a 20 69 66 20 74 68 65 72 65 20 69  er.** if there i
e7e0: 73 20 6f 6e 65 2e 20 20 42 75 74 20 69 66 20 74  s one.  But if t
e7f0: 68 65 72 65 20 77 61 73 20 70 72 65 76 69 6f 75  here was previou
e800: 73 6c 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 2c  sly a read-lock,
e810: 20 64 6f 20 6e 6f 74 0a 2a 2a 20 69 6e 76 6f 6b   do not.** invok
e820: 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
e830: 65 72 20 2d 20 6a 75 73 74 20 72 65 74 75 72 6e  er - just return
e840: 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 53   SQLITE_BUSY.  S
e850: 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 0a 2a  QLITE_BUSY is .*
e860: 2a 20 72 65 74 75 72 6e 65 64 20 77 68 65 6e 20  * returned when 
e870: 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79  there is already
e880: 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 69 6e 20   a read-lock in 
e890: 6f 72 64 65 72 20 74 6f 20 61 76 6f 69 64 20 61  order to avoid a
e8a0: 20 64 65 61 64 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a   deadlock..**.**
e8b0: 20 53 75 70 70 6f 73 65 20 74 68 65 72 65 20 61   Suppose there a
e8c0: 72 65 20 74 77 6f 20 70 72 6f 63 65 73 73 65 73  re two processes
e8d0: 20 41 20 61 6e 64 20 42 2e 20 20 41 20 68 61 73   A and B.  A has
e8e0: 20 61 20 72 65 61 64 20 6c 6f 63 6b 20 61 6e 64   a read lock and
e8f0: 20 42 20 68 61 73 0a 2a 2a 20 61 20 72 65 73 65   B has.** a rese
e900: 72 76 65 64 20 6c 6f 63 6b 2e 20 20 42 20 74 72  rved lock.  B tr
e910: 69 65 73 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74  ies to promote t
e920: 6f 20 65 78 63 6c 75 73 69 76 65 20 62 75 74 20  o exclusive but 
e930: 69 73 20 62 6c 6f 63 6b 65 64 20 62 65 63 61 75  is blocked becau
e940: 73 65 0a 2a 2a 20 6f 66 20 41 27 73 20 72 65 61  se.** of A's rea
e950: 64 20 6c 6f 63 6b 2e 20 20 41 20 74 72 69 65 73  d lock.  A tries
e960: 20 74 6f 20 70 72 6f 6d 6f 74 65 20 74 6f 20 72   to promote to r
e970: 65 73 65 72 76 65 64 20 62 75 74 20 69 73 20 62  eserved but is b
e980: 6c 6f 63 6b 65 64 20 62 79 20 42 2e 0a 2a 2a 20  locked by B..** 
e990: 4f 6e 65 20 6f 72 20 74 68 65 20 6f 74 68 65 72  One or the other
e9a0: 20 6f 66 20 74 68 65 20 74 77 6f 20 70 72 6f 63   of the two proc
e9b0: 65 73 73 65 73 20 6d 75 73 74 20 67 69 76 65 20  esses must give 
e9c0: 77 61 79 20 6f 72 20 74 68 65 72 65 20 63 61 6e  way or there can
e9d0: 20 62 65 0a 2a 2a 20 6e 6f 20 70 72 6f 67 72 65   be.** no progre
e9e0: 73 73 2e 20 20 42 79 20 72 65 74 75 72 6e 69 6e  ss.  By returnin
e9f0: 67 20 53 51 4c 49 54 45 5f 42 55 53 59 20 61 6e  g SQLITE_BUSY an
ea00: 64 20 6e 6f 74 20 69 6e 76 6f 6b 69 6e 67 20 74  d not invoking t
ea10: 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
ea20: 0a 2a 2a 20 77 68 65 6e 20 41 20 61 6c 72 65 61  .** when A alrea
ea30: 64 79 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f  dy has a read lo
ea40: 63 6b 2c 20 77 65 20 65 6e 63 6f 75 72 61 67 65  ck, we encourage
ea50: 20 41 20 74 6f 20 67 69 76 65 20 75 70 20 61 6e   A to give up an
ea60: 64 20 6c 65 74 20 42 0a 2a 2a 20 70 72 6f 63 65  d let B.** proce
ea70: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
ea80: 65 33 42 74 72 65 65 42 65 67 69 6e 54 72 61 6e  e3BtreeBeginTran
ea90: 73 28 42 74 72 65 65 20 2a 70 2c 20 69 6e 74 20  s(Btree *p, int 
eaa0: 77 72 66 6c 61 67 29 7b 0a 20 20 42 74 53 68 61  wrflag){.  BtSha
eab0: 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42  red *pBt = p->pB
eac0: 74 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  t;.  int rc = SQ
ead0: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 73 71 6c 69  LITE_OK;..  sqli
eae0: 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
eaf0: 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d  ;.  pBt->db = p-
eb00: 3e 64 62 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  >db;.  btreeInte
eb10: 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
eb20: 49 66 20 74 68 65 20 62 74 72 65 65 20 69 73 20  If the btree is 
eb30: 61 6c 72 65 61 64 79 20 69 6e 20 61 20 77 72 69  already in a wri
eb40: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  te-transaction, 
eb50: 6f 72 20 69 74 0a 20 20 2a 2a 20 69 73 20 61 6c  or it.  ** is al
eb60: 72 65 61 64 79 20 69 6e 20 61 20 72 65 61 64 2d  ready in a read-
eb70: 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
eb80: 61 20 72 65 61 64 2d 74 72 61 6e 73 61 63 74 69  a read-transacti
eb90: 6f 6e 0a 20 20 2a 2a 20 69 73 20 72 65 71 75 65  on.  ** is reque
eba0: 73 74 65 64 2c 20 74 68 69 73 20 69 73 20 61 20  sted, this is a 
ebb0: 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
ebc0: 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52  ( p->inTrans==TR
ebd0: 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 28 70 2d  ANS_WRITE || (p-
ebe0: 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
ebf0: 52 45 41 44 20 26 26 20 21 77 72 66 6c 61 67 29  READ && !wrflag)
ec00: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 74 72 61   ){.    goto tra
ec10: 6e 73 5f 62 65 67 75 6e 3b 0a 20 20 7d 0a 0a 20  ns_begun;.  }.. 
ec20: 20 2f 2a 20 57 72 69 74 65 20 74 72 61 6e 73 61   /* Write transa
ec30: 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 70  ctions are not p
ec40: 6f 73 73 69 62 6c 65 20 6f 6e 20 61 20 72 65 61  ossible on a rea
ec50: 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20  d-only database 
ec60: 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 72 65  */.  if( pBt->re
ec70: 61 64 4f 6e 6c 79 20 26 26 20 77 72 66 6c 61 67  adOnly && wrflag
ec80: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
ec90: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  ITE_READONLY;.  
eca0: 20 20 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67    goto trans_beg
ecb0: 75 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  un;.  }..  /* If
ecc0: 20 61 6e 6f 74 68 65 72 20 64 61 74 61 62 61 73   another databas
ecd0: 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6c 72  e handle has alr
ece0: 65 61 64 79 20 6f 70 65 6e 65 64 20 61 20 77 72  eady opened a wr
ecf0: 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite transaction 
ed00: 0a 20 20 2a 2a 20 6f 6e 20 74 68 69 73 20 73 68  .  ** on this sh
ed10: 61 72 65 64 2d 62 74 72 65 65 20 73 74 72 75 63  ared-btree struc
ed20: 74 75 72 65 20 61 6e 64 20 61 20 73 65 63 6f 6e  ture and a secon
ed30: 64 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  d write transact
ed40: 69 6f 6e 20 69 73 0a 20 20 2a 2a 20 72 65 71 75  ion is.  ** requ
ed50: 65 73 74 65 64 2c 20 72 65 74 75 72 6e 20 53 51  ested, return SQ
ed60: 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 2a 2f 0a  LITE_BUSY..  */.
ed70: 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72 61    if( pBt->inTra
ed80: 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41 4e 53 5f  nsaction==TRANS_
ed90: 57 52 49 54 45 20 26 26 20 77 72 66 6c 61 67 20  WRITE && wrflag 
eda0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
edb0: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 67 6f 74  TE_BUSY;.    got
edc0: 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e 3b 0a 20  o trans_begun;. 
edd0: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
ede0: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
edf0: 41 43 48 45 0a 20 20 69 66 28 20 77 72 66 6c 61  ACHE.  if( wrfla
ee00: 67 3e 31 20 29 7b 0a 20 20 20 20 42 74 4c 6f 63  g>1 ){.    BtLoc
ee10: 6b 20 2a 70 49 74 65 72 3b 0a 20 20 20 20 66 6f  k *pIter;.    fo
ee20: 72 28 70 49 74 65 72 3d 70 42 74 2d 3e 70 4c 6f  r(pIter=pBt->pLo
ee30: 63 6b 3b 20 70 49 74 65 72 3b 20 70 49 74 65 72  ck; pIter; pIter
ee40: 3d 70 49 74 65 72 2d 3e 70 4e 65 78 74 29 7b 0a  =pIter->pNext){.
ee50: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 72 2d        if( pIter-
ee60: 3e 70 42 74 72 65 65 21 3d 70 20 29 7b 0a 20 20  >pBtree!=p ){.  
ee70: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
ee80: 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
ee90: 67 6f 74 6f 20 74 72 61 6e 73 5f 62 65 67 75 6e  goto trans_begun
eea0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
eeb0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 64 6f    }.#endif..  do
eec0: 20 7b 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e   {.    if( pBt->
eed0: 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20 20 20  pPage1==0 ){.   
eee0: 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 72     do{.        r
eef0: 63 20 3d 20 6c 6f 63 6b 42 74 72 65 65 28 70 42  c = lockBtree(pB
ef00: 74 29 3b 0a 20 20 20 20 20 20 7d 77 68 69 6c 65  t);.      }while
ef10: 28 20 70 42 74 2d 3e 70 50 61 67 65 31 3d 3d 30  ( pBt->pPage1==0
ef20: 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
ef30: 4b 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  K );.    }..    
ef40: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
ef50: 4b 20 26 26 20 77 72 66 6c 61 67 20 29 7b 0a 20  K && wrflag ){. 
ef60: 20 20 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65       if( pBt->re
ef70: 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 20 20  adOnly ){.      
ef80: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 52 45    rc = SQLITE_RE
ef90: 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65  ADONLY;.      }e
efa0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20  lse{.        rc 
efb0: 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42 65  = sqlite3PagerBe
efc0: 67 69 6e 28 70 42 74 2d 3e 70 50 61 67 65 31 2d  gin(pBt->pPage1-
efd0: 3e 70 44 62 50 61 67 65 2c 20 77 72 66 6c 61 67  >pDbPage, wrflag
efe0: 3e 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  >1);.        if(
eff0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
f000: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
f010: 20 6e 65 77 44 61 74 61 62 61 73 65 28 70 42 74   newDatabase(pBt
f020: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
f030: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20     }.    }.  .  
f040: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
f050: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28  _OK ){.      if(
f060: 20 77 72 66 6c 61 67 20 29 20 70 42 74 2d 3e 69   wrflag ) pBt->i
f070: 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7d  nStmt = 0;.    }
f080: 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 6e 6c 6f  else{.      unlo
f090: 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
f0a0: 70 42 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 77  pBt);.    }.  }w
f0b0: 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
f0c0: 5f 42 55 53 59 20 26 26 20 70 42 74 2d 3e 69 6e  _BUSY && pBt->in
f0d0: 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
f0e0: 4e 53 5f 4e 4f 4e 45 20 26 26 0a 20 20 20 20 20  NS_NONE &&.     
f0f0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
f100: 65 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  eInvokeBusyHandl
f110: 65 72 28 70 42 74 2c 20 30 29 20 29 3b 0a 0a 20  er(pBt, 0) );.. 
f120: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
f130: 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  OK ){.    if( p-
f140: 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53 5f  >inTrans==TRANS_
f150: 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 70 42  NONE ){.      pB
f160: 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2b  t->nTransaction+
f170: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  +;.    }.    p->
f180: 69 6e 54 72 61 6e 73 20 3d 20 28 77 72 66 6c 61  inTrans = (wrfla
f190: 67 3f 54 52 41 4e 53 5f 57 52 49 54 45 3a 54 52  g?TRANS_WRITE:TR
f1a0: 41 4e 53 5f 52 45 41 44 29 3b 0a 20 20 20 20 69  ANS_READ);.    i
f1b0: 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 3e 70 42  f( p->inTrans>pB
f1c0: 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
f1d0: 20 29 7b 0a 20 20 20 20 20 20 70 42 74 2d 3e 69   ){.      pBt->i
f1e0: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d 20 70  nTransaction = p
f1f0: 2d 3e 69 6e 54 72 61 6e 73 3b 0a 20 20 20 20 7d  ->inTrans;.    }
f200: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f210: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
f220: 45 0a 20 20 20 20 69 66 28 20 77 72 66 6c 61 67  E.    if( wrflag
f230: 3e 31 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  >1 ){.      asse
f240: 72 74 28 20 21 70 42 74 2d 3e 70 45 78 63 6c 75  rt( !pBt->pExclu
f250: 73 69 76 65 20 29 3b 0a 20 20 20 20 20 20 70 42  sive );.      pB
f260: 74 2d 3e 70 45 78 63 6c 75 73 69 76 65 20 3d 20  t->pExclusive = 
f270: 70 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  p;.    }.#endif.
f280: 20 20 7d 0a 0a 0a 74 72 61 6e 73 5f 62 65 67 75    }...trans_begu
f290: 6e 3a 0a 20 20 62 74 72 65 65 49 6e 74 65 67 72  n:.  btreeIntegr
f2a0: 69 74 79 28 70 29 3b 0a 20 20 73 71 6c 69 74 65  ity(p);.  sqlite
f2b0: 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
f2c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f2d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f2e0: 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
f2f0: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70  ./*.** Set the p
f300: 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 69  ointer-map entri
f310: 65 73 20 66 6f 72 20 61 6c 6c 20 63 68 69 6c 64  es for all child
f320: 72 65 6e 20 6f 66 20 70 61 67 65 20 70 50 61 67  ren of page pPag
f330: 65 2e 20 41 6c 73 6f 2c 20 69 66 0a 2a 2a 20 70  e. Also, if.** p
f340: 50 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 65  Page contains ce
f350: 6c 6c 73 20 74 68 61 74 20 70 6f 69 6e 74 20 74  lls that point t
f360: 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 73  o overflow pages
f370: 2c 20 73 65 74 20 74 68 65 20 70 6f 69 6e 74 65  , set the pointe
f380: 72 0a 2a 2a 20 6d 61 70 20 65 6e 74 72 69 65 73  r.** map entries
f390: 20 66 6f 72 20 74 68 65 20 6f 76 65 72 66 6c 6f   for the overflo
f3a0: 77 20 70 61 67 65 73 20 61 73 20 77 65 6c 6c 2e  w pages as well.
f3b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
f3c0: 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28 4d  etChildPtrmaps(M
f3d0: 65 6d 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a  emPage *pPage){.
f3e0: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
f3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f400: 20 20 20 20 20 2f 2a 20 43 6f 75 6e 74 65 72 20       /* Counter 
f410: 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 69 6e  variable */.  in
f420: 74 20 6e 43 65 6c 6c 3b 20 20 20 20 20 20 20 20  t nCell;        
f430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f440: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 65   /* Number of ce
f450: 6c 6c 73 20 69 6e 20 70 61 67 65 20 70 50 61 67  lls in page pPag
f460: 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
f470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
f490: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 74  urn code */.  Bt
f4a0: 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50  Shared *pBt = pP
f4b0: 61 67 65 2d 3e 70 42 74 3b 0a 20 20 69 6e 74 20  age->pBt;.  int 
f4c0: 69 73 49 6e 69 74 4f 72 69 67 20 3d 20 70 50 61  isInitOrig = pPa
f4d0: 67 65 2d 3e 69 73 49 6e 69 74 3b 0a 20 20 50 67  ge->isInit;.  Pg
f4e0: 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 61 67 65 2d  no pgno = pPage-
f4f0: 3e 70 67 6e 6f 3b 0a 0a 20 20 61 73 73 65 72 74  >pgno;..  assert
f500: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
f510: 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d  held(pPage->pBt-
f520: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 63 20  >mutex) );.  rc 
f530: 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
f540: 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20  itPage(pPage);. 
f550: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f560: 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73  OK ){.    goto s
f570: 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73  et_child_ptrmaps
f580: 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 6e 43 65 6c  _out;.  }.  nCel
f590: 6c 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  l = pPage->nCell
f5a0: 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  ;..  for(i=0; i<
f5b0: 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20  nCell; i++){.   
f5c0: 20 75 38 20 2a 70 43 65 6c 6c 20 3d 20 66 69 6e   u8 *pCell = fin
f5d0: 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 29 3b  dCell(pPage, i);
f5e0: 0a 0a 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61  ..    rc = ptrma
f5f0: 70 50 75 74 4f 76 66 6c 50 74 72 28 70 50 61 67  pPutOvflPtr(pPag
f600: 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20 69  e, pCell);.    i
f610: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f620: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
f630: 65 74 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73  et_child_ptrmaps
f640: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  _out;.    }..   
f650: 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61   if( !pPage->lea
f660: 66 20 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f 20  f ){.      Pgno 
f670: 63 68 69 6c 64 50 67 6e 6f 20 3d 20 67 65 74 34  childPgno = get4
f680: 62 79 74 65 28 70 43 65 6c 6c 29 3b 0a 20 20 20  byte(pCell);.   
f690: 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
f6a0: 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e 6f  t(pBt, childPgno
f6b0: 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c 20  , PTRMAP_BTREE, 
f6c0: 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
f6d0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
f6e0: 20 67 6f 74 6f 20 73 65 74 5f 63 68 69 6c 64 5f   goto set_child_
f6f0: 70 74 72 6d 61 70 73 5f 6f 75 74 3b 0a 20 20 20  ptrmaps_out;.   
f700: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70   }.  }..  if( !p
f710: 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20  Page->leaf ){.  
f720: 20 20 50 67 6e 6f 20 63 68 69 6c 64 50 67 6e 6f    Pgno childPgno
f730: 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 61   = get4byte(&pPa
f740: 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d  ge->aData[pPage-
f750: 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a  >hdrOffset+8]);.
f760: 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50      rc = ptrmapP
f770: 75 74 28 70 42 74 2c 20 63 68 69 6c 64 50 67 6e  ut(pBt, childPgn
f780: 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
f790: 20 70 67 6e 6f 29 3b 0a 20 20 7d 0a 0a 73 65 74   pgno);.  }..set
f7a0: 5f 63 68 69 6c 64 5f 70 74 72 6d 61 70 73 5f 6f  _child_ptrmaps_o
f7b0: 75 74 3a 0a 20 20 70 50 61 67 65 2d 3e 69 73 49  ut:.  pPage->isI
f7c0: 6e 69 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67  nit = isInitOrig
f7d0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
f7e0: 0a 0a 2f 2a 0a 2a 2a 20 53 6f 6d 65 77 68 65 72  ../*.** Somewher
f7f0: 65 20 6f 6e 20 70 50 61 67 65 2c 20 77 68 69 63  e on pPage, whic
f800: 68 20 69 73 20 67 75 61 72 65 6e 74 65 65 64 20  h is guarenteed 
f810: 74 6f 20 62 65 20 61 20 62 74 72 65 65 20 70 61  to be a btree pa
f820: 67 65 2c 20 6e 6f 74 20 61 6e 20 6f 76 65 72 66  ge, not an overf
f830: 6c 6f 77 0a 2a 2a 20 70 61 67 65 2c 20 69 73 20  low.** page, is 
f840: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 61 67  a pointer to pag
f850: 65 20 69 46 72 6f 6d 2e 20 4d 6f 64 69 66 79 20  e iFrom. Modify 
f860: 74 68 69 73 20 70 6f 69 6e 74 65 72 20 73 6f 20  this pointer so 
f870: 74 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 74  that it points t
f880: 6f 0a 2a 2a 20 69 54 6f 2e 20 50 61 72 61 6d 65  o.** iTo. Parame
f890: 74 65 72 20 65 54 79 70 65 20 64 65 73 63 72 69  ter eType descri
f8a0: 62 65 73 20 74 68 65 20 74 79 70 65 20 6f 66 20  bes the type of 
f8b0: 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 6d 6f  pointer to be mo
f8c0: 64 69 66 69 65 64 2c 20 61 73 20 0a 2a 2a 20 66  dified, as .** f
f8d0: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 50 54  ollows:.**.** PT
f8e0: 52 4d 41 50 5f 42 54 52 45 45 3a 20 20 20 20 20  RMAP_BTREE:     
f8f0: 70 50 61 67 65 20 69 73 20 61 20 62 74 72 65 65  pPage is a btree
f900: 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69 6e 74  -page. The point
f910: 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61 20 63  er points at a c
f920: 68 69 6c 64 20 0a 2a 2a 20 20 20 20 20 20 20 20  hild .**        
f930: 20 20 20 20 20 20 20 20 20 20 20 70 61 67 65 20             page 
f940: 6f 66 20 70 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  of pPage..**.** 
f950: 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
f960: 3a 20 70 50 61 67 65 20 69 73 20 61 20 62 74 72  : pPage is a btr
f970: 65 65 2d 70 61 67 65 2e 20 54 68 65 20 70 6f 69  ee-page. The poi
f980: 6e 74 65 72 20 70 6f 69 6e 74 73 20 61 74 20 61  nter points at a
f990: 6e 20 6f 76 65 72 66 6c 6f 77 0a 2a 2a 20 20 20  n overflow.**   
f9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9b0: 70 61 67 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  page pointed to 
f9c0: 62 79 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 65  by one of the ce
f9d0: 6c 6c 73 20 6f 6e 20 70 50 61 67 65 2e 0a 2a 2a  lls on pPage..**
f9e0: 0a 2a 2a 20 50 54 52 4d 41 50 5f 4f 56 45 52 46  .** PTRMAP_OVERF
f9f0: 4c 4f 57 32 3a 20 70 50 61 67 65 20 69 73 20 61  LOW2: pPage is a
fa00: 6e 20 6f 76 65 72 66 6c 6f 77 2d 70 61 67 65 2e  n overflow-page.
fa10: 20 54 68 65 20 70 6f 69 6e 74 65 72 20 70 6f 69   The pointer poi
fa20: 6e 74 73 20 61 74 20 74 68 65 20 6e 65 78 74 0a  nts at the next.
fa30: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
fa40: 20 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 70 61       overflow pa
fa50: 67 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a  ge in the list..
fa60: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6d 6f  */.static int mo
fa70: 64 69 66 79 50 61 67 65 50 6f 69 6e 74 65 72 28  difyPagePointer(
fa80: 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 2c 20  MemPage *pPage, 
fa90: 50 67 6e 6f 20 69 46 72 6f 6d 2c 20 50 67 6e 6f  Pgno iFrom, Pgno
faa0: 20 69 54 6f 2c 20 75 38 20 65 54 79 70 65 29 7b   iTo, u8 eType){
fab0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
fac0: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50  e3_mutex_held(pP
fad0: 61 67 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29  age->pBt->mutex)
fae0: 20 29 3b 0a 20 20 69 66 28 20 65 54 79 70 65 3d   );.  if( eType=
faf0: 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57  =PTRMAP_OVERFLOW
fb00: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20  2 ){.    /* The 
fb10: 70 6f 69 6e 74 65 72 20 69 73 20 61 6c 77 61 79  pointer is alway
fb20: 73 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79  s the first 4 by
fb30: 74 65 73 20 6f 66 20 74 68 65 20 70 61 67 65 20  tes of the page 
fb40: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 2a  in this case.  *
fb50: 2f 0a 20 20 20 20 69 66 28 20 67 65 74 34 62 79  /.    if( get4by
fb60: 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61 29  te(pPage->aData)
fb70: 21 3d 69 46 72 6f 6d 20 29 7b 0a 20 20 20 20 20  !=iFrom ){.     
fb80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
fb90: 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20  ORRUPT_BKPT;.   
fba0: 20 7d 0a 20 20 20 20 70 75 74 34 62 79 74 65 28   }.    put4byte(
fbb0: 70 50 61 67 65 2d 3e 61 44 61 74 61 2c 20 69 54  pPage->aData, iT
fbc0: 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  o);.  }else{.   
fbd0: 20 69 6e 74 20 69 73 49 6e 69 74 4f 72 69 67 20   int isInitOrig 
fbe0: 3d 20 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 3b  = pPage->isInit;
fbf0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
fc00: 69 6e 74 20 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20  int nCell;..    
fc10: 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
fc20: 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
fc30: 20 6e 43 65 6c 6c 20 3d 20 70 50 61 67 65 2d 3e   nCell = pPage->
fc40: 6e 43 65 6c 6c 3b 0a 0a 20 20 20 20 66 6f 72 28  nCell;..    for(
fc50: 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b  i=0; i<nCell; i+
fc60: 2b 29 7b 0a 20 20 20 20 20 20 75 38 20 2a 70 43  +){.      u8 *pC
fc70: 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70  ell = findCell(p
fc80: 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 20 20  Page, i);.      
fc90: 69 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41  if( eType==PTRMA
fca0: 50 5f 4f 56 45 52 46 4c 4f 57 31 20 29 7b 0a 20  P_OVERFLOW1 ){. 
fcb0: 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20         CellInfo 
fcc0: 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 73 71  info;.        sq
fcd0: 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
fce0: 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
fcf0: 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 20  ell, &info);.   
fd00: 20 20 20 20 20 69 66 28 20 69 6e 66 6f 2e 69 4f       if( info.iO
fd10: 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
fd20: 20 20 20 20 20 69 66 28 20 69 46 72 6f 6d 3d 3d       if( iFrom==
fd30: 67 65 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  get4byte(&pCell[
fd40: 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 29  info.iOverflow])
fd50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
fd60: 70 75 74 34 62 79 74 65 28 26 70 43 65 6c 6c 5b  put4byte(&pCell[
fd70: 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f 77 5d 2c  info.iOverflow],
fd80: 20 69 54 6f 29 3b 0a 20 20 20 20 20 20 20 20 20   iTo);.         
fd90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
fda0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
fdb0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
fdc0: 20 20 20 20 20 69 66 28 20 67 65 74 34 62 79 74       if( get4byt
fdd0: 65 28 70 43 65 6c 6c 29 3d 3d 69 46 72 6f 6d 20  e(pCell)==iFrom 
fde0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 75 74  ){.          put
fdf0: 34 62 79 74 65 28 70 43 65 6c 6c 2c 20 69 54 6f  4byte(pCell, iTo
fe00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
fe10: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
fe20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
fe30: 20 20 20 69 66 28 20 69 3d 3d 6e 43 65 6c 6c 20     if( i==nCell 
fe40: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 65 54 79  ){.      if( eTy
fe50: 70 65 21 3d 50 54 52 4d 41 50 5f 42 54 52 45 45  pe!=PTRMAP_BTREE
fe60: 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 67   || .          g
fe70: 65 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e  et4byte(&pPage->
fe80: 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68 64 72  aData[pPage->hdr
fe90: 4f 66 66 73 65 74 2b 38 5d 29 21 3d 69 46 72 6f  Offset+8])!=iFro
fea0: 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  m ){.        ret
feb0: 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
fec0: 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20 20 7d  PT_BKPT;.      }
fed0: 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28  .      put4byte(
fee0: 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
fef0: 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
ff00: 5d 2c 20 69 54 6f 29 3b 0a 20 20 20 20 7d 0a 0a  ], iTo);.    }..
ff10: 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e 69      pPage->isIni
ff20: 74 20 3d 20 69 73 49 6e 69 74 4f 72 69 67 3b 0a  t = isInitOrig;.
ff30: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
ff40: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
ff50: 2a 20 4d 6f 76 65 20 74 68 65 20 6f 70 65 6e 20  * Move the open 
ff60: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70 44  database page pD
ff70: 62 50 61 67 65 20 74 6f 20 6c 6f 63 61 74 69 6f  bPage to locatio
ff80: 6e 20 69 46 72 65 65 50 61 67 65 20 69 6e 20 74  n iFreePage in t
ff90: 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 2e  he .** database.
ffa0: 20 54 68 65 20 70 44 62 50 61 67 65 20 72 65 66   The pDbPage ref
ffb0: 65 72 65 6e 63 65 20 72 65 6d 61 69 6e 73 20 76  erence remains v
ffc0: 61 6c 69 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alid..*/.static 
ffd0: 69 6e 74 20 72 65 6c 6f 63 61 74 65 50 61 67 65  int relocatePage
ffe0: 28 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42  (.  BtShared *pB
fff0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t,           /* 
10000 42 74 72 65 65 20 2a 2f 0a 20 20 4d 65 6d 50 61  Btree */.  MemPa
10010 67 65 20 2a 70 44 62 50 61 67 65 2c 20 20 20 20  ge *pDbPage,    
10020 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65      /* Open page
10030 20 74 6f 20 6d 6f 76 65 20 2a 2f 0a 20 20 75 38   to move */.  u8
10040 20 65 54 79 70 65 2c 20 20 20 20 20 20 20 20 20   eType,         
10050 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
10060 72 20 6d 61 70 20 27 74 79 70 65 27 20 65 6e 74  r map 'type' ent
10070 72 79 20 66 6f 72 20 70 44 62 50 61 67 65 20 2a  ry for pDbPage *
10080 2f 0a 20 20 50 67 6e 6f 20 69 50 74 72 50 61 67  /.  Pgno iPtrPag
10090 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e,           /* 
100a0 50 6f 69 6e 74 65 72 20 6d 61 70 20 27 70 61 67  Pointer map 'pag
100b0 65 2d 6e 6f 27 20 65 6e 74 72 79 20 66 6f 72 20  e-no' entry for 
100c0 70 44 62 50 61 67 65 20 2a 2f 0a 20 20 50 67 6e  pDbPage */.  Pgn
100d0 6f 20 69 46 72 65 65 50 61 67 65 2c 20 20 20 20  o iFreePage,    
100e0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 63        /* The loc
100f0 61 74 69 6f 6e 20 74 6f 20 6d 6f 76 65 20 70 44  ation to move pD
10100 62 50 61 67 65 20 74 6f 20 2a 2f 0a 20 20 69 6e  bPage to */.  in
10110 74 20 69 73 43 6f 6d 6d 69 74 0a 29 7b 0a 20 20  t isCommit.){.  
10120 4d 65 6d 50 61 67 65 20 2a 70 50 74 72 50 61 67  MemPage *pPtrPag
10130 65 3b 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65  e;   /* The page
10140 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61   that contains a
10150 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 44 62 50   pointer to pDbP
10160 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 44  age */.  Pgno iD
10170 62 50 61 67 65 20 3d 20 70 44 62 50 61 67 65 2d  bPage = pDbPage-
10180 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72 20 2a  >pgno;.  Pager *
10190 70 50 61 67 65 72 20 3d 20 70 42 74 2d 3e 70 50  pPager = pBt->pP
101a0 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  ager;.  int rc;.
101b0 0a 20 20 61 73 73 65 72 74 28 20 65 54 79 70 65  .  assert( eType
101c0 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
101d0 57 32 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52  W2 || eType==PTR
101e0 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 20 7c 7c  MAP_OVERFLOW1 ||
101f0 20 0a 20 20 20 20 20 20 65 54 79 70 65 3d 3d 50   .      eType==P
10200 54 52 4d 41 50 5f 42 54 52 45 45 20 7c 7c 20 65  TRMAP_BTREE || e
10210 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f 52 4f 4f  Type==PTRMAP_ROO
10220 54 50 41 47 45 20 29 3b 0a 20 20 61 73 73 65 72  TPAGE );.  asser
10230 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
10240 5f 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78  _held(pBt->mutex
10250 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ) );.  assert( p
10260 44 62 50 61 67 65 2d 3e 70 42 74 3d 3d 70 42 74  DbPage->pBt==pBt
10270 20 29 3b 0a 0a 20 20 2f 2a 20 4d 6f 76 65 20 70   );..  /* Move p
10280 61 67 65 20 69 44 62 50 61 67 65 20 66 72 6f 6d  age iDbPage from
10290 20 69 74 73 20 63 75 72 72 65 6e 74 20 6c 6f 63   its current loc
102a0 61 74 69 6f 6e 20 74 6f 20 70 61 67 65 20 6e 75  ation to page nu
102b0 6d 62 65 72 20 69 46 72 65 65 50 61 67 65 20 2a  mber iFreePage *
102c0 2f 0a 20 20 54 52 41 43 45 28 28 22 41 55 54 4f  /.  TRACE(("AUTO
102d0 56 41 43 55 55 4d 3a 20 4d 6f 76 69 6e 67 20 25  VACUUM: Moving %
102e0 64 20 74 6f 20 66 72 65 65 20 70 61 67 65 20 25  d to free page %
102f0 64 20 28 70 74 72 20 70 61 67 65 20 25 64 20 74  d (ptr page %d t
10300 79 70 65 20 25 64 29 5c 6e 22 2c 20 0a 20 20 20  ype %d)\n", .   
10310 20 20 20 69 44 62 50 61 67 65 2c 20 69 46 72 65     iDbPage, iFre
10320 65 50 61 67 65 2c 20 69 50 74 72 50 61 67 65 2c  ePage, iPtrPage,
10330 20 65 54 79 70 65 29 29 3b 0a 20 20 72 63 20 3d   eType));.  rc =
10340 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76   sqlite3PagerMov
10350 65 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 44  epage(pPager, pD
10360 62 50 61 67 65 2d 3e 70 44 62 50 61 67 65 2c 20  bPage->pDbPage, 
10370 69 46 72 65 65 50 61 67 65 2c 20 69 73 43 6f 6d  iFreePage, isCom
10380 6d 69 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  mit);.  if( rc!=
10390 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
103a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
103b0 20 20 70 44 62 50 61 67 65 2d 3e 70 67 6e 6f 20    pDbPage->pgno 
103c0 3d 20 69 46 72 65 65 50 61 67 65 3b 0a 0a 20 20  = iFreePage;..  
103d0 2f 2a 20 49 66 20 70 44 62 50 61 67 65 20 77 61  /* If pDbPage wa
103e0 73 20 61 20 62 74 72 65 65 2d 70 61 67 65 2c 20  s a btree-page, 
103f0 74 68 65 6e 20 69 74 20 6d 61 79 20 68 61 76 65  then it may have
10400 20 63 68 69 6c 64 20 70 61 67 65 73 20 61 6e 64   child pages and
10410 2f 6f 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 74  /or cells.  ** t
10420 68 61 74 20 70 6f 69 6e 74 20 74 6f 20 6f 76 65  hat point to ove
10430 72 66 6c 6f 77 20 70 61 67 65 73 2e 20 54 68 65  rflow pages. The
10440 20 70 6f 69 6e 74 65 72 20 6d 61 70 20 65 6e 74   pointer map ent
10450 72 69 65 73 20 66 6f 72 20 61 6c 6c 20 74 68 65  ries for all the
10460 73 65 0a 20 20 2a 2a 20 70 61 67 65 73 20 6e 65  se.  ** pages ne
10470 65 64 20 74 6f 20 62 65 20 63 68 61 6e 67 65 64  ed to be changed
10480 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70  ..  **.  ** If p
10490 44 62 50 61 67 65 20 69 73 20 61 6e 20 6f 76 65  DbPage is an ove
104a0 72 66 6c 6f 77 20 70 61 67 65 2c 20 74 68 65 6e  rflow page, then
104b0 20 74 68 65 20 66 69 72 73 74 20 34 20 62 79 74   the first 4 byt
104c0 65 73 20 6d 61 79 20 73 74 6f 72 65 20 61 0a 20  es may store a. 
104d0 20 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 61   ** pointer to a
104e0 20 73 75 62 73 65 71 75 65 6e 74 20 6f 76 65 72   subsequent over
104f0 66 6c 6f 77 20 70 61 67 65 2e 20 49 66 20 74 68  flow page. If th
10500 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
10510 74 68 65 6e 0a 20 20 2a 2a 20 74 68 65 20 70 6f  then.  ** the po
10520 69 6e 74 65 72 20 6d 61 70 20 6e 65 65 64 73 20  inter map needs 
10530 74 6f 20 62 65 20 75 70 64 61 74 65 64 20 66 6f  to be updated fo
10540 72 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74  r the subsequent
10550 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2e 0a   overflow page..
10560 20 20 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65    */.  if( eType
10570 3d 3d 50 54 52 4d 41 50 5f 42 54 52 45 45 20 7c  ==PTRMAP_BTREE |
10580 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  | eType==PTRMAP_
10590 52 4f 4f 54 50 41 47 45 20 29 7b 0a 20 20 20 20  ROOTPAGE ){.    
105a0 72 63 20 3d 20 73 65 74 43 68 69 6c 64 50 74 72  rc = setChildPtr
105b0 6d 61 70 73 28 70 44 62 50 61 67 65 29 3b 0a 20  maps(pDbPage);. 
105c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
105d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
105e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
105f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f   }else{.    Pgno
10600 20 6e 65 78 74 4f 76 66 6c 20 3d 20 67 65 74 34   nextOvfl = get4
10610 62 79 74 65 28 70 44 62 50 61 67 65 2d 3e 61 44  byte(pDbPage->aD
10620 61 74 61 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  ata);.    if( ne
10630 78 74 4f 76 66 6c 21 3d 30 20 29 7b 0a 20 20 20  xtOvfl!=0 ){.   
10640 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
10650 74 28 70 42 74 2c 20 6e 65 78 74 4f 76 66 6c 2c  t(pBt, nextOvfl,
10660 20 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57   PTRMAP_OVERFLOW
10670 32 2c 20 69 46 72 65 65 50 61 67 65 29 3b 0a 20  2, iFreePage);. 
10680 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
10690 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
106a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
106b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
106c0 20 20 2f 2a 20 46 69 78 20 74 68 65 20 64 61 74    /* Fix the dat
106d0 61 62 61 73 65 20 70 6f 69 6e 74 65 72 20 6f 6e  abase pointer on
106e0 20 70 61 67 65 20 69 50 74 72 50 61 67 65 20 74   page iPtrPage t
106f0 68 61 74 20 70 6f 69 6e 74 65 64 20 61 74 20 69  hat pointed at i
10700 44 62 50 61 67 65 20 73 6f 0a 20 20 2a 2a 20 74  DbPage so.  ** t
10710 68 61 74 20 69 74 20 70 6f 69 6e 74 73 20 61 74  hat it points at
10720 20 69 46 72 65 65 50 61 67 65 2e 20 41 6c 73 6f   iFreePage. Also
10730 20 66 69 78 20 74 68 65 20 70 6f 69 6e 74 65 72   fix the pointer
10740 20 6d 61 70 20 65 6e 74 72 79 20 66 6f 72 0a 20   map entry for. 
10750 20 2a 2a 20 69 50 74 72 50 61 67 65 2e 0a 20 20   ** iPtrPage..  
10760 2a 2f 0a 20 20 69 66 28 20 65 54 79 70 65 21 3d  */.  if( eType!=
10770 50 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20  PTRMAP_ROOTPAGE 
10780 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
10790 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
107a0 70 42 74 2c 20 69 50 74 72 50 61 67 65 2c 20 26  pBt, iPtrPage, &
107b0 70 50 74 72 50 61 67 65 2c 20 30 29 3b 0a 20 20  pPtrPage, 0);.  
107c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
107d0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
107e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
107f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
10800 67 65 72 57 72 69 74 65 28 70 50 74 72 50 61 67  gerWrite(pPtrPag
10810 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
10820 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10830 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 6c 65  OK ){.      rele
10840 61 73 65 50 61 67 65 28 70 50 74 72 50 61 67 65  asePage(pPtrPage
10850 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
10860 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  rc;.    }.    rc
10870 20 3d 20 6d 6f 64 69 66 79 50 61 67 65 50 6f 69   = modifyPagePoi
10880 6e 74 65 72 28 70 50 74 72 50 61 67 65 2c 20 69  nter(pPtrPage, i
10890 44 62 50 61 67 65 2c 20 69 46 72 65 65 50 61 67  DbPage, iFreePag
108a0 65 2c 20 65 54 79 70 65 29 3b 0a 20 20 20 20 72  e, eType);.    r
108b0 65 6c 65 61 73 65 50 61 67 65 28 70 50 74 72 50  eleasePage(pPtrP
108c0 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  age);.    if( rc
108d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
108e0 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70       rc = ptrmap
108f0 50 75 74 28 70 42 74 2c 20 69 46 72 65 65 50 61  Put(pBt, iFreePa
10900 67 65 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50  ge, eType, iPtrP
10910 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  age);.    }.  }.
10920 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10930 2f 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61  /* Forward decla
10940 72 61 74 69 6f 6e 20 72 65 71 75 69 72 65 64 20  ration required 
10950 62 79 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65  by incrVacuumSte
10960 70 28 29 2e 20 2a 2f 0a 73 74 61 74 69 63 20 69  p(). */.static i
10970 6e 74 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65  nt allocateBtree
10980 50 61 67 65 28 42 74 53 68 61 72 65 64 20 2a 2c  Page(BtShared *,
10990 20 4d 65 6d 50 61 67 65 20 2a 2a 2c 20 50 67 6e   MemPage **, Pgn
109a0 6f 20 2a 2c 20 50 67 6e 6f 2c 20 75 38 29 3b 0a  o *, Pgno, u8);.
109b0 0a 2f 2a 0a 2a 2a 20 50 65 72 66 6f 72 6d 20 61  ./*.** Perform a
109c0 20 73 69 6e 67 6c 65 20 73 74 65 70 20 6f 66 20   single step of 
109d0 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76  an incremental-v
109e0 61 63 75 75 6d 2e 20 49 66 20 73 75 63 63 65 73  acuum. If succes
109f0 73 66 75 6c 2c 0a 2a 2a 20 72 65 74 75 72 6e 20  sful,.** return 
10a00 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 74 68  SQLITE_OK. If th
10a10 65 72 65 20 69 73 20 6e 6f 20 77 6f 72 6b 20 74  ere is no work t
10a20 6f 20 64 6f 20 28 61 6e 64 20 74 68 65 72 65 66  o do (and theref
10a30 6f 72 65 20 6e 6f 0a 2a 2a 20 70 6f 69 6e 74 20  ore no.** point 
10a40 69 6e 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20  in calling this 
10a50 66 75 6e 63 74 69 6f 6e 20 61 67 61 69 6e 29 2c  function again),
10a60 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
10a70 4f 4e 45 2e 0a 2a 2a 0a 2a 2a 20 4d 6f 72 65 20  ONE..**.** More 
10a80 73 70 65 63 69 66 69 63 6c 79 2c 20 74 68 69 73  specificly, this
10a90 20 66 75 6e 63 74 69 6f 6e 20 61 74 74 65 6d 70   function attemp
10aa0 74 73 20 74 6f 20 72 65 2d 6f 72 67 61 6e 69 7a  ts to re-organiz
10ab0 65 20 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61  e the .** databa
10ac0 73 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 6c  se so that the l
10ad0 61 73 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  ast page of the 
10ae0 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 69  file currently i
10af0 6e 20 75 73 65 0a 2a 2a 20 69 73 20 6e 6f 20 6c  n use.** is no l
10b00 6f 6e 67 65 72 20 69 6e 20 75 73 65 2e 0a 2a 2a  onger in use..**
10b10 0a 2a 2a 20 49 66 20 74 68 65 20 6e 46 69 6e 20  .** If the nFin 
10b20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 6e  parameter is non
10b30 2d 7a 65 72 6f 2c 20 74 68 65 20 69 6d 70 6c 65  -zero, the imple
10b40 6d 65 6e 74 61 74 69 6f 6e 20 61 73 73 75 6d 65  mentation assume
10b50 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 63 61  s.** that the ca
10b60 6c 6c 65 72 20 77 69 6c 6c 20 6b 65 65 70 20 63  ller will keep c
10b70 61 6c 6c 69 6e 67 20 69 6e 63 72 56 61 63 75 75  alling incrVacuu
10b80 6d 53 74 65 70 28 29 20 75 6e 74 69 6c 0a 2a 2a  mStep() until.**
10b90 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49   it returns SQLI
10ba0 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 65 72  TE_DONE or an er
10bb0 72 6f 72 2c 20 61 6e 64 20 74 68 61 74 20 6e 46  ror, and that nF
10bc0 69 6e 20 69 73 20 74 68 65 0a 2a 2a 20 6e 75 6d  in is the.** num
10bd0 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 68 65  ber of pages the
10be0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
10bf0 69 6c 6c 20 63 6f 6e 74 61 69 6e 20 61 66 74 65  ill contain afte
10c00 72 20 74 68 69 73 20 0a 2a 2a 20 70 72 6f 63 65  r this .** proce
10c10 73 73 20 69 73 20 63 6f 6d 70 6c 65 74 65 2e 0a  ss is complete..
10c20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69 6e  */.static int in
10c30 63 72 56 61 63 75 75 6d 53 74 65 70 28 42 74 53  crVacuumStep(BtS
10c40 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67 6e 6f  hared *pBt, Pgno
10c50 20 6e 46 69 6e 29 7b 0a 20 20 50 67 6e 6f 20 69   nFin){.  Pgno i
10c60 4c 61 73 74 50 67 3b 20 20 20 20 20 20 20 20 20  LastPg;         
10c70 20 20 20 20 2f 2a 20 4c 61 73 74 20 70 61 67 65      /* Last page
10c80 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
10c90 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 46 72 65 65   */.  Pgno nFree
10ca0 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20 20 20  List;           
10cb0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
10cc0 65 73 20 73 74 69 6c 6c 20 6f 6e 20 74 68 65 20  es still on the 
10cd0 66 72 65 65 2d 6c 69 73 74 20 2a 2f 0a 0a 20 20  free-list */..  
10ce0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
10cf0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
10d00 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 4c 61 73  mutex) );.  iLas
10d10 74 50 67 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e  tPg = pBt->nTrun
10d20 63 3b 0a 20 20 69 66 28 20 69 4c 61 73 74 50 67  c;.  if( iLastPg
10d30 3d 3d 30 20 29 7b 0a 20 20 20 20 69 4c 61 73 74  ==0 ){.    iLast
10d40 50 67 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  Pg = pagerPageco
10d50 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
10d60 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 50 54  ;.  }..  if( !PT
10d70 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c  RMAP_ISPAGE(pBt,
10d80 20 69 4c 61 73 74 50 67 29 20 26 26 20 69 4c 61   iLastPg) && iLa
10d90 73 74 50 67 21 3d 50 45 4e 44 49 4e 47 5f 42 59  stPg!=PENDING_BY
10da0 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a  TE_PAGE(pBt) ){.
10db0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
10dc0 75 38 20 65 54 79 70 65 3b 0a 20 20 20 20 50 67  u8 eType;.    Pg
10dd0 6e 6f 20 69 50 74 72 50 61 67 65 3b 0a 0a 20 20  no iPtrPage;..  
10de0 20 20 6e 46 72 65 65 4c 69 73 74 20 3d 20 67 65    nFreeList = ge
10df0 74 34 62 79 74 65 28 26 70 42 74 2d 3e 70 50 61  t4byte(&pBt->pPa
10e00 67 65 31 2d 3e 61 44 61 74 61 5b 33 36 5d 29 3b  ge1->aData[36]);
10e10 0a 20 20 20 20 69 66 28 20 6e 46 72 65 65 4c 69  .    if( nFreeLi
10e20 73 74 3d 3d 30 20 7c 7c 20 6e 46 69 6e 3d 3d 69  st==0 || nFin==i
10e30 4c 61 73 74 50 67 20 29 7b 0a 20 20 20 20 20 20  LastPg ){.      
10e40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
10e50 4e 45 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  NE;.    }..    r
10e60 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
10e70 74 2c 20 69 4c 61 73 74 50 67 2c 20 26 65 54 79  t, iLastPg, &eTy
10e80 70 65 2c 20 26 69 50 74 72 50 61 67 65 29 3b 0a  pe, &iPtrPage);.
10e90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
10ea0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
10eb0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
10ec0 20 20 20 20 69 66 28 20 65 54 79 70 65 3d 3d 50      if( eType==P
10ed0 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 20 29  TRMAP_ROOTPAGE )
10ee0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
10ef0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
10f00 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  PT;.    }..    i
10f10 66 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50  f( eType==PTRMAP
10f20 5f 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20  _FREEPAGE ){.   
10f30 20 20 20 69 66 28 20 6e 46 69 6e 3d 3d 30 20 29     if( nFin==0 )
10f40 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 65 6d  {.        /* Rem
10f50 6f 76 65 20 74 68 65 20 70 61 67 65 20 66 72 6f  ove the page fro
10f60 6d 20 74 68 65 20 66 69 6c 65 73 20 66 72 65 65  m the files free
10f70 2d 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20 6e  -list. This is n
10f80 6f 74 20 72 65 71 75 69 72 65 64 0a 20 20 20 20  ot required.    
10f90 20 20 20 20 2a 2a 20 69 66 20 6e 46 69 6e 20 69      ** if nFin i
10fa0 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 49 6e 20 74  s non-zero. In t
10fb0 68 61 74 20 63 61 73 65 2c 20 74 68 65 20 66 72  hat case, the fr
10fc0 65 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 0a  ee-list will be.
10fd0 20 20 20 20 20 20 20 20 2a 2a 20 74 72 75 6e 63          ** trunc
10fe0 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 61 66 74  ated to zero aft
10ff0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
11000 20 72 65 74 75 72 6e 73 2c 20 73 6f 20 69 74 20   returns, so it 
11010 64 6f 65 73 6e 27 74 20 0a 20 20 20 20 20 20 20  doesn't .       
11020 20 2a 2a 20 6d 61 74 74 65 72 20 69 66 20 69 74   ** matter if it
11030 20 73 74 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20   still contains 
11040 73 6f 6d 65 20 67 61 72 62 61 67 65 20 65 6e 74  some garbage ent
11050 72 69 65 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ries..        */
11060 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69 46  .        Pgno iF
11070 72 65 65 50 67 3b 0a 20 20 20 20 20 20 20 20 4d  reePg;.        M
11080 65 6d 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b  emPage *pFreePg;
11090 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c  .        rc = al
110a0 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
110b0 70 42 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26  pBt, &pFreePg, &
110c0 69 46 72 65 65 50 67 2c 20 69 4c 61 73 74 50 67  iFreePg, iLastPg
110d0 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 1);.        if
110e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
110f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
11100 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
11110 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
11120 28 20 69 46 72 65 65 50 67 3d 3d 69 4c 61 73 74  ( iFreePg==iLast
11130 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  Pg );.        re
11140 6c 65 61 73 65 50 61 67 65 28 70 46 72 65 65 50  leasePage(pFreeP
11150 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
11160 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 50  } else {.      P
11170 67 6e 6f 20 69 46 72 65 65 50 67 3b 20 20 20 20  gno iFreePg;    
11180 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
11190 78 20 6f 66 20 66 72 65 65 20 70 61 67 65 20 74  x of free page t
111a0 6f 20 6d 6f 76 65 20 70 4c 61 73 74 50 67 20 74  o move pLastPg t
111b0 6f 20 2a 2f 0a 20 20 20 20 20 20 4d 65 6d 50 61  o */.      MemPa
111c0 67 65 20 2a 70 4c 61 73 74 50 67 3b 0a 0a 20 20  ge *pLastPg;..  
111d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
111e0 42 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74  BtreeGetPage(pBt
111f0 2c 20 69 4c 61 73 74 50 67 2c 20 26 70 4c 61 73  , iLastPg, &pLas
11200 74 50 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  tPg, 0);.      i
11210 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11220 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
11230 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a  rn rc;.      }..
11240 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 46 69 6e        /* If nFin
11250 20 69 73 20 7a 65 72 6f 2c 20 74 68 69 73 20 6c   is zero, this l
11260 6f 6f 70 20 72 75 6e 73 20 65 78 61 63 74 6c 79  oop runs exactly
11270 20 6f 6e 63 65 20 61 6e 64 20 70 61 67 65 20 70   once and page p
11280 4c 61 73 74 50 67 0a 20 20 20 20 20 20 2a 2a 20  LastPg.      ** 
11290 69 73 20 73 77 61 70 70 65 64 20 77 69 74 68 20  is swapped with 
112a0 74 68 65 20 66 69 72 73 74 20 66 72 65 65 20 70  the first free p
112b0 61 67 65 20 70 75 6c 6c 65 64 20 6f 66 66 20 74  age pulled off t
112c0 68 65 20 66 72 65 65 20 6c 69 73 74 2e 0a 20 20  he free list..  
112d0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
112e0 4f 6e 20 74 68 65 20 6f 74 68 65 72 20 68 61 6e  On the other han
112f0 64 2c 20 69 66 20 6e 46 69 6e 20 69 73 20 67 72  d, if nFin is gr
11300 65 61 74 65 72 20 74 68 61 6e 20 7a 65 72 6f 2c  eater than zero,
11310 20 74 68 65 6e 20 6b 65 65 70 0a 20 20 20 20 20   then keep.     
11320 20 2a 2a 20 6c 6f 6f 70 69 6e 67 20 75 6e 74 69   ** looping unti
11330 6c 20 61 20 66 72 65 65 2d 70 61 67 65 20 6c 6f  l a free-page lo
11340 63 61 74 65 64 20 77 69 74 68 69 6e 20 74 68 65  cated within the
11350 20 66 69 72 73 74 20 6e 46 69 6e 20 70 61 67 65   first nFin page
11360 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68  s.      ** of th
11370 65 20 66 69 6c 65 20 69 73 20 66 6f 75 6e 64 2e  e file is found.
11380 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
11390 64 6f 20 7b 0a 20 20 20 20 20 20 20 20 4d 65 6d  do {.        Mem
113a0 50 61 67 65 20 2a 70 46 72 65 65 50 67 3b 0a 20  Page *pFreePg;. 
113b0 20 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f         rc = allo
113c0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
113d0 74 2c 20 26 70 46 72 65 65 50 67 2c 20 26 69 46  t, &pFreePg, &iF
113e0 72 65 65 50 67 2c 20 30 2c 20 30 29 3b 0a 20 20  reePg, 0, 0);.  
113f0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
11400 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
11410 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
11420 28 70 4c 61 73 74 50 67 29 3b 0a 20 20 20 20 20  (pLastPg);.     
11430 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
11440 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11450 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 46    releasePage(pF
11460 72 65 65 50 67 29 3b 0a 20 20 20 20 20 20 7d 77  reePg);.      }w
11470 68 69 6c 65 28 20 6e 46 69 6e 21 3d 30 20 26 26  hile( nFin!=0 &&
11480 20 69 46 72 65 65 50 67 3e 6e 46 69 6e 20 29 3b   iFreePg>nFin );
11490 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69  .      assert( i
114a0 46 72 65 65 50 67 3c 69 4c 61 73 74 50 67 20 29  FreePg<iLastPg )
114b0 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 72  ;.      .      r
114c0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
114d0 57 72 69 74 65 28 70 4c 61 73 74 50 67 2d 3e 70  Write(pLastPg->p
114e0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
114f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
11500 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
11510 20 72 65 6c 6f 63 61 74 65 50 61 67 65 28 70 42   relocatePage(pB
11520 74 2c 20 70 4c 61 73 74 50 67 2c 20 65 54 79 70  t, pLastPg, eTyp
11530 65 2c 20 69 50 74 72 50 61 67 65 2c 20 69 46 72  e, iPtrPage, iFr
11540 65 65 50 67 2c 20 6e 46 69 6e 21 3d 30 29 3b 0a  eePg, nFin!=0);.
11550 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
11560 6c 65 61 73 65 50 61 67 65 28 70 4c 61 73 74 50  leasePage(pLastP
11570 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
11580 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11590 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
115a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
115b0 20 20 7d 0a 0a 20 20 70 42 74 2d 3e 6e 54 72 75    }..  pBt->nTru
115c0 6e 63 20 3d 20 69 4c 61 73 74 50 67 20 2d 20 31  nc = iLastPg - 1
115d0 3b 0a 20 20 77 68 69 6c 65 28 20 70 42 74 2d 3e  ;.  while( pBt->
115e0 6e 54 72 75 6e 63 3d 3d 50 45 4e 44 49 4e 47 5f  nTrunc==PENDING_
115f0 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 7c 7c  BYTE_PAGE(pBt)||
11600 50 54 52 4d 41 50 5f 49 53 50 41 47 45 28 70 42  PTRMAP_ISPAGE(pB
11610 74 2c 20 70 42 74 2d 3e 6e 54 72 75 6e 63 29 20  t, pBt->nTrunc) 
11620 29 7b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 75  ){.    pBt->nTru
11630 6e 63 2d 2d 3b 0a 20 20 7d 0a 20 20 72 65 74 75  nc--;.  }.  retu
11640 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
11650 0a 2f 2a 0a 2a 2a 20 41 20 77 72 69 74 65 2d 74  ./*.** A write-t
11660 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74 20  ransaction must 
11670 62 65 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  be opened before
11680 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 66 75   calling this fu
11690 6e 63 74 69 6f 6e 2e 0a 2a 2a 20 49 74 20 70 65  nction..** It pe
116a0 72 66 6f 72 6d 73 20 61 20 73 69 6e 67 6c 65 20  rforms a single 
116b0 75 6e 69 74 20 6f 66 20 77 6f 72 6b 20 74 6f 77  unit of work tow
116c0 61 72 64 73 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ards an incremen
116d0 74 61 6c 20 76 61 63 75 75 6d 2e 0a 2a 2a 0a 2a  tal vacuum..**.*
116e0 2a 20 49 66 20 74 68 65 20 69 6e 63 72 65 6d 65  * If the increme
116f0 6e 74 61 6c 20 76 61 63 75 75 6d 20 69 73 20 66  ntal vacuum is f
11700 69 6e 69 73 68 65 64 20 61 66 74 65 72 20 74 68  inished after th
11710 69 73 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20  is function has 
11720 72 75 6e 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 44  run,.** SQLITE_D
11730 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ONE is returned.
11740 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 66 69   If it is not fi
11750 6e 69 73 68 65 64 2c 20 62 75 74 20 6e 6f 20 65  nished, but no e
11760 72 72 6f 72 20 6f 63 63 75 72 65 64 2c 0a 2a 2a  rror occured,.**
11770 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
11780 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
11790 65 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  e an SQLite erro
117a0 72 20 63 6f 64 65 2e 20 0a 2a 2f 0a 69 6e 74 20  r code. .*/.int 
117b0 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 63 72  sqlite3BtreeIncr
117c0 56 61 63 75 75 6d 28 42 74 72 65 65 20 2a 70 29  Vacuum(Btree *p)
117d0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74  {.  int rc;.  Bt
117e0 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
117f0 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33  >pBt;..  sqlite3
11800 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
11810 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62   pBt->db = p->db
11820 3b 0a 20 20 61 73 73 65 72 74 28 20 70 42 74 2d  ;.  assert( pBt-
11830 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d  >inTransaction==
11840 54 52 41 4e 53 5f 57 52 49 54 45 20 26 26 20 70  TRANS_WRITE && p
11850 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41 4e 53  ->inTrans==TRANS
11860 5f 57 52 49 54 45 20 29 3b 0a 20 20 69 66 28 20  _WRITE );.  if( 
11870 21 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d  !pBt->autoVacuum
11880 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
11890 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 65 6c 73  ITE_DONE;.  }els
118a0 65 7b 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74  e{.    invalidat
118b0 65 41 6c 6c 4f 76 65 72 66 6c 6f 77 43 61 63 68  eAllOverflowCach
118c0 65 28 70 42 74 29 3b 0a 20 20 20 20 72 63 20 3d  e(pBt);.    rc =
118d0 20 69 6e 63 72 56 61 63 75 75 6d 53 74 65 70 28   incrVacuumStep(
118e0 70 42 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  pBt, 0);.  }.  s
118f0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
11900 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
11910 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
11920 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
11930 64 20 70 72 69 6f 72 20 74 6f 20 73 71 6c 69 74  d prior to sqlit
11940 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 20 77 68  e3PagerCommit wh
11950 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
11960 0a 2a 2a 20 69 73 20 63 6f 6d 6d 69 74 65 64 20  .** is commited 
11970 66 6f 72 20 61 6e 20 61 75 74 6f 2d 76 61 63 75  for an auto-vacu
11980 75 6d 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a  um database..**.
11990 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 4f 4b 20  ** If SQLITE_OK 
119a0 69 73 20 72 65 74 75 72 6e 65 64 2c 20 74 68 65  is returned, the
119b0 6e 20 2a 70 6e 54 72 75 6e 63 20 69 73 20 73 65  n *pnTrunc is se
119c0 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
119d0 6f 66 20 70 61 67 65 73 0a 2a 2a 20 74 68 65 20  of pages.** the 
119e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68  database file sh
119f0 6f 75 6c 64 20 62 65 20 74 72 75 6e 63 61 74 65  ould be truncate
11a00 64 20 74 6f 20 64 75 72 69 6e 67 20 74 68 65 20  d to during the 
11a10 63 6f 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 20  commit process. 
11a20 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 64 61 74  .** i.e. the dat
11a30 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 72  abase has been r
11a40 65 6f 72 67 61 6e 69 7a 65 64 20 73 6f 20 74 68  eorganized so th
11a50 61 74 20 6f 6e 6c 79 20 74 68 65 20 66 69 72 73  at only the firs
11a60 74 20 2a 70 6e 54 72 75 6e 63 0a 2a 2a 20 70 61  t *pnTrunc.** pa
11a70 67 65 73 20 61 72 65 20 69 6e 20 75 73 65 2e 0a  ges are in use..
11a80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 75  */.static int au
11a90 74 6f 56 61 63 75 75 6d 43 6f 6d 6d 69 74 28 42  toVacuumCommit(B
11aa0 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20 50 67  tShared *pBt, Pg
11ab0 6e 6f 20 2a 70 6e 54 72 75 6e 63 29 7b 0a 20 20  no *pnTrunc){.  
11ac0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
11ad0 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  OK;.  Pager *pPa
11ae0 67 65 72 20 3d 20 70 42 74 2d 3e 70 50 61 67 65  ger = pBt->pPage
11af0 72 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  r;.#ifndef NDEBU
11b00 47 0a 20 20 69 6e 74 20 6e 52 65 66 20 3d 20 73  G.  int nRef = s
11b10 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f  qlite3PagerRefco
11b20 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 23 65 6e  unt(pPager);.#en
11b30 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 73  dif..  assert( s
11b40 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
11b50 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  d(pBt->mutex) );
11b60 0a 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c  .  invalidateAll
11b70 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42  OverflowCache(pB
11b80 74 29 3b 0a 20 20 61 73 73 65 72 74 28 70 42 74  t);.  assert(pBt
11b90 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 3b 0a 20  ->autoVacuum);. 
11ba0 20 69 66 28 20 21 70 42 74 2d 3e 69 6e 63 72 56   if( !pBt->incrV
11bb0 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50 67 6e  acuum ){.    Pgn
11bc0 6f 20 6e 46 69 6e 20 3d 20 30 3b 0a 0a 20 20 20  o nFin = 0;..   
11bd0 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63   if( pBt->nTrunc
11be0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 50 67 6e  ==0 ){.      Pgn
11bf0 6f 20 6e 46 72 65 65 3b 0a 20 20 20 20 20 20 50  o nFree;.      P
11c00 67 6e 6f 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20  gno nPtrmap;.   
11c10 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 70 67 73     const int pgs
11c20 7a 20 3d 20 70 42 74 2d 3e 70 61 67 65 53 69 7a  z = pBt->pageSiz
11c30 65 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 72  e;.      int nOr
11c40 69 67 20 3d 20 70 61 67 65 72 50 61 67 65 63 6f  ig = pagerPageco
11c50 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
11c60 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 50 54 52  ;..      if( PTR
11c70 4d 41 50 5f 49 53 50 41 47 45 28 70 42 74 2c 20  MAP_ISPAGE(pBt, 
11c80 6e 4f 72 69 67 29 20 29 7b 0a 20 20 20 20 20 20  nOrig) ){.      
11c90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
11ca0 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20  CORRUPT_BKPT;.  
11cb0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
11cc0 6e 4f 72 69 67 3d 3d 50 45 4e 44 49 4e 47 5f 42  nOrig==PENDING_B
11cd0 59 54 45 5f 50 41 47 45 28 70 42 74 29 20 29 7b  YTE_PAGE(pBt) ){
11ce0 0a 20 20 20 20 20 20 20 20 6e 4f 72 69 67 2d 2d  .        nOrig--
11cf0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
11d00 6e 46 72 65 65 20 3d 20 67 65 74 34 62 79 74 65  nFree = get4byte
11d10 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
11d20 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 20 20 20  Data[36]);.     
11d30 20 6e 50 74 72 6d 61 70 20 3d 20 28 6e 46 72 65   nPtrmap = (nFre
11d40 65 2d 6e 4f 72 69 67 2b 50 54 52 4d 41 50 5f 50  e-nOrig+PTRMAP_P
11d50 41 47 45 4e 4f 28 70 42 74 2c 20 6e 4f 72 69 67  AGENO(pBt, nOrig
11d60 29 2b 70 67 73 7a 2f 35 29 2f 28 70 67 73 7a 2f  )+pgsz/5)/(pgsz/
11d70 35 29 3b 0a 20 20 20 20 20 20 6e 46 69 6e 20 3d  5);.      nFin =
11d80 20 6e 4f 72 69 67 20 2d 20 6e 46 72 65 65 20 2d   nOrig - nFree -
11d90 20 6e 50 74 72 6d 61 70 3b 0a 20 20 20 20 20 20   nPtrmap;.      
11da0 69 66 28 20 6e 4f 72 69 67 3e 50 45 4e 44 49 4e  if( nOrig>PENDIN
11db0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
11dc0 20 26 26 20 6e 46 69 6e 3c 3d 50 45 4e 44 49 4e   && nFin<=PENDIN
11dd0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
11de0 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 46 69 6e   ){.        nFin
11df0 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  --;.      }.    
11e00 20 20 77 68 69 6c 65 28 20 50 54 52 4d 41 50 5f    while( PTRMAP_
11e10 49 53 50 41 47 45 28 70 42 74 2c 20 6e 46 69 6e  ISPAGE(pBt, nFin
11e20 29 20 7c 7c 20 6e 46 69 6e 3d 3d 50 45 4e 44 49  ) || nFin==PENDI
11e30 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74  NG_BYTE_PAGE(pBt
11e40 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 46 69  ) ){.        nFi
11e50 6e 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n--;.      }.   
11e60 20 7d 0a 0a 20 20 20 20 77 68 69 6c 65 28 20 72   }..    while( r
11e70 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
11e80 20 20 20 20 20 20 72 63 20 3d 20 69 6e 63 72 56        rc = incrV
11e90 61 63 75 75 6d 53 74 65 70 28 70 42 74 2c 20 6e  acuumStep(pBt, n
11ea0 46 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Fin);.    }.    
11eb0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
11ec0 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ONE ){.      ass
11ed0 65 72 74 28 6e 46 69 6e 3d 3d 30 20 7c 7c 20 70  ert(nFin==0 || p
11ee0 42 74 2d 3e 6e 54 72 75 6e 63 3d 3d 30 20 7c 7c  Bt->nTrunc==0 ||
11ef0 20 6e 46 69 6e 3c 3d 70 42 74 2d 3e 6e 54 72 75   nFin<=pBt->nTru
11f00 6e 63 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  nc);.      rc = 
11f10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
11f20 20 69 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63   if( pBt->nTrunc
11f30 20 26 26 20 6e 46 69 6e 20 29 7b 0a 20 20 20 20   && nFin ){.    
11f40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11f50 50 61 67 65 72 57 72 69 74 65 28 70 42 74 2d 3e  PagerWrite(pBt->
11f60 70 50 61 67 65 31 2d 3e 70 44 62 50 61 67 65 29  pPage1->pDbPage)
11f70 3b 0a 20 20 20 20 20 20 20 20 70 75 74 34 62 79  ;.        put4by
11f80 74 65 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d  te(&pBt->pPage1-
11f90 3e 61 44 61 74 61 5b 33 32 5d 2c 20 30 29 3b 0a  >aData[32], 0);.
11fa0 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65          put4byte
11fb0 28 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61  (&pBt->pPage1->a
11fc0 44 61 74 61 5b 33 36 5d 2c 20 30 29 3b 0a 20 20  Data[36], 0);.  
11fd0 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 75 6e        pBt->nTrun
11fe0 63 20 3d 20 6e 46 69 6e 3b 0a 20 20 20 20 20 20  c = nFin;.      
11ff0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
12000 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
12010 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61  .      sqlite3Pa
12020 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  gerRollback(pPag
12030 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  er);.    }.  }..
12040 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
12050 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 6e 54 72  _OK ){.    *pnTr
12060 75 6e 63 20 3d 20 70 42 74 2d 3e 6e 54 72 75 6e  unc = pBt->nTrun
12070 63 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54 72 75  c;.    pBt->nTru
12080 6e 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 61 73  nc = 0;.  }.  as
12090 73 65 72 74 28 20 6e 52 65 66 3d 3d 73 71 6c 69  sert( nRef==sqli
120a0 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
120b0 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72 65  (pPager) );.  re
120c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64  turn rc;.}..#end
120d0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
120e0 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
120f0 66 69 72 73 74 20 70 68 61 73 65 20 6f 66 20 61  first phase of a
12100 20 74 77 6f 2d 70 68 61 73 65 20 63 6f 6d 6d 69   two-phase commi
12110 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  t.  This routine
12120 0a 2a 2a 20 63 61 75 73 65 73 20 61 20 72 6f 6c  .** causes a rol
12130 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74 6f  lback journal to
12140 20 62 65 20 63 72 65 61 74 65 64 20 28 69 66 20   be created (if 
12150 69 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65  it does not alre
12160 61 64 79 20 65 78 69 73 74 29 0a 2a 2a 20 61 6e  ady exist).** an
12170 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68  d populated with
12180 20 65 6e 6f 75 67 68 20 69 6e 66 6f 72 6d 61 74   enough informat
12190 69 6f 6e 20 73 6f 20 74 68 61 74 20 69 66 20 61  ion so that if a
121a0 20 70 6f 77 65 72 20 6c 6f 73 73 20 6f 63 63 75   power loss occu
121b0 72 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  rs.** the databa
121c0 73 65 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72  se can be restor
121d0 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e  ed to its origin
121e0 61 6c 20 73 74 61 74 65 20 62 79 20 70 6c 61 79  al state by play
121f0 69 6e 67 20 62 61 63 6b 0a 2a 2a 20 74 68 65 20  ing back.** the 
12200 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 6e 20 74  journal.  Then t
12210 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
12220 68 65 20 6a 6f 75 72 6e 61 6c 20 61 72 65 20 66  he journal are f
12230 6c 75 73 68 65 64 20 6f 75 74 20 74 6f 0a 2a 2a  lushed out to.**
12240 20 74 68 65 20 64 69 73 6b 2e 20 20 41 66 74 65   the disk.  Afte
12250 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  r the journal is
12260 20 73 61 66 65 6c 79 20 6f 6e 20 6f 78 69 64 65   safely on oxide
12270 2c 20 74 68 65 20 63 68 61 6e 67 65 73 20 74 6f  , the changes to
12280 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65   the.** database
12290 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e 74   are written int
122a0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
122b0 69 6c 65 20 61 6e 64 20 66 6c 75 73 68 65 64 20  ile and flushed 
122c0 74 6f 20 6f 78 69 64 65 2e 0a 2a 2a 20 41 74 20  to oxide..** At 
122d0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20  the end of this 
122e0 63 61 6c 6c 2c 20 74 68 65 20 72 6f 6c 6c 62 61  call, the rollba
122f0 63 6b 20 6a 6f 75 72 6e 61 6c 20 73 74 69 6c 6c  ck journal still
12300 20 65 78 69 73 74 73 20 6f 6e 20 74 68 65 0a 2a   exists on the.*
12310 2a 20 64 69 73 6b 20 61 6e 64 20 77 65 20 61 72  * disk and we ar
12320 65 20 73 74 69 6c 6c 20 68 6f 6c 64 69 6e 67 20  e still holding 
12330 61 6c 6c 20 6c 6f 63 6b 73 2c 20 73 6f 20 74 68  all locks, so th
12340 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
12350 73 20 6e 6f 74 0a 2a 2a 20 63 6f 6d 6d 69 74 74  s not.** committ
12360 65 64 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33  ed.  See sqlite3
12370 42 74 72 65 65 43 6f 6d 6d 69 74 28 29 20 66 6f  BtreeCommit() fo
12380 72 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61  r the second pha
12390 73 65 20 6f 66 20 74 68 65 0a 2a 2a 20 63 6f 6d  se of the.** com
123a0 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 2a 2a 0a  mit process..**.
123b0 2a 2a 20 54 68 69 73 20 63 61 6c 6c 20 69 73 20  ** This call is 
123c0 61 20 6e 6f 2d 6f 70 20 69 66 20 6e 6f 20 77 72  a no-op if no wr
123d0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
123e0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 63 74  is currently act
123f0 69 76 65 20 6f 6e 20 70 42 74 2e 0a 2a 2a 0a 2a  ive on pBt..**.*
12400 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 73 79 6e  * Otherwise, syn
12410 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
12420 69 6c 65 20 66 6f 72 20 74 68 65 20 62 74 72 65  ile for the btre
12430 65 20 70 42 74 2e 20 7a 4d 61 73 74 65 72 20 70  e pBt. zMaster p
12440 6f 69 6e 74 73 20 74 6f 0a 2a 2a 20 74 68 65 20  oints to.** the 
12450 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
12460 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
12470 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69  at should be wri
12480 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 0a 2a 2a  tten into the.**
12490 20 69 6e 64 69 76 69 64 75 61 6c 20 6a 6f 75 72   individual jour
124a0 6e 61 6c 20 66 69 6c 65 2c 20 6f 72 20 69 73 20  nal file, or is 
124b0 4e 55 4c 4c 2c 20 69 6e 64 69 63 61 74 69 6e 67  NULL, indicating
124c0 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
124d0 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 28 73 69 6e  al file .** (sin
124e0 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61  gle database tra
124f0 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a  nsaction)..**.**
12500 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
12510 6c 6c 65 64 2c 20 74 68 65 20 6d 61 73 74 65 72  lled, the master
12520 20 6a 6f 75 72 6e 61 6c 20 73 68 6f 75 6c 64 20   journal should 
12530 61 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65  already have bee
12540 6e 0a 2a 2a 20 63 72 65 61 74 65 64 2c 20 70 6f  n.** created, po
12550 70 75 6c 61 74 65 64 20 77 69 74 68 20 74 68 69  pulated with thi
12560 73 20 6a 6f 75 72 6e 61 6c 20 70 6f 69 6e 74 65  s journal pointe
12570 72 20 61 6e 64 20 73 79 6e 63 65 64 20 74 6f 20  r and synced to 
12580 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65  disk..**.** Once
12590 20 74 68 69 73 20 69 73 20 72 6f 75 74 69 6e 65   this is routine
125a0 20 68 61 73 20 72 65 74 75 72 6e 65 64 2c 20 74   has returned, t
125b0 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 72 65  he only thing re
125c0 71 75 69 72 65 64 20 74 6f 20 63 6f 6d 6d 69 74  quired to commit
125d0 0a 2a 2a 20 74 68 65 20 77 72 69 74 65 2d 74 72  .** the write-tr
125e0 61 6e 73 61 63 74 69 6f 6e 20 66 6f 72 20 74 68  ansaction for th
125f0 69 73 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  is database file
12600 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68   is to delete th
12610 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 69 6e  e journal..*/.in
12620 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f  t sqlite3BtreeCo
12630 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 42 74 72  mmitPhaseOne(Btr
12640 65 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  ee *p, const cha
12650 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69  r *zMaster){.  i
12660 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
12670 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72  K;.  if( p->inTr
12680 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54 45  ans==TRANS_WRITE
12690 20 29 7b 0a 20 20 20 20 42 74 53 68 61 72 65 64   ){.    BtShared
126a0 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
126b0 20 20 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 20      Pgno nTrunc 
126c0 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
126d0 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20  BtreeEnter(p);. 
126e0 20 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e     pBt->db = p->
126f0 64 62 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  db;.#ifndef SQLI
12700 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
12710 55 4d 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  UM.    if( pBt->
12720 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
12730 20 20 20 20 72 63 20 3d 20 61 75 74 6f 56 61 63      rc = autoVac
12740 75 75 6d 43 6f 6d 6d 69 74 28 70 42 74 2c 20 26  uumCommit(pBt, &
12750 6e 54 72 75 6e 63 29 3b 20 0a 20 20 20 20 20 20  nTrunc); .      
12760 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12770 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  K ){.        sql
12780 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
12790 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
127a0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
127b0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 72    }.#endif.    r
127c0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
127d0 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70  CommitPhaseOne(p
127e0 42 74 2d 3e 70 50 61 67 65 72 2c 20 7a 4d 61 73  Bt->pPager, zMas
127f0 74 65 72 2c 20 6e 54 72 75 6e 63 2c 20 30 29 3b  ter, nTrunc, 0);
12800 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
12810 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 7d 0a 20  eLeave(p);.  }. 
12820 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
12830 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 74 68 65 20  *.** Commit the 
12840 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 75 72 72  transaction curr
12850 65 6e 74 6c 79 20 69 6e 20 70 72 6f 67 72 65 73  ently in progres
12860 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  s..**.** This ro
12870 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73  utine implements
12880 20 74 68 65 20 73 65 63 6f 6e 64 20 70 68 61 73   the second phas
12890 65 20 6f 66 20 61 20 32 2d 70 68 61 73 65 20 63  e of a 2-phase c
128a0 6f 6d 6d 69 74 2e 20 20 54 68 65 0a 2a 2a 20 73  ommit.  The.** s
128b0 71 6c 69 74 65 33 42 74 72 65 65 53 79 6e 63 28  qlite3BtreeSync(
128c0 29 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  ) routine does t
128d0 68 65 20 66 69 72 73 74 20 70 68 61 73 65 20 61  he first phase a
128e0 6e 64 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 76  nd should be inv
128f0 6f 6b 65 64 0a 2a 2a 20 70 72 69 6f 72 20 74 6f  oked.** prior to
12900 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   calling this ro
12910 75 74 69 6e 65 2e 20 20 54 68 65 20 73 71 6c 69  utine.  The sqli
12920 74 65 33 42 74 72 65 65 53 79 6e 63 28 29 20 72  te3BtreeSync() r
12930 6f 75 74 69 6e 65 20 64 69 64 0a 2a 2a 20 61 6c  outine did.** al
12940 6c 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 77 72  l the work of wr
12950 69 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  iting informatio
12960 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b 20 61 6e  n out to disk an
12970 64 20 66 6c 75 73 68 69 6e 67 20 74 68 65 0a 2a  d flushing the.*
12980 2a 20 63 6f 6e 74 65 6e 74 73 20 73 6f 20 74 68  * contents so th
12990 61 74 20 74 68 65 79 20 61 72 65 20 77 72 69 74  at they are writ
129a0 74 65 6e 20 6f 6e 74 6f 20 74 68 65 20 64 69 73  ten onto the dis
129b0 6b 20 70 6c 61 74 74 65 72 2e 20 20 41 6c 6c 20  k platter.  All 
129c0 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  this.** routine 
129d0 68 61 73 20 74 6f 20 64 6f 20 69 73 20 64 65 6c  has to do is del
129e0 65 74 65 20 6f 72 20 74 72 75 6e 63 61 74 65 20  ete or truncate 
129f0 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
12a00 72 6e 61 6c 0a 2a 2a 20 28 77 68 69 63 68 20 63  rnal.** (which c
12a10 61 75 73 65 73 20 74 68 65 20 74 72 61 6e 73 61  auses the transa
12a20 63 74 69 6f 6e 20 74 6f 20 63 6f 6d 6d 69 74 29  ction to commit)
12a30 20 61 6e 64 20 64 72 6f 70 20 6c 6f 63 6b 73 2e   and drop locks.
12a40 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c  .**.** This will
12a50 20 72 65 6c 65 61 73 65 20 74 68 65 20 77 72 69   release the wri
12a60 74 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te lock on the d
12a70 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49  atabase file.  I
12a80 66 20 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e  f there.** are n
12a90 6f 20 61 63 74 69 76 65 20 63 75 72 73 6f 72 73  o active cursors
12aa0 2c 20 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73  , it also releas
12ab0 65 73 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  es the read lock
12ac0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
12ad0 42 74 72 65 65 43 6f 6d 6d 69 74 50 68 61 73 65  BtreeCommitPhase
12ae0 54 77 6f 28 42 74 72 65 65 20 2a 70 29 7b 0a 20  Two(Btree *p){. 
12af0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
12b00 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69   p->pBt;..  sqli
12b10 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
12b20 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d  ;.  pBt->db = p-
12b30 3e 64 62 3b 0a 20 20 62 74 72 65 65 49 6e 74 65  >db;.  btreeInte
12b40 67 72 69 74 79 28 70 29 3b 0a 0a 20 20 2f 2a 20  grity(p);..  /* 
12b50 49 66 20 74 68 65 20 68 61 6e 64 6c 65 20 68 61  If the handle ha
12b60 73 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  s a write-transa
12b70 63 74 69 6f 6e 20 6f 70 65 6e 2c 20 63 6f 6d 6d  ction open, comm
12b80 69 74 20 74 68 65 20 73 68 61 72 65 64 2d 62 74  it the shared-bt
12b90 72 65 65 73 20 0a 20 20 2a 2a 20 74 72 61 6e 73  rees .  ** trans
12ba0 61 63 74 69 6f 6e 20 61 6e 64 20 73 65 74 20 74  action and set t
12bb0 68 65 20 73 68 61 72 65 64 20 73 74 61 74 65 20  he shared state 
12bc0 74 6f 20 54 52 41 4e 53 5f 52 45 41 44 2e 0a 20  to TRANS_READ.. 
12bd0 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54   */.  if( p->inT
12be0 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
12bf0 45 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  E ){.    int rc;
12c00 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74  .    assert( pBt
12c10 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d  ->inTransaction=
12c20 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a  =TRANS_WRITE );.
12c30 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d      assert( pBt-
12c40 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e 30 20  >nTransaction>0 
12c50 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
12c60 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
12c70 61 73 65 54 77 6f 28 70 42 74 2d 3e 70 50 61 67  aseTwo(pBt->pPag
12c80 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
12c90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12ca0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
12cb0 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 20 20  Leave(p);.      
12cc0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
12cd0 0a 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e  .    pBt->inTran
12ce0 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f  saction = TRANS_
12cf0 52 45 41 44 3b 0a 20 20 20 20 70 42 74 2d 3e 69  READ;.    pBt->i
12d00 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  nStmt = 0;.  }. 
12d10 20 75 6e 6c 6f 63 6b 41 6c 6c 54 61 62 6c 65 73   unlockAllTables
12d20 28 70 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  (p);..  /* If th
12d30 65 20 68 61 6e 64 6c 65 20 68 61 73 20 61 6e 79  e handle has any
12d40 20 6b 69 6e 64 20 6f 66 20 74 72 61 6e 73 61 63   kind of transac
12d50 74 69 6f 6e 20 6f 70 65 6e 2c 20 64 65 63 72 65  tion open, decre
12d60 6d 65 6e 74 20 74 68 65 20 74 72 61 6e 73 61 63  ment the transac
12d70 74 69 6f 6e 0a 20 20 2a 2a 20 63 6f 75 6e 74 20  tion.  ** count 
12d80 6f 66 20 74 68 65 20 73 68 61 72 65 64 20 62 74  of the shared bt
12d90 72 65 65 2e 20 49 66 20 74 68 65 20 74 72 61 6e  ree. If the tran
12da0 73 61 63 74 69 6f 6e 20 63 6f 75 6e 74 20 72 65  saction count re
12db0 61 63 68 65 73 20 30 2c 20 73 65 74 0a 20 20 2a  aches 0, set.  *
12dc0 2a 20 74 68 65 20 73 68 61 72 65 64 20 73 74 61  * the shared sta
12dd0 74 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45  te to TRANS_NONE
12de0 2e 20 54 68 65 20 75 6e 6c 6f 63 6b 42 74 72 65  . The unlockBtre
12df0 65 49 66 55 6e 75 73 65 64 28 29 20 63 61 6c 6c  eIfUnused() call
12e00 20 62 65 6c 6f 77 0a 20 20 2a 2a 20 77 69 6c 6c   below.  ** will
12e10 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67 65   unlock the page
12e20 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 2d  r..  */.  if( p-
12e30 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e 53 5f  >inTrans!=TRANS_
12e40 4e 4f 4e 45 20 29 7b 0a 20 20 20 20 70 42 74 2d  NONE ){.    pBt-
12e50 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b  >nTransaction--;
12e60 0a 20 20 20 20 69 66 28 20 30 3d 3d 70 42 74 2d  .    if( 0==pBt-
12e70 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b  >nTransaction ){
12e80 0a 20 20 20 20 20 20 70 42 74 2d 3e 69 6e 54 72  .      pBt->inTr
12e90 61 6e 73 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e  ansaction = TRAN
12ea0 53 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20  S_NONE;.    }.  
12eb0 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65 20  }..  /* Set the 
12ec0 68 61 6e 64 6c 65 73 20 63 75 72 72 65 6e 74 20  handles current 
12ed0 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 74  transaction stat
12ee0 65 20 74 6f 20 54 52 41 4e 53 5f 4e 4f 4e 45 20  e to TRANS_NONE 
12ef0 61 6e 64 20 75 6e 6c 6f 63 6b 0a 20 20 2a 2a 20  and unlock.  ** 
12f00 74 68 65 20 70 61 67 65 72 20 69 66 20 74 68 69  the pager if thi
12f10 73 20 63 61 6c 6c 20 63 6c 6f 73 65 64 20 74 68  s call closed th
12f20 65 20 6f 6e 6c 79 20 72 65 61 64 20 6f 72 20 77  e only read or w
12f30 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
12f40 2e 0a 20 20 2a 2f 0a 20 20 70 2d 3e 69 6e 54 72  ..  */.  p->inTr
12f50 61 6e 73 20 3d 20 54 52 41 4e 53 5f 4e 4f 4e 45  ans = TRANS_NONE
12f60 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65 49  ;.  unlockBtreeI
12f70 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 0a 20  fUnused(pBt);.. 
12f80 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
12f90 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  p);.  sqlite3Btr
12fa0 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65  eeLeave(p);.  re
12fb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12fc0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 62 6f 74 68  }../*.** Do both
12fd0 20 70 68 61 73 65 73 20 6f 66 20 61 20 63 6f 6d   phases of a com
12fe0 6d 69 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  mit..*/.int sqli
12ff0 74 65 33 42 74 72 65 65 43 6f 6d 6d 69 74 28 42  te3BtreeCommit(B
13000 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
13010 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72  rc;.  sqlite3Btr
13020 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 72 63  eeEnter(p);.  rc
13030 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 43   = sqlite3BtreeC
13040 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 70 2c  ommitPhaseOne(p,
13050 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
13060 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13070 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
13080 65 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28  eCommitPhaseTwo(
13090 70 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  p);.  }.  sqlite
130a0 33 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a  3BtreeLeave(p);.
130b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
130c0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 2f  #ifndef NDEBUG./
130d0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
130e0 6e 75 6d 62 65 72 20 6f 66 20 77 72 69 74 65 2d  number of write-
130f0 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
13100 74 68 69 73 20 68 61 6e 64 6c 65 2e 20 54 68 69  this handle. Thi
13110 73 20 69 73 20 66 6f 72 20 75 73 65 0a 2a 2a 20  s is for use.** 
13120 69 6e 20 61 73 73 65 72 74 28 29 20 65 78 70 72  in assert() expr
13130 65 73 73 69 6f 6e 73 2c 20 73 6f 20 69 74 20 69  essions, so it i
13140 73 20 6f 6e 6c 79 20 63 6f 6d 70 69 6c 65 64 20  s only compiled 
13150 69 66 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  if NDEBUG is not
13160 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2a 0a  .** defined..**.
13170 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
13180 73 65 73 20 6f 66 20 74 68 69 73 20 72 6f 75 74  ses of this rout
13190 69 6e 65 2c 20 61 20 77 72 69 74 65 2d 63 75 72  ine, a write-cur
131a0 73 6f 72 20 69 73 20 61 6e 79 20 63 75 72 73 6f  sor is any curso
131b0 72 20 74 68 61 74 0a 2a 2a 20 69 73 20 63 61 70  r that.** is cap
131c0 61 62 6c 65 20 6f 66 20 77 72 69 74 69 6e 67 20  able of writing 
131d0 74 6f 20 74 68 65 20 64 61 74 61 62 73 65 2e 20  to the databse. 
131e0 20 54 68 61 74 20 6d 65 61 6e 73 20 74 68 65 20   That means the 
131f0 63 75 72 73 6f 72 20 77 61 73 0a 2a 2a 20 6f 72  cursor was.** or
13200 69 67 69 6e 61 6c 6c 79 20 6f 70 65 6e 65 64 20  iginally opened 
13210 66 6f 72 20 77 72 69 74 69 6e 67 20 61 6e 64 20  for writing and 
13220 74 68 65 20 63 75 72 73 6f 72 20 68 61 73 20 6e  the cursor has n
13230 6f 74 20 62 65 20 64 69 73 61 62 6c 65 64 0a 2a  ot be disabled.*
13240 2a 20 62 79 20 68 61 76 69 6e 67 20 69 74 73 20  * by having its 
13250 73 74 61 74 65 20 63 68 61 6e 67 65 64 20 74 6f  state changed to
13260 20 43 55 52 53 4f 52 5f 46 41 55 4c 54 2e 0a 2a   CURSOR_FAULT..*
13270 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 75  /.static int cou
13280 6e 74 57 72 69 74 65 43 75 72 73 6f 72 73 28 42  ntWriteCursors(B
13290 74 53 68 61 72 65 64 20 2a 70 42 74 29 7b 0a 20  tShared *pBt){. 
132a0 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 3b   BtCursor *pCur;
132b0 0a 20 20 69 6e 74 20 72 20 3d 20 30 3b 0a 20 20  .  int r = 0;.  
132c0 66 6f 72 28 70 43 75 72 3d 70 42 74 2d 3e 70 43  for(pCur=pBt->pC
132d0 75 72 73 6f 72 3b 20 70 43 75 72 3b 20 70 43 75  ursor; pCur; pCu
132e0 72 3d 70 43 75 72 2d 3e 70 4e 65 78 74 29 7b 0a  r=pCur->pNext){.
132f0 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 77 72      if( pCur->wr
13300 46 6c 61 67 20 26 26 20 70 43 75 72 2d 3e 65 53  Flag && pCur->eS
13310 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 46 41 55  tate!=CURSOR_FAU
13320 4c 54 20 29 20 72 2b 2b 3b 20 0a 20 20 7d 0a 20  LT ) r++; .  }. 
13330 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 23 65 6e   return r;.}.#en
13340 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  dif../*.** This 
13350 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
13360 20 73 74 61 74 65 20 74 6f 20 43 55 52 53 4f 52   state to CURSOR
13370 5f 46 41 55 4c 54 20 61 6e 64 20 74 68 65 20 65  _FAULT and the e
13380 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 74 6f 20  rror.** code to 
13390 65 72 72 43 6f 64 65 20 66 6f 72 20 65 76 65 72  errCode for ever
133a0 79 20 63 75 72 73 6f 72 20 6f 6e 20 42 74 53 68  y cursor on BtSh
133b0 61 72 65 64 20 74 68 61 74 20 70 42 74 72 65 65  ared that pBtree
133c0 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 2e 0a  .** references..
133d0 2a 2a 0a 2a 2a 20 45 76 65 72 79 20 63 75 72 73  **.** Every curs
133e0 6f 72 20 69 73 20 74 72 69 70 70 65 64 2c 20 69  or is tripped, i
133f0 6e 63 6c 75 64 69 6e 67 20 63 75 72 73 6f 72 73  ncluding cursors
13400 20 74 68 61 74 20 62 65 6c 6f 6e 67 0a 2a 2a 20   that belong.** 
13410 74 6f 20 6f 74 68 65 72 20 64 61 74 61 62 61 73  to other databas
13420 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68  e connections th
13430 61 74 20 68 61 70 70 65 6e 20 74 6f 20 62 65 20  at happen to be 
13440 73 68 61 72 69 6e 67 0a 2a 2a 20 74 68 65 20 63  sharing.** the c
13450 61 63 68 65 20 77 69 74 68 20 70 42 74 72 65 65  ache with pBtree
13460 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
13470 74 69 6e 65 20 67 65 74 73 20 63 61 6c 6c 65 64  tine gets called
13480 20 77 68 65 6e 20 61 20 72 6f 6c 6c 62 61 63 6b   when a rollback
13490 20 6f 63 63 75 72 73 2e 0a 2a 2a 20 41 6c 6c 20   occurs..** All 
134a0 63 75 72 73 6f 72 73 20 75 73 69 6e 67 20 74 68  cursors using th
134b0 65 20 73 61 6d 65 20 63 61 63 68 65 20 6d 75 73  e same cache mus
134c0 74 20 62 65 20 74 72 69 70 70 65 64 0a 2a 2a 20  t be tripped.** 
134d0 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 6d 20  to prevent them 
134e0 66 72 6f 6d 20 74 72 79 69 6e 67 20 74 6f 20 75  from trying to u
134f0 73 65 20 74 68 65 20 62 74 72 65 65 20 61 66 74  se the btree aft
13500 65 72 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61  er.** the rollba
13510 63 6b 2e 20 20 54 68 65 20 72 6f 6c 6c 62 61 63  ck.  The rollbac
13520 6b 20 6d 61 79 20 68 61 76 65 20 64 65 6c 65 74  k may have delet
13530 65 64 20 74 61 62 6c 65 73 0a 2a 2a 20 6f 72 20  ed tables.** or 
13540 6d 6f 76 65 64 20 72 6f 6f 74 20 70 61 67 65 73  moved root pages
13550 2c 20 73 6f 20 69 74 20 69 73 20 6e 6f 74 20 73  , so it is not s
13560 75 66 66 69 63 69 65 6e 74 20 74 6f 0a 2a 2a 20  ufficient to.** 
13570 73 61 76 65 20 74 68 65 20 73 74 61 74 65 20 6f  save the state o
13580 66 20 74 68 65 20 63 75 72 73 6f 72 2e 20 20 54  f the cursor.  T
13590 68 65 20 63 75 72 73 6f 72 20 6d 75 73 74 20 62  he cursor must b
135a0 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 61 74 65 64  e.** invalidated
135b0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
135c0 33 42 74 72 65 65 54 72 69 70 41 6c 6c 43 75 72  3BtreeTripAllCur
135d0 73 6f 72 73 28 42 74 72 65 65 20 2a 70 42 74 72  sors(Btree *pBtr
135e0 65 65 2c 20 69 6e 74 20 65 72 72 43 6f 64 65 29  ee, int errCode)
135f0 7b 0a 20 20 42 74 43 75 72 73 6f 72 20 2a 70 3b  {.  BtCursor *p;
13600 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
13610 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
13620 66 6f 72 28 70 3d 70 42 74 72 65 65 2d 3e 70 42  for(p=pBtree->pB
13630 74 2d 3e 70 43 75 72 73 6f 72 3b 20 70 3b 20 70  t->pCursor; p; p
13640 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
13650 63 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74  clearCursorPosit
13660 69 6f 6e 28 70 29 3b 0a 20 20 20 20 70 2d 3e 65  ion(p);.    p->e
13670 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 46  State = CURSOR_F
13680 41 55 4c 54 3b 0a 20 20 20 20 70 2d 3e 73 6b 69  AULT;.    p->ski
13690 70 20 3d 20 65 72 72 43 6f 64 65 3b 0a 20 20 7d  p = errCode;.  }
136a0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
136b0 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 7d 0a  eave(pBtree);.}.
136c0 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
136d0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
136e0 69 6e 20 70 72 6f 67 72 65 73 73 2e 20 20 41 6c  in progress.  Al
136f0 6c 20 63 75 72 73 6f 72 73 20 77 69 6c 6c 20 62  l cursors will b
13700 65 0a 2a 2a 20 69 6e 76 61 6c 69 64 65 64 20 62  e.** invalided b
13710 79 20 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  y this operation
13720 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
13730 6f 20 75 73 65 20 61 20 63 75 72 73 6f 72 0a 2a  o use a cursor.*
13740 2a 20 74 68 61 74 20 77 61 73 20 6f 70 65 6e 20  * that was open 
13750 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
13760 20 6f 66 20 74 68 69 73 20 6f 70 65 72 61 74 69   of this operati
13770 6f 6e 20 77 69 6c 6c 20 72 65 73 75 6c 74 0a 2a  on will result.*
13780 2a 20 69 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 2a  * in an error..*
13790 2a 0a 2a 2a 20 54 68 69 73 20 77 69 6c 6c 20 72  *.** This will r
137a0 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
137b0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
137c0 61 62 61 73 65 20 66 69 6c 65 2e 20 20 49 66 20  abase file.  If 
137d0 74 68 65 72 65 0a 2a 2a 20 61 72 65 20 6e 6f 20  there.** are no 
137e0 61 63 74 69 76 65 20 63 75 72 73 6f 72 73 2c 20  active cursors, 
137f0 69 74 20 61 6c 73 6f 20 72 65 6c 65 61 73 65 73  it also releases
13800 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a   the read lock..
13810 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
13820 72 65 65 52 6f 6c 6c 62 61 63 6b 28 42 74 72 65  reeRollback(Btre
13830 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b  e *p){.  int rc;
13840 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
13850 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d   = p->pBt;.  Mem
13860 50 61 67 65 20 2a 70 50 61 67 65 31 3b 0a 0a 20  Page *pPage1;.. 
13870 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
13880 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62  er(p);.  pBt->db
13890 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d   = p->db;.  rc =
138a0 20 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28   saveAllCursors(
138b0 70 42 74 2c 20 30 2c 20 30 29 3b 0a 23 69 66 6e  pBt, 0, 0);.#ifn
138c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
138d0 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20 69  SHARED_CACHE.  i
138e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
138f0 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20   ){.    /* This 
13900 69 73 20 61 20 68 6f 72 72 69 62 6c 65 20 73 69  is a horrible si
13910 74 75 61 74 69 6f 6e 2e 20 41 6e 20 49 4f 20 6f  tuation. An IO o
13920 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
13930 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74 0a   occured whilst.
13940 20 20 20 20 2a 2a 20 74 72 79 69 6e 67 20 74 6f      ** trying to
13950 20 73 61 76 65 20 63 75 72 73 6f 72 20 70 6f 73   save cursor pos
13960 69 74 69 6f 6e 73 2e 20 49 66 20 74 68 69 73 20  itions. If this 
13970 69 73 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  is an automatic 
13980 72 6f 6c 6c 62 61 63 6b 20 28 61 73 0a 20 20 20  rollback (as.   
13990 20 2a 2a 20 74 68 65 20 72 65 73 75 6c 74 20 6f   ** the result o
139a0 66 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 2c 20  f a constraint, 
139b0 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
139c0 20 6f 72 20 49 4f 20 65 72 72 6f 72 29 20 74 68   or IO error) th
139d0 65 6e 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 63  en .    ** the c
139e0 61 63 68 65 20 6d 61 79 20 62 65 20 69 6e 74 65  ache may be inte
139f0 72 6e 61 6c 6c 79 20 69 6e 63 6f 6e 73 69 73 74  rnally inconsist
13a00 65 6e 74 20 28 6e 6f 74 20 63 6f 6e 74 61 69 6e  ent (not contain
13a10 20 76 61 6c 69 64 20 74 72 65 65 73 29 20 73 6f   valid trees) so
13a20 0a 20 20 20 20 2a 2a 20 77 65 20 63 61 6e 6e 6f  .    ** we canno
13a30 74 20 73 69 6d 70 6c 79 20 72 65 74 75 72 6e 20  t simply return 
13a40 74 68 65 20 65 72 72 6f 72 20 74 6f 20 74 68 65  the error to the
13a50 20 63 61 6c 6c 65 72 2e 20 49 6e 73 74 65 61 64   caller. Instead
13a60 2c 20 61 62 6f 72 74 20 0a 20 20 20 20 2a 2a 20  , abort .    ** 
13a70 61 6c 6c 20 71 75 65 72 69 65 73 20 74 68 61 74  all queries that
13a80 20 6d 61 79 20 62 65 20 75 73 69 6e 67 20 61 6e   may be using an
13a90 79 20 6f 66 20 74 68 65 20 63 75 72 73 6f 72 73  y of the cursors
13aa0 20 74 68 61 74 20 66 61 69 6c 65 64 20 74 6f 20   that failed to 
13ab0 73 61 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  save..    */.   
13ac0 20 73 71 6c 69 74 65 33 42 74 72 65 65 54 72 69   sqlite3BtreeTri
13ad0 70 41 6c 6c 43 75 72 73 6f 72 73 28 70 2c 20 72  pAllCursors(p, r
13ae0 63 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  c);.  }.#endif. 
13af0 20 62 74 72 65 65 49 6e 74 65 67 72 69 74 79 28   btreeIntegrity(
13b00 70 29 3b 0a 20 20 75 6e 6c 6f 63 6b 41 6c 6c 54  p);.  unlockAllT
13b10 61 62 6c 65 73 28 70 29 3b 0a 0a 20 20 69 66 28  ables(p);..  if(
13b20 20 70 2d 3e 69 6e 54 72 61 6e 73 3d 3d 54 52 41   p->inTrans==TRA
13b30 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20  NS_WRITE ){.    
13b40 69 6e 74 20 72 63 32 3b 0a 0a 23 69 66 6e 64 65  int rc2;..#ifnde
13b50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
13b60 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 70 42 74  TOVACUUM.    pBt
13b70 2d 3e 6e 54 72 75 6e 63 20 3d 20 30 3b 0a 23 65  ->nTrunc = 0;.#e
13b80 6e 64 69 66 0a 0a 20 20 20 20 61 73 73 65 72 74  ndif..    assert
13b90 28 20 54 52 41 4e 53 5f 57 52 49 54 45 3d 3d 70  ( TRANS_WRITE==p
13ba0 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f  Bt->inTransactio
13bb0 6e 20 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 73  n );.    rc2 = s
13bc0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
13bd0 61 63 6b 28 70 42 74 2d 3e 70 50 61 67 65 72 29  ack(pBt->pPager)
13be0 3b 0a 20 20 20 20 69 66 28 20 72 63 32 21 3d 53  ;.    if( rc2!=S
13bf0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
13c00 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20    rc = rc2;.    
13c10 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f  }..    /* The ro
13c20 6c 6c 62 61 63 6b 20 6d 61 79 20 68 61 76 65 20  llback may have 
13c30 64 65 73 74 72 6f 79 65 64 20 74 68 65 20 70 50  destroyed the pP
13c40 61 67 65 31 2d 3e 61 44 61 74 61 20 76 61 6c 75  age1->aData valu
13c50 65 2e 20 20 53 6f 0a 20 20 20 20 2a 2a 20 63 61  e.  So.    ** ca
13c60 6c 6c 20 73 71 6c 69 74 65 33 42 74 72 65 65 47  ll sqlite3BtreeG
13c70 65 74 50 61 67 65 28 29 20 6f 6e 20 70 61 67 65  etPage() on page
13c80 20 31 20 61 67 61 69 6e 20 74 6f 20 6d 61 6b 65   1 again to make
13c90 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 70 50 61  .    ** sure pPa
13ca0 67 65 31 2d 3e 61 44 61 74 61 20 69 73 20 73 65  ge1->aData is se
13cb0 74 20 63 6f 72 72 65 63 74 6c 79 2e 20 2a 2f 0a  t correctly. */.
13cc0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
13cd0 74 72 65 65 47 65 74 50 61 67 65 28 70 42 74 2c  treeGetPage(pBt,
13ce0 20 31 2c 20 26 70 50 61 67 65 31 2c 20 30 29 3d   1, &pPage1, 0)=
13cf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13d00 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
13d10 70 50 61 67 65 31 29 3b 0a 20 20 20 20 7d 0a 20  pPage1);.    }. 
13d20 20 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74     assert( count
13d30 57 72 69 74 65 43 75 72 73 6f 72 73 28 70 42 74  WriteCursors(pBt
13d40 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 42 74 2d  )==0 );.    pBt-
13d50 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 3d  >inTransaction =
13d60 20 54 52 41 4e 53 5f 52 45 41 44 3b 0a 20 20 7d   TRANS_READ;.  }
13d70 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61  ..  if( p->inTra
13d80 6e 73 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 20 29  ns!=TRANS_NONE )
13d90 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 42  {.    assert( pB
13da0 74 2d 3e 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3e  t->nTransaction>
13db0 30 20 29 3b 0a 20 20 20 20 70 42 74 2d 3e 6e 54  0 );.    pBt->nT
13dc0 72 61 6e 73 61 63 74 69 6f 6e 2d 2d 3b 0a 20 20  ransaction--;.  
13dd0 20 20 69 66 28 20 30 3d 3d 70 42 74 2d 3e 6e 54    if( 0==pBt->nT
13de0 72 61 6e 73 61 63 74 69 6f 6e 20 29 7b 0a 20 20  ransaction ){.  
13df0 20 20 20 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73      pBt->inTrans
13e00 61 63 74 69 6f 6e 20 3d 20 54 52 41 4e 53 5f 4e  action = TRANS_N
13e10 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ONE;.    }.  }..
13e20 20 20 70 2d 3e 69 6e 54 72 61 6e 73 20 3d 20 54    p->inTrans = T
13e30 52 41 4e 53 5f 4e 4f 4e 45 3b 0a 20 20 70 42 74  RANS_NONE;.  pBt
13e40 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
13e50 75 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75  unlockBtreeIfUnu
13e60 73 65 64 28 70 42 74 29 3b 0a 0a 20 20 62 74 72  sed(pBt);..  btr
13e70 65 65 49 6e 74 65 67 72 69 74 79 28 70 29 3b 0a  eeIntegrity(p);.
13e80 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
13e90 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e  ave(p);.  return
13ea0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 74   rc;.}../*.** St
13eb0 61 72 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  art a statement 
13ec0 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  subtransaction. 
13ed0 20 54 68 65 20 73 75 62 74 72 61 6e 73 61 63 74   The subtransact
13ee0 69 6f 6e 20 63 61 6e 0a 2a 2a 20 63 61 6e 20 62  ion can.** can b
13ef0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e  e rolled back in
13f00 64 65 70 65 6e 64 65 6e 74 6c 79 20 6f 66 20 74  dependently of t
13f10 68 65 20 6d 61 69 6e 20 74 72 61 6e 73 61 63 74  he main transact
13f20 69 6f 6e 2e 0a 2a 2a 20 59 6f 75 20 6d 75 73 74  ion..** You must
13f30 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
13f40 74 69 6f 6e 20 62 65 66 6f 72 65 20 73 74 61 72  tion before star
13f50 74 69 6e 67 20 61 20 73 75 62 74 72 61 6e 73 61  ting a subtransa
13f60 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 73 75  ction..** The su
13f70 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20  btransaction is 
13f80 65 6e 64 65 64 20 61 75 74 6f 6d 61 74 69 63 61  ended automatica
13f90 6c 6c 79 20 69 66 20 74 68 65 20 6d 61 69 6e 20  lly if the main 
13fa0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 63  transaction.** c
13fb0 6f 6d 6d 69 74 73 20 6f 72 20 72 6f 6c 6c 73 20  ommits or rolls 
13fc0 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 6c 79  back..**.** Only
13fd0 20 6f 6e 65 20 73 75 62 74 72 61 6e 73 61 63 74   one subtransact
13fe0 69 6f 6e 20 6d 61 79 20 62 65 20 61 63 74 69 76  ion may be activ
13ff0 65 20 61 74 20 61 20 74 69 6d 65 2e 20 20 49 74  e at a time.  It
14000 20 69 73 20 61 6e 20 65 72 72 6f 72 20 74 6f 20   is an error to 
14010 74 72 79 0a 2a 2a 20 74 6f 20 73 74 61 72 74 20  try.** to start 
14020 61 20 6e 65 77 20 73 75 62 74 72 61 6e 73 61 63  a new subtransac
14030 74 69 6f 6e 20 69 66 20 61 6e 6f 74 68 65 72 20  tion if another 
14040 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  subtransaction i
14050 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65  s already active
14060 2e 0a 2a 2a 0a 2a 2a 20 53 74 61 74 65 6d 65 6e  ..**.** Statemen
14070 74 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e  t subtransaction
14080 73 20 61 72 65 20 75 73 65 64 20 61 72 6f 75 6e  s are used aroun
14090 64 20 69 6e 64 69 76 69 64 75 61 6c 20 53 51 4c  d individual SQL
140a0 20 73 74 61 74 65 6d 65 6e 74 73 0a 2a 2a 20 74   statements.** t
140b0 68 61 74 20 61 72 65 20 63 6f 6e 74 61 69 6e 65  hat are containe
140c0 64 20 77 69 74 68 69 6e 20 61 20 42 45 47 49 4e  d within a BEGIN
140d0 2e 2e 2e 43 4f 4d 4d 49 54 20 62 6c 6f 63 6b 2e  ...COMMIT block.
140e0 20 20 49 66 20 61 20 63 6f 6e 73 74 72 61 69 6e    If a constrain
140f0 74 0a 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72  t.** error occur
14100 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 74 61  s within the sta
14110 74 65 6d 65 6e 74 2c 20 74 68 65 20 65 66 66 65  tement, the effe
14120 63 74 20 6f 66 20 74 68 61 74 20 6f 6e 65 20 73  ct of that one s
14130 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 63 61 6e 20  tatement.** can 
14140 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 77  be rolled back w
14150 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
14160 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65 20 65 6e   rollback the en
14170 74 69 72 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tire transaction
14180 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
14190 42 74 72 65 65 42 65 67 69 6e 53 74 6d 74 28 42  BtreeBeginStmt(B
141a0 74 72 65 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tree *p){.  int 
141b0 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64 20 2a  rc;.  BtShared *
141c0 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20  pBt = p->pBt;.  
141d0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
141e0 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20  r(p);.  pBt->db 
141f0 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66 28 20 28  = p->db;.  if( (
14200 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52 41 4e  p->inTrans!=TRAN
14210 53 5f 57 52 49 54 45 29 20 7c 7c 20 70 42 74 2d  S_WRITE) || pBt-
14220 3e 69 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 72  >inStmt ){.    r
14230 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  c = pBt->readOnl
14240 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  y ? SQLITE_READO
14250 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52  NLY : SQLITE_ERR
14260 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OR;.  }else{.   
14270 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e 69 6e   assert( pBt->in
14280 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52 41  Transaction==TRA
14290 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 20 20  NS_WRITE );.    
142a0 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e  rc = pBt->readOn
142b0 6c 79 20 3f 20 53 51 4c 49 54 45 5f 4f 4b 20 3a  ly ? SQLITE_OK :
142c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
142d0 74 42 65 67 69 6e 28 70 42 74 2d 3e 70 50 61 67  tBegin(pBt->pPag
142e0 65 72 29 3b 0a 20 20 20 20 70 42 74 2d 3e 69 6e  er);.    pBt->in
142f0 53 74 6d 74 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  Stmt = 1;.  }.  
14300 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
14310 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(p);.  return r
14320 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  c;.}.../*.** Com
14330 6d 69 74 20 74 68 65 20 73 74 61 74 6d 65 6e 74  mit the statment
14340 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
14350 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 70 72 6f  currently in pro
14360 67 72 65 73 73 2e 20 20 49 66 20 6e 6f 0a 2a 2a  gress.  If no.**
14370 20 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20   subtransaction 
14380 69 73 20 61 63 74 69 76 65 2c 20 74 68 69 73 20  is active, this 
14390 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69  is a no-op..*/.i
143a0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
143b0 6f 6d 6d 69 74 53 74 6d 74 28 42 74 72 65 65 20  ommitStmt(Btree 
143c0 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
143d0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
143e0 20 70 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74   p->pBt;.  sqlit
143f0 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29 3b  e3BtreeEnter(p);
14400 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e  .  pBt->db = p->
14410 64 62 3b 0a 20 20 69 66 28 20 70 42 74 2d 3e 69  db;.  if( pBt->i
14420 6e 53 74 6d 74 20 26 26 20 21 70 42 74 2d 3e 72  nStmt && !pBt->r
14430 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72  eadOnly ){.    r
14440 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
14450 53 74 6d 74 43 6f 6d 6d 69 74 28 70 42 74 2d 3e  StmtCommit(pBt->
14460 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65  pPager);.  }else
14470 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
14480 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 42 74 2d  E_OK;.  }.  pBt-
14490 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 73  >inStmt = 0;.  s
144a0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
144b0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
144c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
144d0 61 63 6b 20 74 68 65 20 61 63 74 69 76 65 20 73  ack the active s
144e0 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
144f0 73 61 63 74 69 6f 6e 2e 20 20 49 66 20 6e 6f 20  saction.  If no 
14500 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a  subtransaction.*
14510 2a 20 69 73 20 61 63 74 69 76 65 20 74 68 69 73  * is active this
14520 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
14530 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 63  -op..**.** All c
14540 75 72 73 6f 72 73 20 77 69 6c 6c 20 62 65 20 69  ursors will be i
14550 6e 76 61 6c 69 64 61 74 65 64 20 62 79 20 74 68  nvalidated by th
14560 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 41  is operation.  A
14570 6e 79 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f  ny attempt.** to
14580 20 75 73 65 20 61 20 63 75 72 73 6f 72 20 74 68   use a cursor th
14590 61 74 20 77 61 73 20 6f 70 65 6e 20 61 74 20 74  at was open at t
145a0 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
145b0 74 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 0a 2a  this operation.*
145c0 2a 20 77 69 6c 6c 20 72 65 73 75 6c 74 20 69 6e  * will result in
145d0 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e   an error..*/.in
145e0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f  t sqlite3BtreeRo
145f0 6c 6c 62 61 63 6b 53 74 6d 74 28 42 74 72 65 65  llbackStmt(Btree
14600 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d   *p){.  int rc =
14610 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 42 74   SQLITE_OK;.  Bt
14620 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d  Shared *pBt = p-
14630 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42  >pBt;.  sqlite3B
14640 74 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20  treeEnter(p);.  
14650 70 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b  pBt->db = p->db;
14660 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 53 74  .  if( pBt->inSt
14670 6d 74 20 26 26 20 21 70 42 74 2d 3e 72 65 61 64  mt && !pBt->read
14680 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 63 20 3d  Only ){.    rc =
14690 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
146a0 74 52 6f 6c 6c 62 61 63 6b 28 70 42 74 2d 3e 70  tRollback(pBt->p
146b0 50 61 67 65 72 29 3b 0a 20 20 20 20 70 42 74 2d  Pager);.    pBt-
146c0 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d  >inStmt = 0;.  }
146d0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
146e0 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74 75 72  eave(p);.  retur
146f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
14700 72 65 61 74 65 20 61 20 6e 65 77 20 63 75 72 73  reate a new curs
14710 6f 72 20 66 6f 72 20 74 68 65 20 42 54 72 65 65  or for the BTree
14720 20 77 68 6f 73 65 20 72 6f 6f 74 20 69 73 20 6f   whose root is o
14730 6e 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 69 54  n the page.** iT
14740 61 62 6c 65 2e 20 20 54 68 65 20 61 63 74 20 6f  able.  The act o
14750 66 20 61 63 71 75 69 72 69 6e 67 20 61 20 63 75  f acquiring a cu
14760 72 73 6f 72 20 67 65 74 73 20 61 20 72 65 61 64  rsor gets a read
14770 20 6c 6f 63 6b 20 6f 6e 20 0a 2a 2a 20 74 68 65   lock on .** the
14780 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
14790 2a 2a 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d  **.** If wrFlag=
147a0 3d 30 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72  =0, then the cur
147b0 73 6f 72 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20  sor can only be 
147c0 75 73 65 64 20 66 6f 72 20 72 65 61 64 69 6e 67  used for reading
147d0 2e 0a 2a 2a 20 49 66 20 77 72 46 6c 61 67 3d 3d  ..** If wrFlag==
147e0 31 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  1, then the curs
147f0 6f 72 20 63 61 6e 20 62 65 20 75 73 65 64 20 66  or can be used f
14800 6f 72 20 72 65 61 64 69 6e 67 20 6f 72 20 66 6f  or reading or fo
14810 72 0a 2a 2a 20 77 72 69 74 69 6e 67 20 69 66 20  r.** writing if 
14820 6f 74 68 65 72 20 63 6f 6e 64 69 74 69 6f 6e 73  other conditions
14830 20 66 6f 72 20 77 72 69 74 69 6e 67 20 61 72 65   for writing are
14840 20 61 6c 73 6f 20 6d 65 74 2e 20 20 54 68 65 73   also met.  Thes
14850 65 0a 2a 2a 20 61 72 65 20 74 68 65 20 63 6f 6e  e.** are the con
14860 64 69 74 69 6f 6e 73 20 74 68 61 74 20 6d 75 73  ditions that mus
14870 74 20 62 65 20 6d 65 74 20 69 6e 20 6f 72 64 65  t be met in orde
14880 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f  r for writing to
14890 0a 2a 2a 20 62 65 20 61 6c 6c 6f 77 65 64 3a 0a  .** be allowed:.
148a0 2a 2a 0a 2a 2a 20 31 3a 20 20 54 68 65 20 63 75  **.** 1:  The cu
148b0 72 73 6f 72 20 6d 75 73 74 20 68 61 76 65 20 62  rsor must have b
148c0 65 65 6e 20 6f 70 65 6e 65 64 20 77 69 74 68 20  een opened with 
148d0 77 72 46 6c 61 67 3d 3d 31 0a 2a 2a 0a 2a 2a 20  wrFlag==1.**.** 
148e0 32 3a 20 20 4f 74 68 65 72 20 64 61 74 61 62 61  2:  Other databa
148f0 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74  se connections t
14900 68 61 74 20 73 68 61 72 65 20 74 68 65 20 73 61  hat share the sa
14910 6d 65 20 70 61 67 65 72 20 63 61 63 68 65 0a 2a  me pager cache.*
14920 2a 20 20 20 20 20 62 75 74 20 77 68 69 63 68 20  *     but which 
14930 61 72 65 20 6e 6f 74 20 69 6e 20 74 68 65 20 52  are not in the R
14940 45 41 44 5f 55 4e 43 4f 4d 4d 49 54 54 45 44 20  EAD_UNCOMMITTED 
14950 73 74 61 74 65 20 6d 61 79 20 6e 6f 74 20 68 61  state may not ha
14960 76 65 0a 2a 2a 20 20 20 20 20 63 75 72 73 6f 72  ve.**     cursor
14970 73 20 6f 70 65 6e 20 77 69 74 68 20 77 72 46 6c  s open with wrFl
14980 61 67 3d 3d 30 20 6f 6e 20 74 68 65 20 73 61 6d  ag==0 on the sam
14990 65 20 74 61 62 6c 65 2e 20 20 4f 74 68 65 72 77  e table.  Otherw
149a0 69 73 65 0a 2a 2a 20 20 20 20 20 74 68 65 20 63  ise.**     the c
149b0 68 61 6e 67 65 73 20 6d 61 64 65 20 62 79 20 74  hanges made by t
149c0 68 69 73 20 77 72 69 74 65 20 63 75 72 73 6f 72  his write cursor
149d0 20 77 6f 75 6c 64 20 62 65 20 76 69 73 69 62 6c   would be visibl
149e0 65 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20  e to.**     the 
149f0 72 65 61 64 20 63 75 72 73 6f 72 73 20 69 6e 20  read cursors in 
14a00 74 68 65 20 6f 74 68 65 72 20 64 61 74 61 62 61  the other databa
14a10 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
14a20 2a 0a 2a 2a 20 33 3a 20 20 54 68 65 20 64 61 74  *.** 3:  The dat
14a30 61 62 61 73 65 20 6d 75 73 74 20 62 65 20 77 72  abase must be wr
14a40 69 74 61 62 6c 65 20 28 6e 6f 74 20 6f 6e 20 72  itable (not on r
14a50 65 61 64 2d 6f 6e 6c 79 20 6d 65 64 69 61 29 0a  ead-only media).
14a60 2a 2a 0a 2a 2a 20 34 3a 20 20 54 68 65 72 65 20  **.** 4:  There 
14a70 6d 75 73 74 20 62 65 20 61 6e 20 61 63 74 69 76  must be an activ
14a80 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  e transaction..*
14a90 2a 0a 2a 2a 20 4e 6f 20 63 68 65 63 6b 69 6e 67  *.** No checking
14aa0 20 69 73 20 64 6f 6e 65 20 74 6f 20 6d 61 6b 65   is done to make
14ab0 20 73 75 72 65 20 74 68 61 74 20 70 61 67 65 20   sure that page 
14ac0 69 54 61 62 6c 65 20 72 65 61 6c 6c 79 20 69 73  iTable really is
14ad0 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 70 61 67   the.** root pag
14ae0 65 20 6f 66 20 61 20 62 2d 74 72 65 65 2e 20 20  e of a b-tree.  
14af0 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68  If it is not, th
14b00 65 6e 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  en the cursor ac
14b10 71 75 69 72 65 64 0a 2a 2a 20 77 69 6c 6c 20 6e  quired.** will n
14b20 6f 74 20 77 6f 72 6b 20 63 6f 72 72 65 63 74 6c  ot work correctl
14b30 79 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73 20 61  y..**.** It is a
14b40 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20  ssumed that the 
14b50 73 71 6c 69 74 65 33 42 74 72 65 65 43 75 72 73  sqlite3BtreeCurs
14b60 6f 72 53 69 7a 65 28 29 20 62 79 74 65 73 20 6f  orSize() bytes o
14b70 66 20 6d 65 6d 6f 72 79 20 0a 2a 2a 20 70 6f 69  f memory .** poi
14b80 6e 74 65 64 20 74 6f 20 62 79 20 70 43 75 72 20  nted to by pCur 
14b90 68 61 76 65 20 62 65 65 6e 20 7a 65 72 6f 65 64  have been zeroed
14ba0 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   by the caller..
14bb0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 74  */.static int bt
14bc0 72 65 65 43 75 72 73 6f 72 28 0a 20 20 42 74 72  reeCursor(.  Btr
14bd0 65 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ee *p,          
14be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bf0 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
14c00 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
14c10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
14c20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
14c30 52 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 61 62  Root page of tab
14c40 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
14c50 69 6e 74 20 77 72 46 6c 61 67 2c 20 20 20 20 20  int wrFlag,     
14c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c70 20 20 20 20 20 20 20 2f 2a 20 31 20 74 6f 20 77         /* 1 to w
14c80 72 69 74 65 2e 20 30 20 72 65 61 64 2d 6f 6e 6c  rite. 0 read-onl
14c90 79 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 4b 65  y */.  struct Ke
14ca0 79 49 6e 66 6f 20 2a 70 4b 65 79 49 6e 66 6f 2c  yInfo *pKeyInfo,
14cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14cc0 20 46 69 72 73 74 20 61 72 67 20 74 6f 20 63 6f   First arg to co
14cd0 6d 70 61 72 69 73 6f 6e 20 66 75 6e 63 74 69 6f  mparison functio
14ce0 6e 20 2a 2f 0a 20 20 42 74 43 75 72 73 6f 72 20  n */.  BtCursor 
14cf0 2a 70 43 75 72 20 20 20 20 20 20 20 20 20 20 20  *pCur           
14d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14d10 20 53 70 61 63 65 20 66 6f 72 20 6e 65 77 20 63   Space for new c
14d20 75 72 73 6f 72 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ursor */.){.  in
14d30 74 20 72 63 3b 0a 20 20 42 74 53 68 61 72 65 64  t rc;.  BtShared
14d40 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b 0a   *pBt = p->pBt;.
14d50 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
14d60 65 33 42 74 72 65 65 48 6f 6c 64 73 4d 75 74 65  e3BtreeHoldsMute
14d70 78 28 70 29 20 29 3b 0a 20 20 69 66 28 20 77 72  x(p) );.  if( wr
14d80 46 6c 61 67 20 29 7b 0a 20 20 20 20 69 66 28 20  Flag ){.    if( 
14d90 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  pBt->readOnly ){
14da0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
14db0 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  LITE_READONLY;. 
14dc0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 68 65     }.    if( che
14dd0 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70 2c 20 69  ckReadLocks(p, i
14de0 54 61 62 6c 65 2c 20 30 2c 20 30 29 20 29 7b 0a  Table, 0, 0) ){.
14df0 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
14e00 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20 20  ITE_LOCKED;.    
14e10 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 42 74  }.  }..  if( pBt
14e20 2d 3e 70 50 61 67 65 31 3d 3d 30 20 29 7b 0a 20  ->pPage1==0 ){. 
14e30 20 20 20 72 63 20 3d 20 6c 6f 63 6b 42 74 72 65     rc = lockBtre
14e40 65 57 69 74 68 52 65 74 72 79 28 70 29 3b 0a 20  eWithRetry(p);. 
14e50 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
14e60 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
14e70 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
14e80 20 20 20 69 66 28 20 70 42 74 2d 3e 72 65 61 64     if( pBt->read
14e90 4f 6e 6c 79 20 26 26 20 77 72 46 6c 61 67 20 29  Only && wrFlag )
14ea0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
14eb0 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3b 0a  QLITE_READONLY;.
14ec0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 43 75 72      }.  }.  pCur
14ed0 2d 3e 70 67 6e 6f 52 6f 6f 74 20 3d 20 28 50 67  ->pgnoRoot = (Pg
14ee0 6e 6f 29 69 54 61 62 6c 65 3b 0a 20 20 69 66 28  no)iTable;.  if(
14ef0 20 69 54 61 62 6c 65 3d 3d 31 20 26 26 20 70 61   iTable==1 && pa
14f00 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42 74  gerPagecount(pBt
14f10 2d 3e 70 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a  ->pPager)==0 ){.
14f20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14f30 45 4d 50 54 59 3b 0a 20 20 20 20 67 6f 74 6f 20  EMPTY;.    goto 
14f40 63 72 65 61 74 65 5f 63 75 72 73 6f 72 5f 65 78  create_cursor_ex
14f50 63 65 70 74 69 6f 6e 3b 0a 20 20 7d 0a 20 20 72  ception;.  }.  r
14f60 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61  c = getAndInitPa
14f70 67 65 28 70 42 74 2c 20 70 43 75 72 2d 3e 70 67  ge(pBt, pCur->pg
14f80 6e 6f 52 6f 6f 74 2c 20 26 70 43 75 72 2d 3e 61  noRoot, &pCur->a
14f90 70 50 61 67 65 5b 30 5d 29 3b 0a 20 20 69 66 28  pPage[0]);.  if(
14fa0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14fb0 7b 0a 20 20 20 20 67 6f 74 6f 20 63 72 65 61 74  {.    goto creat
14fc0 65 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69  e_cursor_excepti
14fd0 6f 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  on;.  }..  /* No
14fe0 77 20 74 68 61 74 20 6e 6f 20 6f 74 68 65 72 20  w that no other 
14ff0 65 72 72 6f 72 73 20 63 61 6e 20 6f 63 63 75 72  errors can occur
15000 2c 20 66 69 6e 69 73 68 20 66 69 6c 6c 69 6e 67  , finish filling
15010 20 69 6e 20 74 68 65 20 42 74 43 75 72 73 6f 72   in the BtCursor
15020 0a 20 20 2a 2a 20 76 61 72 69 61 62 6c 65 73 2c  .  ** variables,
15030 20 6c 69 6e 6b 20 74 68 65 20 63 75 72 73 6f 72   link the cursor
15040 20 69 6e 74 6f 20 74 68 65 20 42 74 53 68 61 72   into the BtShar
15050 65 64 20 6c 69 73 74 20 61 6e 64 20 73 65 74 20  ed list and set 
15060 2a 70 70 43 75 72 20 28 74 68 65 0a 20 20 2a 2a  *ppCur (the.  **
15070 20 6f 75 74 70 75 74 20 61 72 67 75 6d 65 6e 74   output argument
15080 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
15090 6e 29 2e 0a 20 20 2a 2f 0a 20 20 70 43 75 72 2d  n)..  */.  pCur-
150a0 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 70 4b 65 79  >pKeyInfo = pKey
150b0 49 6e 66 6f 3b 0a 20 20 70 43 75 72 2d 3e 70 42  Info;.  pCur->pB
150c0 74 72 65 65 20 3d 20 70 3b 0a 20 20 70 43 75 72  tree = p;.  pCur
150d0 2d 3e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 70  ->pBt = pBt;.  p
150e0 43 75 72 2d 3e 77 72 46 6c 61 67 20 3d 20 77 72  Cur->wrFlag = wr
150f0 46 6c 61 67 3b 0a 20 20 70 43 75 72 2d 3e 70 4e  Flag;.  pCur->pN
15100 65 78 74 20 3d 20 70 42 74 2d 3e 70 43 75 72 73  ext = pBt->pCurs
15110 6f 72 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e  or;.  if( pCur->
15120 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 70 43 75  pNext ){.    pCu
15130 72 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20  r->pNext->pPrev 
15140 3d 20 70 43 75 72 3b 0a 20 20 7d 0a 20 20 70 42  = pCur;.  }.  pB
15150 74 2d 3e 70 43 75 72 73 6f 72 20 3d 20 70 43 75  t->pCursor = pCu
15160 72 3b 0a 20 20 70 43 75 72 2d 3e 65 53 74 61 74  r;.  pCur->eStat
15170 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  e = CURSOR_INVAL
15180 49 44 3b 0a 0a 20 20 72 65 74 75 72 6e 20 53 51  ID;..  return SQ
15190 4c 49 54 45 5f 4f 4b 3b 0a 0a 63 72 65 61 74 65  LITE_OK;..create
151a0 5f 63 75 72 73 6f 72 5f 65 78 63 65 70 74 69 6f  _cursor_exceptio
151b0 6e 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  n:.  releasePage
151c0 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d  (pCur->apPage[0]
151d0 29 3b 0a 20 20 75 6e 6c 6f 63 6b 42 74 72 65 65  );.  unlockBtree
151e0 49 66 55 6e 75 73 65 64 28 70 42 74 29 3b 0a 20  IfUnused(pBt);. 
151f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e   return rc;.}.in
15200 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
15210 72 73 6f 72 28 0a 20 20 42 74 72 65 65 20 2a 70  rsor(.  Btree *p
15220 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15240 20 20 20 20 2f 2a 20 54 68 65 20 62 74 72 65 65      /* The btree
15250 20 2a 2f 0a 20 20 69 6e 74 20 69 54 61 62 6c 65   */.  int iTable
15260 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
15270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15280 20 20 2f 2a 20 52 6f 6f 74 20 70 61 67 65 20 6f    /* Root page o
15290 66 20 74 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  f table to open 
152a0 2a 2f 0a 20 20 69 6e 74 20 77 72 46 6c 61 67 2c  */.  int wrFlag,
152b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152d0 20 2f 2a 20 31 20 74 6f 20 77 72 69 74 65 2e 20   /* 1 to write. 
152e0 30 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 20  0 read-only */. 
152f0 20 73 74 72 75 63 74 20 4b 65 79 49 6e 66 6f 20   struct KeyInfo 
15300 2a 70 4b 65 79 49 6e 66 6f 2c 20 20 20 20 20 20  *pKeyInfo,      
15310 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15320 46 69 72 73 74 20 61 72 67 20 74 6f 20 78 43 6f  First arg to xCo
15330 6d 70 61 72 65 28 29 20 2a 2f 0a 20 20 42 74 43  mpare() */.  BtC
15340 75 72 73 6f 72 20 2a 70 43 75 72 20 20 20 20 20  ursor *pCur     
15350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15360 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
15370 65 20 6e 65 77 20 63 75 72 73 6f 72 20 68 65 72  e new cursor her
15380 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
15390 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
153a0 45 6e 74 65 72 28 70 29 3b 0a 20 20 70 2d 3e 70  Enter(p);.  p->p
153b0 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
153c0 20 20 72 63 20 3d 20 62 74 72 65 65 43 75 72 73    rc = btreeCurs
153d0 6f 72 28 70 2c 20 69 54 61 62 6c 65 2c 20 77 72  or(p, iTable, wr
153e0 46 6c 61 67 2c 20 70 4b 65 79 49 6e 66 6f 2c 20  Flag, pKeyInfo, 
153f0 70 43 75 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  pCur);.  sqlite3
15400 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
15410 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e   return rc;.}.in
15420 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 75  t sqlite3BtreeCu
15430 72 73 6f 72 53 69 7a 65 28 29 7b 0a 20 20 72 65  rsorSize(){.  re
15440 74 75 72 6e 20 73 69 7a 65 6f 66 28 42 74 43 75  turn sizeof(BtCu
15450 72 73 6f 72 29 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a  rsor);.}..../*.*
15460 2a 20 43 6c 6f 73 65 20 61 20 63 75 72 73 6f 72  * Close a cursor
15470 2e 20 20 54 68 65 20 72 65 61 64 20 6c 6f 63 6b  .  The read lock
15480 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
15490 20 66 69 6c 65 20 69 73 20 72 65 6c 65 61 73 65   file is release
154a0 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 6c 61  d.** when the la
154b0 73 74 20 63 75 72 73 6f 72 20 69 73 20 63 6c 6f  st cursor is clo
154c0 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sed..*/.int sqli
154d0 74 65 33 42 74 72 65 65 43 6c 6f 73 65 43 75 72  te3BtreeCloseCur
154e0 73 6f 72 28 42 74 43 75 72 73 6f 72 20 2a 70 43  sor(BtCursor *pC
154f0 75 72 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  ur){.  Btree *pB
15500 74 72 65 65 20 3d 20 70 43 75 72 2d 3e 70 42 74  tree = pCur->pBt
15510 72 65 65 3b 0a 20 20 69 66 28 20 70 42 74 72 65  ree;.  if( pBtre
15520 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  e ){.    int i;.
15530 20 20 20 20 42 74 53 68 61 72 65 64 20 2a 70 42      BtShared *pB
15540 74 20 3d 20 70 43 75 72 2d 3e 70 42 74 3b 0a 20  t = pCur->pBt;. 
15550 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
15560 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20  nter(pBtree);.  
15570 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 42 74 72    pBt->db = pBtr
15580 65 65 2d 3e 64 62 3b 0a 20 20 20 20 63 6c 65 61  ee->db;.    clea
15590 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28  rCursorPosition(
155a0 70 43 75 72 29 3b 0a 20 20 20 20 69 66 28 20 70  pCur);.    if( p
155b0 43 75 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  Cur->pPrev ){.  
155c0 20 20 20 20 70 43 75 72 2d 3e 70 50 72 65 76 2d      pCur->pPrev-
155d0 3e 70 4e 65 78 74 20 3d 20 70 43 75 72 2d 3e 70  >pNext = pCur->p
155e0 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Next;.    }else{
155f0 0a 20 20 20 20 20 20 70 42 74 2d 3e 70 43 75 72  .      pBt->pCur
15600 73 6f 72 20 3d 20 70 43 75 72 2d 3e 70 4e 65 78  sor = pCur->pNex
15610 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
15620 20 70 43 75 72 2d 3e 70 4e 65 78 74 20 29 7b 0a   pCur->pNext ){.
15630 20 20 20 20 20 20 70 43 75 72 2d 3e 70 4e 65 78        pCur->pNex
15640 74 2d 3e 70 50 72 65 76 20 3d 20 70 43 75 72 2d  t->pPrev = pCur-
15650 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20  >pPrev;.    }.  
15660 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43    for(i=0; i<=pC
15670 75 72 2d 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b  ur->iPage; i++){
15680 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61  .      releasePa
15690 67 65 28 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  ge(pCur->apPage[
156a0 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 75  i]);.    }.    u
156b0 6e 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73  nlockBtreeIfUnus
156c0 65 64 28 70 42 74 29 3b 0a 20 20 20 20 69 6e 76  ed(pBt);.    inv
156d0 61 6c 69 64 61 74 65 4f 76 65 72 66 6c 6f 77 43  alidateOverflowC
156e0 61 63 68 65 28 70 43 75 72 29 3b 0a 20 20 20 20  ache(pCur);.    
156f0 2f 2a 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  /* sqlite3_free(
15700 70 43 75 72 29 3b 20 2a 2f 0a 20 20 20 20 73 71  pCur); */.    sq
15710 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
15720 70 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 72  pBtree);.  }.  r
15730 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15740 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  .}../*.** Make a
15750 20 74 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f   temporary curso
15760 72 20 62 79 20 66 69 6c 6c 69 6e 67 20 69 6e 20  r by filling in 
15770 74 68 65 20 66 69 65 6c 64 73 20 6f 66 20 70 54  the fields of pT
15780 65 6d 70 43 75 72 2e 0a 2a 2a 20 54 68 65 20 74  empCur..** The t
15790 65 6d 70 6f 72 61 72 79 20 63 75 72 73 6f 72 20  emporary cursor 
157a0 69 73 20 6e 6f 74 20 6f 6e 20 74 68 65 20 63 75  is not on the cu
157b0 72 73 6f 72 20 6c 69 73 74 20 66 6f 72 20 74 68  rsor list for th
157c0 65 20 42 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64  e Btree..*/.void
157d0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
157e0 54 65 6d 70 43 75 72 73 6f 72 28 42 74 43 75 72  TempCursor(BtCur
157f0 73 6f 72 20 2a 70 43 75 72 2c 20 42 74 43 75 72  sor *pCur, BtCur
15800 73 6f 72 20 2a 70 54 65 6d 70 43 75 72 29 7b 0a  sor *pTempCur){.
15810 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
15820 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
15830 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 6d  tex(pCur) );.  m
15840 65 6d 63 70 79 28 70 54 65 6d 70 43 75 72 2c 20  emcpy(pTempCur, 
15850 70 43 75 72 2c 20 73 69 7a 65 6f 66 28 42 74 43  pCur, sizeof(BtC
15860 75 72 73 6f 72 29 29 3b 0a 20 20 70 54 65 6d 70  ursor));.  pTemp
15870 43 75 72 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  Cur->pNext = 0;.
15880 20 20 70 54 65 6d 70 43 75 72 2d 3e 70 50 72 65    pTempCur->pPre
15890 76 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  v = 0;.  for(i=0
158a0 3b 20 69 3c 3d 70 54 65 6d 70 43 75 72 2d 3e 69  ; i<=pTempCur->i
158b0 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Page; i++){.    
158c0 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
158d0 70 54 65 6d 70 43 75 72 2d 3e 61 70 50 61 67 65  pTempCur->apPage
158e0 5b 69 5d 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  [i]->pDbPage);. 
158f0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65   }.}../*.** Dele
15900 74 65 20 61 20 74 65 6d 70 6f 72 61 72 79 20 63  te a temporary c
15910 75 72 73 6f 72 20 73 75 63 68 20 61 73 20 77 61  ursor such as wa
15920 73 20 6d 61 64 65 20 62 79 20 74 68 65 20 43 72  s made by the Cr
15930 65 61 74 65 54 65 6d 70 6f 72 61 72 79 43 75 72  eateTemporaryCur
15940 73 6f 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f  sor().** functio
15950 6e 20 61 62 6f 76 65 2e 0a 2a 2f 0a 76 6f 69 64  n above..*/.void
15960 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 65 6c   sqlite3BtreeRel
15970 65 61 73 65 54 65 6d 70 43 75 72 73 6f 72 28 42  easeTempCursor(B
15980 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a  tCursor *pCur){.
15990 20 20 69 6e 74 20 69 3b 0a 20 20 61 73 73 65 72    int i;.  asser
159a0 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75  t( cursorHoldsMu
159b0 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 66  tex(pCur) );.  f
159c0 6f 72 28 69 3d 30 3b 20 69 3c 3d 70 43 75 72 2d  or(i=0; i<=pCur-
159d0 3e 69 50 61 67 65 3b 20 69 2b 2b 29 7b 0a 20 20  >iPage; i++){.  
159e0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
159f0 72 65 66 28 70 43 75 72 2d 3e 61 70 50 61 67 65  ref(pCur->apPage
15a00 5b 69 5d 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20  [i]->pDbPage);. 
15a10 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
15a20 20 73 75 72 65 20 74 68 65 20 42 74 43 75 72 73   sure the BtCurs
15a30 6f 72 2a 20 67 69 76 65 6e 20 69 6e 20 74 68 65  or* given in the
15a40 20 61 72 67 75 6d 65 6e 74 20 68 61 73 20 61 20   argument has a 
15a50 76 61 6c 69 64 0a 2a 2a 20 42 74 43 75 72 73 6f  valid.** BtCurso
15a60 72 2e 69 6e 66 6f 20 73 74 72 75 63 74 75 72 65  r.info structure
15a70 2e 20 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  .  If it is not 
15a80 61 6c 72 65 61 64 79 20 76 61 6c 69 64 2c 20 63  already valid, c
15a90 61 6c 6c 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74  all.** sqlite3Bt
15aa0 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 20 74  reeParseCell() t
15ab0 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a 2a 2a  o fill it in..**
15ac0 0a 2a 2a 20 42 74 43 75 72 73 6f 72 2e 69 6e 66  .** BtCursor.inf
15ad0 6f 20 69 73 20 61 20 63 61 63 68 65 20 6f 66 20  o is a cache of 
15ae0 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
15af0 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  in the current c
15b00 65 6c 6c 2e 0a 2a 2a 20 55 73 69 6e 67 20 74 68  ell..** Using th
15b10 69 73 20 63 61 63 68 65 20 72 65 64 75 63 65 73  is cache reduces
15b20 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
15b30 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 42  alls to sqlite3B
15b40 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 29 2e  treeParseCell().
15b50 0a 2a 2a 0a 2a 2a 20 32 30 30 37 2d 30 36 2d 32  .**.** 2007-06-2
15b60 35 3a 20 20 54 68 65 72 65 20 69 73 20 61 20 62  5:  There is a b
15b70 75 67 20 69 6e 20 73 6f 6d 65 20 76 65 72 73 69  ug in some versi
15b80 6f 6e 73 20 6f 66 20 4d 53 56 43 20 74 68 61 74  ons of MSVC that
15b90 20 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 63 6f   cause the.** co
15ba0 6d 70 69 6c 65 72 20 74 6f 20 63 72 61 73 68 20  mpiler to crash 
15bb0 77 68 65 6e 20 67 65 74 43 65 6c 6c 49 6e 66 6f  when getCellInfo
15bc0 28 29 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  () is implemente
15bd0 64 20 61 73 20 61 20 6d 61 63 72 6f 2e 0a 2a 2a  d as a macro..**
15be0 20 42 75 74 20 74 68 65 72 65 20 69 73 20 61 20   But there is a 
15bf0 6d 65 61 73 75 72 65 61 62 6c 65 20 73 70 65 65  measureable spee
15c00 64 20 61 64 76 61 6e 74 61 67 65 20 74 6f 20 75  d advantage to u
15c10 73 69 6e 67 20 74 68 65 20 6d 61 63 72 6f 20 6f  sing the macro o
15c20 6e 20 67 63 63 0a 2a 2a 20 28 77 68 65 6e 20 6c  n gcc.** (when l
15c30 65 73 73 20 63 6f 6d 70 69 6c 65 72 20 6f 70 74  ess compiler opt
15c40 69 6d 69 7a 61 74 69 6f 6e 73 20 6c 69 6b 65 20  imizations like 
15c50 2d 4f 73 20 6f 72 20 2d 4f 30 20 61 72 65 20 75  -Os or -O0 are u
15c60 73 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 63  sed and the.** c
15c70 6f 6d 70 69 6c 65 72 20 69 73 20 6e 6f 74 20 64  ompiler is not d
15c80 6f 69 6e 67 20 61 67 72 65 73 73 69 76 65 20 69  oing agressive i
15c90 6e 6c 69 6e 69 6e 67 2e 29 20 20 53 6f 20 77 65  nlining.)  So we
15ca0 20 75 73 65 20 61 20 72 65 61 6c 20 66 75 6e 63   use a real func
15cb0 74 69 6f 6e 0a 2a 2a 20 66 6f 72 20 4d 53 56 43  tion.** for MSVC
15cc0 20 61 6e 64 20 61 20 6d 61 63 72 6f 20 66 6f 72   and a macro for
15cd0 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65   everything else
15ce0 2e 20 20 54 69 63 6b 65 74 20 23 32 34 35 37 2e  .  Ticket #2457.
15cf0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
15d00 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  UG.  static void
15d10 20 61 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28   assertCellInfo(
15d20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
15d30 0a 20 20 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e  .    CellInfo in
15d40 66 6f 3b 0a 20 20 20 20 69 6e 74 20 69 50 61 67  fo;.    int iPag
15d50 65 20 3d 20 70 43 75 72 2d 3e 69 50 61 67 65 3b  e = pCur->iPage;
15d60 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 69 6e 66  .    memset(&inf
15d70 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 69 6e 66  o, 0, sizeof(inf
15d80 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  o));.    sqlite3
15d90 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 28 70  BtreeParseCell(p
15da0 43 75 72 2d 3e 61 70 50 61 67 65 5b 69 50 61 67  Cur->apPage[iPag
15db0 65 5d 2c 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  e], pCur->aiIdx[
15dc0 69 50 61 67 65 5d 2c 20 26 69 6e 66 6f 29 3b 0a  iPage], &info);.
15dd0 20 20 20 20 61 73 73 65 72 74 28 20 6d 65 6d 63      assert( memc
15de0 6d 70 28 26 69 6e 66 6f 2c 20 26 70 43 75 72 2d  mp(&info, &pCur-
15df0 3e 69 6e 66 6f 2c 20 73 69 7a 65 6f 66 28 69 6e  >info, sizeof(in
15e00 66 6f 29 29 3d 3d 30 20 29 3b 0a 20 20 7d 0a 23  fo))==0 );.  }.#
15e10 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65 20 61  else.  #define a
15e20 73 73 65 72 74 43 65 6c 6c 49 6e 66 6f 28 78 29  ssertCellInfo(x)
15e30 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 5f  .#endif.#ifdef _
15e40 4d 53 43 5f 56 45 52 0a 20 20 2f 2a 20 55 73 65  MSC_VER.  /* Use
15e50 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e   a real function
15e60 20 69 6e 20 4d 53 56 43 20 74 6f 20 77 6f 72 6b   in MSVC to work
15e70 20 61 72 6f 75 6e 64 20 62 75 67 73 20 69 6e 20   around bugs in 
15e80 74 68 61 74 20 63 6f 6d 70 69 6c 65 72 2e 20 2a  that compiler. *
15e90 2f 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  /.  static void 
15ea0 67 65 74 43 65 6c 6c 49 6e 66 6f 28 42 74 43 75  getCellInfo(BtCu
15eb0 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 20  rsor *pCur){.   
15ec0 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f 2e   if( pCur->info.
15ed0 6e 53 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20  nSize==0 ){.    
15ee0 20 20 69 6e 74 20 69 50 61 67 65 20 3d 20 70 43    int iPage = pC
15ef0 75 72 2d 3e 69 50 61 67 65 3b 0a 20 20 20 20 20  ur->iPage;.     
15f00 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 72   sqlite3BtreePar
15f10 73 65 43 65 6c 6c 28 70 43 75 72 2d 3e 61 70 50  seCell(pCur->apP
15f20 61 67 65 5b 69 50 61 67 65 5d 2c 70 43 75 72 2d  age[iPage],pCur-
15f30 3e 61 69 49 64 78 5b 69 50 61 67 65 5d 2c 26 70  >aiIdx[iPage],&p
15f40 43 75 72 2d 3e 69 6e 66 6f 29 3b 0a 20 20 20 20  Cur->info);.    
15f50 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
15f60 79 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  y = 1;.    }else
15f70 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 43 65  {.      assertCe
15f80 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20  llInfo(pCur);.  
15f90 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65 20 2f 2a    }.  }.#else /*
15fa0 20 69 66 20 6e 6f 74 20 5f 4d 53 43 5f 56 45 52   if not _MSC_VER
15fb0 20 2a 2f 0a 20 20 2f 2a 20 55 73 65 20 61 20 6d   */.  /* Use a m
15fc0 61 63 72 6f 20 69 6e 20 61 6c 6c 20 6f 74 68 65  acro in all othe
15fd0 72 20 63 6f 6d 70 69 6c 65 72 73 20 73 6f 20 74  r compilers so t
15fe0 68 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  hat the function
15ff0 20 69 73 20 69 6e 6c 69 6e 65 64 20 2a 2f 0a 23   is inlined */.#
16000 64 65 66 69 6e 65 20 67 65 74 43 65 6c 6c 49 6e  define getCellIn
16010 66 6f 28 70 43 75 72 29 20 20 20 20 20 20 20 20  fo(pCur)        
16020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c 0a                \.
16050 20 20 69 66 28 20 70 43 75 72 2d 3e 69 6e 66 6f    if( pCur->info
16060 2e 6e 53 69 7a 65 3d 3d 30 20 29 7b 20 20 20 20  .nSize==0 ){    
16070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5c                 \
160a0 0a 20 20 20 20 69 6e 74 20 69 50 61 67 65 20 3d  .    int iPage =
160b0 20 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 20 20   pCur->iPage;   
160c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
160f0 5c 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  \.    sqlite3Btr
16100 65 65 50 61 72 73 65 43 65 6c 6c 28 70 43 75 72  eeParseCell(pCur
16110 2d 3e 61 70 50 61 67 65 5b 69 50 61 67 65 5d 2c  ->apPage[iPage],
16120 70 43 75 72 2d 3e 61 69 49 64 78 5b 69 50 61 67  pCur->aiIdx[iPag
16130 65 5d 2c 26 70 43 75 72 2d 3e 69 6e 66 6f 29 3b  e],&pCur->info);
16140 20 5c 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c   \.    pCur->val
16150 69 64 4e 4b 65 79 20 3d 20 31 3b 20 20 20 20 20  idNKey = 1;     
16160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16190 20 20 5c 0a 20 20 7d 65 6c 73 65 7b 20 20 20 20    \.  }else{    
161a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
161e0 20 20 20 5c 0a 20 20 20 20 61 73 73 65 72 74 43     \.    assertC
161f0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 20 20  ellInfo(pCur);  
16200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16230 20 20 20 20 5c 0a 20 20 7d 0a 23 65 6e 64 69 66      \.  }.#endif
16240 20 2f 2a 20 5f 4d 53 43 5f 56 45 52 20 2a 2f 0a   /* _MSC_VER */.
16250 0a 2f 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a  ./*.** Set *pSiz
16260 65 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66  e to the size of
16270 20 74 68 65 20 62 75 66 66 65 72 20 6e 65 65 64   the buffer need
16280 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 76  ed to hold the v
16290 61 6c 75 65 20 6f 66 0a 2a 2a 20 74 68 65 20 6b  alue of.** the k
162a0 65 79 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  ey for the curre
162b0 6e 74 20 65 6e 74 72 79 2e 20 20 49 66 20 74 68  nt entry.  If th
162c0 65 20 63 75 72 73 6f 72 20 69 73 20 6e 6f 74 20  e cursor is not 
162d0 70 6f 69 6e 74 69 6e 67 0a 2a 2a 20 74 6f 20 61  pointing.** to a
162e0 20 76 61 6c 69 64 20 65 6e 74 72 79 2c 20 2a 70   valid entry, *p
162f0 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 30  Size is set to 0
16300 2e 20 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 74  . .**.** For a t
16310 61 62 6c 65 20 77 69 74 68 20 74 68 65 20 49 4e  able with the IN
16320 54 4b 45 59 20 66 6c 61 67 20 73 65 74 2c 20 74  TKEY flag set, t
16330 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
16340 72 6e 73 20 74 68 65 20 6b 65 79 0a 2a 2a 20 69  rns the key.** i
16350 74 73 65 6c 66 2c 20 6e 6f 74 20 74 68 65 20 6e  tself, not the n
16360 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
16370 6e 20 74 68 65 20 6b 65 79 2e 0a 2a 2f 0a 69 6e  n the key..*/.in
16380 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65  t sqlite3BtreeKe
16390 79 53 69 7a 65 28 42 74 43 75 72 73 6f 72 20 2a  ySize(BtCursor *
163a0 70 43 75 72 2c 20 69 36 34 20 2a 70 53 69 7a 65  pCur, i64 *pSize
163b0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ){.  int rc;..  
163c0 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
163d0 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
163e0 3b 0a 20 20 72 63 20 3d 20 72 65 73 74 6f 72 65  ;.  rc = restore
163f0 43 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 28 70  CursorPosition(p
16400 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
16410 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16420 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
16430 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e  State==CURSOR_IN
16440 56 41 4c 49 44 20 7c 7c 20 70 43 75 72 2d 3e 65  VALID || pCur->e
16450 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
16460 4c 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70  LID );.    if( p
16470 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
16480 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29 7b 0a 20  SOR_INVALID ){. 
16490 20 20 20 20 20 2a 70 53 69 7a 65 20 3d 20 30 3b       *pSize = 0;
164a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
164b0 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
164c0 75 72 29 3b 0a 20 20 20 20 20 20 2a 70 53 69 7a  ur);.      *pSiz
164d0 65 20 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e  e = pCur->info.n
164e0 4b 65 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  Key;.    }.  }. 
164f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
16500 2a 0a 2a 2a 20 53 65 74 20 2a 70 53 69 7a 65 20  *.** Set *pSize 
16510 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
16520 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 69   bytes of data i
16530 6e 20 74 68 65 20 65 6e 74 72 79 20 74 68 65 0a  n the entry the.
16540 2a 2a 20 63 75 72 73 6f 72 20 63 75 72 72 65 6e  ** cursor curren
16550 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20  tly points to.  
16560 41 6c 77 61 79 73 20 72 65 74 75 72 6e 20 53 51  Always return SQ
16570 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 20 46 61 69 6c  LITE_OK..** Fail
16580 75 72 65 20 69 73 20 6e 6f 74 20 70 6f 73 73 69  ure is not possi
16590 62 6c 65 2e 20 20 49 66 20 74 68 65 20 63 75 72  ble.  If the cur
165a0 73 6f 72 20 69 73 20 6e 6f 74 20 63 75 72 72 65  sor is not curre
165b0 6e 74 6c 79 0a 2a 2a 20 70 6f 69 6e 74 69 6e 67  ntly.** pointing
165c0 20 74 6f 20 61 6e 20 65 6e 74 72 79 20 28 77 68   to an entry (wh
165d0 69 63 68 20 63 61 6e 20 68 61 70 70 65 6e 2c 20  ich can happen, 
165e0 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a  for example, if.
165f0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
16600 69 73 20 65 6d 70 74 79 29 20 74 68 65 6e 20 2a  is empty) then *
16610 70 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20  pSize is set to 
16620 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
16630 33 42 74 72 65 65 44 61 74 61 53 69 7a 65 28 42  3BtreeDataSize(B
16640 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 75  tCursor *pCur, u
16650 33 32 20 2a 70 53 69 7a 65 29 7b 0a 20 20 69 6e  32 *pSize){.  in
16660 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
16670 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
16680 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
16690 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
166a0 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
166b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
166c0 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
166d0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
166e0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c  CURSOR_INVALID |
166f0 7c 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  | pCur->eState==
16700 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
16710 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53      if( pCur->eS
16720 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56  tate==CURSOR_INV
16730 41 4c 49 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a  ALID ){.      /*
16740 20 4e 6f 74 20 70 6f 69 6e 74 69 6e 67 20 61 74   Not pointing at
16750 20 61 20 76 61 6c 69 64 20 65 6e 74 72 79 20 2d   a valid entry -
16760 20 73 65 74 20 2a 70 53 69 7a 65 20 74 6f 20 30   set *pSize to 0
16770 2e 20 2a 2f 0a 20 20 20 20 20 20 2a 70 53 69 7a  . */.      *pSiz
16780 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 0;.    }else
16790 7b 0a 20 20 20 20 20 20 67 65 74 43 65 6c 6c 49  {.      getCellI
167a0 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 20 20 20  nfo(pCur);.     
167b0 20 2a 70 53 69 7a 65 20 3d 20 70 43 75 72 2d 3e   *pSize = pCur->
167c0 69 6e 66 6f 2e 6e 44 61 74 61 3b 0a 20 20 20 20  info.nData;.    
167d0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
167e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  c;.}../*.** Give
167f0 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
16800 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f 77  r of an overflow
16810 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
16820 61 62 61 73 65 20 28 70 61 72 61 6d 65 74 65 72  abase (parameter
16830 0a 2a 2a 20 6f 76 66 6c 29 2c 20 74 68 69 73 20  .** ovfl), this 
16840 66 75 6e 63 74 69 6f 6e 20 66 69 6e 64 73 20 74  function finds t
16850 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
16860 66 20 74 68 65 20 6e 65 78 74 20 70 61 67 65 20  f the next page 
16870 69 6e 20 74 68 65 20 0a 2a 2a 20 6c 69 6e 6b 65  in the .** linke
16880 64 20 6c 69 73 74 20 6f 66 20 6f 76 65 72 66 6c  d list of overfl
16890 6f 77 20 70 61 67 65 73 2e 20 49 66 20 70 6f 73  ow pages. If pos
168a0 73 69 62 6c 65 2c 20 69 74 20 75 73 65 73 20 74  sible, it uses t
168b0 68 65 20 61 75 74 6f 2d 76 61 63 75 75 6d 0a 2a  he auto-vacuum.*
168c0 2a 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 64 61  * pointer-map da
168d0 74 61 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65  ta instead of re
168e0 61 64 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e  ading the conten
168f0 74 20 6f 66 20 70 61 67 65 20 6f 76 66 6c 20 74  t of page ovfl t
16900 6f 20 64 6f 20 73 6f 2e 20 0a 2a 2a 0a 2a 2a 20  o do so. .**.** 
16910 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
16920 72 73 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  rs an SQLite err
16930 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
16940 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 3a 0a  ned. Otherwise:.
16950 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 70 50 67  **.** Unless pPg
16960 6e 6f 4e 65 78 74 20 69 73 20 4e 55 4c 4c 2c 20  noNext is NULL, 
16970 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
16980 6f 66 20 74 68 65 20 6e 65 78 74 20 6f 76 65 72  of the next over
16990 66 6c 6f 77 20 0a 2a 2a 20 70 61 67 65 20 69 6e  flow .** page in
169a0 20 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74   the linked list
169b0 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 2a   is written to *
169c0 70 50 67 6e 6f 4e 65 78 74 2e 20 49 66 20 70 61  pPgnoNext. If pa
169d0 67 65 20 6f 76 66 6c 0a 2a 2a 20 69 73 20 74 68  ge ovfl.** is th
169e0 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 69  e last page in i
169f0 74 73 20 6c 69 6e 6b 65 64 20 6c 69 73 74 2c 20  ts linked list, 
16a00 2a 70 50 67 6e 6f 4e 65 78 74 20 69 73 20 73 65  *pPgnoNext is se
16a10 74 20 74 6f 20 7a 65 72 6f 2e 20 0a 2a 2a 0a 2a  t to zero. .**.*
16a20 2a 20 49 66 20 70 70 50 61 67 65 20 69 73 20 6e  * If ppPage is n
16a30 6f 74 20 4e 55 4c 4c 2c 20 2a 70 70 50 61 67 65  ot NULL, *ppPage
16a40 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 4d   is set to the M
16a50 65 6d 50 61 67 65 2a 20 68 61 6e 64 6c 65 0a 2a  emPage* handle.*
16a60 2a 20 66 6f 72 20 70 61 67 65 20 6f 76 66 6c 2e  * for page ovfl.
16a70 20 54 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   The underlying 
16a80 70 61 67 65 72 20 70 61 67 65 20 6d 61 79 20 68  pager page may h
16a90 61 76 65 20 62 65 65 6e 20 72 65 71 75 65 73 74  ave been request
16aa0 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 6e  ed.** with the n
16ab0 6f 43 6f 6e 74 65 6e 74 20 66 6c 61 67 20 73 65  oContent flag se
16ac0 74 2c 20 73 6f 20 74 68 65 20 70 61 67 65 20 64  t, so the page d
16ad0 61 74 61 20 61 63 63 65 73 73 61 62 6c 65 20 76  ata accessable v
16ae0 69 61 0a 2a 2a 20 74 68 69 73 20 68 61 6e 64 6c  ia.** this handl
16af0 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 74 72 75  e may not be tru
16b00 73 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sted..*/.static 
16b10 69 6e 74 20 67 65 74 4f 76 65 72 66 6c 6f 77 50  int getOverflowP
16b20 61 67 65 28 0a 20 20 42 74 53 68 61 72 65 64 20  age(.  BtShared 
16b30 2a 70 42 74 2c 20 0a 20 20 50 67 6e 6f 20 6f 76  *pBt, .  Pgno ov
16b40 66 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  fl,             
16b50 20 20 20 20 20 20 2f 2a 20 4f 76 65 72 66 6c 6f        /* Overflo
16b60 77 20 70 61 67 65 20 2a 2f 0a 20 20 4d 65 6d 50  w page */.  MemP
16b70 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20  age **ppPage,   
16b80 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
16b90 20 4d 65 6d 50 61 67 65 20 68 61 6e 64 6c 65 20   MemPage handle 
16ba0 2a 2f 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f  */.  Pgno *pPgno
16bb0 4e 65 78 74 20 20 20 20 20 20 20 20 20 20 20 20  Next            
16bc0 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 78 74 20 6f    /* OUT: Next o
16bd0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6e 75 6d  verflow page num
16be0 62 65 72 20 2a 2f 0a 29 7b 0a 20 20 50 67 6e 6f  ber */.){.  Pgno
16bf0 20 6e 65 78 74 20 3d 20 30 3b 0a 20 20 69 6e 74   next = 0;.  int
16c00 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
16c10 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
16c20 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  ld(pBt->mutex) )
16c30 3b 0a 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68  ;.  /* One of th
16c40 65 73 65 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  ese must not be 
16c50 4e 55 4c 4c 2e 20 4f 74 68 65 72 77 69 73 65 2c  NULL. Otherwise,
16c60 20 77 68 79 20 63 61 6c 6c 20 74 68 69 73 20 66   why call this f
16c70 75 6e 63 74 69 6f 6e 3f 20 2a 2f 0a 20 20 61 73  unction? */.  as
16c80 73 65 72 74 28 70 70 50 61 67 65 20 7c 7c 20 70  sert(ppPage || p
16c90 50 67 6e 6f 4e 65 78 74 29 3b 0a 0a 20 20 2f 2a  PgnoNext);..  /*
16ca0 20 49 66 20 70 50 67 6e 6f 4e 65 78 74 20 69 73   If pPgnoNext is
16cb0 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 74 68 69 73   NULL, then this
16cc0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65 69   function is bei
16cd0 6e 67 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74  ng called to obt
16ce0 61 69 6e 0a 20 20 2a 2a 20 61 20 4d 65 6d 50 61  ain.  ** a MemPa
16cf0 67 65 2a 20 72 65 66 65 72 65 6e 63 65 20 6f 6e  ge* reference on
16d00 6c 79 2e 20 4e 6f 20 70 61 67 65 2d 64 61 74 61  ly. No page-data
16d10 20 69 73 20 72 65 71 75 69 72 65 64 20 69 6e 20   is required in 
16d20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2f 0a  this case..  */.
16d30 20 20 69 66 28 20 21 70 50 67 6e 6f 4e 65 78 74    if( !pPgnoNext
16d40 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   ){.    return s
16d50 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
16d60 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c 20 70 70  ge(pBt, ovfl, pp
16d70 50 61 67 65 2c 20 31 29 3b 0a 20 20 7d 0a 0a 23  Page, 1);.  }..#
16d80 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16d90 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
16da0 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 74  /* Try to find t
16db0 68 65 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20  he next page in 
16dc0 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69 73  the overflow lis
16dd0 74 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  t using the.  **
16de0 20 61 75 74 6f 76 61 63 75 75 6d 20 70 6f 69 6e   autovacuum poin
16df0 74 65 72 2d 6d 61 70 20 70 61 67 65 73 2e 20 47  ter-map pages. G
16e00 75 65 73 73 20 74 68 61 74 20 74 68 65 20 6e 65  uess that the ne
16e10 78 74 20 70 61 67 65 20 69 6e 20 0a 20 20 2a 2a  xt page in .  **
16e20 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 6c 69   the overflow li
16e30 73 74 20 69 73 20 70 61 67 65 20 6e 75 6d 62 65  st is page numbe
16e40 72 20 28 6f 76 66 6c 2b 31 29 2e 20 49 66 20 74  r (ovfl+1). If t
16e50 68 61 74 20 67 75 65 73 73 20 74 75 72 6e 73 20  hat guess turns 
16e60 0a 20 20 2a 2a 20 6f 75 74 20 74 6f 20 62 65 20  .  ** out to be 
16e70 77 72 6f 6e 67 2c 20 66 61 6c 6c 20 62 61 63 6b  wrong, fall back
16e80 20 74 6f 20 6c 6f 61 64 69 6e 67 20 74 68 65 20   to loading the 
16e90 64 61 74 61 20 6f 66 20 70 61 67 65 20 0a 20 20  data of page .  
16ea0 2a 2a 20 6e 75 6d 62 65 72 20 6f 76 66 6c 20 74  ** number ovfl t
16eb0 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
16ec0 6e 65 78 74 20 70 61 67 65 20 6e 75 6d 62 65 72  next page number
16ed0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 42 74  ..  */.  if( pBt
16ee0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a  ->autoVacuum ){.
16ef0 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20      Pgno pgno;. 
16f00 20 20 20 50 67 6e 6f 20 69 47 75 65 73 73 20 3d     Pgno iGuess =
16f10 20 6f 76 66 6c 2b 31 3b 0a 20 20 20 20 75 38 20   ovfl+1;.    u8 
16f20 65 54 79 70 65 3b 0a 0a 20 20 20 20 77 68 69 6c  eType;..    whil
16f30 65 28 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45  e( PTRMAP_ISPAGE
16f40 28 70 42 74 2c 20 69 47 75 65 73 73 29 20 7c 7c  (pBt, iGuess) ||
16f50 20 69 47 75 65 73 73 3d 3d 50 45 4e 44 49 4e 47   iGuess==PENDING
16f60 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29 20  _BYTE_PAGE(pBt) 
16f70 29 7b 0a 20 20 20 20 20 20 69 47 75 65 73 73 2b  ){.      iGuess+
16f80 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  +;.    }..    if
16f90 28 20 69 47 75 65 73 73 3c 3d 70 61 67 65 72 50  ( iGuess<=pagerP
16fa0 61 67 65 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  agecount(pBt->pP
16fb0 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 72  ager) ){.      r
16fc0 63 20 3d 20 70 74 72 6d 61 70 47 65 74 28 70 42  c = ptrmapGet(pB
16fd0 74 2c 20 69 47 75 65 73 73 2c 20 26 65 54 79 70  t, iGuess, &eTyp
16fe0 65 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 20 20 20  e, &pgno);.     
16ff0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17000 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
17010 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
17020 0a 20 20 20 20 20 20 69 66 28 20 65 54 79 70 65  .      if( eType
17030 3d 3d 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f  ==PTRMAP_OVERFLO
17040 57 32 20 26 26 20 70 67 6e 6f 3d 3d 6f 76 66 6c  W2 && pgno==ovfl
17050 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 78 74   ){.        next
17060 20 3d 20 69 47 75 65 73 73 3b 0a 20 20 20 20 20   = iGuess;.     
17070 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e   }.    }.  }.#en
17080 64 69 66 0a 0a 20 20 69 66 28 20 6e 65 78 74 3d  dif..  if( next=
17090 3d 30 20 7c 7c 20 70 70 50 61 67 65 20 29 7b 0a  =0 || ppPage ){.
170a0 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61      MemPage *pPa
170b0 67 65 20 3d 20 30 3b 0a 0a 20 20 20 20 72 63 20  ge = 0;..    rc 
170c0 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
170d0 74 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 2c  tPage(pBt, ovfl,
170e0 20 26 70 50 61 67 65 2c 20 6e 65 78 74 21 3d 30   &pPage, next!=0
170f0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 72 63  );.    assert(rc
17100 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
17110 50 61 67 65 3d 3d 30 29 3b 0a 20 20 20 20 69 66  Page==0);.    if
17120 28 20 6e 65 78 74 3d 3d 30 20 26 26 20 72 63 3d  ( next==0 && rc=
17130 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17140 20 20 20 20 6e 65 78 74 20 3d 20 67 65 74 34 62      next = get4b
17150 79 74 65 28 70 50 61 67 65 2d 3e 61 44 61 74 61  yte(pPage->aData
17160 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
17170 28 20 70 70 50 61 67 65 20 29 7b 0a 20 20 20 20  ( ppPage ){.    
17180 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50 61 67    *ppPage = pPag
17190 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
171a0 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
171b0 70 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20  pPage);.    }.  
171c0 7d 0a 20 20 2a 70 50 67 6e 6f 4e 65 78 74 20 3d  }.  *pPgnoNext =
171d0 20 6e 65 78 74 3b 0a 0a 20 20 72 65 74 75 72 6e   next;..  return
171e0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f   rc;.}../*.** Co
171f0 70 79 20 64 61 74 61 20 66 72 6f 6d 20 61 20 62  py data from a b
17200 75 66 66 65 72 20 74 6f 20 61 20 70 61 67 65 2c  uffer to a page,
17210 20 6f 72 20 66 72 6f 6d 20 61 20 70 61 67 65 20   or from a page 
17220 74 6f 20 61 20 62 75 66 66 65 72 2e 0a 2a 2a 0a  to a buffer..**.
17230 2a 2a 20 70 50 61 79 6c 6f 61 64 20 69 73 20 61  ** pPayload is a
17240 20 70 6f 69 6e 74 65 72 20 74 6f 20 64 61 74 61   pointer to data
17250 20 73 74 6f 72 65 64 20 6f 6e 20 64 61 74 61 62   stored on datab
17260 61 73 65 20 70 61 67 65 20 70 44 62 50 61 67 65  ase page pDbPage
17270 2e 0a 2a 2a 20 49 66 20 61 72 67 75 6d 65 6e 74  ..** If argument
17280 20 65 4f 70 20 69 73 20 66 61 6c 73 65 2c 20 74   eOp is false, t
17290 68 65 6e 20 6e 42 79 74 65 20 62 79 74 65 73 20  hen nByte bytes 
172a0 6f 66 20 64 61 74 61 20 61 72 65 20 63 6f 70 69  of data are copi
172b0 65 64 0a 2a 2a 20 66 72 6f 6d 20 70 50 61 79 6c  ed.** from pPayl
172c0 6f 61 64 20 74 6f 20 74 68 65 20 62 75 66 66 65  oad to the buffe
172d0 72 20 70 6f 69 6e 74 65 64 20 61 74 20 62 79 20  r pointed at by 
172e0 70 42 75 66 2e 20 49 66 20 65 4f 70 20 69 73 20  pBuf. If eOp is 
172f0 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20 73 71  true,.** then sq
17300 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
17310 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 70  ) is called on p
17320 44 62 50 61 67 65 20 61 6e 64 20 6e 42 79 74 65  DbPage and nByte
17330 20 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74   bytes.** of dat
17340 61 20 61 72 65 20 63 6f 70 69 65 64 20 66 72 6f  a are copied fro
17350 6d 20 74 68 65 20 62 75 66 66 65 72 20 70 42 75  m the buffer pBu
17360 66 20 74 6f 20 70 50 61 79 6c 6f 61 64 2e 0a 2a  f to pPayload..*
17370 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69  *.** SQLITE_OK i
17380 73 20 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75  s returned on su
17390 63 63 65 73 73 2c 20 6f 74 68 65 72 77 69 73 65  ccess, otherwise
173a0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a   an error code..
173b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
173c0 70 79 50 61 79 6c 6f 61 64 28 0a 20 20 76 6f 69  pyPayload(.  voi
173d0 64 20 2a 70 50 61 79 6c 6f 61 64 2c 20 20 20 20  d *pPayload,    
173e0 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
173f0 72 20 74 6f 20 70 61 67 65 20 64 61 74 61 20 2a  r to page data *
17400 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  /.  void *pBuf, 
17410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17420 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 66 66   Pointer to buff
17430 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6e 42 79 74  er */.  int nByt
17440 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
17450 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
17460 79 74 65 73 20 74 6f 20 63 6f 70 79 20 2a 2f 0a  ytes to copy */.
17470 20 20 69 6e 74 20 65 4f 70 2c 20 20 20 20 20 20    int eOp,      
17480 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 30              /* 0
17490 20 2d 3e 20 63 6f 70 79 20 66 72 6f 6d 20 70 61   -> copy from pa
174a0 67 65 2c 20 31 20 2d 3e 20 63 6f 70 79 20 74 6f  ge, 1 -> copy to
174b0 20 70 61 67 65 20 2a 2f 0a 20 20 44 62 50 61 67   page */.  DbPag
174c0 65 20 2a 70 44 62 50 61 67 65 20 20 20 20 20 20  e *pDbPage      
174d0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 63 6f 6e       /* Page con
174e0 74 61 69 6e 69 6e 67 20 70 50 61 79 6c 6f 61 64  taining pPayload
174f0 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 65 4f 70   */.){.  if( eOp
17500 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20   ){.    /* Copy 
17510 64 61 74 61 20 66 72 6f 6d 20 62 75 66 66 65 72  data from buffer
17520 20 74 6f 20 70 61 67 65 20 28 61 20 77 72 69 74   to page (a writ
17530 65 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a  e operation) */.
17540 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
17550 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
17560 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
17570 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
17580 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
17590 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d  c;.    }.    mem
175a0 63 70 79 28 70 50 61 79 6c 6f 61 64 2c 20 70 42  cpy(pPayload, pB
175b0 75 66 2c 20 6e 42 79 74 65 29 3b 0a 20 20 7d 65  uf, nByte);.  }e
175c0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 43 6f 70 79  lse{.    /* Copy
175d0 20 64 61 74 61 20 66 72 6f 6d 20 70 61 67 65 20   data from page 
175e0 74 6f 20 62 75 66 66 65 72 20 28 61 20 72 65 61  to buffer (a rea
175f0 64 20 6f 70 65 72 61 74 69 6f 6e 29 20 2a 2f 0a  d operation) */.
17600 20 20 20 20 6d 65 6d 63 70 79 28 70 42 75 66 2c      memcpy(pBuf,
17610 20 70 50 61 79 6c 6f 61 64 2c 20 6e 42 79 74 65   pPayload, nByte
17620 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
17630 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
17640 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
17650 6e 20 69 73 20 75 73 65 64 20 74 6f 20 72 65 61  n is used to rea
17660 64 20 6f 72 20 6f 76 65 72 77 72 69 74 65 20 70  d or overwrite p
17670 61 79 6c 6f 61 64 20 69 6e 66 6f 72 6d 61 74 69  ayload informati
17680 6f 6e 0a 2a 2a 20 66 6f 72 20 74 68 65 20 65 6e  on.** for the en
17690 74 72 79 20 74 68 61 74 20 74 68 65 20 70 43 75  try that the pCu
176a0 72 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69 6e  r cursor is poin
176b0 74 69 6e 67 20 74 6f 2e 20 49 66 20 74 68 65 20  ting to. If the 
176c0 65 4f 70 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  eOp.** parameter
176d0 20 69 73 20 30 2c 20 74 68 69 73 20 69 73 20 61   is 0, this is a
176e0 20 72 65 61 64 20 6f 70 65 72 61 74 69 6f 6e 20   read operation 
176f0 28 64 61 74 61 20 63 6f 70 69 65 64 20 69 6e 74  (data copied int
17700 6f 0a 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66  o.** buffer pBuf
17710 29 2e 20 49 66 20 69 74 20 69 73 20 6e 6f 6e 2d  ). If it is non-
17720 7a 65 72 6f 2c 20 61 20 77 72 69 74 65 20 28 64  zero, a write (d
17730 61 74 61 20 63 6f 70 69 65 64 20 66 72 6f 6d 0a  ata copied from.
17740 2a 2a 20 62 75 66 66 65 72 20 70 42 75 66 29 2e  ** buffer pBuf).
17750 0a 2a 2a 0a 2a 2a 20 41 20 74 6f 74 61 6c 20 6f  .**.** A total o
17760 66 20 22 61 6d 74 22 20 62 79 74 65 73 20 61 72  f "amt" bytes ar
17770 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
17780 6e 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 22  n beginning at "
17790 6f 66 66 73 65 74 22 2e 0a 2a 2a 20 44 61 74 61  offset"..** Data
177a0 20 69 73 20 72 65 61 64 20 74 6f 20 6f 72 20 66   is read to or f
177b0 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72 20 70  rom the buffer p
177c0 42 75 66 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Buf..**.** This 
177d0 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74  routine does not
177e0 20 6d 61 6b 65 20 61 20 64 69 73 74 69 6e 63 74   make a distinct
177f0 69 6f 6e 20 62 65 74 77 65 65 6e 20 6b 65 79 20  ion between key 
17800 61 6e 64 20 64 61 74 61 2e 0a 2a 2a 20 49 74 20  and data..** It 
17810 6a 75 73 74 20 72 65 61 64 73 20 6f 72 20 77 72  just reads or wr
17820 69 74 65 73 20 62 79 74 65 73 20 66 72 6f 6d 20  ites bytes from 
17830 74 68 65 20 70 61 79 6c 6f 61 64 20 61 72 65 61  the payload area
17840 2e 20 20 44 61 74 61 20 6d 69 67 68 74 20 0a 2a  .  Data might .*
17850 2a 20 61 70 70 65 61 72 20 6f 6e 20 74 68 65 20  * appear on the 
17860 6d 61 69 6e 20 70 61 67 65 20 6f 72 20 62 65 20  main page or be 
17870 73 63 61 74 74 65 72 65 64 20 6f 75 74 20 6f 6e  scattered out on
17880 20 6d 75 6c 74 69 70 6c 65 20 6f 76 65 72 66 6c   multiple overfl
17890 6f 77 20 0a 2a 2a 20 70 61 67 65 73 2e 0a 2a 2a  ow .** pages..**
178a0 0a 2a 2a 20 49 66 20 74 68 65 20 42 74 43 75 72  .** If the BtCur
178b0 73 6f 72 2e 69 73 49 6e 63 72 62 6c 6f 62 48 61  sor.isIncrblobHa
178c0 6e 64 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74  ndle flag is set
178d0 2c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65 6e  , and the curren
178e0 74 0a 2a 2a 20 63 75 72 73 6f 72 20 65 6e 74 72  t.** cursor entr
178f0 79 20 75 73 65 73 20 6f 6e 65 20 6f 72 20 6d 6f  y uses one or mo
17900 72 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  re overflow page
17910 73 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  s, this function
17920 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 73 20 73 70  .** allocates sp
17930 61 63 65 20 66 6f 72 20 61 6e 64 20 6c 61 7a 69  ace for and lazi
17940 6c 79 20 70 6f 70 6c 75 61 74 65 73 20 74 68 65  ly popluates the
17950 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c   overflow page-l
17960 69 73 74 20 0a 2a 2a 20 63 61 63 68 65 20 61 72  ist .** cache ar
17970 72 61 79 20 28 42 74 43 75 72 73 6f 72 2e 61 4f  ray (BtCursor.aO
17980 76 65 72 66 6c 6f 77 29 2e 20 53 75 62 73 65 71  verflow). Subseq
17990 75 65 6e 74 20 63 61 6c 6c 73 20 75 73 65 20 74  uent calls use t
179a0 68 69 73 0a 2a 2a 20 63 61 63 68 65 20 74 6f 20  his.** cache to 
179b0 6d 61 6b 65 20 73 65 65 6b 69 6e 67 20 74 6f 20  make seeking to 
179c0 74 68 65 20 73 75 70 70 6c 69 65 64 20 6f 66 66  the supplied off
179d0 73 65 74 20 6d 6f 72 65 20 65 66 66 69 63 69 65  set more efficie
179e0 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 61  nt..**.** Once a
179f0 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  n overflow page-
17a00 6c 69 73 74 20 63 61 63 68 65 20 68 61 73 20 62  list cache has b
17a10 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69  een allocated, i
17a20 74 20 6d 61 79 20 62 65 0a 2a 2a 20 69 6e 76 61  t may be.** inva
17a30 6c 69 64 61 74 65 64 20 69 66 20 73 6f 6d 65 20  lidated if some 
17a40 6f 74 68 65 72 20 63 75 72 73 6f 72 20 77 72 69  other cursor wri
17a50 74 65 73 20 74 6f 20 74 68 65 20 73 61 6d 65 20  tes to the same 
17a60 74 61 62 6c 65 2c 20 6f 72 20 69 66 0a 2a 2a 20  table, or if.** 
17a70 74 68 65 20 63 75 72 73 6f 72 20 69 73 20 6d 6f  the cursor is mo
17a80 76 65 64 20 74 6f 20 61 20 64 69 66 66 65 72 65  ved to a differe
17a90 6e 74 20 72 6f 77 2e 20 41 64 64 69 74 69 6f 6e  nt row. Addition
17aa0 61 6c 6c 79 2c 20 69 6e 20 61 75 74 6f 2d 76 61  ally, in auto-va
17ab0 63 75 75 6d 0a 2a 2a 20 6d 6f 64 65 2c 20 74 68  cuum.** mode, th
17ac0 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 76 65 6e  e following even
17ad0 74 73 20 6d 61 79 20 69 6e 76 61 6c 69 64 61 74  ts may invalidat
17ae0 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70 61  e an overflow pa
17af0 67 65 2d 6c 69 73 74 20 63 61 63 68 65 2e 0a 2a  ge-list cache..*
17b00 2a 0a 2a 2a 20 20 20 2a 20 41 6e 20 69 6e 63 72  *.**   * An incr
17b10 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 2c 0a  emental vacuum,.
17b20 2a 2a 20 20 20 2a 20 41 20 63 6f 6d 6d 69 74 20  **   * A commit 
17b30 69 6e 20 61 75 74 6f 5f 76 61 63 75 75 6d 3d 22  in auto_vacuum="
17b40 66 75 6c 6c 22 20 6d 6f 64 65 2c 0a 2a 2a 20 20  full" mode,.**  
17b50 20 2a 20 43 72 65 61 74 69 6e 67 20 61 20 74 61   * Creating a ta
17b60 62 6c 65 20 28 6d 61 79 20 72 65 71 75 69 72 65  ble (may require
17b70 20 6d 6f 76 69 6e 67 20 61 6e 20 6f 76 65 72 66   moving an overf
17b80 6c 6f 77 20 70 61 67 65 29 2e 0a 2a 2f 0a 73 74  low page)..*/.st
17b90 61 74 69 63 20 69 6e 74 20 61 63 63 65 73 73 50  atic int accessP
17ba0 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72 73  ayload(.  BtCurs
17bb0 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 2f  or *pCur,      /
17bc0 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69 6e  * Cursor pointin
17bd0 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72 65  g to entry to re
17be0 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74  ad from */.  int
17bf0 20 6f 66 66 73 65 74 2c 20 20 20 20 20 20 20 20   offset,        
17c00 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 61 64 69    /* Begin readi
17c10 6e 67 20 74 68 69 73 20 66 61 72 20 69 6e 74 6f  ng this far into
17c20 20 70 61 79 6c 6f 61 64 20 2a 2f 0a 20 20 69 6e   payload */.  in
17c30 74 20 61 6d 74 2c 20 20 20 20 20 20 20 20 20 20  t amt,          
17c40 20 20 20 2f 2a 20 52 65 61 64 20 74 68 69 73 20     /* Read this 
17c50 6d 61 6e 79 20 62 79 74 65 73 20 2a 2f 0a 20 20  many bytes */.  
17c60 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
17c70 42 75 66 2c 20 2f 2a 20 57 72 69 74 65 20 74 68  Buf, /* Write th
17c80 65 20 62 79 74 65 73 20 69 6e 74 6f 20 74 68 69  e bytes into thi
17c90 73 20 62 75 66 66 65 72 20 2a 2f 20 0a 20 20 69  s buffer */ .  i
17ca0 6e 74 20 73 6b 69 70 4b 65 79 2c 20 20 20 20 20  nt skipKey,     
17cb0 20 20 20 20 2f 2a 20 6f 66 66 73 65 74 20 62 65      /* offset be
17cc0 67 69 6e 73 20 61 74 20 64 61 74 61 20 69 66 20  gins at data if 
17cd0 74 68 69 73 20 69 73 20 74 72 75 65 20 2a 2f 0a  this is true */.
17ce0 20 20 69 6e 74 20 65 4f 70 20 20 20 20 20 20 20    int eOp       
17cf0 20 20 20 20 20 20 20 2f 2a 20 7a 65 72 6f 20 74         /* zero t
17d00 6f 20 72 65 61 64 2e 20 6e 6f 6e 2d 7a 65 72 6f  o read. non-zero
17d10 20 74 6f 20 77 72 69 74 65 2e 20 2a 2f 0a 29 7b   to write. */.){
17d20 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
17d30 20 2a 61 50 61 79 6c 6f 61 64 3b 0a 20 20 69 6e   *aPayload;.  in
17d40 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
17d50 3b 0a 20 20 75 33 32 20 6e 4b 65 79 3b 0a 20 20  ;.  u32 nKey;.  
17d60 69 6e 74 20 69 49 64 78 20 3d 20 30 3b 0a 20 20  int iIdx = 0;.  
17d70 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d  MemPage *pPage =
17d80 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
17d90 75 72 2d 3e 69 50 61 67 65 5d 3b 20 2f 2a 20 42  ur->iPage]; /* B
17da0 74 72 65 65 20 70 61 67 65 20 6f 66 20 63 75 72  tree page of cur
17db0 72 65 6e 74 20 65 6e 74 72 79 20 2a 2f 0a 20 20  rent entry */.  
17dc0 42 74 53 68 61 72 65 64 20 2a 70 42 74 3b 20 20  BtShared *pBt;  
17dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17de0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
17df0 74 72 65 65 20 74 68 69 73 20 63 75 72 73 6f 72  tree this cursor
17e00 20 62 65 6c 6f 6e 67 73 20 74 6f 20 2a 2f 0a 0a   belongs to */..
17e10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 20    assert( pPage 
17e20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75  );.  assert( pCu
17e30 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f  r->eState==CURSO
17e40 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73 73  R_VALID );.  ass
17e50 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78  ert( pCur->aiIdx
17e60 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 50  [pCur->iPage]<pP
17e70 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20  age->nCell );.  
17e80 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d  assert( offset>=
17e90 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 63  0 );.  assert( c
17ea0 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
17eb0 70 43 75 72 29 20 29 3b 0a 0a 20 20 67 65 74 43  pCur) );..  getC
17ec0 65 6c 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20  ellInfo(pCur);. 
17ed0 20 61 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72   aPayload = pCur
17ee0 2d 3e 69 6e 66 6f 2e 70 43 65 6c 6c 20 2b 20 70  ->info.pCell + p
17ef0 43 75 72 2d 3e 69 6e 66 6f 2e 6e 48 65 61 64 65  Cur->info.nHeade
17f00 72 3b 0a 20 20 6e 4b 65 79 20 3d 20 28 70 50 61  r;.  nKey = (pPa
17f10 67 65 2d 3e 69 6e 74 4b 65 79 20 3f 20 30 20 3a  ge->intKey ? 0 :
17f20 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
17f30 29 3b 0a 0a 20 20 69 66 28 20 73 6b 69 70 4b 65  );..  if( skipKe
17f40 79 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  y ){.    offset 
17f50 2b 3d 20 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69  += nKey;.  }.  i
17f60 66 28 20 6f 66 66 73 65 74 2b 61 6d 74 20 3e 20  f( offset+amt > 
17f70 6e 4b 65 79 2b 70 43 75 72 2d 3e 69 6e 66 6f 2e  nKey+pCur->info.
17f80 6e 44 61 74 61 20 29 7b 0a 20 20 20 20 2f 2a 20  nData ){.    /* 
17f90 54 72 79 69 6e 67 20 74 6f 20 72 65 61 64 20 6f  Trying to read o
17fa0 72 20 77 72 69 74 65 20 70 61 73 74 20 74 68 65  r write past the
17fb0 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74 61   end of the data
17fc0 20 69 73 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a   is an error */.
17fd0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
17fe0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
17ff0 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20    }..  /* Check 
18000 69 66 20 64 61 74 61 20 6d 75 73 74 20 62 65 20  if data must be 
18010 72 65 61 64 2f 77 72 69 74 74 65 6e 20 74 6f 2f  read/written to/
18020 66 72 6f 6d 20 74 68 65 20 62 74 72 65 65 20 70  from the btree p
18030 61 67 65 20 69 74 73 65 6c 66 2e 20 2a 2f 0a 20  age itself. */. 
18040 20 69 66 28 20 6f 66 66 73 65 74 3c 70 43 75 72   if( offset<pCur
18050 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b  ->info.nLocal ){
18060 0a 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74  .    int a = amt
18070 3b 0a 20 20 20 20 69 66 28 20 61 2b 6f 66 66 73  ;.    if( a+offs
18080 65 74 3e 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c  et>pCur->info.nL
18090 6f 63 61 6c 20 29 7b 0a 20 20 20 20 20 20 61 20  ocal ){.      a 
180a0 3d 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  = pCur->info.nLo
180b0 63 61 6c 20 2d 20 6f 66 66 73 65 74 3b 0a 20 20  cal - offset;.  
180c0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 63 6f 70    }.    rc = cop
180d0 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c 6f  yPayload(&aPaylo
180e0 61 64 5b 6f 66 66 73 65 74 5d 2c 20 70 42 75 66  ad[offset], pBuf
180f0 2c 20 61 2c 20 65 4f 70 2c 20 70 50 61 67 65 2d  , a, eOp, pPage-
18100 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 6f  >pDbPage);.    o
18110 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 20 20 70  ffset = 0;.    p
18120 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20 61 6d  Buf += a;.    am
18130 74 20 2d 3d 20 61 3b 0a 20 20 7d 65 6c 73 65 7b  t -= a;.  }else{
18140 0a 20 20 20 20 6f 66 66 73 65 74 20 2d 3d 20 70  .    offset -= p
18150 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  Cur->info.nLocal
18160 3b 0a 20 20 7d 0a 0a 20 20 70 42 74 20 3d 20 70  ;.  }..  pBt = p
18170 43 75 72 2d 3e 70 42 74 3b 0a 20 20 69 66 28 20  Cur->pBt;.  if( 
18180 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
18190 20 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 63 6f   amt>0 ){.    co
181a0 6e 73 74 20 69 6e 74 20 6f 76 66 6c 53 69 7a 65  nst int ovflSize
181b0 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
181c0 7a 65 20 2d 20 34 3b 20 20 2f 2a 20 42 79 74 65  ze - 4;  /* Byte
181d0 73 20 63 6f 6e 74 65 6e 74 20 70 65 72 20 6f 76  s content per ov
181e0 66 6c 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 50  fl page */.    P
181f0 67 6e 6f 20 6e 65 78 74 50 61 67 65 3b 0a 0a 20  gno nextPage;.. 
18200 20 20 20 6e 65 78 74 50 61 67 65 20 3d 20 67 65     nextPage = ge
18210 74 34 62 79 74 65 28 26 61 50 61 79 6c 6f 61 64  t4byte(&aPayload
18220 5b 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63  [pCur->info.nLoc
18230 61 6c 5d 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53  al]);..#ifndef S
18240 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
18250 4c 4f 42 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  LOB.    /* If th
18260 65 20 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e 64  e isIncrblobHand
18270 6c 65 20 66 6c 61 67 20 69 73 20 73 65 74 20 61  le flag is set a
18280 6e 64 20 74 68 65 20 42 74 43 75 72 73 6f 72 2e  nd the BtCursor.
18290 61 4f 76 65 72 66 6c 6f 77 5b 5d 0a 20 20 20 20  aOverflow[].    
182a0 2a 2a 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  ** has not been 
182b0 61 6c 6c 6f 63 61 74 65 64 2c 20 61 6c 6c 6f 63  allocated, alloc
182c0 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 20  ate it now. The 
182d0 61 72 72 61 79 20 69 73 20 73 69 7a 65 64 20 61  array is sized a
182e0 74 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 65 6e 74  t.    ** one ent
182f0 72 79 20 66 6f 72 20 65 61 63 68 20 6f 76 65 72  ry for each over
18300 66 6c 6f 77 20 70 61 67 65 20 69 6e 20 74 68 65  flow page in the
18310 20 6f 76 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e   overflow chain.
18320 20 54 68 65 0a 20 20 20 20 2a 2a 20 70 61 67 65   The.    ** page
18330 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 66   number of the f
18340 69 72 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61  irst overflow pa
18350 67 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  ge is stored in 
18360 61 4f 76 65 72 66 6c 6f 77 5b 30 5d 2c 0a 20 20  aOverflow[0],.  
18370 20 20 2a 2a 20 65 74 63 2e 20 41 20 76 61 6c 75    ** etc. A valu
18380 65 20 6f 66 20 30 20 69 6e 20 74 68 65 20 61 4f  e of 0 in the aO
18390 76 65 72 66 6c 6f 77 5b 5d 20 61 72 72 61 79 20  verflow[] array 
183a0 6d 65 61 6e 73 20 22 6e 6f 74 20 79 65 74 20 6b  means "not yet k
183b0 6e 6f 77 6e 22 0a 20 20 20 20 2a 2a 20 28 74 68  nown".    ** (th
183c0 65 20 63 61 63 68 65 20 69 73 20 6c 61 7a 69 6c  e cache is lazil
183d0 79 20 70 6f 70 75 6c 61 74 65 64 29 2e 0a 20 20  y populated)..  
183e0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75    */.    if( pCu
183f0 72 2d 3e 69 73 49 6e 63 72 62 6c 6f 62 48 61 6e  r->isIncrblobHan
18400 64 6c 65 20 26 26 20 21 70 43 75 72 2d 3e 61 4f  dle && !pCur->aO
18410 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20  verflow ){.     
18420 20 69 6e 74 20 6e 4f 76 66 6c 20 3d 20 28 70 43   int nOvfl = (pC
18430 75 72 2d 3e 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61  ur->info.nPayloa
18440 64 2d 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f  d-pCur->info.nLo
18450 63 61 6c 2b 6f 76 66 6c 53 69 7a 65 2d 31 29 2f  cal+ovflSize-1)/
18460 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20 20 20 20  ovflSize;.      
18470 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 20  pCur->aOverflow 
18480 3d 20 28 50 67 6e 6f 20 2a 29 73 71 6c 69 74 65  = (Pgno *)sqlite
18490 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 73 69 7a 65  3MallocZero(size
184a0 6f 66 28 50 67 6e 6f 29 2a 6e 4f 76 66 6c 29 3b  of(Pgno)*nOvfl);
184b0 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 76 66 6c  .      if( nOvfl
184c0 20 26 26 20 21 70 43 75 72 2d 3e 61 4f 76 65 72   && !pCur->aOver
184d0 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 20 20  flow ){.        
184e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
184f0 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  M;.      }.    }
18500 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
18510 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d 6c 69  overflow page-li
18520 73 74 20 63 61 63 68 65 20 68 61 73 20 62 65 65  st cache has bee
18530 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  n allocated and 
18540 74 68 65 0a 20 20 20 20 2a 2a 20 65 6e 74 72 79  the.    ** entry
18550 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 72   for the first r
18560 65 71 75 69 72 65 64 20 6f 76 65 72 66 6c 6f 77  equired overflow
18570 20 70 61 67 65 20 69 73 20 76 61 6c 69 64 2c 20   page is valid, 
18580 73 6b 69 70 0a 20 20 20 20 2a 2a 20 64 69 72 65  skip.    ** dire
18590 63 74 6c 79 20 74 6f 20 69 74 2e 0a 20 20 20 20  ctly to it..    
185a0 2a 2f 0a 20 20 20 20 69 66 28 20 70 43 75 72 2d  */.    if( pCur-
185b0 3e 61 4f 76 65 72 66 6c 6f 77 20 26 26 20 70 43  >aOverflow && pC
185c0 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 6f 66  ur->aOverflow[of
185d0 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 5d 20 29  fset/ovflSize] )
185e0 7b 0a 20 20 20 20 20 20 69 49 64 78 20 3d 20 28  {.      iIdx = (
185f0 6f 66 66 73 65 74 2f 6f 76 66 6c 53 69 7a 65 29  offset/ovflSize)
18600 3b 0a 20 20 20 20 20 20 6e 65 78 74 50 61 67 65  ;.      nextPage
18610 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c   = pCur->aOverfl
18620 6f 77 5b 69 49 64 78 5d 3b 0a 20 20 20 20 20 20  ow[iIdx];.      
18630 6f 66 66 73 65 74 20 3d 20 28 6f 66 66 73 65 74  offset = (offset
18640 25 6f 76 66 6c 53 69 7a 65 29 3b 0a 20 20 20 20  %ovflSize);.    
18650 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 66 6f  }.#endif..    fo
18660 72 28 20 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  r( ; rc==SQLITE_
18670 4f 4b 20 26 26 20 61 6d 74 3e 30 20 26 26 20 6e  OK && amt>0 && n
18680 65 78 74 50 61 67 65 3b 20 69 49 64 78 2b 2b 29  extPage; iIdx++)
18690 7b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  {..#ifndef SQLIT
186a0 45 5f 4f 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a  E_OMIT_INCRBLOB.
186b0 20 20 20 20 20 20 2f 2a 20 49 66 20 72 65 71 75        /* If requ
186c0 69 72 65 64 2c 20 70 6f 70 75 6c 61 74 65 20 74  ired, populate t
186d0 68 65 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  he overflow page
186e0 2d 6c 69 73 74 20 63 61 63 68 65 2e 20 2a 2f 0a  -list cache. */.
186f0 20 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e        if( pCur->
18700 61 4f 76 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20  aOverflow ){.   
18710 20 20 20 20 20 61 73 73 65 72 74 28 21 70 43 75       assert(!pCu
18720 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b 69 49 64  r->aOverflow[iId
18730 78 5d 20 7c 7c 20 70 43 75 72 2d 3e 61 4f 76 65  x] || pCur->aOve
18740 72 66 6c 6f 77 5b 69 49 64 78 5d 3d 3d 6e 65 78  rflow[iIdx]==nex
18750 74 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  tPage);.        
18760 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77 5b  pCur->aOverflow[
18770 69 49 64 78 5d 20 3d 20 6e 65 78 74 50 61 67 65  iIdx] = nextPage
18780 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
18790 0a 0a 20 20 20 20 20 20 69 66 28 20 6f 66 66 73  ..      if( offs
187a0 65 74 3e 3d 6f 76 66 6c 53 69 7a 65 20 29 7b 0a  et>=ovflSize ){.
187b0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
187c0 6e 6c 79 20 72 65 61 73 6f 6e 20 74 6f 20 72 65  nly reason to re
187d0 61 64 20 74 68 69 73 20 70 61 67 65 20 69 73 20  ad this page is 
187e0 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 70 61  to obtain the pa
187f0 67 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 75  ge.        ** nu
18800 6d 62 65 72 20 66 6f 72 20 74 68 65 20 6e 65 78  mber for the nex
18810 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6f 76  t page in the ov
18820 65 72 66 6c 6f 77 20 63 68 61 69 6e 2e 20 54 68  erflow chain. Th
18830 65 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a  e page.        *
18840 2a 20 64 61 74 61 20 69 73 20 6e 6f 74 20 72 65  * data is not re
18850 71 75 69 72 65 64 2e 20 53 6f 20 66 69 72 73 74  quired. So first
18860 20 74 72 79 20 74 6f 20 6c 6f 6f 6b 75 70 20 74   try to lookup t
18870 68 65 20 6f 76 65 72 66 6c 6f 77 0a 20 20 20 20  he overflow.    
18880 20 20 20 20 2a 2a 20 70 61 67 65 2d 6c 69 73 74      ** page-list
18890 20 63 61 63 68 65 2c 20 69 66 20 61 6e 79 2c 20   cache, if any, 
188a0 74 68 65 6e 20 66 61 6c 6c 20 62 61 63 6b 20 74  then fall back t
188b0 6f 20 74 68 65 20 67 65 74 4f 76 65 72 66 6c 6f  o the getOverflo
188c0 77 50 61 67 65 28 29 0a 20 20 20 20 20 20 20 20  wPage().        
188d0 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  ** function..   
188e0 20 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20       */.#ifndef 
188f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52  SQLITE_OMIT_INCR
18900 42 4c 4f 42 0a 20 20 20 20 20 20 20 20 69 66 28  BLOB.        if(
18910 20 70 43 75 72 2d 3e 61 4f 76 65 72 66 6c 6f 77   pCur->aOverflow
18920 20 26 26 20 70 43 75 72 2d 3e 61 4f 76 65 72 66   && pCur->aOverf
18930 6c 6f 77 5b 69 49 64 78 2b 31 5d 20 29 7b 0a 20  low[iIdx+1] ){. 
18940 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61 67           nextPag
18950 65 20 3d 20 70 43 75 72 2d 3e 61 4f 76 65 72 66  e = pCur->aOverf
18960 6c 6f 77 5b 69 49 64 78 2b 31 5d 3b 0a 20 20 20  low[iIdx+1];.   
18970 20 20 20 20 20 7d 20 65 6c 73 65 20 0a 23 65 6e       } else .#en
18980 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 72 63  dif.          rc
18990 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77 50 61   = getOverflowPa
189a0 67 65 28 70 42 74 2c 20 6e 65 78 74 50 61 67 65  ge(pBt, nextPage
189b0 2c 20 30 2c 20 26 6e 65 78 74 50 61 67 65 29 3b  , 0, &nextPage);
189c0 0a 20 20 20 20 20 20 20 20 6f 66 66 73 65 74 20  .        offset 
189d0 2d 3d 20 6f 76 66 6c 53 69 7a 65 3b 0a 20 20 20  -= ovflSize;.   
189e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
189f0 20 20 2f 2a 20 4e 65 65 64 20 74 6f 20 72 65 61    /* Need to rea
18a00 64 20 74 68 69 73 20 70 61 67 65 20 70 72 6f 70  d this page prop
18a10 65 72 6c 79 2e 20 49 74 20 63 6f 6e 74 61 69 6e  erly. It contain
18a20 73 20 73 6f 6d 65 20 6f 66 20 74 68 65 0a 20 20  s some of the.  
18a30 20 20 20 20 20 20 2a 2a 20 72 61 6e 67 65 20 6f        ** range o
18a40 66 20 64 61 74 61 20 74 68 61 74 20 69 73 20 62  f data that is b
18a50 65 69 6e 67 20 72 65 61 64 20 28 65 4f 70 3d 3d  eing read (eOp==
18a60 30 29 20 6f 72 20 77 72 69 74 74 65 6e 20 28 65  0) or written (e
18a70 4f 70 21 3d 30 29 2e 0a 20 20 20 20 20 20 20 20  Op!=0)..        
18a80 2a 2f 0a 20 20 20 20 20 20 20 20 44 62 50 61 67  */.        DbPag
18a90 65 20 2a 70 44 62 50 61 67 65 3b 0a 20 20 20 20  e *pDbPage;.    
18aa0 20 20 20 20 69 6e 74 20 61 20 3d 20 61 6d 74 3b      int a = amt;
18ab0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
18ac0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
18ad0 74 2d 3e 70 50 61 67 65 72 2c 20 6e 65 78 74 50  t->pPager, nextP
18ae0 61 67 65 2c 20 26 70 44 62 50 61 67 65 29 3b 0a  age, &pDbPage);.
18af0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
18b00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
18b10 20 20 20 20 20 20 20 61 50 61 79 6c 6f 61 64 20         aPayload 
18b20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
18b30 74 44 61 74 61 28 70 44 62 50 61 67 65 29 3b 0a  tData(pDbPage);.
18b40 20 20 20 20 20 20 20 20 20 20 6e 65 78 74 50 61            nextPa
18b50 67 65 20 3d 20 67 65 74 34 62 79 74 65 28 61 50  ge = get4byte(aP
18b60 61 79 6c 6f 61 64 29 3b 0a 20 20 20 20 20 20 20  ayload);.       
18b70 20 20 20 69 66 28 20 61 20 2b 20 6f 66 66 73 65     if( a + offse
18b80 74 20 3e 20 6f 76 66 6c 53 69 7a 65 20 29 7b 0a  t > ovflSize ){.
18b90 20 20 20 20 20 20 20 20 20 20 20 20 61 20 3d 20              a = 
18ba0 6f 76 66 6c 53 69 7a 65 20 2d 20 6f 66 66 73 65  ovflSize - offse
18bb0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
18bc0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 63 6f           rc = co
18bd0 70 79 50 61 79 6c 6f 61 64 28 26 61 50 61 79 6c  pyPayload(&aPayl
18be0 6f 61 64 5b 6f 66 66 73 65 74 2b 34 5d 2c 20 70  oad[offset+4], p
18bf0 42 75 66 2c 20 61 2c 20 65 4f 70 2c 20 70 44 62  Buf, a, eOp, pDb
18c00 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
18c10 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
18c20 65 66 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20  ef(pDbPage);.   
18c30 20 20 20 20 20 20 20 6f 66 66 73 65 74 20 3d 20         offset = 
18c40 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 6d 74  0;.          amt
18c50 20 2d 3d 20 61 3b 0a 20 20 20 20 20 20 20 20 20   -= a;.         
18c60 20 70 42 75 66 20 2b 3d 20 61 3b 0a 20 20 20 20   pBuf += a;.    
18c70 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
18c80 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72    }.  }..  if( r
18c90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
18ca0 61 6d 74 3e 30 20 29 7b 0a 20 20 20 20 72 65 74  amt>0 ){.    ret
18cb0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
18cc0 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
18cd0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
18ce0 2a 2a 20 52 65 61 64 20 70 61 72 74 20 6f 66 20  ** Read part of 
18cf0 74 68 65 20 6b 65 79 20 61 73 73 6f 63 69 61 74  the key associat
18d00 65 64 20 77 69 74 68 20 63 75 72 73 6f 72 20 70  ed with cursor p
18d10 43 75 72 2e 20 20 45 78 61 63 74 6c 79 0a 2a 2a  Cur.  Exactly.**
18d20 20 22 61 6d 74 22 20 62 79 74 65 73 20 77 69 6c   "amt" bytes wil
18d30 6c 20 62 65 20 74 72 61 6e 73 66 65 72 65 64 20  l be transfered 
18d40 69 6e 74 6f 20 70 42 75 66 5b 5d 2e 20 20 54 68  into pBuf[].  Th
18d50 65 20 74 72 61 6e 73 66 65 72 0a 2a 2a 20 62 65  e transfer.** be
18d60 67 69 6e 73 20 61 74 20 22 6f 66 66 73 65 74 22  gins at "offset"
18d70 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ..**.** Return S
18d80 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
18d90 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20  ess or an error 
18da0 63 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67  code if anything
18db0 20 67 6f 65 73 0a 2a 2a 20 77 72 6f 6e 67 2e 20   goes.** wrong. 
18dc0 20 41 6e 20 65 72 72 6f 72 20 69 73 20 72 65 74   An error is ret
18dd0 75 72 6e 65 64 20 69 66 20 22 6f 66 66 73 65 74  urned if "offset
18de0 2b 61 6d 74 22 20 69 73 20 6c 61 72 67 65 72 20  +amt" is larger 
18df0 74 68 61 6e 0a 2a 2a 20 74 68 65 20 61 76 61 69  than.** the avai
18e00 6c 61 62 6c 65 20 70 61 79 6c 6f 61 64 2e 0a 2a  lable payload..*
18e10 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72  /.int sqlite3Btr
18e20 65 65 4b 65 79 28 42 74 43 75 72 73 6f 72 20 2a  eeKey(BtCursor *
18e30 70 43 75 72 2c 20 75 33 32 20 6f 66 66 73 65 74  pCur, u32 offset
18e40 2c 20 75 33 32 20 61 6d 74 2c 20 76 6f 69 64 20  , u32 amt, void 
18e50 2a 70 42 75 66 29 7b 0a 20 20 69 6e 74 20 72 63  *pBuf){.  int rc
18e60 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72  ;..  assert( cur
18e70 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43  sorHoldsMutex(pC
18e80 75 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65  ur) );.  rc = re
18e90 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
18ea0 69 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28  ion(pCur);.  if(
18eb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18ec0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  {.    assert( pC
18ed0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
18ee0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 20 20  OR_VALID );.    
18ef0 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 69 50  assert( pCur->iP
18f00 61 67 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e  age>=0 && pCur->
18f10 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
18f20 67 65 5d 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ge] );.    if( p
18f30 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e  Cur->apPage[0]->
18f40 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  intKey ){.      
18f50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
18f60 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20  RRUPT_BKPT;.    
18f70 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 43  }.    assert( pC
18f80 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e  ur->aiIdx[pCur->
18f90 69 50 61 67 65 5d 3c 70 43 75 72 2d 3e 61 70 50  iPage]<pCur->apP
18fa0 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
18fb0 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20 72  ->nCell );.    r
18fc0 63 20 3d 20 61 63 63 65 73 73 50 61 79 6c 6f 61  c = accessPayloa
18fd0 64 28 70 43 75 72 2c 20 6f 66 66 73 65 74 2c 20  d(pCur, offset, 
18fe0 61 6d 74 2c 20 28 75 6e 73 69 67 6e 65 64 20 63  amt, (unsigned c
18ff0 68 61 72 2a 29 70 42 75 66 2c 20 30 2c 20 30 29  har*)pBuf, 0, 0)
19000 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
19010 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  c;.}../*.** Read
19020 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61 74   part of the dat
19030 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  a associated wit
19040 68 20 63 75 72 73 6f 72 20 70 43 75 72 2e 20 20  h cursor pCur.  
19050 45 78 61 63 74 6c 79 0a 2a 2a 20 22 61 6d 74 22  Exactly.** "amt"
19060 20 62 79 74 65 73 20 77 69 6c 6c 20 62 65 20 74   bytes will be t
19070 72 61 6e 73 66 65 72 65 64 20 69 6e 74 6f 20 70  ransfered into p
19080 42 75 66 5b 5d 2e 20 20 54 68 65 20 74 72 61 6e  Buf[].  The tran
19090 73 66 65 72 0a 2a 2a 20 62 65 67 69 6e 73 20 61  sfer.** begins a
190a0 74 20 22 6f 66 66 73 65 74 22 2e 0a 2a 2a 0a 2a  t "offset"..**.*
190b0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
190c0 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
190d0 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
190e0 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 0a  f anything goes.
190f0 2a 2a 20 77 72 6f 6e 67 2e 20 20 41 6e 20 65 72  ** wrong.  An er
19100 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20  ror is returned 
19110 69 66 20 22 6f 66 66 73 65 74 2b 61 6d 74 22 20  if "offset+amt" 
19120 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 0a 2a  is larger than.*
19130 2a 20 74 68 65 20 61 76 61 69 6c 61 62 6c 65 20  * the available 
19140 70 61 79 6c 6f 61 64 2e 0a 2a 2f 0a 69 6e 74 20  payload..*/.int 
19150 73 71 6c 69 74 65 33 42 74 72 65 65 44 61 74 61  sqlite3BtreeData
19160 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c  (BtCursor *pCur,
19170 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32   u32 offset, u32
19180 20 61 6d 74 2c 20 76 6f 69 64 20 2a 70 42 75 66   amt, void *pBuf
19190 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69  ){.  int rc;..#i
191a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
191b0 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 69 66 20  T_INCRBLOB.  if 
191c0 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
191d0 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 20 29  CURSOR_INVALID )
191e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
191f0 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 23  ITE_ABORT;.  }.#
19200 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28  endif..  assert(
19210 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
19220 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
19230 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
19240 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
19250 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19260 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  OK ){.    assert
19270 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d  ( pCur->eState==
19280 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 3b 0a  CURSOR_VALID );.
19290 20 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72      assert( pCur
192a0 2d 3e 69 50 61 67 65 3e 3d 30 20 26 26 20 70 43  ->iPage>=0 && pC
192b0 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
192c0 3e 69 50 61 67 65 5d 20 29 3b 0a 20 20 20 20 61  >iPage] );.    a
192d0 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 69 49  ssert( pCur->aiI
192e0 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c  dx[pCur->iPage]<
192f0 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75  pCur->apPage[pCu
19300 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c  r->iPage]->nCell
19310 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 63 63   );.    rc = acc
19320 65 73 73 50 61 79 6c 6f 61 64 28 70 43 75 72 2c  essPayload(pCur,
19330 20 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 70 42   offset, amt, pB
19340 75 66 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 20  uf, 1, 0);.  }. 
19350 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19360 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
19370 69 6e 74 65 72 20 74 6f 20 70 61 79 6c 6f 61 64  inter to payload
19380 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
19390 6d 20 74 68 65 20 65 6e 74 72 79 20 74 68 61 74  m the entry that
193a0 20 74 68 65 20 0a 2a 2a 20 70 43 75 72 20 63 75   the .** pCur cu
193b0 72 73 6f 72 20 69 73 20 70 6f 69 6e 74 69 6e 67  rsor is pointing
193c0 20 74 6f 2e 20 20 54 68 65 20 70 6f 69 6e 74 65   to.  The pointe
193d0 72 20 69 73 20 74 6f 20 74 68 65 20 62 65 67 69  r is to the begi
193e0 6e 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 65 20  nning of.** the 
193f0 6b 65 79 20 69 66 20 73 6b 69 70 4b 65 79 3d 3d  key if skipKey==
19400 30 20 61 6e 64 20 69 74 20 70 6f 69 6e 74 73 20  0 and it points 
19410 74 6f 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  to the beginning
19420 20 6f 66 20 64 61 74 61 20 69 66 0a 2a 2a 20 73   of data if.** s
19430 6b 69 70 4b 65 79 3d 3d 31 2e 20 20 54 68 65 20  kipKey==1.  The 
19440 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
19450 6f 66 20 61 76 61 69 6c 61 62 6c 65 20 6b 65 79  of available key
19460 2f 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e  /data is written
19470 0a 2a 2a 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 20  .** into *pAmt. 
19480 20 49 66 20 2a 70 41 6d 74 3d 3d 30 2c 20 74 68   If *pAmt==0, th
19490 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  en the value ret
194a0 75 72 6e 65 64 20 77 69 6c 6c 20 6e 6f 74 20 62  urned will not b
194b0 65 0a 2a 2a 20 61 20 76 61 6c 69 64 20 70 6f 69  e.** a valid poi
194c0 6e 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  nter..**.** This
194d0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 6e 20 6f   routine is an o
194e0 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 49 74  ptimization.  It
194f0 20 69 73 20 63 6f 6d 6d 6f 6e 20 66 6f 72 20 74   is common for t
19500 68 65 20 65 6e 74 69 72 65 20 6b 65 79 0a 2a 2a  he entire key.**
19510 20 61 6e 64 20 64 61 74 61 20 74 6f 20 66 69 74   and data to fit
19520 20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 20 70 61   on the local pa
19530 67 65 20 61 6e 64 20 66 6f 72 20 74 68 65 72 65  ge and for there
19540 20 74 6f 20 62 65 20 6e 6f 20 6f 76 65 72 66 6c   to be no overfl
19550 6f 77 0a 2a 2a 20 70 61 67 65 73 2e 20 20 57 68  ow.** pages.  Wh
19560 65 6e 20 74 68 61 74 20 69 73 20 73 6f 2c 20 74  en that is so, t
19570 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 20  his routine can 
19580 62 65 20 75 73 65 64 20 74 6f 20 61 63 63 65 73  be used to acces
19590 73 20 74 68 65 0a 2a 2a 20 6b 65 79 20 61 6e 64  s the.** key and
195a0 20 64 61 74 61 20 77 69 74 68 6f 75 74 20 6d 61   data without ma
195b0 6b 69 6e 67 20 61 20 63 6f 70 79 2e 20 20 49 66  king a copy.  If
195c0 20 74 68 65 20 6b 65 79 20 61 6e 64 2f 6f 72 20   the key and/or 
195d0 64 61 74 61 20 73 70 69 6c 6c 73 0a 2a 2a 20 6f  data spills.** o
195e0 6e 74 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  nto overflow pag
195f0 65 73 2c 20 74 68 65 6e 20 61 63 63 65 73 73 50  es, then accessP
19600 61 79 6c 6f 61 64 28 29 20 6d 75 73 74 20 62 65  ayload() must be
19610 20 75 73 65 64 20 74 6f 20 72 65 61 73 73 65 6d   used to reassem
19620 62 6c 79 0a 2a 2a 20 74 68 65 20 6b 65 79 2f 64  bly.** the key/d
19630 61 74 61 20 61 6e 64 20 63 6f 70 79 20 69 74 20  ata and copy it 
19640 69 6e 74 6f 20 61 20 70 72 65 61 6c 6c 6f 63 61  into a prealloca
19650 74 65 64 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  ted buffer..**.*
19660 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20 72 65  * The pointer re
19670 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 72  turned by this r
19680 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 64 69 72  outine looks dir
19690 65 63 74 6c 79 20 69 6e 74 6f 20 74 68 65 20 63  ectly into the c
196a0 61 63 68 65 64 0a 2a 2a 20 70 61 67 65 20 6f 66  ached.** page of
196b0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
196c0 54 68 65 20 64 61 74 61 20 6d 69 67 68 74 20 63  The data might c
196d0 68 61 6e 67 65 20 6f 72 20 6d 6f 76 65 20 74 68  hange or move th
196e0 65 20 6e 65 78 74 20 74 69 6d 65 0a 2a 2a 20 61  e next time.** a
196f0 6e 79 20 62 74 72 65 65 20 72 6f 75 74 69 6e 65  ny btree routine
19700 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73   is called..*/.s
19710 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69  tatic const unsi
19720 67 6e 65 64 20 63 68 61 72 20 2a 66 65 74 63 68  gned char *fetch
19730 50 61 79 6c 6f 61 64 28 0a 20 20 42 74 43 75 72  Payload(.  BtCur
19740 73 6f 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20  sor *pCur,      
19750 2f 2a 20 43 75 72 73 6f 72 20 70 6f 69 6e 74 69  /* Cursor pointi
19760 6e 67 20 74 6f 20 65 6e 74 72 79 20 74 6f 20 72  ng to entry to r
19770 65 61 64 20 66 72 6f 6d 20 2a 2f 0a 20 20 69 6e  ead from */.  in
19780 74 20 2a 70 41 6d 74 2c 20 20 20 20 20 20 20 20  t *pAmt,        
19790 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
197a0 6e 75 6d 62 65 72 20 6f 66 20 61 76 61 69 6c 61  number of availa
197b0 62 6c 65 20 62 79 74 65 73 20 68 65 72 65 20 2a  ble bytes here *
197c0 2f 0a 20 20 69 6e 74 20 73 6b 69 70 4b 65 79 20  /.  int skipKey 
197d0 20 20 20 20 20 20 20 20 20 2f 2a 20 72 65 61 64           /* read
197e0 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 64 61   beginning at da
197f0 74 61 20 69 66 20 74 68 69 73 20 69 73 20 74 72  ta if this is tr
19800 75 65 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67  ue */.){.  unsig
19810 6e 65 64 20 63 68 61 72 20 2a 61 50 61 79 6c 6f  ned char *aPaylo
19820 61 64 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  ad;.  MemPage *p
19830 50 61 67 65 3b 0a 20 20 75 33 32 20 6e 4b 65 79  Page;.  u32 nKey
19840 3b 0a 20 20 69 6e 74 20 6e 4c 6f 63 61 6c 3b 0a  ;.  int nLocal;.
19850 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 21  .  assert( pCur!
19860 3d 30 20 26 26 20 70 43 75 72 2d 3e 69 50 61 67  =0 && pCur->iPag
19870 65 3e 3d 30 20 26 26 20 70 43 75 72 2d 3e 61 70  e>=0 && pCur->ap
19880 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
19890 5d 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43  ]);.  assert( pC
198a0 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
198b0 4f 52 5f 56 41 4c 49 44 20 29 3b 0a 20 20 61 73  OR_VALID );.  as
198c0 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64  sert( cursorHold
198d0 73 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a  sMutex(pCur) );.
198e0 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
198f0 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
19900 67 65 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 70  ge];.  assert( p
19910 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
19920 3e 69 50 61 67 65 5d 3c 70 50 61 67 65 2d 3e 6e  >iPage]<pPage->n
19930 43 65 6c 6c 20 29 3b 0a 20 20 67 65 74 43 65 6c  Cell );.  getCel
19940 6c 49 6e 66 6f 28 70 43 75 72 29 3b 0a 20 20 61  lInfo(pCur);.  a
19950 50 61 79 6c 6f 61 64 20 3d 20 70 43 75 72 2d 3e  Payload = pCur->
19960 69 6e 66 6f 2e 70 43 65 6c 6c 3b 0a 20 20 61 50  info.pCell;.  aP
19970 61 79 6c 6f 61 64 20 2b 3d 20 70 43 75 72 2d 3e  ayload += pCur->
19980 69 6e 66 6f 2e 6e 48 65 61 64 65 72 3b 0a 20 20  info.nHeader;.  
19990 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65  if( pPage->intKe
199a0 79 20 29 7b 0a 20 20 20 20 6e 4b 65 79 20 3d 20  y ){.    nKey = 
199b0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
199c0 6e 4b 65 79 20 3d 20 70 43 75 72 2d 3e 69 6e 66  nKey = pCur->inf
199d0 6f 2e 6e 4b 65 79 3b 0a 20 20 7d 0a 20 20 69 66  o.nKey;.  }.  if
199e0 28 20 73 6b 69 70 4b 65 79 20 29 7b 0a 20 20 20  ( skipKey ){.   
199f0 20 61 50 61 79 6c 6f 61 64 20 2b 3d 20 6e 4b 65   aPayload += nKe
19a00 79 3b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20  y;.    nLocal = 
19a10 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
19a20 6c 20 2d 20 6e 4b 65 79 3b 0a 20 20 7d 65 6c 73  l - nKey;.  }els
19a30 65 7b 0a 20 20 20 20 6e 4c 6f 63 61 6c 20 3d 20  e{.    nLocal = 
19a40 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4c 6f 63 61  pCur->info.nLoca
19a50 6c 3b 0a 20 20 20 20 69 66 28 20 6e 4c 6f 63 61  l;.    if( nLoca
19a60 6c 3e 6e 4b 65 79 20 29 7b 0a 20 20 20 20 20 20  l>nKey ){.      
19a70 6e 4c 6f 63 61 6c 20 3d 20 6e 4b 65 79 3b 0a 20  nLocal = nKey;. 
19a80 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 41 6d 74     }.  }.  *pAmt
19a90 20 3d 20 6e 4c 6f 63 61 6c 3b 0a 20 20 72 65 74   = nLocal;.  ret
19aa0 75 72 6e 20 61 50 61 79 6c 6f 61 64 3b 0a 7d 0a  urn aPayload;.}.
19ab0 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20  ../*.** For the 
19ac0 65 6e 74 72 79 20 74 68 61 74 20 63 75 72 73 6f  entry that curso
19ad0 72 20 70 43 75 72 20 69 73 20 70 6f 69 6e 74 20  r pCur is point 
19ae0 74 6f 2c 20 72 65 74 75 72 6e 20 61 73 0a 2a 2a  to, return as.**
19af0 20 6d 61 6e 79 20 62 79 74 65 73 20 6f 66 20 74   many bytes of t
19b00 68 65 20 6b 65 79 20 6f 72 20 64 61 74 61 20 61  he key or data a
19b10 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  s are available 
19b20 6f 6e 20 74 68 65 20 6c 6f 63 61 6c 0a 2a 2a 20  on the local.** 
19b30 62 2d 74 72 65 65 20 70 61 67 65 2e 20 20 57 72  b-tree page.  Wr
19b40 69 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ite the number o
19b50 66 20 61 76 61 69 6c 61 62 6c 65 20 62 79 74 65  f available byte
19b60 73 20 69 6e 74 6f 20 2a 70 41 6d 74 2e 0a 2a 2a  s into *pAmt..**
19b70 0a 2a 2a 20 54 68 65 20 70 6f 69 6e 74 65 72 20  .** The pointer 
19b80 72 65 74 75 72 6e 65 64 20 69 73 20 65 70 68 65  returned is ephe
19b90 6d 65 72 61 6c 2e 20 20 54 68 65 20 6b 65 79 2f  meral.  The key/
19ba0 64 61 74 61 20 6d 61 79 20 6d 6f 76 65 0a 2a 2a  data may move.**
19bb0 20 6f 72 20 62 65 20 64 65 73 74 72 6f 79 65 64   or be destroyed
19bc0 20 6f 6e 20 74 68 65 20 6e 65 78 74 20 63 61 6c   on the next cal
19bd0 6c 20 74 6f 20 61 6e 79 20 42 74 72 65 65 20 72  l to any Btree r
19be0 6f 75 74 69 6e 65 2c 0a 2a 2a 20 69 6e 63 6c 75  outine,.** inclu
19bf0 64 69 6e 67 20 63 61 6c 6c 73 20 66 72 6f 6d 20  ding calls from 
19c00 6f 74 68 65 72 20 74 68 72 65 61 64 73 20 61 67  other threads ag
19c10 61 69 6e 73 74 20 74 68 65 20 73 61 6d 65 20 63  ainst the same c
19c20 61 63 68 65 2e 0a 2a 2a 20 48 65 6e 63 65 2c 20  ache..** Hence, 
19c30 61 20 6d 75 74 65 78 20 6f 6e 20 74 68 65 20 42  a mutex on the B
19c40 74 53 68 61 72 65 64 20 73 68 6f 75 6c 64 20 62  tShared should b
19c50 65 20 68 65 6c 64 20 70 72 69 6f 72 20 74 6f 20  e held prior to 
19c60 63 61 6c 6c 69 6e 67 0a 2a 2a 20 74 68 69 73 20  calling.** this 
19c70 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 54  routine..**.** T
19c80 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 69 73  hese routines is
19c90 20 75 73 65 64 20 74 6f 20 67 65 74 20 71 75 69   used to get qui
19ca0 63 6b 20 61 63 63 65 73 73 20 74 6f 20 6b 65 79  ck access to key
19cb0 20 61 6e 64 20 64 61 74 61 0a 2a 2a 20 69 6e 20   and data.** in 
19cc0 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20  the common case 
19cd0 77 68 65 72 65 20 6e 6f 20 6f 76 65 72 66 6c 6f  where no overflo
19ce0 77 20 70 61 67 65 73 20 61 72 65 20 75 73 65 64  w pages are used
19cf0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20  ..*/.const void 
19d00 2a 73 71 6c 69 74 65 33 42 74 72 65 65 4b 65 79  *sqlite3BtreeKey
19d10 46 65 74 63 68 28 42 74 43 75 72 73 6f 72 20 2a  Fetch(BtCursor *
19d20 70 43 75 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29  pCur, int *pAmt)
19d30 7b 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  {.  assert( curs
19d40 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
19d50 72 29 20 29 3b 0a 20 20 69 66 28 20 70 43 75 72  r) );.  if( pCur
19d60 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52  ->eState==CURSOR
19d70 5f 56 41 4c 49 44 20 29 7b 0a 20 20 20 20 72 65  _VALID ){.    re
19d80 74 75 72 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64  turn (const void
19d90 2a 29 66 65 74 63 68 50 61 79 6c 6f 61 64 28 70  *)fetchPayload(p
19da0 43 75 72 2c 20 70 41 6d 74 2c 20 30 29 3b 0a 20  Cur, pAmt, 0);. 
19db0 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
19dc0 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
19dd0 69 74 65 33 42 74 72 65 65 44 61 74 61 46 65 74  ite3BtreeDataFet
19de0 63 68 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ch(BtCursor *pCu
19df0 72 2c 20 69 6e 74 20 2a 70 41 6d 74 29 7b 0a 20  r, int *pAmt){. 
19e00 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48   assert( cursorH
19e10 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20  oldsMutex(pCur) 
19e20 29 3b 0a 20 20 69 66 28 20 70 43 75 72 2d 3e 65  );.  if( pCur->e
19e30 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
19e40 4c 49 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LID ){.    retur
19e50 6e 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 66  n (const void*)f
19e60 65 74 63 68 50 61 79 6c 6f 61 64 28 70 43 75 72  etchPayload(pCur
19e70 2c 20 70 41 6d 74 2c 20 31 29 3b 0a 20 20 7d 0a  , pAmt, 1);.  }.
19e80 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a    return 0;.}...
19e90 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63  /*.** Move the c
19ea0 75 72 73 6f 72 20 64 6f 77 6e 20 74 6f 20 61 20  ursor down to a 
19eb0 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 2e 20  new child page. 
19ec0 20 54 68 65 20 6e 65 77 50 67 6e 6f 20 61 72 67   The newPgno arg
19ed0 75 6d 65 6e 74 20 69 73 20 74 68 65 0a 2a 2a 20  ument is the.** 
19ee0 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74  page number of t
19ef0 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 74 6f  he child page to
19f00 20 6d 6f 76 65 20 74 6f 2e 0a 2a 2f 0a 73 74 61   move to..*/.sta
19f10 74 69 63 20 69 6e 74 20 6d 6f 76 65 54 6f 43 68  tic int moveToCh
19f20 69 6c 64 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ild(BtCursor *pC
19f30 75 72 2c 20 75 33 32 20 6e 65 77 50 67 6e 6f 29  ur, u32 newPgno)
19f40 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
19f50 74 20 69 20 3d 20 70 43 75 72 2d 3e 69 50 61 67  t i = pCur->iPag
19f60 65 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e  e;.  MemPage *pN
19f70 65 77 50 61 67 65 3b 0a 20 20 42 74 53 68 61 72  ewPage;.  BtShar
19f80 65 64 20 2a 70 42 74 20 3d 20 70 43 75 72 2d 3e  ed *pBt = pCur->
19f90 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  pBt;..  assert( 
19fa0 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78  cursorHoldsMutex
19fb0 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65  (pCur) );.  asse
19fc0 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65  rt( pCur->eState
19fd0 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29  ==CURSOR_VALID )
19fe0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ;.  assert( pCur
19ff0 2d 3e 69 50 61 67 65 3c 42 54 43 55 52 53 4f 52  ->iPage<BTCURSOR
1a000 5f 4d 41 58 5f 44 45 50 54 48 20 29 3b 0a 20 20  _MAX_DEPTH );.  
1a010 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e  if( pCur->iPage>
1a020 3d 28 42 54 43 55 52 53 4f 52 5f 4d 41 58 5f 44  =(BTCURSOR_MAX_D
1a030 45 50 54 48 2d 31 29 20 29 7b 0a 20 20 20 20 72  EPTH-1) ){.    r
1a040 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
1a050 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  RUPT_BKPT;.  }. 
1a060 20 72 63 20 3d 20 67 65 74 41 6e 64 49 6e 69 74   rc = getAndInit
1a070 50 61 67 65 28 70 42 74 2c 20 6e 65 77 50 67 6e  Page(pBt, newPgn
1a080 6f 2c 20 26 70 4e 65 77 50 61 67 65 29 3b 0a 20  o, &pNewPage);. 
1a090 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1a0a0 20 72 63 3b 0a 20 20 70 43 75 72 2d 3e 61 70 50   rc;.  pCur->apP
1a0b0 61 67 65 5b 69 2b 31 5d 20 3d 20 70 4e 65 77 50  age[i+1] = pNewP
1a0c0 61 67 65 3b 0a 20 20 70 43 75 72 2d 3e 61 69 49  age;.  pCur->aiI
1a0d0 64 78 5b 69 2b 31 5d 20 3d 20 30 3b 0a 20 20 70  dx[i+1] = 0;.  p
1a0e0 43 75 72 2d 3e 69 50 61 67 65 2b 2b 3b 0a 0a 20  Cur->iPage++;.. 
1a0f0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1a100 65 20 3d 20 30 3b 0a 20 20 70 43 75 72 2d 3e 76  e = 0;.  pCur->v
1a110 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a 20 20  alidNKey = 0;.  
1a120 69 66 28 20 70 4e 65 77 50 61 67 65 2d 3e 6e 43  if( pNewPage->nC
1a130 65 6c 6c 3c 31 20 29 7b 0a 20 20 20 20 72 65 74  ell<1 ){.    ret
1a140 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
1a150 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 72  PT_BKPT;.  }.  r
1a160 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1a170 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .}..#ifndef NDEB
1a180 55 47 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 70 50  UG./*.** Page pP
1a190 61 72 65 6e 74 20 69 73 20 61 6e 20 69 6e 74 65  arent is an inte
1a1a0 72 6e 61 6c 20 28 6e 6f 6e 2d 6c 65 61 66 29 20  rnal (non-leaf) 
1a1b0 74 72 65 65 20 70 61 67 65 2e 20 54 68 69 73 20  tree page. This 
1a1c0 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 61 73 73  function .** ass
1a1d0 65 72 74 73 20 74 68 61 74 20 70 61 67 65 20 6e  erts that page n
1a1e0 75 6d 62 65 72 20 69 43 68 69 6c 64 20 69 73 20  umber iChild is 
1a1f0 74 68 65 20 6c 65 66 74 2d 63 68 69 6c 64 20 69  the left-child i
1a200 66 20 74 68 65 20 69 49 64 78 27 74 68 0a 2a 2a  f the iIdx'th.**
1a210 20 63 65 6c 6c 20 69 6e 20 70 61 67 65 20 70 50   cell in page pP
1a220 61 72 65 6e 74 2e 20 4f 72 2c 20 69 66 20 69 49  arent. Or, if iI
1a230 64 78 20 69 73 20 65 71 75 61 6c 20 74 6f 20 74  dx is equal to t
1a240 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
1a250 6f 66 0a 2a 2a 20 63 65 6c 6c 73 20 69 6e 20 70  of.** cells in p
1a260 50 61 72 65 6e 74 2c 20 74 68 61 74 20 70 61 67  Parent, that pag
1a270 65 20 6e 75 6d 62 65 72 20 69 43 68 69 6c 64 20  e number iChild 
1a280 69 73 20 74 68 65 20 72 69 67 68 74 2d 63 68 69  is the right-chi
1a290 6c 64 20 6f 66 0a 2a 2a 20 74 68 65 20 70 61 67  ld of.** the pag
1a2a0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1a2b0 64 20 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e  d assertParentIn
1a2c0 64 65 78 28 4d 65 6d 50 61 67 65 20 2a 70 50 61  dex(MemPage *pPa
1a2d0 72 65 6e 74 2c 20 69 6e 74 20 69 49 64 78 2c 20  rent, int iIdx, 
1a2e0 50 67 6e 6f 20 69 43 68 69 6c 64 29 7b 0a 20 20  Pgno iChild){.  
1a2f0 61 73 73 65 72 74 28 20 69 49 64 78 3c 3d 70 50  assert( iIdx<=pP
1a300 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 3b 0a  arent->nCell );.
1a310 20 20 69 66 28 20 69 49 64 78 3d 3d 70 50 61 72    if( iIdx==pPar
1a320 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
1a330 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
1a340 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
1a350 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
1a360 66 66 73 65 74 2b 38 5d 29 3d 3d 69 43 68 69 6c  ffset+8])==iChil
1a370 64 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  d );.  }else{.  
1a380 20 20 61 73 73 65 72 74 28 20 67 65 74 34 62 79    assert( get4by
1a390 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61 72  te(findCell(pPar
1a3a0 65 6e 74 2c 20 69 49 64 78 29 29 3d 3d 69 43 68  ent, iIdx))==iCh
1a3b0 69 6c 64 20 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6c  ild );.  }.}.#el
1a3c0 73 65 0a 23 20 20 64 65 66 69 6e 65 20 61 73 73  se.#  define ass
1a3d0 65 72 74 50 61 72 65 6e 74 49 6e 64 65 78 28 78  ertParentIndex(x
1a3e0 2c 79 2c 7a 29 20 0a 23 65 6e 64 69 66 0a 0a 2f  ,y,z) .#endif../
1a3f0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 63 75  *.** Move the cu
1a400 72 73 6f 72 20 75 70 20 74 6f 20 74 68 65 20 70  rsor up to the p
1a410 61 72 65 6e 74 20 70 61 67 65 2e 0a 2a 2a 0a 2a  arent page..**.*
1a420 2a 20 70 43 75 72 2d 3e 69 64 78 20 69 73 20 73  * pCur->idx is s
1a430 65 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 69  et to the cell i
1a440 6e 64 65 78 20 74 68 61 74 20 63 6f 6e 74 61 69  ndex that contai
1a450 6e 73 20 74 68 65 20 70 6f 69 6e 74 65 72 0a 2a  ns the pointer.*
1a460 2a 20 74 6f 20 74 68 65 20 70 61 67 65 20 77 65  * to the page we
1a470 20 61 72 65 20 63 6f 6d 69 6e 67 20 66 72 6f 6d   are coming from
1a480 2e 20 20 49 66 20 77 65 20 61 72 65 20 63 6f 6d  .  If we are com
1a490 69 6e 67 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20  ing from the.** 
1a4a0 72 69 67 68 74 2d 6d 6f 73 74 20 63 68 69 6c 64  right-most child
1a4b0 20 70 61 67 65 20 74 68 65 6e 20 70 43 75 72 2d   page then pCur-
1a4c0 3e 69 64 78 20 69 73 20 73 65 74 20 74 6f 20 6f  >idx is set to o
1a4d0 6e 65 20 6d 6f 72 65 20 74 68 61 6e 0a 2a 2a 20  ne more than.** 
1a4e0 74 68 65 20 6c 61 72 67 65 73 74 20 63 65 6c 6c  the largest cell
1a4f0 20 69 6e 64 65 78 2e 0a 2a 2f 0a 76 6f 69 64 20   index..*/.void 
1a500 73 71 6c 69 74 65 33 42 74 72 65 65 4d 6f 76 65  sqlite3BtreeMove
1a510 54 6f 50 61 72 65 6e 74 28 42 74 43 75 72 73 6f  ToParent(BtCurso
1a520 72 20 2a 70 43 75 72 29 7b 0a 20 20 61 73 73 65  r *pCur){.  asse
1a530 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d  rt( cursorHoldsM
1a540 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20  utex(pCur) );.  
1a550 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53  assert( pCur->eS
1a560 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c  tate==CURSOR_VAL
1a570 49 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ID );.  assert( 
1a580 70 43 75 72 2d 3e 69 50 61 67 65 3e 30 20 29 3b  pCur->iPage>0 );
1a590 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1a5a0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1a5b0 61 67 65 5d 20 29 3b 0a 20 20 61 73 73 65 72 74  age] );.  assert
1a5c0 50 61 72 65 6e 74 49 6e 64 65 78 28 0a 20 20 20  ParentIndex(.   
1a5d0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70 43   pCur->apPage[pC
1a5e0 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a 20  ur->iPage-1], . 
1a5f0 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70     pCur->aiIdx[p
1a600 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 2c 20 0a  Cur->iPage-1], .
1a610 20 20 20 20 70 43 75 72 2d 3e 61 70 50 61 67 65      pCur->apPage
1a620 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 70  [pCur->iPage]->p
1a630 67 6e 6f 0a 20 20 29 3b 0a 20 20 72 65 6c 65 61  gno.  );.  relea
1a640 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
1a650 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1a660 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50 61 67 65  );.  pCur->iPage
1a670 2d 2d 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f  --;.  pCur->info
1a680 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
1a690 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20  ur->validNKey = 
1a6a0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  0;.}../*.** Move
1a6b0 20 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 74   the cursor to t
1a6c0 68 65 20 72 6f 6f 74 20 70 61 67 65 0a 2a 2f 0a  he root page.*/.
1a6d0 73 74 61 74 69 63 20 69 6e 74 20 6d 6f 76 65 54  static int moveT
1a6e0 6f 52 6f 6f 74 28 42 74 43 75 72 73 6f 72 20 2a  oRoot(BtCursor *
1a6f0 70 43 75 72 29 7b 0a 20 20 4d 65 6d 50 61 67 65  pCur){.  MemPage
1a700 20 2a 70 52 6f 6f 74 3b 0a 20 20 69 6e 74 20 72   *pRoot;.  int r
1a710 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1a720 20 42 74 72 65 65 20 2a 70 20 3d 20 70 43 75 72   Btree *p = pCur
1a730 2d 3e 70 42 74 72 65 65 3b 0a 20 20 42 74 53 68  ->pBtree;.  BtSh
1a740 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70  ared *pBt = p->p
1a750 42 74 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  Bt;..  assert( c
1a760 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28  ursorHoldsMutex(
1a770 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73 65 72  pCur) );.  asser
1a780 74 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  t( CURSOR_INVALI
1a790 44 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55 49  D < CURSOR_REQUI
1a7a0 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73 65  RESEEK );.  asse
1a7b0 72 74 28 20 43 55 52 53 4f 52 5f 56 41 4c 49 44  rt( CURSOR_VALID
1a7c0 20 20 20 3c 20 43 55 52 53 4f 52 5f 52 45 51 55     < CURSOR_REQU
1a7d0 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 61 73 73  IRESEEK );.  ass
1a7e0 65 72 74 28 20 43 55 52 53 4f 52 5f 46 41 55 4c  ert( CURSOR_FAUL
1a7f0 54 20 20 20 3e 20 43 55 52 53 4f 52 5f 52 45 51  T   > CURSOR_REQ
1a800 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69 66  UIRESEEK );.  if
1a810 28 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3e 3d  ( pCur->eState>=
1a820 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
1a830 45 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 70 43  EK ){.    if( pC
1a840 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52 53  ur->eState==CURS
1a850 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20 20  OR_FAULT ){.    
1a860 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73    return pCur->s
1a870 6b 69 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  kip;.    }.    c
1a880 6c 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69  learCursorPositi
1a890 6f 6e 28 70 43 75 72 29 3b 0a 20 20 7d 0a 0a 20  on(pCur);.  }.. 
1a8a0 20 69 66 28 20 70 43 75 72 2d 3e 69 50 61 67 65   if( pCur->iPage
1a8b0 3e 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  >=0 ){.    int i
1a8c0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  ;.    for(i=1; i
1a8d0 3c 3d 70 43 75 72 2d 3e 69 50 61 67 65 3b 20 69  <=pCur->iPage; i
1a8e0 2b 2b 29 7b 0a 20 20 20 20 20 20 72 65 6c 65 61  ++){.      relea
1a8f0 73 65 50 61 67 65 28 70 43 75 72 2d 3e 61 70 50  sePage(pCur->apP
1a900 61 67 65 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  age[i]);.    }. 
1a910 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
1a920 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b  .      SQLITE_OK
1a930 21 3d 28 72 63 20 3d 20 67 65 74 41 6e 64 49 6e  !=(rc = getAndIn
1a940 69 74 50 61 67 65 28 70 42 74 2c 20 70 43 75 72  itPage(pBt, pCur
1a950 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 26 70 43 75  ->pgnoRoot, &pCu
1a960 72 2d 3e 61 70 50 61 67 65 5b 30 5d 29 29 0a 20  r->apPage[0])). 
1a970 20 20 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72     ){.      pCur
1a980 2d 3e 65 53 74 61 74 65 20 3d 20 43 55 52 53 4f  ->eState = CURSO
1a990 52 5f 49 4e 56 41 4c 49 44 3b 0a 20 20 20 20 20  R_INVALID;.     
1a9a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1a9b0 7d 0a 20 20 7d 0a 0a 20 20 70 52 6f 6f 74 20 3d  }.  }..  pRoot =
1a9c0 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 30 5d   pCur->apPage[0]
1a9d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 52 6f 6f  ;.  assert( pRoo
1a9e0 74 2d 3e 70 67 6e 6f 3d 3d 70 43 75 72 2d 3e 70  t->pgno==pCur->p
1a9f0 67 6e 6f 52 6f 6f 74 20 29 3b 0a 20 20 70 43 75  gnoRoot );.  pCu
1aa00 72 2d 3e 69 50 61 67 65 20 3d 20 30 3b 0a 20 20  r->iPage = 0;.  
1aa10 70 43 75 72 2d 3e 61 69 49 64 78 5b 30 5d 20 3d  pCur->aiIdx[0] =
1aa20 20 30 3b 0a 20 20 70 43 75 72 2d 3e 69 6e 66 6f   0;.  pCur->info
1aa30 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 43  .nSize = 0;.  pC
1aa40 75 72 2d 3e 61 74 4c 61 73 74 20 3d 20 30 3b 0a  ur->atLast = 0;.
1aa50 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65    pCur->validNKe
1aa60 79 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 52  y = 0;..  if( pR
1aa70 6f 6f 74 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 26 26  oot->nCell==0 &&
1aa80 20 21 70 52 6f 6f 74 2d 3e 6c 65 61 66 20 29 7b   !pRoot->leaf ){
1aa90 0a 20 20 20 20 50 67 6e 6f 20 73 75 62 70 61 67  .    Pgno subpag
1aaa0 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
1aab0 52 6f 6f 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b  Root->pgno==1 );
1aac0 0a 20 20 20 20 73 75 62 70 61 67 65 20 3d 20 67  .    subpage = g
1aad0 65 74 34 62 79 74 65 28 26 70 52 6f 6f 74 2d 3e  et4byte(&pRoot->
1aae0 61 44 61 74 61 5b 70 52 6f 6f 74 2d 3e 68 64 72  aData[pRoot->hdr
1aaf0 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20  Offset+8]);.    
1ab00 61 73 73 65 72 74 28 20 73 75 62 70 61 67 65 3e  assert( subpage>
1ab10 30 20 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 65  0 );.    pCur->e
1ab20 53 74 61 74 65 20 3d 20 43 55 52 53 4f 52 5f 56  State = CURSOR_V
1ab30 41 4c 49 44 3b 0a 20 20 20 20 72 63 20 3d 20 6d  ALID;.    rc = m
1ab40 6f 76 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c  oveToChild(pCur,
1ab50 20 73 75 62 70 61 67 65 29 3b 0a 20 20 7d 65 6c   subpage);.  }el
1ab60 73 65 7b 0a 20 20 20 20 70 43 75 72 2d 3e 65 53  se{.    pCur->eS
1ab70 74 61 74 65 20 3d 20 28 28 70 52 6f 6f 74 2d 3e  tate = ((pRoot->
1ab80 6e 43 65 6c 6c 3e 30 29 3f 43 55 52 53 4f 52 5f  nCell>0)?CURSOR_
1ab90 56 41 4c 49 44 3a 43 55 52 53 4f 52 5f 49 4e 56  VALID:CURSOR_INV
1aba0 41 4c 49 44 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ALID);.  }.  ret
1abb0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1abc0 20 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72   Move the cursor
1abd0 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 6c 65 66   down to the lef
1abe0 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
1abf0 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
1ac00 20 65 6e 74 72 79 20 74 6f 20 77 68 69 63 68 20   entry to which 
1ac10 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  it is currently 
1ac20 70 6f 69 6e 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  pointing..**.** 
1ac30 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 6c 65  The left-most le
1ac40 61 66 20 69 73 20 74 68 65 20 6f 6e 65 20 77 69  af is the one wi
1ac50 74 68 20 74 68 65 20 73 6d 61 6c 6c 65 73 74 20  th the smallest 
1ac60 6b 65 79 20 2d 20 74 68 65 20 66 69 72 73 74 0a  key - the first.
1ac70 2a 2a 20 69 6e 20 61 73 63 65 6e 64 69 6e 67 20  ** in ascending 
1ac80 6f 72 64 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  order..*/.static
1ac90 20 69 6e 74 20 6d 6f 76 65 54 6f 4c 65 66 74 6d   int moveToLeftm
1aca0 6f 73 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43  ost(BtCursor *pC
1acb0 75 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  ur){.  Pgno pgno
1acc0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
1acd0 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67  ITE_OK;.  MemPag
1ace0 65 20 2a 70 50 61 67 65 3b 0a 0a 20 20 61 73 73  e *pPage;..  ass
1acf0 65 72 74 28 20 63 75 72 73 6f 72 48 6f 6c 64 73  ert( cursorHolds
1ad00 4d 75 74 65 78 28 70 43 75 72 29 20 29 3b 0a 20  Mutex(pCur) );. 
1ad10 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 65   assert( pCur->e
1ad20 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41  State==CURSOR_VA
1ad30 4c 49 44 20 29 3b 0a 20 20 77 68 69 6c 65 28 20  LID );.  while( 
1ad40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1ad50 20 21 28 70 50 61 67 65 20 3d 20 70 43 75 72 2d   !(pPage = pCur-
1ad60 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1ad70 61 67 65 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20  age])->leaf ){. 
1ad80 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1ad90 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1ada0 67 65 5d 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  ge]<pPage->nCell
1adb0 20 29 3b 0a 20 20 20 20 70 67 6e 6f 20 3d 20 67   );.    pgno = g
1adc0 65 74 34 62 79 74 65 28 66 69 6e 64 43 65 6c 6c  et4byte(findCell
1add0 28 70 50 61 67 65 2c 20 70 43 75 72 2d 3e 61 69  (pPage, pCur->ai
1ade0 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1adf0 29 29 3b 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76  ));.    rc = mov
1ae00 65 54 6f 43 68 69 6c 64 28 70 43 75 72 2c 20 70  eToChild(pCur, p
1ae10 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  gno);.  }.  retu
1ae20 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1ae30 4d 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20  Move the cursor 
1ae40 64 6f 77 6e 20 74 6f 20 74 68 65 20 72 69 67 68  down to the righ
1ae50 74 2d 6d 6f 73 74 20 6c 65 61 66 20 65 6e 74 72  t-most leaf entr
1ae60 79 20 62 65 6e 65 61 74 68 20 74 68 65 0a 2a 2a  y beneath the.**
1ae70 20 70 61 67 65 20 74 6f 20 77 68 69 63 68 20 69   page to which i
1ae80 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 70  t is currently p
1ae90 6f 69 6e 74 69 6e 67 2e 20 20 4e 6f 74 69 63 65  ointing.  Notice
1aea0 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 0a   the difference.
1aeb0 2a 2a 20 62 65 74 77 65 65 6e 20 6d 6f 76 65 54  ** between moveT
1aec0 6f 4c 65 66 74 6d 6f 73 74 28 29 20 61 6e 64 20  oLeftmost() and 
1aed0 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28  moveToRightmost(
1aee0 29 2e 20 20 6d 6f 76 65 54 6f 4c 65 66 74 6d 6f  ).  moveToLeftmo
1aef0 73 74 28 29 0a 2a 2a 20 66 69 6e 64 73 20 74 68  st().** finds th
1af00 65 20 6c 65 66 74 2d 6d 6f 73 74 20 65 6e 74 72  e left-most entr
1af10 79 20 62 65 6e 65 61 74 68 20 74 68 65 20 2a 65  y beneath the *e
1af20 6e 74 72 79 2a 20 77 68 65 72 65 61 73 20 6d 6f  ntry* whereas mo
1af30 76 65 54 6f 52 69 67 68 74 6d 6f 73 74 28 29 0a  veToRightmost().
1af40 2a 2a 20 66 69 6e 64 73 20 74 68 65 20 72 69 67  ** finds the rig
1af50 68 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 62 65  ht-most entry be
1af60 6e 65 61 74 68 20 74 68 65 20 2a 70 61 67 65 2a  neath the *page*
1af70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 69 67 68  ..**.** The righ
1af80 74 2d 6d 6f 73 74 20 65 6e 74 72 79 20 69 73 20  t-most entry is 
1af90 74 68 65 20 6f 6e 65 20 77 69 74 68 20 74 68 65  the one with the
1afa0 20 6c 61 72 67 65 73 74 20 6b 65 79 20 2d 20 74   largest key - t
1afb0 68 65 20 6c 61 73 74 0a 2a 2a 20 6b 65 79 20 69  he last.** key i
1afc0 6e 20 61 73 63 65 6e 64 69 6e 67 20 6f 72 64 65  n ascending orde
1afd0 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
1afe0 20 6d 6f 76 65 54 6f 52 69 67 68 74 6d 6f 73 74   moveToRightmost
1aff0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29  (BtCursor *pCur)
1b000 7b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 0a 20  {.  Pgno pgno;. 
1b010 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
1b020 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a  _OK;.  MemPage *
1b030 70 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74  pPage;..  assert
1b040 28 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74  ( cursorHoldsMut
1b050 65 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73  ex(pCur) );.  as
1b060 73 65 72 74 28 20 70 43 75 72 2d 3e 65 53 74 61  sert( pCur->eSta
1b070 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1b080 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d   );.  while( rc=
1b090 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 28  =SQLITE_OK && !(
1b0a0 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70  pPage = pCur->ap
1b0b0 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65  Page[pCur->iPage
1b0c0 5d 29 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20  ])->leaf ){.    
1b0d0 70 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  pgno = get4byte(
1b0e0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50  &pPage->aData[pP
1b0f0 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38  age->hdrOffset+8
1b100 5d 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  ]);.    pCur->ai
1b110 49 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  Idx[pCur->iPage]
1b120 20 3d 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b   = pPage->nCell;
1b130 0a 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f  .    rc = moveTo
1b140 43 68 69 6c 64 28 70 43 75 72 2c 20 70 67 6e 6f  Child(pCur, pgno
1b150 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1b160 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1b170 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43    pCur->aiIdx[pC
1b180 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 70 50 61  ur->iPage] = pPa
1b190 67 65 2d 3e 6e 43 65 6c 6c 2d 31 3b 0a 20 20 20  ge->nCell-1;.   
1b1a0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a   pCur->info.nSiz
1b1b0 65 20 3d 20 30 3b 0a 20 20 20 20 70 43 75 72 2d  e = 0;.    pCur-
1b1c0 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 30 3b 0a  >validNKey = 0;.
1b1d0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1b1e0 0a 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20  .}../* Move the 
1b1f0 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 66 69  cursor to the fi
1b200 72 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  rst entry in the
1b210 20 74 61 62 6c 65 2e 20 20 52 65 74 75 72 6e 20   table.  Return 
1b220 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
1b230 73 75 63 63 65 73 73 2e 20 20 53 65 74 20 2a 70  success.  Set *p
1b240 52 65 73 20 74 6f 20 30 20 69 66 20 74 68 65 20  Res to 0 if the 
1b250 63 75 72 73 6f 72 20 61 63 74 75 61 6c 6c 79 20  cursor actually 
1b260 70 6f 69 6e 74 73 20 74 6f 20 73 6f 6d 65 74 68  points to someth
1b270 69 6e 67 0a 2a 2a 20 6f 72 20 73 65 74 20 2a 70  ing.** or set *p
1b280 52 65 73 20 74 6f 20 31 20 69 66 20 74 68 65 20  Res to 1 if the 
1b290 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 2e 0a  table is empty..
1b2a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
1b2b0 72 65 65 46 69 72 73 74 28 42 74 43 75 72 73 6f  reeFirst(BtCurso
1b2c0 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
1b2d0 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  es){.  int rc;..
1b2e0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
1b2f0 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29  HoldsMutex(pCur)
1b300 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
1b310 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
1b320 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCur->pBtree->d
1b330 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 72  b->mutex) );.  r
1b340 63 20 3d 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70  c = moveToRoot(p
1b350 43 75 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  Cur);.  if( rc==
1b360 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1b370 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61 74   if( pCur->eStat
1b380 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49  e==CURSOR_INVALI
1b390 44 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  D ){.      asser
1b3a0 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b  t( pCur->apPage[
1b3b0 70 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43  pCur->iPage]->nC
1b3c0 65 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ell==0 );.      
1b3d0 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20 20 20  *pRes = 1;.     
1b3e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1b3f0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1b400 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1b410 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1b420 67 65 5d 2d 3e 6e 43 65 6c 6c 3e 30 20 29 3b 0a  ge]->nCell>0 );.
1b430 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b        *pRes = 0;
1b440 0a 20 20 20 20 20 20 72 63 20 3d 20 6d 6f 76 65  .      rc = move
1b450 54 6f 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29  ToLeftmost(pCur)
1b460 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1b470 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 20 4d  turn rc;.}../* M
1b480 6f 76 65 20 74 68 65 20 63 75 72 73 6f 72 20 74  ove the cursor t
1b490 6f 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79  o the last entry
1b4a0 20 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20   in the table.  
1b4b0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
1b4c0 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 2e 20  .** on success. 
1b4d0 20 53 65 74 20 2a 70 52 65 73 20 74 6f 20 30 20   Set *pRes to 0 
1b4e0 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 61 63  if the cursor ac
1b4f0 74 75 61 6c 6c 79 20 70 6f 69 6e 74 73 20 74 6f  tually points to
1b500 20 73 6f 6d 65 74 68 69 6e 67 0a 2a 2a 20 6f 72   something.** or
1b510 20 73 65 74 20 2a 70 52 65 73 20 74 6f 20 31 20   set *pRes to 1 
1b520 69 66 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  if the table is 
1b530 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  empty..*/.int sq
1b540 6c 69 74 65 33 42 74 72 65 65 4c 61 73 74 28 42  lite3BtreeLast(B
1b550 74 43 75 72 73 6f 72 20 2a 70 43 75 72 2c 20 69  tCursor *pCur, i
1b560 6e 74 20 2a 70 52 65 73 29 7b 0a 20 20 69 6e 74  nt *pRes){.  int
1b570 20 72 63 3b 0a 20 0a 20 20 61 73 73 65 72 74 28   rc;. .  assert(
1b580 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1b590 78 28 70 43 75 72 29 20 29 3b 0a 20 20 61 73 73  x(pCur) );.  ass
1b5a0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
1b5b0 65 78 5f 68 65 6c 64 28 70 43 75 72 2d 3e 70 42  ex_held(pCur->pB
1b5c0 74 72 65 65 2d 3e 64 62 2d 3e 6d 75 74 65 78 29  tree->db->mutex)
1b5d0 20 29 3b 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54   );.  rc = moveT
1b5e0 6f 52 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69  oRoot(pCur);.  i
1b5f0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1b600 20 29 7b 0a 20 20 20 20 69 66 28 20 43 55 52 53   ){.    if( CURS
1b610 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43 75 72  OR_INVALID==pCur
1b620 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20 20 20  ->eState ){.    
1b630 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e    assert( pCur->
1b640 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50 61  apPage[pCur->iPa
1b650 67 65 5d 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 3b  ge]->nCell==0 );
1b660 0a 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20 31  .      *pRes = 1
1b670 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1b680 20 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d     assert( pCur-
1b690 3e 65 53 74 61 74 65 3d 3d 43 55 52 53 4f 52 5f  >eState==CURSOR_
1b6a0 56 41 4c 49 44 20 29 3b 0a 20 20 20 20 20 20 2a  VALID );.      *
1b6b0 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  pRes = 0;.      
1b6c0 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74  rc = moveToRight
1b6d0 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 20 20  most(pCur);.    
1b6e0 20 20 67 65 74 43 65 6c 6c 49 6e 66 6f 28 70 43    getCellInfo(pC
1b6f0 75 72 29 3b 0a 20 20 20 20 20 20 70 43 75 72 2d  ur);.      pCur-
1b700 3e 61 74 4c 61 73 74 20 3d 20 72 63 3d 3d 53 51  >atLast = rc==SQ
1b710 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
1b720 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1b730 7d 0a 0a 2f 2a 20 4d 6f 76 65 20 74 68 65 20 63  }../* Move the c
1b740 75 72 73 6f 72 20 73 6f 20 74 68 61 74 20 69 74  ursor so that it
1b750 20 70 6f 69 6e 74 73 20 74 6f 20 61 6e 20 65 6e   points to an en
1b760 74 72 79 20 6e 65 61 72 20 74 68 65 20 6b 65 79  try near the key
1b770 20 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 62   .** specified b
1b780 79 20 70 49 64 78 4b 65 79 20 6f 72 20 69 6e 74  y pIdxKey or int
1b790 4b 65 79 2e 20 20 20 52 65 74 75 72 6e 20 61 20  Key.   Return a 
1b7a0 73 75 63 63 65 73 73 20 63 6f 64 65 2e 0a 2a 2a  success code..**
1b7b0 0a 2a 2a 20 46 6f 72 20 49 4e 54 4b 45 59 20 74  .** For INTKEY t
1b7c0 61 62 6c 65 73 2c 20 74 68 65 20 69 6e 74 4b 65  ables, the intKe
1b7d0 79 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 75  y parameter is u
1b7e0 73 65 64 2e 20 20 70 49 64 78 4b 65 79 20 0a 2a  sed.  pIdxKey .*
1b7f0 2a 20 6d 75 73 74 20 62 65 20 4e 55 4c 4c 2e 20  * must be NULL. 
1b800 20 46 6f 72 20 69 6e 64 65 78 20 74 61 62 6c 65   For index table
1b810 73 2c 20 70 49 64 78 4b 65 79 20 69 73 20 75 73  s, pIdxKey is us
1b820 65 64 20 61 6e 64 20 69 6e 74 4b 65 79 0a 2a 2a  ed and intKey.**
1b830 20 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2a 0a   is ignored..**.
1b840 2a 2a 20 49 66 20 61 6e 20 65 78 61 63 74 20 6d  ** If an exact m
1b850 61 74 63 68 20 69 73 20 6e 6f 74 20 66 6f 75 6e  atch is not foun
1b860 64 2c 20 74 68 65 6e 20 74 68 65 20 63 75 72 73  d, then the curs
1b870 6f 72 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20  or is always.** 
1b880 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67 20 61 74  left pointing at
1b890 20 61 20 6c 65 61 66 20 70 61 67 65 20 77 68 69   a leaf page whi
1b8a0 63 68 20 77 6f 75 6c 64 20 68 6f 6c 64 20 74 68  ch would hold th
1b8b0 65 20 65 6e 74 72 79 20 69 66 20 69 74 0a 2a 2a  e entry if it.**
1b8c0 20 77 65 72 65 20 70 72 65 73 65 6e 74 2e 20 20   were present.  
1b8d0 54 68 65 20 63 75 72 73 6f 72 20 6d 69 67 68 74  The cursor might
1b8e0 20 70 6f 69 6e 74 20 74 6f 20 61 6e 20 65 6e 74   point to an ent
1b8f0 72 79 20 74 68 61 74 20 63 6f 6d 65 73 0a 2a 2a  ry that comes.**
1b900 20 62 65 66 6f 72 65 20 6f 72 20 61 66 74 65 72   before or after
1b910 20 74 68 65 20 6b 65 79 2e 0a 2a 2a 0a 2a 2a 20   the key..**.** 
1b920 54 68 65 20 72 65 73 75 6c 74 20 6f 66 20 63 6f  The result of co
1b930 6d 70 61 72 69 6e 67 20 74 68 65 20 6b 65 79 20  mparing the key 
1b940 77 69 74 68 20 74 68 65 20 65 6e 74 72 79 20 74  with the entry t
1b950 6f 20 77 68 69 63 68 20 74 68 65 0a 2a 2a 20 63  o which the.** c
1b960 75 72 73 6f 72 20 69 73 20 77 72 69 74 74 65 6e  ursor is written
1b970 20 74 6f 20 2a 70 52 65 73 20 69 66 20 70 52 65   to *pRes if pRe
1b980 73 21 3d 4e 55 4c 4c 2e 20 20 54 68 65 20 6d 65  s!=NULL.  The me
1b990 61 6e 69 6e 67 20 6f 66 0a 2a 2a 20 74 68 69 73  aning of.** this
1b9a0 20 76 61 6c 75 65 20 69 73 20 61 73 20 66 6f 6c   value is as fol
1b9b0 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  lows:.**.**     
1b9c0 2a 70 52 65 73 3c 30 20 20 20 20 20 20 54 68 65  *pRes<0      The
1b9d0 20 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20   cursor is left 
1b9e0 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 6e 20 65  pointing at an e
1b9f0 6e 74 72 79 20 74 68 61 74 0a 2a 2a 20 20 20 20  ntry that.**    
1ba00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 73                is
1ba10 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 70 4b   smaller than pK
1ba20 65 79 20 6f 72 20 69 66 20 74 68 65 20 74 61 62  ey or if the tab
1ba30 6c 65 20 69 73 20 65 6d 70 74 79 0a 2a 2a 20 20  le is empty.**  
1ba40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba50 61 6e 64 20 74 68 65 20 63 75 72 73 6f 72 20 69  and the cursor i
1ba60 73 20 74 68 65 72 65 66 6f 72 65 20 6c 65 66 74  s therefore left
1ba70 20 70 6f 69 6e 74 20 74 6f 20 6e 6f 74 68 69 6e   point to nothin
1ba80 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52  g..**.**     *pR
1ba90 65 73 3d 3d 30 20 20 20 20 20 54 68 65 20 63 75  es==0     The cu
1baa0 72 73 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69  rsor is left poi
1bab0 6e 74 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72  nting at an entr
1bac0 79 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20  y that.**       
1bad0 20 20 20 20 20 20 20 20 20 20 20 65 78 61 63 74             exact
1bae0 6c 79 20 6d 61 74 63 68 65 73 20 70 4b 65 79 2e  ly matches pKey.
1baf0 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 70 52 65 73  .**.**     *pRes
1bb00 3e 30 20 20 20 20 20 20 54 68 65 20 63 75 72 73  >0      The curs
1bb10 6f 72 20 69 73 20 6c 65 66 74 20 70 6f 69 6e 74  or is left point
1bb20 69 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20  ing at an entry 
1bb30 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  that.**         
1bb40 20 20 20 20 20 20 20 20 20 69 73 20 6c 61 72 67           is larg
1bb50 65 72 20 74 68 61 6e 20 70 4b 65 79 2e 0a 2a 2a  er than pKey..**
1bb60 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
1bb70 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
1bb80 65 64 28 0a 20 20 42 74 43 75 72 73 6f 72 20 2a  ed(.  BtCursor *
1bb90 70 43 75 72 2c 20 20 20 20 20 20 20 20 20 20 2f  pCur,          /
1bba0 2a 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  * The cursor to 
1bbb0 62 65 20 6d 6f 76 65 64 20 2a 2f 0a 20 20 55 6e  be moved */.  Un
1bbc0 70 61 63 6b 65 64 52 65 63 6f 72 64 20 2a 70 49  packedRecord *pI
1bbd0 64 78 4b 65 79 2c 20 2f 2a 20 55 6e 70 61 63 6b  dxKey, /* Unpack
1bbe0 65 64 20 69 6e 64 65 78 20 6b 65 79 20 2a 2f 0a  ed index key */.
1bbf0 20 20 69 36 34 20 69 6e 74 4b 65 79 2c 20 20 20    i64 intKey,   
1bc00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1bc10 65 20 74 61 62 6c 65 20 6b 65 79 20 2a 2f 0a 20  e table key */. 
1bc20 20 69 6e 74 20 62 69 61 73 52 69 67 68 74 2c 20   int biasRight, 
1bc30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
1bc40 74 72 75 65 2c 20 62 69 61 73 20 74 68 65 20 73  true, bias the s
1bc50 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69 67  earch to the hig
1bc60 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 2a  h end */.  int *
1bc70 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20 20  pRes            
1bc80 20 20 20 20 2f 2a 20 57 72 69 74 65 20 73 65 61      /* Write sea
1bc90 72 63 68 20 72 65 73 75 6c 74 73 20 68 65 72 65  rch results here
1bca0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
1bcb0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1bcc0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1bcd0 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
1bce0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1bcf0 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
1bd00 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  >db->mutex) );..
1bd10 20 20 2f 2a 20 49 66 20 74 68 65 20 63 75 72 73    /* If the curs
1bd20 6f 72 20 69 73 20 61 6c 72 65 61 64 79 20 70 6f  or is already po
1bd30 73 69 74 69 6f 6e 65 64 20 61 74 20 74 68 65 20  sitioned at the 
1bd40 70 6f 69 6e 74 20 77 65 20 61 72 65 20 74 72 79  point we are try
1bd50 69 6e 67 0a 20 20 2a 2a 20 74 6f 20 6d 6f 76 65  ing.  ** to move
1bd60 20 74 6f 2c 20 74 68 65 6e 20 6a 75 73 74 20 72   to, then just r
1bd70 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f  eturn without do
1bd80 69 6e 67 20 61 6e 79 20 77 6f 72 6b 20 2a 2f 0a  ing any work */.
1bd90 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1bda0 74 65 3d 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44  te==CURSOR_VALID
1bdb0 20 26 26 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e   && pCur->validN
1bdc0 4b 65 79 20 0a 20 20 20 26 26 20 70 43 75 72 2d  Key .   && pCur-
1bdd0 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e 74 4b  >apPage[0]->intK
1bde0 65 79 20 0a 20 20 29 7b 0a 20 20 20 20 69 66 28  ey .  ){.    if(
1bdf0 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79   pCur->info.nKey
1be00 3d 3d 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ==intKey ){.    
1be10 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20    *pRes = 0;.   
1be20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1be30 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  _OK;.    }.    i
1be40 66 28 20 70 43 75 72 2d 3e 61 74 4c 61 73 74 20  f( pCur->atLast 
1be50 26 26 20 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 4b  && pCur->info.nK
1be60 65 79 3c 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20  ey<intKey ){.   
1be70 20 20 20 2a 70 52 65 73 20 3d 20 2d 31 3b 0a 20     *pRes = -1;. 
1be80 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
1be90 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d  TE_OK;.    }.  }
1bea0 0a 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 52  ..  rc = moveToR
1beb0 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 69 66 28  oot(pCur);.  if(
1bec0 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
1bed0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
1bee0 72 74 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65  rt( pCur->apPage
1bef0 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 29 3b  [pCur->iPage] );
1bf00 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72 2d  .  assert( pCur-
1bf10 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1bf20 61 67 65 5d 2d 3e 69 73 49 6e 69 74 20 29 3b 0a  age]->isInit );.
1bf30 20 20 69 66 28 20 70 43 75 72 2d 3e 65 53 74 61    if( pCur->eSta
1bf40 74 65 3d 3d 43 55 52 53 4f 52 5f 49 4e 56 41 4c  te==CURSOR_INVAL
1bf50 49 44 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20  ID ){.    *pRes 
1bf60 3d 20 2d 31 3b 0a 20 20 20 20 61 73 73 65 72 74  = -1;.    assert
1bf70 28 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b 70  ( pCur->apPage[p
1bf80 43 75 72 2d 3e 69 50 61 67 65 5d 2d 3e 6e 43 65  Cur->iPage]->nCe
1bf90 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74  ll==0 );.    ret
1bfa0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1bfb0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 43 75   }.  assert( pCu
1bfc0 72 2d 3e 61 70 50 61 67 65 5b 30 5d 2d 3e 69 6e  r->apPage[0]->in
1bfd0 74 4b 65 79 20 7c 7c 20 70 49 64 78 4b 65 79 20  tKey || pIdxKey 
1bfe0 29 3b 0a 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20  );.  for(;;){.  
1bff0 20 20 69 6e 74 20 6c 77 72 2c 20 75 70 72 3b 0a    int lwr, upr;.
1c000 20 20 20 20 50 67 6e 6f 20 63 68 6c 64 50 67 3b      Pgno chldPg;
1c010 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 50  .    MemPage *pP
1c020 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61  age = pCur->apPa
1c030 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b  ge[pCur->iPage];
1c040 0a 20 20 20 20 69 6e 74 20 63 20 3d 20 2d 31 3b  .    int c = -1;
1c050 20 20 2f 2a 20 70 52 65 73 20 72 65 74 75 72 6e    /* pRes return
1c060 20 69 66 20 74 61 62 6c 65 20 69 73 20 65 6d 70   if table is emp
1c070 74 79 20 6d 75 73 74 20 62 65 20 2d 31 20 2a 2f  ty must be -1 */
1c080 0a 20 20 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20  .    lwr = 0;.  
1c090 20 20 75 70 72 20 3d 20 70 50 61 67 65 2d 3e 6e    upr = pPage->n
1c0a0 43 65 6c 6c 2d 31 3b 0a 20 20 20 20 69 66 28 20  Cell-1;.    if( 
1c0b0 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26  !pPage->intKey &
1c0c0 26 20 70 49 64 78 4b 65 79 3d 3d 30 20 29 7b 0a  & pIdxKey==0 ){.
1c0d0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1c0e0 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a  E_CORRUPT_BKPT;.
1c0f0 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76 65 74        goto movet
1c100 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20 7d 0a  o_finish;.    }.
1c110 20 20 20 20 69 66 28 20 62 69 61 73 52 69 67 68      if( biasRigh
1c120 74 20 29 7b 0a 20 20 20 20 20 20 70 43 75 72 2d  t ){.      pCur-
1c130 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1c140 67 65 5d 20 3d 20 75 70 72 3b 0a 20 20 20 20 7d  ge] = upr;.    }
1c150 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 43 75 72  else{.      pCur
1c160 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
1c170 61 67 65 5d 20 3d 20 28 75 70 72 2b 6c 77 72 29  age] = (upr+lwr)
1c180 2f 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  /2;.    }.    if
1c190 28 20 6c 77 72 3c 3d 75 70 72 20 29 20 66 6f 72  ( lwr<=upr ) for
1c1a0 28 3b 3b 29 7b 0a 20 20 20 20 20 20 76 6f 69 64  (;;){.      void
1c1b0 20 2a 70 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20   *pCellKey;.    
1c1c0 20 20 69 36 34 20 6e 43 65 6c 6c 4b 65 79 3b 0a    i64 nCellKey;.
1c1d0 20 20 20 20 20 20 69 6e 74 20 69 64 78 20 3d 20        int idx = 
1c1e0 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1c1f0 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 20 20  ->iPage];.      
1c200 70 43 75 72 2d 3e 69 6e 66 6f 2e 6e 53 69 7a 65  pCur->info.nSize
1c210 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 43 75 72   = 0;.      pCur
1c220 2d 3e 76 61 6c 69 64 4e 4b 65 79 20 3d 20 31 3b  ->validNKey = 1;
1c230 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
1c240 2d 3e 69 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20  ->intKey ){.    
1c250 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20      u8 *pCell;. 
1c260 20 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 66         pCell = f
1c270 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
1c280 64 78 29 20 2b 20 70 50 61 67 65 2d 3e 63 68 69  dx) + pPage->chi
1c290 6c 64 50 74 72 53 69 7a 65 3b 0a 20 20 20 20 20  ldPtrSize;.     
1c2a0 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e 68 61     if( pPage->ha
1c2b0 73 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20  sData ){.       
1c2c0 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20     u32 dummy;.  
1c2d0 20 20 20 20 20 20 20 20 70 43 65 6c 6c 20 2b 3d          pCell +=
1c2e0 20 67 65 74 56 61 72 69 6e 74 33 32 28 70 43 65   getVarint32(pCe
1c2f0 6c 6c 2c 20 64 75 6d 6d 79 29 3b 0a 20 20 20 20  ll, dummy);.    
1c300 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 67 65      }.        ge
1c310 74 56 61 72 69 6e 74 28 70 43 65 6c 6c 2c 20 28  tVarint(pCell, (
1c320 75 36 34 2a 29 26 6e 43 65 6c 6c 4b 65 79 29 3b  u64*)&nCellKey);
1c330 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 43 65  .        if( nCe
1c340 6c 6c 4b 65 79 3d 3d 69 6e 74 4b 65 79 20 29 7b  llKey==intKey ){
1c350 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20 30  .          c = 0
1c360 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
1c370 69 66 28 20 6e 43 65 6c 6c 4b 65 79 3c 69 6e 74  if( nCellKey<int
1c380 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
1c390 20 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20   c = -1;.       
1c3a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1c3b0 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 4b    assert( nCellK
1c3c0 65 79 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20  ey>intKey );.   
1c3d0 20 20 20 20 20 20 20 63 20 3d 20 2b 31 3b 0a 20         c = +1;. 
1c3e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1c3f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
1c400 74 20 61 76 61 69 6c 61 62 6c 65 3b 0a 20 20 20  t available;.   
1c410 20 20 20 20 20 70 43 65 6c 6c 4b 65 79 20 3d 20       pCellKey = 
1c420 28 76 6f 69 64 20 2a 29 66 65 74 63 68 50 61 79  (void *)fetchPay
1c430 6c 6f 61 64 28 70 43 75 72 2c 20 26 61 76 61 69  load(pCur, &avai
1c440 6c 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  lable, 0);.     
1c450 20 20 20 6e 43 65 6c 6c 4b 65 79 20 3d 20 70 43     nCellKey = pC
1c460 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3b 0a 20  ur->info.nKey;. 
1c470 20 20 20 20 20 20 20 69 66 28 20 61 76 61 69 6c         if( avail
1c480 61 62 6c 65 3e 3d 6e 43 65 6c 6c 4b 65 79 20 29  able>=nCellKey )
1c490 7b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d 20  {.          c = 
1c4a0 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f 72  sqlite3VdbeRecor
1c4b0 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 4b 65  dCompare(nCellKe
1c4c0 79 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49 64  y, pCellKey, pId
1c4d0 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20 7d  xKey);.        }
1c4e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
1c4f0 70 43 65 6c 6c 4b 65 79 20 3d 20 73 71 6c 69 74  pCellKey = sqlit
1c500 65 33 4d 61 6c 6c 6f 63 28 20 6e 43 65 6c 6c 4b  e3Malloc( nCellK
1c510 65 79 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ey );.          
1c520 69 66 28 20 70 43 65 6c 6c 4b 65 79 3d 3d 30 20  if( pCellKey==0 
1c530 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
1c540 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1c550 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
1c560 74 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68  to moveto_finish
1c570 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1c580 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1c590 69 74 65 33 42 74 72 65 65 4b 65 79 28 70 43 75  ite3BtreeKey(pCu
1c5a0 72 2c 20 30 2c 20 6e 43 65 6c 6c 4b 65 79 2c 20  r, 0, nCellKey, 
1c5b0 28 76 6f 69 64 20 2a 29 70 43 65 6c 6c 4b 65 79  (void *)pCellKey
1c5c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  );.          c =
1c5d0 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 63 6f   sqlite3VdbeReco
1c5e0 72 64 43 6f 6d 70 61 72 65 28 6e 43 65 6c 6c 4b  rdCompare(nCellK
1c5f0 65 79 2c 20 70 43 65 6c 6c 4b 65 79 2c 20 70 49  ey, pCellKey, pI
1c600 64 78 4b 65 79 29 3b 0a 20 20 20 20 20 20 20 20  dxKey);.        
1c610 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1c620 43 65 6c 6c 4b 65 79 29 3b 0a 20 20 20 20 20 20  CellKey);.      
1c630 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74      if( rc ) got
1c640 6f 20 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b  o moveto_finish;
1c650 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c660 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d   }.      if( c==
1c670 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75  0 ){.        pCu
1c680 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e  r->info.nKey = n
1c690 43 65 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20  CellKey;.       
1c6a0 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b   if( pPage->intK
1c6b0 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c 65  ey && !pPage->le
1c6c0 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
1c6d0 6c 77 72 20 3d 20 69 64 78 3b 0a 20 20 20 20 20  lwr = idx;.     
1c6e0 20 20 20 20 20 75 70 72 20 3d 20 6c 77 72 20 2d       upr = lwr -
1c6f0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72   1;.          br
1c700 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
1c710 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  se{.          if
1c720 28 20 70 52 65 73 20 29 20 2a 70 52 65 73 20 3d  ( pRes ) *pRes =
1c730 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   0;.          rc
1c740 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1c750 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f 76          goto mov
1c760 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20 20  eto_finish;.    
1c770 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
1c780 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20      if( c<0 ){. 
1c790 20 20 20 20 20 20 20 6c 77 72 20 3d 20 69 64 78         lwr = idx
1c7a0 2b 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  +1;.      }else{
1c7b0 0a 20 20 20 20 20 20 20 20 75 70 72 20 3d 20 69  .        upr = i
1c7c0 64 78 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  dx-1;.      }.  
1c7d0 20 20 20 20 69 66 28 20 6c 77 72 3e 75 70 72 20      if( lwr>upr 
1c7e0 29 7b 0a 20 20 20 20 20 20 20 20 70 43 75 72 2d  ){.        pCur-
1c7f0 3e 69 6e 66 6f 2e 6e 4b 65 79 20 3d 20 6e 43 65  >info.nKey = nCe
1c800 6c 6c 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 62  llKey;.        b
1c810 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1c820 20 20 20 20 70 43 75 72 2d 3e 61 69 49 64 78 5b      pCur->aiIdx[
1c830 70 43 75 72 2d 3e 69 50 61 67 65 5d 20 3d 20 28  pCur->iPage] = (
1c840 6c 77 72 2b 75 70 72 29 2f 32 3b 0a 20 20 20 20  lwr+upr)/2;.    
1c850 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 6c 77  }.    assert( lw
1c860 72 3d 3d 75 70 72 2b 31 20 29 3b 0a 20 20 20 20  r==upr+1 );.    
1c870 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
1c880 73 49 6e 69 74 20 29 3b 0a 20 20 20 20 69 66 28  sInit );.    if(
1c890 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a   pPage->leaf ){.
1c8a0 20 20 20 20 20 20 63 68 6c 64 50 67 20 3d 20 30        chldPg = 0
1c8b0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1c8c0 6c 77 72 3e 3d 70 50 61 67 65 2d 3e 6e 43 65 6c  lwr>=pPage->nCel
1c8d0 6c 20 29 7b 0a 20 20 20 20 20 20 63 68 6c 64 50  l ){.      chldP
1c8e0 67 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 50  g = get4byte(&pP
1c8f0 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67 65  age->aData[pPage
1c900 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b  ->hdrOffset+8]);
1c910 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1c920 20 20 63 68 6c 64 50 67 20 3d 20 67 65 74 34 62    chldPg = get4b
1c930 79 74 65 28 66 69 6e 64 43 65 6c 6c 28 70 50 61  yte(findCell(pPa
1c940 67 65 2c 20 6c 77 72 29 29 3b 0a 20 20 20 20 7d  ge, lwr));.    }
1c950 0a 20 20 20 20 69 66 28 20 63 68 6c 64 50 67 3d  .    if( chldPg=
1c960 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  =0 ){.      asse
1c970 72 74 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b  rt( pCur->aiIdx[
1c980 70 43 75 72 2d 3e 69 50 61 67 65 5d 3c 70 43 75  pCur->iPage]<pCu
1c990 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1c9a0 69 50 61 67 65 5d 2d 3e 6e 43 65 6c 6c 20 29 3b  iPage]->nCell );
1c9b0 0a 20 20 20 20 20 20 69 66 28 20 70 52 65 73 20  .      if( pRes 
1c9c0 29 20 2a 70 52 65 73 20 3d 20 63 3b 0a 20 20 20  ) *pRes = c;.   
1c9d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
1c9e0 4b 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 6f  K;.      goto mo
1c9f0 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20 20 20  veto_finish;.   
1ca00 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 61 69 49   }.    pCur->aiI
1ca10 64 78 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 20  dx[pCur->iPage] 
1ca20 3d 20 6c 77 72 3b 0a 20 20 20 20 70 43 75 72 2d  = lwr;.    pCur-
1ca30 3e 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b  >info.nSize = 0;
1ca40 0a 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64  .    pCur->valid
1ca50 4e 4b 65 79 20 3d 20 30 3b 0a 20 20 20 20 72 63  NKey = 0;.    rc
1ca60 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28 70   = moveToChild(p
1ca70 43 75 72 2c 20 63 68 6c 64 50 67 29 3b 0a 20 20  Cur, chldPg);.  
1ca80 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
1ca90 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68 3b 0a 20  moveto_finish;. 
1caa0 20 7d 0a 6d 6f 76 65 74 6f 5f 66 69 6e 69 73 68   }.moveto_finish
1cab0 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  :.  return rc;.}
1cac0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 20 74 68 69 73 20  ../*.** In this 
1cad0 76 65 72 73 69 6f 6e 20 6f 66 20 42 74 72 65 65  version of Btree
1cae0 4d 6f 76 65 74 6f 2c 20 70 4b 65 79 20 69 73 20  Moveto, pKey is 
1caf0 61 20 70 61 63 6b 65 64 20 69 6e 64 65 78 20 72  a packed index r
1cb00 65 63 6f 72 64 0a 2a 2a 20 73 75 63 68 20 61 73  ecord.** such as
1cb10 20 69 73 20 67 65 6e 65 72 61 74 65 64 20 62 79   is generated by
1cb20 20 74 68 65 20 4f 50 5f 4d 61 6b 65 52 65 63 6f   the OP_MakeReco
1cb30 72 64 20 6f 70 63 6f 64 65 2e 20 20 55 6e 70 61  rd opcode.  Unpa
1cb40 63 6b 20 74 68 65 0a 2a 2a 20 72 65 63 6f 72 64  ck the.** record
1cb50 20 61 6e 64 20 74 68 65 6e 20 63 61 6c 6c 20 42   and then call B
1cb60 74 72 65 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b  treeMovetoUnpack
1cb70 65 64 28 29 20 74 6f 20 64 6f 20 74 68 65 20 77  ed() to do the w
1cb80 6f 72 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ork..*/.int sqli
1cb90 74 65 33 42 74 72 65 65 4d 6f 76 65 74 6f 28 0a  te3BtreeMoveto(.
1cba0 20 20 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72    BtCursor *pCur
1cbb0 2c 20 20 20 20 20 2f 2a 20 43 75 72 73 6f 72 20  ,     /* Cursor 
1cbc0 6f 70 65 6e 20 6f 6e 20 74 68 65 20 62 74 72 65  open on the btre
1cbd0 65 20 74 6f 20 62 65 20 73 65 61 72 63 68 65 64  e to be searched
1cbe0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64   */.  const void
1cbf0 20 2a 70 4b 65 79 2c 20 20 20 2f 2a 20 50 61 63   *pKey,   /* Pac
1cc00 6b 65 64 20 6b 65 79 20 69 66 20 74 68 65 20 62  ked key if the b
1cc10 74 72 65 65 20 69 73 20 61 6e 20 69 6e 64 65 78  tree is an index
1cc20 20 2a 2f 0a 20 20 69 36 34 20 6e 4b 65 79 2c 20   */.  i64 nKey, 
1cc30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74            /* Int
1cc40 65 67 65 72 20 6b 65 79 20 66 6f 72 20 74 61 62  eger key for tab
1cc50 6c 65 73 2e 20 20 53 69 7a 65 20 6f 66 20 70 4b  les.  Size of pK
1cc60 65 79 20 66 6f 72 20 69 6e 64 69 63 65 73 20 2a  ey for indices *
1cc70 2f 0a 20 20 69 6e 74 20 62 69 61 73 2c 20 20 20  /.  int bias,   
1cc80 20 20 20 20 20 20 20 20 2f 2a 20 42 69 61 73 20          /* Bias 
1cc90 73 65 61 72 63 68 20 74 6f 20 74 68 65 20 68 69  search to the hi
1cca0 67 68 20 65 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  gh end */.  int 
1ccb0 2a 70 52 65 73 20 20 20 20 20 20 20 20 20 20 20  *pRes           
1ccc0 2f 2a 20 57 72 69 74 65 20 73 65 61 72 63 68 20  /* Write search 
1ccd0 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
1cce0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
1ccf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd00 2f 2a 20 53 74 61 74 75 73 20 63 6f 64 65 20 2a  /* Status code *
1cd10 2f 0a 20 20 55 6e 70 61 63 6b 65 64 52 65 63 6f  /.  UnpackedReco
1cd20 72 64 20 2a 70 49 64 78 4b 65 79 3b 20 20 20 2f  rd *pIdxKey;   /
1cd30 2a 20 55 6e 70 61 63 6b 65 64 20 69 6e 64 65 78  * Unpacked index
1cd40 20 6b 65 79 20 2a 2f 0a 20 20 55 6e 70 61 63 6b   key */.  Unpack
1cd50 65 64 52 65 63 6f 72 64 20 61 53 70 61 63 65 5b  edRecord aSpace[
1cd60 31 36 5d 3b 20 2f 2a 20 54 65 6d 70 20 73 70 61  16]; /* Temp spa
1cd70 63 65 20 66 6f 72 20 70 49 64 78 4b 65 79 20 2d  ce for pIdxKey -
1cd80 20 74 6f 20 61 76 6f 69 64 20 61 20 6d 61 6c 6c   to avoid a mall
1cd90 6f 63 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4b 65  oc */..  if( pKe
1cda0 79 20 29 7b 0a 20 20 20 20 70 49 64 78 4b 65 79  y ){.    pIdxKey
1cdb0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 52 65   = sqlite3VdbeRe
1cdc0 63 6f 72 64 55 6e 70 61 63 6b 28 70 43 75 72 2d  cordUnpack(pCur-
1cdd0 3e 70 4b 65 79 49 6e 66 6f 2c 20 6e 4b 65 79 2c  >pKeyInfo, nKey,
1cde0 20 70 4b 65 79 2c 0a 20 20 20 20 20 20 20 20 20   pKey,.         
1cdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce00 20 20 20 20 20 20 20 20 20 20 20 20 20 61 53 70               aSp
1ce10 61 63 65 2c 20 73 69 7a 65 6f 66 28 61 53 70 61  ace, sizeof(aSpa
1ce20 63 65 29 29 3b 0a 20 20 20 20 69 66 28 20 70 49  ce));.    if( pI
1ce30 64 78 4b 65 79 3d 3d 30 20 29 20 72 65 74 75 72  dxKey==0 ) retur
1ce40 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
1ce50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 49 64    }else{.    pId
1ce60 78 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  xKey = 0;.  }.  
1ce70 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
1ce80 65 4d 6f 76 65 74 6f 55 6e 70 61 63 6b 65 64 28  eMovetoUnpacked(
1ce90 70 43 75 72 2c 20 70 49 64 78 4b 65 79 2c 20 6e  pCur, pIdxKey, n
1cea0 4b 65 79 2c 20 62 69 61 73 2c 20 70 52 65 73 29  Key, bias, pRes)
1ceb0 3b 0a 20 20 69 66 28 20 70 4b 65 79 20 29 7b 0a  ;.  if( pKey ){.
1cec0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44      sqlite3VdbeD
1ced0 65 6c 65 74 65 55 6e 70 61 63 6b 65 64 52 65 63  eleteUnpackedRec
1cee0 6f 72 64 28 70 49 64 78 4b 65 79 29 3b 0a 20 20  ord(pIdxKey);.  
1cef0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
1cf00 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
1cf10 54 52 55 45 20 69 66 20 74 68 65 20 63 75 72 73  TRUE if the curs
1cf20 6f 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69  or is not pointi
1cf30 6e 67 20 61 74 20 61 6e 20 65 6e 74 72 79 20 6f  ng at an entry o
1cf40 66 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  f the table..**.
1cf50 2a 2a 20 54 52 55 45 20 77 69 6c 6c 20 62 65 20  ** TRUE will be 
1cf60 72 65 74 75 72 6e 65 64 20 61 66 74 65 72 20 61  returned after a
1cf70 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
1cf80 42 74 72 65 65 4e 65 78 74 28 29 20 6d 6f 76 65  BtreeNext() move
1cf90 73 0a 2a 2a 20 70 61 73 74 20 74 68 65 20 6c 61  s.** past the la
1cfa0 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  st entry in the 
1cfb0 74 61 62 6c 65 20 6f 72 20 73 71 6c 69 74 65 33  table or sqlite3
1cfc0 42 74 72 65 65 50 72 65 76 28 29 20 6d 6f 76 65  BtreePrev() move
1cfd0 73 20 70 61 73 74 0a 2a 2a 20 74 68 65 20 66 69  s past.** the fi
1cfe0 72 73 74 20 65 6e 74 72 79 2e 20 20 54 52 55 45  rst entry.  TRUE
1cff0 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 65   is also returne
1d000 64 20 69 66 20 74 68 65 20 74 61 62 6c 65 20 69  d if the table i
1d010 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a 69 6e 74 20  s empty..*/.int 
1d020 73 71 6c 69 74 65 33 42 74 72 65 65 45 6f 66 28  sqlite3BtreeEof(
1d030 42 74 43 75 72 73 6f 72 20 2a 70 43 75 72 29 7b  BtCursor *pCur){
1d040 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 57 68 61 74  .  /* TODO: What
1d050 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20 69   if the cursor i
1d060 73 20 69 6e 20 43 55 52 53 4f 52 5f 52 45 51 55  s in CURSOR_REQU
1d070 49 52 45 53 45 45 4b 20 62 75 74 20 61 6c 6c 20  IRESEEK but all 
1d080 74 61 62 6c 65 20 65 6e 74 72 69 65 73 0a 20 20  table entries.  
1d090 2a 2a 20 68 61 76 65 20 62 65 65 6e 20 64 65 6c  ** have been del
1d0a0 65 74 65 64 3f 20 54 68 69 73 20 41 50 49 20 77  eted? This API w
1d0b0 69 6c 6c 20 6e 65 65 64 20 74 6f 20 63 68 61 6e  ill need to chan
1d0c0 67 65 20 74 6f 20 72 65 74 75 72 6e 20 61 6e 20  ge to return an 
1d0d0 65 72 72 6f 72 20 63 6f 64 65 0a 20 20 2a 2a 20  error code.  ** 
1d0e0 61 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62  as well as the b
1d0f0 6f 6f 6c 65 61 6e 20 72 65 73 75 6c 74 20 76 61  oolean result va
1d100 6c 75 65 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  lue..  */.  retu
1d110 72 6e 20 28 43 55 52 53 4f 52 5f 56 41 4c 49 44  rn (CURSOR_VALID
1d120 21 3d 70 43 75 72 2d 3e 65 53 74 61 74 65 29 3b  !=pCur->eState);
1d130 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1d140 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f   the database co
1d150 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20  nnection handle 
1d160 66 6f 72 20 61 20 63 75 72 73 6f 72 2e 0a 2a 2f  for a cursor..*/
1d170 0a 73 71 6c 69 74 65 33 20 2a 73 71 6c 69 74 65  .sqlite3 *sqlite
1d180 33 42 74 72 65 65 43 75 72 73 6f 72 44 62 28 63  3BtreeCursorDb(c
1d190 6f 6e 73 74 20 42 74 43 75 72 73 6f 72 20 2a 70  onst BtCursor *p
1d1a0 43 75 72 29 7b 0a 20 20 61 73 73 65 72 74 28 20  Cur){.  assert( 
1d1b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
1d1c0 6c 64 28 70 43 75 72 2d 3e 70 42 74 72 65 65 2d  ld(pCur->pBtree-
1d1d0 3e 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  >db->mutex) );. 
1d1e0 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 70 42   return pCur->pB
1d1f0 74 72 65 65 2d 3e 64 62 3b 0a 7d 0a 0a 2f 2a 0a  tree->db;.}../*.
1d200 2a 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 63  ** Advance the c
1d210 75 72 73 6f 72 20 74 6f 20 74 68 65 20 6e 65 78  ursor to the nex
1d220 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
1d230 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a 20  atabase.  If.** 
1d240 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e 20  successful then 
1d250 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49 66  set *pRes=0.  If
1d260 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20 77   the cursor.** w
1d270 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e 74  as already point
1d280 69 6e 67 20 74 6f 20 74 68 65 20 6c 61 73 74 20  ing to the last 
1d290 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64 61 74  entry in the dat
1d2a0 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a 2a 20  abase before.** 
1d2b0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
1d2c0 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 73 65   called, then se
1d2d0 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a 69 6e  t *pRes=1..*/.in
1d2e0 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 4e 65  t sqlite3BtreeNe
1d2f0 78 74 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  xt(BtCursor *pCu
1d300 72 2c 20 69 6e 74 20 2a 70 52 65 73 29 7b 0a 20  r, int *pRes){. 
1d310 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
1d320 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  dx;.  MemPage *p
1d330 50 61 67 65 3b 0a 0a 20 20 61 73 73 65 72 74 28  Page;..  assert(
1d340 20 63 75 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65   cursorHoldsMute
1d350 78 28 70 43 75 72 29 20 29 3b 0a 20 20 72 63 20  x(pCur) );.  rc 
1d360 3d 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50  = restoreCursorP
1d370 6f 73 69 74 69 6f 6e 28 70 43 75 72 29 3b 0a 20  osition(pCur);. 
1d380 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1d390 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1d3a0 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72   rc;.  }.  asser
1d3b0 74 28 20 70 52 65 73 21 3d 30 20 29 3b 0a 20 20  t( pRes!=0 );.  
1d3c0 69 66 28 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c  if( CURSOR_INVAL
1d3d0 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74 61 74 65  ID==pCur->eState
1d3e0 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20   ){.    *pRes = 
1d3f0 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  1;.    return SQ
1d400 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
1d410 66 28 20 70 43 75 72 2d 3e 73 6b 69 70 3e 30 20  f( pCur->skip>0 
1d420 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 73 6b 69  ){.    pCur->ski
1d430 70 20 3d 20 30 3b 0a 20 20 20 20 2a 70 52 65 73  p = 0;.    *pRes
1d440 20 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e   = 0;.    return
1d450 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
1d460 20 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30    pCur->skip = 0
1d470 3b 0a 0a 20 20 70 50 61 67 65 20 3d 20 70 43 75  ;..  pPage = pCu
1d480 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e  r->apPage[pCur->
1d490 69 50 61 67 65 5d 3b 0a 20 20 69 64 78 20 3d 20  iPage];.  idx = 
1d4a0 2b 2b 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ++pCur->aiIdx[pC
1d4b0 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 61 73  ur->iPage];.  as
1d4c0 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 73 49  sert( pPage->isI
1d4d0 6e 69 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  nit );.  assert(
1d4e0 20 69 64 78 3c 3d 70 50 61 67 65 2d 3e 6e 43 65   idx<=pPage->nCe
1d4f0 6c 6c 20 29 3b 0a 0a 20 20 70 43 75 72 2d 3e 69  ll );..  pCur->i
1d500 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20  nfo.nSize = 0;. 
1d510 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
1d520 20 3d 20 30 3b 0a 20 20 69 66 28 20 69 64 78 3e   = 0;.  if( idx>
1d530 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29 7b  =pPage->nCell ){
1d540 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
1d550 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72  >leaf ){.      r
1d560 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
1d570 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 26  pCur, get4byte(&
1d580 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61  pPage->aData[pPa
1d590 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d  ge->hdrOffset+8]
1d5a0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  ));.      if( rc
1d5b0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1d5c0 20 20 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f 4c      rc = moveToL
1d5d0 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20  eftmost(pCur);. 
1d5e0 20 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a       *pRes = 0;.
1d5f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1d600 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 7b 0a 20  .    }.    do{. 
1d610 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
1d620 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
1d630 20 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20     *pRes = 1;.  
1d640 20 20 20 20 20 20 70 43 75 72 2d 3e 65 53 74 61        pCur->eSta
1d650 74 65 20 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41  te = CURSOR_INVA
1d660 4c 49 44 3b 0a 20 20 20 20 20 20 20 20 72 65 74  LID;.        ret
1d670 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1d680 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1d690 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50  ite3BtreeMoveToP
1d6a0 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
1d6b0 20 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d     pPage = pCur-
1d6c0 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
1d6d0 61 67 65 5d 3b 0a 20 20 20 20 7d 77 68 69 6c 65  age];.    }while
1d6e0 28 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  ( pCur->aiIdx[pC
1d6f0 75 72 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67  ur->iPage]>=pPag
1d700 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 20 20  e->nCell );.    
1d710 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 69  *pRes = 0;.    i
1d720 66 28 20 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79  f( pPage->intKey
1d730 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1d740 71 6c 69 74 65 33 42 74 72 65 65 4e 65 78 74 28  qlite3BtreeNext(
1d750 70 43 75 72 2c 20 70 52 65 73 29 3b 0a 20 20 20  pCur, pRes);.   
1d760 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1d770 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1d780 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72    }.    return r
1d790 63 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d  c;.  }.  *pRes =
1d7a0 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d   0;.  if( pPage-
1d7b0 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 72 65 74  >leaf ){.    ret
1d7c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1d7d0 20 7d 0a 20 20 72 63 20 3d 20 6d 6f 76 65 54 6f   }.  rc = moveTo
1d7e0 4c 65 66 74 6d 6f 73 74 28 70 43 75 72 29 3b 0a  Leftmost(pCur);.
1d7f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1d800 0a 2f 2a 0a 2a 2a 20 53 74 65 70 20 74 68 65 20  ./*.** Step the 
1d810 63 75 72 73 6f 72 20 74 6f 20 74 68 65 20 62 61  cursor to the ba
1d820 63 6b 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f  ck to the previo
1d830 75 73 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  us entry in the 
1d840 64 61 74 61 62 61 73 65 2e 20 20 49 66 0a 2a 2a  database.  If.**
1d850 20 73 75 63 63 65 73 73 66 75 6c 20 74 68 65 6e   successful then
1d860 20 73 65 74 20 2a 70 52 65 73 3d 30 2e 20 20 49   set *pRes=0.  I
1d870 66 20 74 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20  f the cursor.** 
1d880 77 61 73 20 61 6c 72 65 61 64 79 20 70 6f 69 6e  was already poin
1d890 74 69 6e 67 20 74 6f 20 74 68 65 20 66 69 72 73  ting to the firs
1d8a0 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 64  t entry in the d
1d8b0 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 0a 2a  atabase before.*
1d8c0 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  * this routine w
1d8d0 61 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  as called, then 
1d8e0 73 65 74 20 2a 70 52 65 73 3d 31 2e 0a 2a 2f 0a  set *pRes=1..*/.
1d8f0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
1d900 50 72 65 76 69 6f 75 73 28 42 74 43 75 72 73 6f  Previous(BtCurso
1d910 72 20 2a 70 43 75 72 2c 20 69 6e 74 20 2a 70 52  r *pCur, int *pR
1d920 65 73 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  es){.  int rc;. 
1d930 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b   MemPage *pPage;
1d940 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
1d950 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
1d960 72 29 20 29 3b 0a 20 20 72 63 20 3d 20 72 65 73  r) );.  rc = res
1d970 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69  toreCursorPositi
1d980 6f 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20  on(pCur);.  if( 
1d990 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1d9a0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1d9b0 20 20 7d 0a 20 20 70 43 75 72 2d 3e 61 74 4c 61    }.  pCur->atLa
1d9c0 73 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 43 55  st = 0;.  if( CU
1d9d0 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3d 3d 70 43  RSOR_INVALID==pC
1d9e0 75 72 2d 3e 65 53 74 61 74 65 20 29 7b 0a 20 20  ur->eState ){.  
1d9f0 20 20 2a 70 52 65 73 20 3d 20 31 3b 0a 20 20 20    *pRes = 1;.   
1da00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1da10 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 43 75  K;.  }.  if( pCu
1da20 72 2d 3e 73 6b 69 70 3c 30 20 29 7b 0a 20 20 20  r->skip<0 ){.   
1da30 20 70 43 75 72 2d 3e 73 6b 69 70 20 3d 20 30 3b   pCur->skip = 0;
1da40 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 30 3b 0a  .    *pRes = 0;.
1da50 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1da60 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 43 75 72  E_OK;.  }.  pCur
1da70 2d 3e 73 6b 69 70 20 3d 20 30 3b 0a 0a 20 20 70  ->skip = 0;..  p
1da80 50 61 67 65 20 3d 20 70 43 75 72 2d 3e 61 70 50  Page = pCur->apP
1da90 61 67 65 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d  age[pCur->iPage]
1daa0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1dab0 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 69  e->isInit );.  i
1dac0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
1dad0 29 7b 0a 20 20 20 20 69 6e 74 20 69 64 78 20 3d  ){.    int idx =
1dae0 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75   pCur->aiIdx[pCu
1daf0 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 20 20 72  r->iPage];.    r
1db00 63 20 3d 20 6d 6f 76 65 54 6f 43 68 69 6c 64 28  c = moveToChild(
1db10 70 43 75 72 2c 20 67 65 74 34 62 79 74 65 28 66  pCur, get4byte(f
1db20 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c 20 69  indCell(pPage, i
1db30 64 78 29 29 29 3b 0a 20 20 20 20 69 66 28 20 72  dx)));.    if( r
1db40 63 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  c ){.      retur
1db50 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
1db60 72 63 20 3d 20 6d 6f 76 65 54 6f 52 69 67 68 74  rc = moveToRight
1db70 6d 6f 73 74 28 70 43 75 72 29 3b 0a 20 20 7d 65  most(pCur);.  }e
1db80 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20  lse{.    while( 
1db90 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
1dba0 2d 3e 69 50 61 67 65 5d 3d 3d 30 20 29 7b 0a 20  ->iPage]==0 ){. 
1dbb0 20 20 20 20 20 69 66 28 20 70 43 75 72 2d 3e 69       if( pCur->i
1dbc0 50 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Page==0 ){.     
1dbd0 20 20 20 70 43 75 72 2d 3e 65 53 74 61 74 65 20     pCur->eState 
1dbe0 3d 20 43 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44  = CURSOR_INVALID
1dbf0 3b 0a 20 20 20 20 20 20 20 20 2a 70 52 65 73 20  ;.        *pRes 
1dc00 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72 65 74  = 1;.        ret
1dc10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1dc20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1dc30 69 74 65 33 42 74 72 65 65 4d 6f 76 65 54 6f 50  ite3BtreeMoveToP
1dc40 61 72 65 6e 74 28 70 43 75 72 29 3b 0a 20 20 20  arent(pCur);.   
1dc50 20 7d 0a 20 20 20 20 70 43 75 72 2d 3e 69 6e 66   }.    pCur->inf
1dc60 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  o.nSize = 0;.   
1dc70 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e 4b 65 79   pCur->validNKey
1dc80 20 3d 20 30 3b 0a 0a 20 20 20 20 70 43 75 72 2d   = 0;..    pCur-
1dc90 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50 61  >aiIdx[pCur->iPa
1dca0 67 65 5d 2d 2d 3b 0a 20 20 20 20 70 50 61 67 65  ge]--;.    pPage
1dcb0 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
1dcc0 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
1dcd0 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69 6e 74    if( pPage->int
1dce0 4b 65 79 20 26 26 20 21 70 50 61 67 65 2d 3e 6c  Key && !pPage->l
1dcf0 65 61 66 20 29 7b 0a 20 20 20 20 20 20 72 63 20  eaf ){.      rc 
1dd00 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 72  = sqlite3BtreePr
1dd10 65 76 69 6f 75 73 28 70 43 75 72 2c 20 70 52 65  evious(pCur, pRe
1dd20 73 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  s);.    }else{. 
1dd30 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1dd40 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
1dd50 20 2a 70 52 65 73 20 3d 20 30 3b 0a 20 20 72 65   *pRes = 0;.  re
1dd60 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1dd70 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  * Allocate a new
1dd80 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64   page from the d
1dd90 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1dda0 0a 2a 2a 20 54 68 65 20 6e 65 77 20 70 61 67 65  .** The new page
1ddb0 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 64 69   is marked as di
1ddc0 72 74 79 2e 20 20 28 49 6e 20 6f 74 68 65 72 20  rty.  (In other 
1ddd0 77 6f 72 64 73 2c 20 73 71 6c 69 74 65 33 50 61  words, sqlite3Pa
1dde0 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 68 61  gerWrite().** ha
1ddf0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
1de00 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6e 65 77  alled on the new
1de10 20 70 61 67 65 2e 29 20 20 54 68 65 20 6e 65 77   page.)  The new
1de20 20 70 61 67 65 20 68 61 73 20 61 6c 73 6f 0a 2a   page has also.*
1de30 2a 20 62 65 65 6e 20 72 65 66 65 72 65 6e 63 65  * been reference
1de40 64 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 69 6e  d and the callin
1de50 67 20 72 6f 75 74 69 6e 65 20 69 73 20 72 65 73  g routine is res
1de60 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 63 61 6c  ponsible for cal
1de70 6c 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 50  ling.** sqlite3P
1de80 61 67 65 72 55 6e 72 65 66 28 29 20 6f 6e 20 74  agerUnref() on t
1de90 68 65 20 6e 65 77 20 70 61 67 65 20 77 68 65 6e  he new page when
1dea0 20 69 74 20 69 73 20 64 6f 6e 65 2e 0a 2a 2a 0a   it is done..**.
1deb0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
1dec0 72 65 74 75 72 6e 65 64 20 6f 6e 20 73 75 63 63  returned on succ
1ded0 65 73 73 2e 20 20 41 6e 79 20 6f 74 68 65 72 20  ess.  Any other 
1dee0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 6e 64  return value ind
1def0 69 63 61 74 65 73 0a 2a 2a 20 61 6e 20 65 72 72  icates.** an err
1df00 6f 72 2e 20 20 2a 70 70 50 61 67 65 20 61 6e 64  or.  *ppPage and
1df10 20 2a 70 50 67 6e 6f 20 61 72 65 20 75 6e 64 65   *pPgno are unde
1df20 66 69 6e 65 64 20 69 6e 20 74 68 65 20 65 76 65  fined in the eve
1df30 6e 74 20 6f 66 20 61 6e 20 65 72 72 6f 72 2e 0a  nt of an error..
1df40 2a 2a 20 44 6f 20 6e 6f 74 20 69 6e 76 6f 6b 65  ** Do not invoke
1df50 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1df60 65 66 28 29 20 6f 6e 20 2a 70 70 50 61 67 65 20  ef() on *ppPage 
1df70 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 72  if an error is r
1df80 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
1df90 66 20 74 68 65 20 22 6e 65 61 72 62 79 22 20 70  f the "nearby" p
1dfa0 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74 20  arameter is not 
1dfb0 30 2c 20 74 68 65 6e 20 61 20 28 66 65 65 62 6c  0, then a (feebl
1dfc0 65 29 20 65 66 66 6f 72 74 20 69 73 20 6d 61 64  e) effort is mad
1dfd0 65 20 74 6f 20 0a 2a 2a 20 6c 6f 63 61 74 65 20  e to .** locate 
1dfe0 61 20 70 61 67 65 20 63 6c 6f 73 65 20 74 6f 20  a page close to 
1dff0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1e000 22 6e 65 61 72 62 79 22 2e 20 20 54 68 69 73 20  "nearby".  This 
1e010 63 61 6e 20 62 65 20 75 73 65 64 20 69 6e 20 61  can be used in a
1e020 6e 0a 2a 2a 20 61 74 74 65 6d 70 74 20 74 6f 20  n.** attempt to 
1e030 6b 65 65 70 20 72 65 6c 61 74 65 64 20 70 61 67  keep related pag
1e040 65 73 20 63 6c 6f 73 65 20 74 6f 20 65 61 63 68  es close to each
1e050 20 6f 74 68 65 72 20 69 6e 20 74 68 65 20 64 61   other in the da
1e060 74 61 62 61 73 65 20 66 69 6c 65 2c 0a 2a 2a 20  tabase file,.** 
1e070 77 68 69 63 68 20 69 6e 20 74 75 72 6e 20 63 61  which in turn ca
1e080 6e 20 6d 61 6b 65 20 64 61 74 61 62 61 73 65 20  n make database 
1e090 61 63 63 65 73 73 20 66 61 73 74 65 72 2e 0a 2a  access faster..*
1e0a0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 22 65 78 61  *.** If the "exa
1e0b0 63 74 22 20 70 61 72 61 6d 65 74 65 72 20 69 73  ct" parameter is
1e0c0 20 6e 6f 74 20 30 2c 20 61 6e 64 20 74 68 65 20   not 0, and the 
1e0d0 70 61 67 65 2d 6e 75 6d 62 65 72 20 6e 65 61 72  page-number near
1e0e0 62 79 20 65 78 69 73 74 73 20 0a 2a 2a 20 61 6e  by exists .** an
1e0f0 79 77 68 65 72 65 20 6f 6e 20 74 68 65 20 66 72  ywhere on the fr
1e100 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 20 69 74  ee-list, then it
1e110 20 69 73 20 67 75 61 72 65 6e 74 65 65 64 20 74   is guarenteed t
1e120 6f 20 62 65 20 72 65 74 75 72 6e 65 64 2e 20 54  o be returned. T
1e130 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 75  his.** is only u
1e140 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75  sed by auto-vacu
1e150 75 6d 20 64 61 74 61 62 61 73 65 73 20 77 68 65  um databases whe
1e160 6e 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e  n allocating a n
1e170 65 77 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  ew table..*/.sta
1e180 74 69 63 20 69 6e 74 20 61 6c 6c 6f 63 61 74 65  tic int allocate
1e190 42 74 72 65 65 50 61 67 65 28 0a 20 20 42 74 53  BtreePage(.  BtS
1e1a0 68 61 72 65 64 20 2a 70 42 74 2c 20 0a 20 20 4d  hared *pBt, .  M
1e1b0 65 6d 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c  emPage **ppPage,
1e1c0 20 0a 20 20 50 67 6e 6f 20 2a 70 50 67 6e 6f 2c   .  Pgno *pPgno,
1e1d0 20 0a 20 20 50 67 6e 6f 20 6e 65 61 72 62 79 2c   .  Pgno nearby,
1e1e0 0a 20 20 75 38 20 65 78 61 63 74 0a 29 7b 0a 20  .  u8 exact.){. 
1e1f0 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65 31   MemPage *pPage1
1e200 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
1e210 74 20 6e 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62  t n;     /* Numb
1e220 65 72 20 6f 66 20 70 61 67 65 73 20 6f 6e 20 74  er of pages on t
1e230 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
1e240 20 69 6e 74 20 6b 3b 20 20 20 20 20 2f 2a 20 4e   int k;     /* N
1e250 75 6d 62 65 72 20 6f 66 20 6c 65 61 76 65 73 20  umber of leaves 
1e260 6f 6e 20 74 68 65 20 74 72 75 6e 6b 20 6f 66 20  on the trunk of 
1e270 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
1e280 20 20 4d 65 6d 50 61 67 65 20 2a 70 54 72 75 6e    MemPage *pTrun
1e290 6b 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67 65  k = 0;.  MemPage
1e2a0 20 2a 70 50 72 65 76 54 72 75 6e 6b 20 3d 20 30   *pPrevTrunk = 0
1e2b0 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
1e2c0 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
1e2d0 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  pBt->mutex) );. 
1e2e0 20 70 50 61 67 65 31 20 3d 20 70 42 74 2d 3e 70   pPage1 = pBt->p
1e2f0 50 61 67 65 31 3b 0a 20 20 6e 20 3d 20 67 65 74  Page1;.  n = get
1e300 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
1e310 44 61 74 61 5b 33 36 5d 29 3b 0a 20 20 69 66 28  Data[36]);.  if(
1e320 20 6e 3e 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54   n>0 ){.    /* T
1e330 68 65 72 65 20 61 72 65 20 70 61 67 65 73 20 6f  here are pages o
1e340 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  n the freelist. 
1e350 20 52 65 75 73 65 20 6f 6e 65 20 6f 66 20 74 68   Reuse one of th
1e360 6f 73 65 20 70 61 67 65 73 2e 20 2a 2f 0a 20 20  ose pages. */.  
1e370 20 20 50 67 6e 6f 20 69 54 72 75 6e 6b 3b 0a 20    Pgno iTrunk;. 
1e380 20 20 20 75 38 20 73 65 61 72 63 68 4c 69 73 74     u8 searchList
1e390 20 3d 20 30 3b 20 2f 2a 20 49 66 20 74 68 65 20   = 0; /* If the 
1e3a0 66 72 65 65 2d 6c 69 73 74 20 6d 75 73 74 20 62  free-list must b
1e3b0 65 20 73 65 61 72 63 68 65 64 20 66 6f 72 20 27  e searched for '
1e3c0 6e 65 61 72 62 79 27 20 2a 2f 0a 20 20 20 20 0a  nearby' */.    .
1e3d0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 27 65      /* If the 'e
1e3e0 78 61 63 74 27 20 70 61 72 61 6d 65 74 65 72 20  xact' parameter 
1e3f0 77 61 73 20 74 72 75 65 20 61 6e 64 20 61 20 71  was true and a q
1e400 75 65 72 79 20 6f 66 20 74 68 65 20 70 6f 69 6e  uery of the poin
1e410 74 65 72 2d 6d 61 70 0a 20 20 20 20 2a 2a 20 73  ter-map.    ** s
1e420 68 6f 77 73 20 74 68 61 74 20 74 68 65 20 70 61  hows that the pa
1e430 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 73  ge 'nearby' is s
1e440 6f 6d 65 77 68 65 72 65 20 6f 6e 20 74 68 65 20  omewhere on the 
1e450 66 72 65 65 2d 6c 69 73 74 2c 20 74 68 65 6e 0a  free-list, then.
1e460 20 20 20 20 2a 2a 20 74 68 65 20 65 6e 74 69 72      ** the entir
1e470 65 2d 6c 69 73 74 20 77 69 6c 6c 20 62 65 20 73  e-list will be s
1e480 65 61 72 63 68 65 64 20 66 6f 72 20 74 68 61 74  earched for that
1e490 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 23 69   page..    */.#i
1e4a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1e4b0 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20  T_AUTOVACUUM.   
1e4c0 20 69 66 28 20 65 78 61 63 74 20 26 26 20 6e 65   if( exact && ne
1e4d0 61 72 62 79 3c 3d 70 61 67 65 72 50 61 67 65 63  arby<=pagerPagec
1e4e0 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
1e4f0 29 20 29 7b 0a 20 20 20 20 20 20 75 38 20 65 54  ) ){.      u8 eT
1e500 79 70 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ype;.      asser
1e510 74 28 20 6e 65 61 72 62 79 3e 30 20 29 3b 0a 20  t( nearby>0 );. 
1e520 20 20 20 20 20 61 73 73 65 72 74 28 20 70 42 74       assert( pBt
1e530 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 3b 0a  ->autoVacuum );.
1e540 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d 61        rc = ptrma
1e550 70 47 65 74 28 70 42 74 2c 20 6e 65 61 72 62 79  pGet(pBt, nearby
1e560 2c 20 26 65 54 79 70 65 2c 20 30 29 3b 0a 20 20  , &eType, 0);.  
1e570 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
1e580 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 69 66  urn rc;.      if
1e590 28 20 65 54 79 70 65 3d 3d 50 54 52 4d 41 50 5f  ( eType==PTRMAP_
1e5a0 46 52 45 45 50 41 47 45 20 29 7b 0a 20 20 20 20  FREEPAGE ){.    
1e5b0 20 20 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d      searchList =
1e5c0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
1e5d0 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 65 61 72 62    *pPgno = nearb
1e5e0 79 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  y;.    }.#endif.
1e5f0 0a 20 20 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  .    /* Decremen
1e600 74 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 20  t the free-list 
1e610 63 6f 75 6e 74 20 62 79 20 31 2e 20 53 65 74 20  count by 1. Set 
1e620 69 54 72 75 6e 6b 20 74 6f 20 74 68 65 20 69 6e  iTrunk to the in
1e630 64 65 78 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  dex of the.    *
1e640 2a 20 66 69 72 73 74 20 66 72 65 65 2d 6c 69 73  * first free-lis
1e650 74 20 74 72 75 6e 6b 20 70 61 67 65 2e 20 69 50  t trunk page. iP
1e660 72 65 76 54 72 75 6e 6b 20 69 73 20 69 6e 69 74  revTrunk is init
1e670 69 61 6c 6c 79 20 31 2e 0a 20 20 20 20 2a 2f 0a  ially 1..    */.
1e680 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1e690 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65  PagerWrite(pPage
1e6a0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
1e6b0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1e6c0 20 72 63 3b 0a 20 20 20 20 70 75 74 34 62 79 74   rc;.    put4byt
1e6d0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1e6e0 5b 33 36 5d 2c 20 6e 2d 31 29 3b 0a 0a 20 20 20  [36], n-1);..   
1e6f0 20 2f 2a 20 54 68 65 20 63 6f 64 65 20 77 69 74   /* The code wit
1e700 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 20 69 73  hin this loop is
1e710 20 72 75 6e 20 6f 6e 6c 79 20 6f 6e 63 65 20 69   run only once i
1e720 66 20 74 68 65 20 27 73 65 61 72 63 68 4c 69 73  f the 'searchLis
1e730 74 27 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20  t' variable.    
1e740 2a 2a 20 69 73 20 6e 6f 74 20 74 72 75 65 2e 20  ** is not true. 
1e750 4f 74 68 65 72 77 69 73 65 2c 20 69 74 20 72 75  Otherwise, it ru
1e760 6e 73 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ns once for each
1e770 20 74 72 75 6e 6b 2d 70 61 67 65 20 6f 6e 20 74   trunk-page on t
1e780 68 65 0a 20 20 20 20 2a 2a 20 66 72 65 65 2d 6c  he.    ** free-l
1e790 69 73 74 20 75 6e 74 69 6c 20 74 68 65 20 70 61  ist until the pa
1e7a0 67 65 20 27 6e 65 61 72 62 79 27 20 69 73 20 6c  ge 'nearby' is l
1e7b0 6f 63 61 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  ocated..    */. 
1e7c0 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 70 50     do {.      pP
1e7d0 72 65 76 54 72 75 6e 6b 20 3d 20 70 54 72 75 6e  revTrunk = pTrun
1e7e0 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 72  k;.      if( pPr
1e7f0 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20 20 20  evTrunk ){.     
1e800 20 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34     iTrunk = get4
1e810 62 79 74 65 28 26 70 50 72 65 76 54 72 75 6e 6b  byte(&pPrevTrunk
1e820 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20 20  ->aData[0]);.   
1e830 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e840 20 20 69 54 72 75 6e 6b 20 3d 20 67 65 74 34 62    iTrunk = get4b
1e850 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61  yte(&pPage1->aDa
1e860 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 20 20 7d  ta[32]);.      }
1e870 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1e880 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
1e890 70 42 74 2c 20 69 54 72 75 6e 6b 2c 20 26 70 54  pBt, iTrunk, &pT
1e8a0 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 20 20  runk, 0);.      
1e8b0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1e8c0 20 20 70 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20    pTrunk = 0;.  
1e8d0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
1e8e0 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20 20  llocate_page;.  
1e8f0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 6b 20 3d      }..      k =
1e900 20 67 65 74 34 62 79 74 65 28 26 70 54 72 75 6e   get4byte(&pTrun
1e910 6b 2d 3e 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20  k->aData[4]);.  
1e920 20 20 20 20 69 66 28 20 6b 3d 3d 30 20 26 26 20      if( k==0 && 
1e930 21 73 65 61 72 63 68 4c 69 73 74 20 29 7b 0a 20  !searchList ){. 
1e940 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72         /* The tr
1e950 75 6e 6b 20 68 61 73 20 6e 6f 20 6c 65 61 76 65  unk has no leave
1e960 73 20 61 6e 64 20 74 68 65 20 6c 69 73 74 20 69  s and the list i
1e970 73 20 6e 6f 74 20 62 65 69 6e 67 20 73 65 61 72  s not being sear
1e980 63 68 65 64 2e 20 0a 20 20 20 20 20 20 20 20 2a  ched. .        *
1e990 2a 20 53 6f 20 65 78 74 72 61 63 74 20 74 68 65  * So extract the
1e9a0 20 74 72 75 6e 6b 20 70 61 67 65 20 69 74 73 65   trunk page itse
1e9b0 6c 66 20 61 6e 64 20 75 73 65 20 69 74 20 61 73  lf and use it as
1e9c0 20 74 68 65 20 6e 65 77 6c 79 20 0a 20 20 20 20   the newly .    
1e9d0 20 20 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 65 64      ** allocated
1e9e0 20 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 20   page */.       
1e9f0 20 61 73 73 65 72 74 28 20 70 50 72 65 76 54 72   assert( pPrevTr
1ea00 75 6e 6b 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  unk==0 );.      
1ea10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1ea20 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
1ea30 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1ea40 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1ea50 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1ea60 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
1ea70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ea80 20 2a 70 50 67 6e 6f 20 3d 20 69 54 72 75 6e 6b   *pPgno = iTrunk
1ea90 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  ;.        memcpy
1eaa0 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61 5b  (&pPage1->aData[
1eab0 33 32 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44  32], &pTrunk->aD
1eac0 61 74 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20  ata[0], 4);.    
1ead0 20 20 20 20 2a 70 70 50 61 67 65 20 3d 20 70 54      *ppPage = pT
1eae0 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20 20 70 54  runk;.        pT
1eaf0 72 75 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20  runk = 0;.      
1eb00 20 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41    TRACE(("ALLOCA
1eb10 54 45 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25  TE: %d trunk - %
1eb20 64 20 66 72 65 65 20 70 61 67 65 73 20 6c 65 66  d free pages lef
1eb30 74 5c 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d  t\n", *pPgno, n-
1eb40 31 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  1));.      }else
1eb50 20 69 66 28 20 6b 3e 70 42 74 2d 3e 75 73 61 62   if( k>pBt->usab
1eb60 6c 65 53 69 7a 65 2f 34 20 2d 20 32 20 29 7b 0a  leSize/4 - 2 ){.
1eb70 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
1eb80 20 6f 66 20 6b 20 69 73 20 6f 75 74 20 6f 66 20   of k is out of 
1eb90 72 61 6e 67 65 2e 20 20 44 61 74 61 62 61 73 65  range.  Database
1eba0 20 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 20   corruption */. 
1ebb0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1ebc0 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b  TE_CORRUPT_BKPT;
1ebd0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
1ebe0 64 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b  d_allocate_page;
1ebf0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1ec00 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1ec10 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1ec20 73 65 61 72 63 68 4c 69 73 74 20 26 26 20 6e 65  searchList && ne
1ec30 61 72 62 79 3d 3d 69 54 72 75 6e 6b 20 29 7b 0a  arby==iTrunk ){.
1ec40 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c          /* The l
1ec50 69 73 74 20 69 73 20 62 65 69 6e 67 20 73 65 61  ist is being sea
1ec60 72 63 68 65 64 20 61 6e 64 20 74 68 69 73 20 74  rched and this t
1ec70 72 75 6e 6b 20 70 61 67 65 20 69 73 20 74 68 65  runk page is the
1ec80 20 70 61 67 65 0a 20 20 20 20 20 20 20 20 2a 2a   page.        **
1ec90 20 74 6f 20 61 6c 6c 6f 63 61 74 65 2c 20 72 65   to allocate, re
1eca0 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65 74  gardless of whet
1ecb0 68 65 72 20 69 74 20 68 61 73 20 6c 65 61 76 65  her it has leave
1ecc0 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
1ecd0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 2a 70        assert( *p
1ece0 50 67 6e 6f 3d 3d 69 54 72 75 6e 6b 20 29 3b 0a  Pgno==iTrunk );.
1ecf0 20 20 20 20 20 20 20 20 2a 70 70 50 61 67 65 20          *ppPage 
1ed00 3d 20 70 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20  = pTrunk;.      
1ed10 20 20 73 65 61 72 63 68 4c 69 73 74 20 3d 20 30    searchList = 0
1ed20 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
1ed30 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1ed40 28 70 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65  (pTrunk->pDbPage
1ed50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1ed60 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  c ){.          g
1ed70 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
1ed80 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 7d  _page;.        }
1ed90 0a 20 20 20 20 20 20 20 20 69 66 28 20 6b 3d 3d  .        if( k==
1eda0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  0 ){.          i
1edb0 66 28 20 21 70 50 72 65 76 54 72 75 6e 6b 20 29  f( !pPrevTrunk )
1edc0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65  {.            me
1edd0 6d 63 70 79 28 26 70 50 61 67 65 31 2d 3e 61 44  mcpy(&pPage1->aD
1ede0 61 74 61 5b 33 32 5d 2c 20 26 70 54 72 75 6e 6b  ata[32], &pTrunk
1edf0 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29 3b 0a  ->aData[0], 4);.
1ee00 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
1ee10 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
1ee20 63 70 79 28 26 70 50 72 65 76 54 72 75 6e 6b 2d  cpy(&pPrevTrunk-
1ee30 3e 61 44 61 74 61 5b 30 5d 2c 20 26 70 54 72 75  >aData[0], &pTru
1ee40 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d 2c 20 34 29  nk->aData[0], 4)
1ee50 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1ee60 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1ee70 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 72         /* The tr
1ee80 75 6e 6b 20 70 61 67 65 20 69 73 20 72 65 71 75  unk page is requ
1ee90 69 72 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  ired by the call
1eea0 65 72 20 62 75 74 20 69 74 20 63 6f 6e 74 61 69  er but it contai
1eeb0 6e 73 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ns .          **
1eec0 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 66 72 65   pointers to fre
1eed0 65 2d 6c 69 73 74 20 6c 65 61 76 65 73 2e 20 54  e-list leaves. T
1eee0 68 65 20 66 69 72 73 74 20 6c 65 61 66 20 62 65  he first leaf be
1eef0 63 6f 6d 65 73 20 61 20 74 72 75 6e 6b 0a 20 20  comes a trunk.  
1ef00 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
1ef10 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
1ef20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1ef30 20 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e       MemPage *pN
1ef40 65 77 54 72 75 6e 6b 3b 0a 20 20 20 20 20 20 20  ewTrunk;.       
1ef50 20 20 20 50 67 6e 6f 20 69 4e 65 77 54 72 75 6e     Pgno iNewTrun
1ef60 6b 20 3d 20 67 65 74 34 62 79 74 65 28 26 70 54  k = get4byte(&pT
1ef70 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 29 3b  runk->aData[8]);
1ef80 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1ef90 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
1efa0 61 67 65 28 70 42 74 2c 20 69 4e 65 77 54 72 75  age(pBt, iNewTru
1efb0 6e 6b 2c 20 26 70 4e 65 77 54 72 75 6e 6b 2c 20  nk, &pNewTrunk, 
1efc0 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0);.          if
1efd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1efe0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  ){.            g
1eff0 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74 65  oto end_allocate
1f000 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20 20  _page;.         
1f010 20 7d 0a 20 20 20 20 20 20 20 20 20 20 72 63 20   }.          rc 
1f020 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
1f030 69 74 65 28 70 4e 65 77 54 72 75 6e 6b 2d 3e 70  ite(pNewTrunk->p
1f040 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  DbPage);.       
1f050 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1f060 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1f070 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
1f080 70 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20 20 20  pNewTrunk);.    
1f090 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
1f0a0 5f 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a  _allocate_page;.
1f0b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1f0c0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 4e        memcpy(&pN
1f0d0 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30  ewTrunk->aData[0
1f0e0 5d 2c 20 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  ], &pTrunk->aDat
1f0f0 61 5b 30 5d 2c 20 34 29 3b 0a 20 20 20 20 20 20  a[0], 4);.      
1f100 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 4e      put4byte(&pN
1f110 65 77 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34  ewTrunk->aData[4
1f120 5d 2c 20 6b 2d 31 29 3b 0a 20 20 20 20 20 20 20  ], k-1);.       
1f130 20 20 20 6d 65 6d 63 70 79 28 26 70 4e 65 77 54     memcpy(&pNewT
1f140 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 38 5d 2c 20  runk->aData[8], 
1f150 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 31  &pTrunk->aData[1
1f160 32 5d 2c 20 28 6b 2d 31 29 2a 34 29 3b 0a 20 20  2], (k-1)*4);.  
1f170 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
1f180 61 67 65 28 70 4e 65 77 54 72 75 6e 6b 29 3b 0a  age(pNewTrunk);.
1f190 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
1f1a0 50 72 65 76 54 72 75 6e 6b 20 29 7b 0a 20 20 20  PrevTrunk ){.   
1f1b0 20 20 20 20 20 20 20 20 20 70 75 74 34 62 79 74           put4byt
1f1c0 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74 61  e(&pPage1->aData
1f1d0 5b 33 32 5d 2c 20 69 4e 65 77 54 72 75 6e 6b 29  [32], iNewTrunk)
1f1e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
1f1f0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
1f200 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1f210 57 72 69 74 65 28 70 50 72 65 76 54 72 75 6e 6b  Write(pPrevTrunk
1f220 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
1f230 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
1f240 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1f250 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
1f260 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
1f270 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1f280 20 20 70 75 74 34 62 79 74 65 28 26 70 50 72 65    put4byte(&pPre
1f290 76 54 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 30 5d  vTrunk->aData[0]
1f2a0 2c 20 69 4e 65 77 54 72 75 6e 6b 29 3b 0a 20 20  , iNewTrunk);.  
1f2b0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f2c0 20 20 7d 0a 20 20 20 20 20 20 20 20 70 54 72 75    }.        pTru
1f2d0 6e 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  nk = 0;.        
1f2e0 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45  TRACE(("ALLOCATE
1f2f0 3a 20 25 64 20 74 72 75 6e 6b 20 2d 20 25 64 20  : %d trunk - %d 
1f300 66 72 65 65 20 70 61 67 65 73 20 6c 65 66 74 5c  free pages left\
1f310 6e 22 2c 20 2a 70 50 67 6e 6f 2c 20 6e 2d 31 29  n", *pPgno, n-1)
1f320 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
1f330 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
1f340 2a 20 45 78 74 72 61 63 74 20 61 20 6c 65 61 66  * Extract a leaf
1f350 20 66 72 6f 6d 20 74 68 65 20 74 72 75 6e 6b 20   from the trunk 
1f360 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63  */.        int c
1f370 6c 6f 73 65 73 74 3b 0a 20 20 20 20 20 20 20 20  losest;.        
1f380 50 67 6e 6f 20 69 50 61 67 65 3b 0a 20 20 20 20  Pgno iPage;.    
1f390 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61      unsigned cha
1f3a0 72 20 2a 61 44 61 74 61 20 3d 20 70 54 72 75 6e  r *aData = pTrun
1f3b0 6b 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  k->aData;.      
1f3c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1f3d0 67 65 72 57 72 69 74 65 28 70 54 72 75 6e 6b 2d  gerWrite(pTrunk-
1f3e0 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20  >pDbPage);.     
1f3f0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1f400 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
1f410 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3b 0a 20  allocate_page;. 
1f420 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f430 20 69 66 28 20 6e 65 61 72 62 79 3e 30 20 29 7b   if( nearby>0 ){
1f440 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69  .          int i
1f450 2c 20 64 69 73 74 3b 0a 20 20 20 20 20 20 20 20  , dist;.        
1f460 20 20 63 6c 6f 73 65 73 74 20 3d 20 30 3b 0a 20    closest = 0;. 
1f470 20 20 20 20 20 20 20 20 20 64 69 73 74 20 3d 20           dist = 
1f480 67 65 74 34 62 79 74 65 28 26 61 44 61 74 61 5b  get4byte(&aData[
1f490 38 5d 29 20 2d 20 6e 65 61 72 62 79 3b 0a 20 20  8]) - nearby;.  
1f4a0 20 20 20 20 20 20 20 20 69 66 28 20 64 69 73 74          if( dist
1f4b0 3c 30 20 29 20 64 69 73 74 20 3d 20 2d 64 69 73  <0 ) dist = -dis
1f4c0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  t;.          for
1f4d0 28 69 3d 31 3b 20 69 3c 6b 3b 20 69 2b 2b 29 7b  (i=1; i<k; i++){
1f4e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
1f4f0 20 64 32 20 3d 20 67 65 74 34 62 79 74 65 28 26   d2 = get4byte(&
1f500 61 44 61 74 61 5b 38 2b 69 2a 34 5d 29 20 2d 20  aData[8+i*4]) - 
1f510 6e 65 61 72 62 79 3b 0a 20 20 20 20 20 20 20 20  nearby;.        
1f520 20 20 20 20 69 66 28 20 64 32 3c 30 20 29 20 64      if( d2<0 ) d
1f530 32 20 3d 20 2d 64 32 3b 0a 20 20 20 20 20 20 20  2 = -d2;.       
1f540 20 20 20 20 20 69 66 28 20 64 32 3c 64 69 73 74       if( d2<dist
1f550 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1f560 20 20 63 6c 6f 73 65 73 74 20 3d 20 69 3b 0a 20    closest = i;. 
1f570 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73               dis
1f580 74 20 3d 20 64 32 3b 0a 20 20 20 20 20 20 20 20  t = d2;.        
1f590 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1f5a0 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
1f5b0 0a 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65  .          close
1f5c0 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  st = 0;.        
1f5d0 7d 0a 0a 20 20 20 20 20 20 20 20 69 50 61 67 65  }..        iPage
1f5e0 20 3d 20 67 65 74 34 62 79 74 65 28 26 61 44 61   = get4byte(&aDa
1f5f0 74 61 5b 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 29  ta[8+closest*4])
1f600 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73  ;.        if( !s
1f610 65 61 72 63 68 4c 69 73 74 20 7c 7c 20 69 50 61  earchList || iPa
1f620 67 65 3d 3d 6e 65 61 72 62 79 20 29 7b 0a 20 20  ge==nearby ){.  
1f630 20 20 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67          int nPag
1f640 65 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 70 50  e;.          *pP
1f650 67 6e 6f 20 3d 20 69 50 61 67 65 3b 0a 20 20 20  gno = iPage;.   
1f660 20 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 70         nPage = p
1f670 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 42  agerPagecount(pB
1f680 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 20 20  t->pPager);.    
1f690 20 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f        if( *pPgno
1f6a0 3e 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20  >nPage ){.      
1f6b0 20 20 20 20 20 20 2f 2a 20 46 72 65 65 20 70 61        /* Free pa
1f6c0 67 65 20 6f 66 66 20 74 68 65 20 65 6e 64 20 6f  ge off the end o
1f6d0 66 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20  f the file */.  
1f6e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
1f6f0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1f700 50 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT;.            
1f710 67 6f 74 6f 20 65 6e 64 5f 61 6c 6c 6f 63 61 74  goto end_allocat
1f720 65 5f 70 61 67 65 3b 0a 20 20 20 20 20 20 20 20  e_page;.        
1f730 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 54 52    }.          TR
1f740 41 43 45 28 28 22 41 4c 4c 4f 43 41 54 45 3a 20  ACE(("ALLOCATE: 
1f750 25 64 20 77 61 73 20 6c 65 61 66 20 25 64 20 6f  %d was leaf %d o
1f760 66 20 25 64 20 6f 6e 20 74 72 75 6e 6b 20 25 64  f %d on trunk %d
1f770 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
1f780 20 20 20 22 3a 20 25 64 20 6d 6f 72 65 20 66 72     ": %d more fr
1f790 65 65 20 70 61 67 65 73 5c 6e 22 2c 0a 20 20 20  ee pages\n",.   
1f7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 70                *p
1f7b0 50 67 6e 6f 2c 20 63 6c 6f 73 65 73 74 2b 31 2c  Pgno, closest+1,
1f7c0 20 6b 2c 20 70 54 72 75 6e 6b 2d 3e 70 67 6e 6f   k, pTrunk->pgno
1f7d0 2c 20 6e 2d 31 29 29 3b 0a 20 20 20 20 20 20 20  , n-1));.       
1f7e0 20 20 20 69 66 28 20 63 6c 6f 73 65 73 74 3c 6b     if( closest<k
1f7f0 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -1 ){.          
1f800 20 20 6d 65 6d 63 70 79 28 26 61 44 61 74 61 5b    memcpy(&aData[
1f810 38 2b 63 6c 6f 73 65 73 74 2a 34 5d 2c 20 26 61  8+closest*4], &a
1f820 44 61 74 61 5b 34 2b 6b 2a 34 5d 2c 20 34 29 3b  Data[4+k*4], 4);
1f830 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1f840 20 20 20 20 20 20 20 70 75 74 34 62 79 74 65 28         put4byte(
1f850 26 61 44 61 74 61 5b 34 5d 2c 20 6b 2d 31 29 3b  &aData[4], k-1);
1f860 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1f870 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50  sqlite3BtreeGetP
1f880 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e 6f 2c  age(pBt, *pPgno,
1f890 20 70 70 50 61 67 65 2c 20 31 29 3b 0a 20 20 20   ppPage, 1);.   
1f8a0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
1f8b0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1f8c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
1f8d0 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
1f8e0 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
1f8f0 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1f900 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
1f910 67 65 72 57 72 69 74 65 28 28 2a 70 70 50 61 67  gerWrite((*ppPag
1f920 65 29 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e)->pDbPage);.  
1f930 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1f940 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1f950 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c               rel
1f960 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67 65  easePage(*ppPage
1f970 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
1f980 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1f990 20 20 20 20 20 20 20 73 65 61 72 63 68 4c 69 73         searchLis
1f9a0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  t = 0;.        }
1f9b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1f9c0 65 6c 65 61 73 65 50 61 67 65 28 70 50 72 65 76  eleasePage(pPrev
1f9d0 54 72 75 6e 6b 29 3b 0a 20 20 20 20 20 20 70 50  Trunk);.      pP
1f9e0 72 65 76 54 72 75 6e 6b 20 3d 20 30 3b 0a 20 20  revTrunk = 0;.  
1f9f0 20 20 7d 77 68 69 6c 65 28 20 73 65 61 72 63 68    }while( search
1fa00 4c 69 73 74 20 29 3b 0a 20 20 7d 65 6c 73 65 7b  List );.  }else{
1fa10 0a 20 20 20 20 2f 2a 20 54 68 65 72 65 20 61 72  .    /* There ar
1fa20 65 20 6e 6f 20 70 61 67 65 73 20 6f 6e 20 74 68  e no pages on th
1fa30 65 20 66 72 65 65 6c 69 73 74 2c 20 73 6f 20 63  e freelist, so c
1fa40 72 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  reate a new page
1fa50 20 61 74 20 74 68 65 0a 20 20 20 20 2a 2a 20 65   at the.    ** e
1fa60 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 2a  nd of the file *
1fa70 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67 65 20  /.    int nPage 
1fa80 3d 20 70 61 67 65 72 50 61 67 65 63 6f 75 6e 74  = pagerPagecount
1fa90 28 70 42 74 2d 3e 70 50 61 67 65 72 29 3b 0a 20  (pBt->pPager);. 
1faa0 20 20 20 2a 70 50 67 6e 6f 20 3d 20 6e 50 61 67     *pPgno = nPag
1fab0 65 20 2b 20 31 3b 0a 0a 23 69 66 6e 64 65 66 20  e + 1;..#ifndef 
1fac0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1fad0 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
1fae0 42 74 2d 3e 6e 54 72 75 6e 63 20 29 7b 0a 20 20  Bt->nTrunc ){.  
1faf0 20 20 20 20 2f 2a 20 41 6e 20 69 6e 63 72 2d 76      /* An incr-v
1fb00 61 63 75 75 6d 20 68 61 73 20 61 6c 72 65 61 64  acuum has alread
1fb10 79 20 72 75 6e 20 77 69 74 68 69 6e 20 74 68 69  y run within thi
1fb20 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 53  s transaction. S
1fb30 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70  o the.      ** p
1fb40 61 67 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  age to allocate 
1fb50 69 73 20 6e 6f 74 20 66 72 6f 6d 20 74 68 65 20  is not from the 
1fb60 70 68 79 73 69 63 61 6c 20 65 6e 64 20 6f 66 20  physical end of 
1fb70 74 68 65 20 66 69 6c 65 2c 20 62 75 74 0a 20 20  the file, but.  
1fb80 20 20 20 20 2a 2a 20 61 74 20 70 42 74 2d 3e 6e      ** at pBt->n
1fb90 54 72 75 6e 63 2e 20 0a 20 20 20 20 20 20 2a 2f  Trunc. .      */
1fba0 0a 20 20 20 20 20 20 2a 70 50 67 6e 6f 20 3d 20  .      *pPgno = 
1fbb0 70 42 74 2d 3e 6e 54 72 75 6e 63 2b 31 3b 0a 20  pBt->nTrunc+1;. 
1fbc0 20 20 20 20 20 69 66 28 20 2a 70 50 67 6e 6f 3d       if( *pPgno=
1fbd0 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1fbe0 47 45 28 70 42 74 29 20 29 7b 0a 20 20 20 20 20  GE(pBt) ){.     
1fbf0 20 20 20 28 2a 70 50 67 6e 6f 29 2b 2b 3b 0a 20     (*pPgno)++;. 
1fc00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1fc10 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61   if( pBt->autoVa
1fc20 63 75 75 6d 20 26 26 20 50 54 52 4d 41 50 5f 49  cuum && PTRMAP_I
1fc30 53 50 41 47 45 28 70 42 74 2c 20 2a 70 50 67 6e  SPAGE(pBt, *pPgn
1fc40 6f 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  o) ){.      /* I
1fc50 66 20 2a 70 50 67 6e 6f 20 72 65 66 65 72 73 20  f *pPgno refers 
1fc60 74 6f 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70  to a pointer-map
1fc70 20 70 61 67 65 2c 20 61 6c 6c 6f 63 61 74 65 20   page, allocate 
1fc80 74 77 6f 20 6e 65 77 20 70 61 67 65 73 0a 20 20  two new pages.  
1fc90 20 20 20 20 2a 2a 20 61 74 20 74 68 65 20 65 6e      ** at the en
1fca0 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e  d of the file in
1fcb0 73 74 65 61 64 20 6f 66 20 6f 6e 65 2e 20 54 68  stead of one. Th
1fcc0 65 20 66 69 72 73 74 20 61 6c 6c 6f 63 61 74 65  e first allocate
1fcd0 64 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  d page.      ** 
1fce0 62 65 63 6f 6d 65 73 20 61 20 6e 65 77 20 70 6f  becomes a new po
1fcf0 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 2c 20  inter-map page, 
1fd00 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 75 73  the second is us
1fd10 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ed by the caller
1fd20 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1fd30 20 54 52 41 43 45 28 28 22 41 4c 4c 4f 43 41 54   TRACE(("ALLOCAT
1fd40 45 3a 20 25 64 20 66 72 6f 6d 20 65 6e 64 20 6f  E: %d from end o
1fd50 66 20 66 69 6c 65 20 28 70 6f 69 6e 74 65 72 2d  f file (pointer-
1fd60 6d 61 70 20 70 61 67 65 29 5c 6e 22 2c 20 2a 70  map page)\n", *p
1fd70 50 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 61 73  Pgno));.      as
1fd80 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50 45  sert( *pPgno!=PE
1fd90 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28  NDING_BYTE_PAGE(
1fda0 70 42 74 29 20 29 3b 0a 20 20 20 20 20 20 28 2a  pBt) );.      (*
1fdb0 70 50 67 6e 6f 29 2b 2b 3b 0a 20 20 20 20 20 20  pPgno)++;.      
1fdc0 69 66 28 20 2a 70 50 67 6e 6f 3d 3d 50 45 4e 44  if( *pPgno==PEND
1fdd0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
1fde0 74 29 20 29 7b 20 28 2a 70 50 67 6e 6f 29 2b 2b  t) ){ (*pPgno)++
1fdf0 3b 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ; }.    }.    if
1fe00 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 20 29 7b  ( pBt->nTrunc ){
1fe10 0a 20 20 20 20 20 20 70 42 74 2d 3e 6e 54 72 75  .      pBt->nTru
1fe20 6e 63 20 3d 20 2a 70 50 67 6e 6f 3b 0a 20 20 20  nc = *pPgno;.   
1fe30 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 61   }.#endif..    a
1fe40 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21 3d 50  ssert( *pPgno!=P
1fe50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45  ENDING_BYTE_PAGE
1fe60 28 70 42 74 29 20 29 3b 0a 20 20 20 20 72 63 20  (pBt) );.    rc 
1fe70 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65  = sqlite3BtreeGe
1fe80 74 50 61 67 65 28 70 42 74 2c 20 2a 70 50 67 6e  tPage(pBt, *pPgn
1fe90 6f 2c 20 70 70 50 61 67 65 2c 20 30 29 3b 0a 20  o, ppPage, 0);. 
1fea0 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
1feb0 72 6e 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20  rn rc;.    rc = 
1fec0 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1fed0 65 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62  e((*ppPage)->pDb
1fee0 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20 72  Page);.    if( r
1fef0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1ff00 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67        releasePag
1ff10 65 28 2a 70 70 50 61 67 65 29 3b 0a 20 20 20 20  e(*ppPage);.    
1ff20 7d 0a 20 20 20 20 54 52 41 43 45 28 28 22 41 4c  }.    TRACE(("AL
1ff30 4c 4f 43 41 54 45 3a 20 25 64 20 66 72 6f 6d 20  LOCATE: %d from 
1ff40 65 6e 64 20 6f 66 20 66 69 6c 65 5c 6e 22 2c 20  end of file\n", 
1ff50 2a 70 50 67 6e 6f 29 29 3b 0a 20 20 7d 0a 0a 20  *pPgno));.  }.. 
1ff60 20 61 73 73 65 72 74 28 20 2a 70 50 67 6e 6f 21   assert( *pPgno!
1ff70 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41  =PENDING_BYTE_PA
1ff80 47 45 28 70 42 74 29 20 29 3b 0a 0a 65 6e 64 5f  GE(pBt) );..end_
1ff90 61 6c 6c 6f 63 61 74 65 5f 70 61 67 65 3a 0a 20  allocate_page:. 
1ffa0 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 72   releasePage(pTr
1ffb0 75 6e 6b 29 3b 0a 20 20 72 65 6c 65 61 73 65 50  unk);.  releaseP
1ffc0 61 67 65 28 70 50 72 65 76 54 72 75 6e 6b 29 3b  age(pPrevTrunk);
1ffd0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1ffe0 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65 33 50  E_OK && sqlite3P
1fff0 61 67 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74  agerPageRefcount
20000 28 28 2a 70 70 50 61 67 65 29 2d 3e 70 44 62 50  ((*ppPage)->pDbP
20010 61 67 65 29 3e 31 20 29 7b 0a 20 20 20 20 72 65  age)>1 ){.    re
20020 6c 65 61 73 65 50 61 67 65 28 2a 70 70 50 61 67  leasePage(*ppPag
20030 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  e);.    return S
20040 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
20050 50 54 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  PT;.  }.  return
20060 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
20070 64 20 61 20 70 61 67 65 20 6f 66 20 74 68 65 20  d a page of the 
20080 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
20090 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a   the freelist..*
200a0 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  *.** sqlite3Page
200b0 72 55 6e 72 65 66 28 29 20 69 73 20 4e 4f 54 20  rUnref() is NOT 
200c0 63 61 6c 6c 65 64 20 66 6f 72 20 70 50 61 67 65  called for pPage
200d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
200e0 66 72 65 65 50 61 67 65 28 4d 65 6d 50 61 67 65  freePage(MemPage
200f0 20 2a 70 50 61 67 65 29 7b 0a 20 20 42 74 53 68   *pPage){.  BtSh
20100 61 72 65 64 20 2a 70 42 74 20 3d 20 70 50 61 67  ared *pBt = pPag
20110 65 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67  e->pBt;.  MemPag
20120 65 20 2a 70 50 61 67 65 31 20 3d 20 70 42 74 2d  e *pPage1 = pBt-
20130 3e 70 50 61 67 65 31 3b 0a 20 20 69 6e 74 20 72  >pPage1;.  int r
20140 63 2c 20 6e 2c 20 6b 3b 0a 0a 20 20 2f 2a 20 50  c, n, k;..  /* P
20150 72 65 70 61 72 65 20 74 68 65 20 70 61 67 65 20  repare the page 
20160 66 6f 72 20 66 72 65 65 69 6e 67 20 2a 2f 0a 20  for freeing */. 
20170 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
20180 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
20190 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
201a0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
201b0 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a 20 20 70  e->pgno>1 );.  p
201c0 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30  Page->isInit = 0
201d0 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  ;..  /* Incremen
201e0 74 20 74 68 65 20 66 72 65 65 20 70 61 67 65 20  t the free page 
201f0 63 6f 75 6e 74 20 6f 6e 20 70 50 61 67 65 31 20  count on pPage1 
20200 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
20210 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
20220 65 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  e1->pDbPage);.  
20230 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
20240 72 63 3b 0a 20 20 6e 20 3d 20 67 65 74 34 62 79  rc;.  n = get4by
20250 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
20260 61 5b 33 36 5d 29 3b 0a 20 20 70 75 74 34 62 79  a[36]);.  put4by
20270 74 65 28 26 70 50 61 67 65 31 2d 3e 61 44 61 74  te(&pPage1->aDat
20280 61 5b 33 36 5d 2c 20 6e 2b 31 29 3b 0a 0a 23 69  a[36], n+1);..#i
20290 66 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55  fdef SQLITE_SECU
202a0 52 45 5f 44 45 4c 45 54 45 0a 20 20 2f 2a 20 49  RE_DELETE.  /* I
202b0 66 20 74 68 65 20 53 51 4c 49 54 45 5f 53 45 43  f the SQLITE_SEC
202c0 55 52 45 5f 44 45 4c 45 54 45 20 63 6f 6d 70 69  URE_DELETE compi
202d0 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 20 69  le-time option i
202e0 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 0a  s enabled, then.
202f0 20 20 2a 2a 20 61 6c 77 61 79 73 20 66 75 6c 6c    ** always full
20300 79 20 6f 76 65 72 77 72 69 74 65 20 64 65 6c 65  y overwrite dele
20310 74 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ted information 
20320 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 2a 2f  with zeros..  */
20330 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
20340 61 67 65 72 57 72 69 74 65 28 70 50 61 67 65 2d  agerWrite(pPage-
20350 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 69 66 28  >pDbPage);.  if(
20360 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
20370 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 2d  .  memset(pPage-
20380 3e 61 44 61 74 61 2c 20 30 2c 20 70 50 61 67 65  >aData, 0, pPage
20390 2d 3e 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 29  ->pBt->pageSize)
203a0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 49  ;.#endif..  /* I
203b0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73  f the database s
203c0 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61 63  upports auto-vac
203d0 75 75 6d 2c 20 77 72 69 74 65 20 61 6e 20 65 6e  uum, write an en
203e0 74 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74  try in the point
203f0 65 72 2d 6d 61 70 0a 20 20 2a 2a 20 74 6f 20 69  er-map.  ** to i
20400 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
20410 20 70 61 67 65 20 69 73 20 66 72 65 65 2e 0a 20   page is free.. 
20420 20 2a 2f 0a 20 20 69 66 28 20 49 53 41 55 54 4f   */.  if( ISAUTO
20430 56 41 43 55 55 4d 20 29 7b 0a 20 20 20 20 72 63  VACUUM ){.    rc
20440 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
20450 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 50  , pPage->pgno, P
20460 54 52 4d 41 50 5f 46 52 45 45 50 41 47 45 2c 20  TRMAP_FREEPAGE, 
20470 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
20480 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
20490 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20  .  if( n==0 ){. 
204a0 20 20 20 2f 2a 20 54 68 69 73 20 69 73 20 74 68     /* This is th
204b0 65 20 66 69 72 73 74 20 66 72 65 65 20 70 61 67  e first free pag
204c0 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  e */.    rc = sq
204d0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
204e0 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 3b  pPage->pDbPage);
204f0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
20500 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 6d 65 6d  turn rc;.    mem
20510 73 65 74 28 70 50 61 67 65 2d 3e 61 44 61 74 61  set(pPage->aData
20520 2c 20 30 2c 20 38 29 3b 0a 20 20 20 20 70 75 74  , 0, 8);.    put
20530 34 62 79 74 65 28 26 70 50 61 67 65 31 2d 3e 61  4byte(&pPage1->a
20540 44 61 74 61 5b 33 32 5d 2c 20 70 50 61 67 65 2d  Data[32], pPage-
20550 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 54 52 41 43  >pgno);.    TRAC
20560 45 28 28 22 46 52 45 45 2d 50 41 47 45 3a 20 25  E(("FREE-PAGE: %
20570 64 20 66 69 72 73 74 5c 6e 22 2c 20 70 50 61 67  d first\n", pPag
20580 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c  e->pgno));.  }el
20590 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 74 68 65 72  se{.    /* Other
205a0 20 66 72 65 65 20 70 61 67 65 73 20 61 6c 72 65   free pages alre
205b0 61 64 79 20 65 78 69 73 74 2e 20 20 52 65 74 72  ady exist.  Retr
205c0 69 76 65 20 74 68 65 20 66 69 72 73 74 20 74 72  ive the first tr
205d0 75 6e 6b 20 70 61 67 65 0a 20 20 20 20 2a 2a 20  unk page.    ** 
205e0 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
205f0 61 6e 64 20 66 69 6e 64 20 6f 75 74 20 68 6f 77  and find out how
20600 20 6d 61 6e 79 20 6c 65 61 76 65 73 20 69 74 20   many leaves it 
20610 68 61 73 2e 20 2a 2f 0a 20 20 20 20 4d 65 6d 50  has. */.    MemP
20620 61 67 65 20 2a 70 54 72 75 6e 6b 3b 0a 20 20 20  age *pTrunk;.   
20630 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
20640 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 67  eeGetPage(pBt, g
20650 65 74 34 62 79 74 65 28 26 70 50 61 67 65 31 2d  et4byte(&pPage1-
20660 3e 61 44 61 74 61 5b 33 32 5d 29 2c 20 26 70 54  >aData[32]), &pT
20670 72 75 6e 6b 2c 20 30 29 3b 0a 20 20 20 20 69 66  runk, 0);.    if
20680 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
20690 3b 0a 20 20 20 20 6b 20 3d 20 67 65 74 34 62 79  ;.    k = get4by
206a0 74 65 28 26 70 54 72 75 6e 6b 2d 3e 61 44 61 74  te(&pTrunk->aDat
206b0 61 5b 34 5d 29 3b 0a 20 20 20 20 69 66 28 20 6b  a[4]);.    if( k
206c0 3e 3d 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  >=pBt->usableSiz
206d0 65 2f 34 20 2d 20 38 20 29 7b 0a 20 20 20 20 20  e/4 - 8 ){.     
206e0 20 2f 2a 20 54 68 65 20 74 72 75 6e 6b 20 69 73   /* The trunk is
206f0 20 66 75 6c 6c 2e 20 20 54 75 72 6e 20 74 68 65   full.  Turn the
20700 20 70 61 67 65 20 62 65 69 6e 67 20 66 72 65 65   page being free
20710 64 20 69 6e 74 6f 20 61 20 6e 65 77 0a 20 20 20  d into a new.   
20720 20 20 20 2a 2a 20 74 72 75 6e 6b 20 70 61 67 65     ** trunk page
20730 20 77 69 74 68 20 6e 6f 20 6c 65 61 76 65 73 2e   with no leaves.
20740 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
20750 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
20760 20 74 72 75 6e 6b 20 70 61 67 65 20 69 73 20 6e   trunk page is n
20770 6f 74 20 72 65 61 6c 6c 79 20 66 75 6c 6c 20 75  ot really full u
20780 6e 74 69 6c 20 69 74 20 63 6f 6e 74 61 69 6e 73  ntil it contains
20790 0a 20 20 20 20 20 20 2a 2a 20 75 73 61 62 6c 65  .      ** usable
207a0 53 69 7a 65 2f 34 20 2d 20 32 20 65 6e 74 72 69  Size/4 - 2 entri
207b0 65 73 2c 20 6e 6f 74 20 75 73 61 62 6c 65 53 69  es, not usableSi
207c0 7a 65 2f 34 20 2d 20 38 20 65 6e 74 72 69 65 73  ze/4 - 8 entries
207d0 20 61 73 20 77 65 20 68 61 76 65 0a 20 20 20 20   as we have.    
207e0 20 20 2a 2a 20 63 6f 64 65 64 2e 20 20 42 75 74    ** coded.  But
207f0 20 64 75 65 20 74 6f 20 61 20 63 6f 64 69 6e 67   due to a coding
20800 20 65 72 72 6f 72 20 69 6e 20 76 65 72 73 69 6f   error in versio
20810 6e 73 20 6f 66 20 53 51 4c 69 74 65 20 70 72 69  ns of SQLite pri
20820 6f 72 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 33  or to.      ** 3
20830 2e 36 2e 30 2c 20 64 61 74 61 62 61 73 65 73 20  .6.0, databases 
20840 77 69 74 68 20 66 72 65 65 6c 69 73 74 20 74 72  with freelist tr
20850 75 6e 6b 20 70 61 67 65 73 20 68 6f 6c 64 69 6e  unk pages holdin
20860 67 20 6d 6f 72 65 20 74 68 61 6e 0a 20 20 20 20  g more than.    
20870 20 20 2a 2a 20 75 73 61 62 6c 65 53 69 7a 65 2f    ** usableSize/
20880 34 20 2d 20 38 20 65 6e 74 72 69 65 73 20 77 69  4 - 8 entries wi
20890 6c 6c 20 62 65 20 72 65 70 6f 72 74 65 64 20 61  ll be reported a
208a0 73 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f  s corrupt.  In o
208b0 72 64 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 6f  rder.      ** to
208c0 20 6d 61 69 6e 74 61 69 6e 20 62 61 63 6b 77 61   maintain backwa
208d0 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
208e0 79 20 77 69 74 68 20 6f 6c 64 65 72 20 76 65 72  y with older ver
208f0 73 69 6f 6e 73 20 6f 66 20 53 51 4c 69 74 65 2c  sions of SQLite,
20900 0a 20 20 20 20 20 20 2a 2a 20 77 65 20 77 69 6c  .      ** we wil
20910 6c 20 63 6f 6e 74 61 69 6e 20 74 6f 20 72 65 73  l contain to res
20920 74 72 69 63 74 20 74 68 65 20 6e 75 6d 62 65 72  trict the number
20930 20 6f 66 20 65 6e 74 72 69 65 73 20 74 6f 20 75   of entries to u
20940 73 61 62 6c 65 53 69 7a 65 2f 34 20 2d 20 38 0a  sableSize/4 - 8.
20950 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6e 6f 77        ** for now
20960 2e 20 20 41 74 20 73 6f 6d 65 20 70 6f 69 6e 74  .  At some point
20970 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 28   in the future (
20980 6f 6e 63 65 20 65 76 65 72 79 6f 6e 65 20 68 61  once everyone ha
20990 73 20 75 70 67 72 61 64 65 64 0a 20 20 20 20 20  s upgraded.     
209a0 20 2a 2a 20 74 6f 20 33 2e 36 2e 30 20 6f 72 20   ** to 3.6.0 or 
209b0 6c 61 74 65 72 29 20 77 65 20 73 68 6f 75 6c 64  later) we should
209c0 20 63 6f 6e 73 69 64 65 72 20 66 69 78 69 6e 67   consider fixing
209d0 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 61 6c   the conditional
209e0 20 61 62 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20   above.      ** 
209f0 74 6f 20 72 65 61 64 20 22 75 73 61 62 6c 65 53  to read "usableS
20a00 69 7a 65 2f 34 2d 32 22 20 69 6e 73 74 65 61 64  ize/4-2" instead
20a10 20 6f 66 20 22 75 73 61 62 6c 65 53 69 7a 65 2f   of "usableSize/
20a20 34 2d 38 22 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  4-8"..      */. 
20a30 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
20a40 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61 67  3PagerWrite(pPag
20a50 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  e->pDbPage);.   
20a60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
20a70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
20a80 70 75 74 34 62 79 74 65 28 70 50 61 67 65 2d 3e  put4byte(pPage->
20a90 61 44 61 74 61 2c 20 70 54 72 75 6e 6b 2d 3e 70  aData, pTrunk->p
20aa0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 75  gno);.        pu
20ab0 74 34 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61  t4byte(&pPage->a
20ac0 44 61 74 61 5b 34 5d 2c 20 30 29 3b 0a 20 20 20  Data[4], 0);.   
20ad0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
20ae0 50 61 67 65 31 2d 3e 61 44 61 74 61 5b 33 32 5d  Page1->aData[32]
20af0 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a  , pPage->pgno);.
20b00 20 20 20 20 20 20 20 20 54 52 41 43 45 28 28 22          TRACE(("
20b10 46 52 45 45 2d 50 41 47 45 3a 20 25 64 20 6e 65  FREE-PAGE: %d ne
20b20 77 20 74 72 75 6e 6b 20 70 61 67 65 20 72 65 70  w trunk page rep
20b30 6c 61 63 69 6e 67 20 25 64 5c 6e 22 2c 0a 20 20  lacing %d\n",.  
20b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
20b50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 54 72 75 6e  age->pgno, pTrun
20b60 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  k->pgno));.     
20b70 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   }.    }else if(
20b80 20 6b 3c 30 20 29 7b 0a 20 20 20 20 20 20 72 63   k<0 ){.      rc
20b90 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
20ba0 54 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  T;.    }else{.  
20bb0 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6e      /* Add the n
20bc0 65 77 6c 79 20 66 72 65 65 64 20 70 61 67 65 20  ewly freed page 
20bd0 61 73 20 61 20 6c 65 61 66 20 6f 6e 20 74 68 65  as a leaf on the
20be0 20 63 75 72 72 65 6e 74 20 74 72 75 6e 6b 20 2a   current trunk *
20bf0 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  /.      rc = sql
20c00 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
20c10 54 72 75 6e 6b 2d 3e 70 44 62 50 61 67 65 29 3b  Trunk->pDbPage);
20c20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
20c30 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20c40 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70 54      put4byte(&pT
20c50 72 75 6e 6b 2d 3e 61 44 61 74 61 5b 34 5d 2c 20  runk->aData[4], 
20c60 6b 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 70 75  k+1);.        pu
20c70 74 34 62 79 74 65 28 26 70 54 72 75 6e 6b 2d 3e  t4byte(&pTrunk->
20c80 61 44 61 74 61 5b 38 2b 6b 2a 34 5d 2c 20 70 50  aData[8+k*4], pP
20c90 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 23 69 66 6e  age->pgno);.#ifn
20ca0 64 65 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52  def SQLITE_SECUR
20cb0 45 5f 44 45 4c 45 54 45 0a 20 20 20 20 20 20 20  E_DELETE.       
20cc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
20cd0 65 72 44 6f 6e 74 57 72 69 74 65 28 70 50 61 67  erDontWrite(pPag
20ce0 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 23 65 6e  e->pDbPage);.#en
20cf0 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dif.      }.    
20d00 20 20 54 52 41 43 45 28 28 22 46 52 45 45 2d 50    TRACE(("FREE-P
20d10 41 47 45 3a 20 25 64 20 6c 65 61 66 20 6f 6e 20  AGE: %d leaf on 
20d20 74 72 75 6e 6b 20 70 61 67 65 20 25 64 5c 6e 22  trunk page %d\n"
20d30 2c 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 70 54 72  ,pPage->pgno,pTr
20d40 75 6e 6b 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20  unk->pgno));.   
20d50 20 7d 0a 20 20 20 20 72 65 6c 65 61 73 65 50 61   }.    releasePa
20d60 67 65 28 70 54 72 75 6e 6b 29 3b 0a 20 20 7d 0a  ge(pTrunk);.  }.
20d70 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
20d80 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 79 20 6f  /*.** Free any o
20d90 76 65 72 66 6c 6f 77 20 70 61 67 65 73 20 61 73  verflow pages as
20da0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
20db0 65 20 67 69 76 65 6e 20 43 65 6c 6c 2e 0a 2a 2f  e given Cell..*/
20dc0 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61  .static int clea
20dd0 72 43 65 6c 6c 28 4d 65 6d 50 61 67 65 20 2a 70  rCell(MemPage *p
20de0 50 61 67 65 2c 20 75 6e 73 69 67 6e 65 64 20 63  Page, unsigned c
20df0 68 61 72 20 2a 70 43 65 6c 6c 29 7b 0a 20 20 42  har *pCell){.  B
20e00 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
20e10 50 61 67 65 2d 3e 70 42 74 3b 0a 20 20 43 65 6c  Page->pBt;.  Cel
20e20 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20 20 50 67  lInfo info;.  Pg
20e30 6e 6f 20 6f 76 66 6c 50 67 6e 6f 3b 0a 20 20 69  no ovflPgno;.  i
20e40 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 4f 76  nt rc;.  int nOv
20e50 66 6c 3b 0a 20 20 69 6e 74 20 6f 76 66 6c 50 61  fl;.  int ovflPa
20e60 67 65 53 69 7a 65 3b 0a 0a 20 20 61 73 73 65 72  geSize;..  asser
20e70 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
20e80 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
20e90 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
20ea0 6c 69 74 65 33 42 74 72 65 65 50 61 72 73 65 43  lite3BtreeParseC
20eb0 65 6c 6c 50 74 72 28 70 50 61 67 65 2c 20 70 43  ellPtr(pPage, pC
20ec0 65 6c 6c 2c 20 26 69 6e 66 6f 29 3b 0a 20 20 69  ell, &info);.  i
20ed0 66 28 20 69 6e 66 6f 2e 69 4f 76 65 72 66 6c 6f  f( info.iOverflo
20ee0 77 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  w==0 ){.    retu
20ef0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 2f  rn SQLITE_OK;  /
20f00 2a 20 4e 6f 20 6f 76 65 72 66 6c 6f 77 20 70 61  * No overflow pa
20f10 67 65 73 2e 20 52 65 74 75 72 6e 20 77 69 74 68  ges. Return with
20f20 6f 75 74 20 64 6f 69 6e 67 20 61 6e 79 74 68 69  out doing anythi
20f30 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 6f 76 66 6c  ng */.  }.  ovfl
20f40 50 67 6e 6f 20 3d 20 67 65 74 34 62 79 74 65 28  Pgno = get4byte(
20f50 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
20f60 72 66 6c 6f 77 5d 29 3b 0a 20 20 6f 76 66 6c 50  rflow]);.  ovflP
20f70 61 67 65 53 69 7a 65 20 3d 20 70 42 74 2d 3e 75  ageSize = pBt->u
20f80 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
20f90 20 6e 4f 76 66 6c 20 3d 20 28 69 6e 66 6f 2e 6e   nOvfl = (info.n
20fa0 50 61 79 6c 6f 61 64 20 2d 20 69 6e 66 6f 2e 6e  Payload - info.n
20fb0 4c 6f 63 61 6c 20 2b 20 6f 76 66 6c 50 61 67 65  Local + ovflPage
20fc0 53 69 7a 65 20 2d 20 31 29 2f 6f 76 66 6c 50 61  Size - 1)/ovflPa
20fd0 67 65 53 69 7a 65 3b 0a 20 20 61 73 73 65 72 74  geSize;.  assert
20fe0 28 20 6f 76 66 6c 50 67 6e 6f 3d 3d 30 20 7c 7c  ( ovflPgno==0 ||
20ff0 20 6e 4f 76 66 6c 3e 30 20 29 3b 0a 20 20 77 68   nOvfl>0 );.  wh
21000 69 6c 65 28 20 6e 4f 76 66 6c 2d 2d 20 29 7b 0a  ile( nOvfl-- ){.
21010 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76      MemPage *pOv
21020 66 6c 3b 0a 20 20 20 20 69 66 28 20 6f 76 66 6c  fl;.    if( ovfl
21030 50 67 6e 6f 3d 3d 30 20 7c 7c 20 6f 76 66 6c 50  Pgno==0 || ovflP
21040 67 6e 6f 3e 70 61 67 65 72 50 61 67 65 63 6f 75  gno>pagerPagecou
21050 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 20  nt(pBt->pPager) 
21060 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
21070 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42  SQLITE_CORRUPT_B
21080 4b 50 54 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  KPT;.    }..    
21090 72 63 20 3d 20 67 65 74 4f 76 65 72 66 6c 6f 77  rc = getOverflow
210a0 50 61 67 65 28 70 42 74 2c 20 6f 76 66 6c 50 67  Page(pBt, ovflPg
210b0 6e 6f 2c 20 26 70 4f 76 66 6c 2c 20 28 6e 4f 76  no, &pOvfl, (nOv
210c0 66 6c 3d 3d 30 29 3f 30 3a 26 6f 76 66 6c 50 67  fl==0)?0:&ovflPg
210d0 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  no);.    if( rc 
210e0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
210f0 20 72 63 20 3d 20 66 72 65 65 50 61 67 65 28 70   rc = freePage(p
21100 4f 76 66 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  Ovfl);.    sqlit
21110 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 4f 76  e3PagerUnref(pOv
21120 66 6c 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  fl->pDbPage);.  
21130 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
21140 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75  n rc;.  }.  retu
21150 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
21160 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74 68  ./*.** Create th
21170 65 20 62 79 74 65 20 73 65 71 75 65 6e 63 65 20  e byte sequence 
21180 75 73 65 64 20 74 6f 20 72 65 70 72 65 73 65 6e  used to represen
21190 74 20 61 20 63 65 6c 6c 20 6f 6e 20 70 61 67 65  t a cell on page
211a0 20 70 50 61 67 65 0a 2a 2a 20 61 6e 64 20 77 72   pPage.** and wr
211b0 69 74 65 20 74 68 61 74 20 62 79 74 65 20 73 65  ite that byte se
211c0 71 75 65 6e 63 65 20 69 6e 74 6f 20 70 43 65 6c  quence into pCel
211d0 6c 5b 5d 2e 20 20 4f 76 65 72 66 6c 6f 77 20 70  l[].  Overflow p
211e0 61 67 65 73 20 61 72 65 0a 2a 2a 20 61 6c 6c 6f  ages are.** allo
211f0 63 61 74 65 64 20 61 6e 64 20 66 69 6c 6c 65 64  cated and filled
21200 20 69 6e 20 61 73 20 6e 65 63 65 73 73 61 72 79   in as necessary
21210 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 70  .  The calling p
21220 72 6f 63 65 64 75 72 65 0a 2a 2a 20 69 73 20 72  rocedure.** is r
21230 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d  esponsible for m
21240 61 6b 69 6e 67 20 73 75 72 65 20 73 75 66 66 69  aking sure suffi
21250 63 69 65 6e 74 20 73 70 61 63 65 20 68 61 73 20  cient space has 
21260 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  been allocated.*
21270 2a 20 66 6f 72 20 70 43 65 6c 6c 5b 5d 2e 0a 2a  * for pCell[]..*
21280 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 70  *.** Note that p
21290 43 65 6c 6c 20 64 6f 65 73 20 6e 6f 74 20 6e 65  Cell does not ne
212a0 63 65 73 73 61 72 79 20 6e 65 65 64 20 74 6f 20  cessary need to 
212b0 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 70 50 61  point to the pPa
212c0 67 65 2d 3e 61 44 61 74 61 0a 2a 2a 20 61 72 65  ge->aData.** are
212d0 61 2e 20 20 70 43 65 6c 6c 20 6d 69 67 68 74 20  a.  pCell might 
212e0 70 6f 69 6e 74 20 74 6f 20 73 6f 6d 65 20 74 65  point to some te
212f0 6d 70 6f 72 61 72 79 20 73 74 6f 72 61 67 65 2e  mporary storage.
21300 20 20 54 68 65 20 63 65 6c 6c 20 77 69 6c 6c 0a    The cell will.
21310 2a 2a 20 62 65 20 63 6f 6e 73 74 72 75 63 74 65  ** be constructe
21320 64 20 69 6e 20 74 68 69 73 20 74 65 6d 70 6f 72  d in this tempor
21330 61 72 79 20 61 72 65 61 20 74 68 65 6e 20 63 6f  ary area then co
21340 70 69 65 64 20 69 6e 74 6f 20 70 50 61 67 65 2d  pied into pPage-
21350 3e 61 44 61 74 61 0a 2a 2a 20 6c 61 74 65 72 2e  >aData.** later.
21360 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
21370 69 6c 6c 49 6e 43 65 6c 6c 28 0a 20 20 4d 65 6d  illInCell(.  Mem
21380 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 20  Page *pPage,    
21390 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
213a0 68 65 20 70 61 67 65 20 74 68 61 74 20 63 6f 6e  he page that con
213b0 74 61 69 6e 73 20 74 68 65 20 63 65 6c 6c 20 2a  tains the cell *
213c0 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
213d0 72 20 2a 70 43 65 6c 6c 2c 20 20 20 20 20 20 20  r *pCell,       
213e0 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 74     /* Complete t
213f0 65 78 74 20 6f 66 20 74 68 65 20 63 65 6c 6c 20  ext of the cell 
21400 2a 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  */.  const void 
21410 2a 70 4b 65 79 2c 20 69 36 34 20 6e 4b 65 79 2c  *pKey, i64 nKey,
21420 20 20 20 20 2f 2a 20 54 68 65 20 6b 65 79 20 2a      /* The key *
21430 2f 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  /.  const void *
21440 70 44 61 74 61 2c 69 6e 74 20 6e 44 61 74 61 2c  pData,int nData,
21450 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 20 2a     /* The data *
21460 2f 0a 20 20 69 6e 74 20 6e 5a 65 72 6f 2c 20 20  /.  int nZero,  
21470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21480 20 20 20 2f 2a 20 45 78 74 72 61 20 7a 65 72 6f     /* Extra zero
21490 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64   bytes to append
214a0 20 74 6f 20 70 44 61 74 61 20 2a 2f 0a 20 20 69   to pData */.  i
214b0 6e 74 20 2a 70 6e 53 69 7a 65 20 20 20 20 20 20  nt *pnSize      
214c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
214d0 20 57 72 69 74 65 20 63 65 6c 6c 20 73 69 7a 65   Write cell size
214e0 20 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   here */.){.  in
214f0 74 20 6e 50 61 79 6c 6f 61 64 3b 0a 20 20 63 6f  t nPayload;.  co
21500 6e 73 74 20 75 38 20 2a 70 53 72 63 3b 0a 20 20  nst u8 *pSrc;.  
21510 69 6e 74 20 6e 53 72 63 2c 20 6e 2c 20 72 63 3b  int nSrc, n, rc;
21520 0a 20 20 69 6e 74 20 73 70 61 63 65 4c 65 66 74  .  int spaceLeft
21530 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 4f 76  ;.  MemPage *pOv
21540 66 6c 20 3d 20 30 3b 0a 20 20 4d 65 6d 50 61 67  fl = 0;.  MemPag
21550 65 20 2a 70 54 6f 52 65 6c 65 61 73 65 20 3d 20  e *pToRelease = 
21560 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  0;.  unsigned ch
21570 61 72 20 2a 70 50 72 69 6f 72 3b 0a 20 20 75 6e  ar *pPrior;.  un
21580 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 50 61  signed char *pPa
21590 79 6c 6f 61 64 3b 0a 20 20 42 74 53 68 61 72 65  yload;.  BtShare
215a0 64 20 2a 70 42 74 20 3d 20 70 50 61 67 65 2d 3e  d *pBt = pPage->
215b0 70 42 74 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  pBt;.  Pgno pgno
215c0 4f 76 66 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  Ovfl = 0;.  int 
215d0 6e 48 65 61 64 65 72 3b 0a 20 20 43 65 6c 6c 49  nHeader;.  CellI
215e0 6e 66 6f 20 69 6e 66 6f 3b 0a 0a 20 20 61 73 73  nfo info;..  ass
215f0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
21600 65 78 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70  ex_held(pPage->p
21610 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20  Bt->mutex) );.. 
21620 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
21630 68 65 61 64 65 72 2e 20 2a 2f 0a 20 20 6e 48 65  header. */.  nHe
21640 61 64 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  ader = 0;.  if( 
21650 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
21660 20 20 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 34      nHeader += 4
21670 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
21680 65 2d 3e 68 61 73 44 61 74 61 20 29 7b 0a 20 20  e->hasData ){.  
21690 20 20 6e 48 65 61 64 65 72 20 2b 3d 20 70 75 74    nHeader += put
216a0 56 61 72 69 6e 74 28 26 70 43 65 6c 6c 5b 6e 48  Varint(&pCell[nH
216b0 65 61 64 65 72 5d 2c 20 6e 44 61 74 61 2b 6e 5a  eader], nData+nZ
216c0 65 72 6f 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ero);.  }else{. 
216d0 20 20 20 6e 44 61 74 61 20 3d 20 6e 5a 65 72 6f     nData = nZero
216e0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 48 65 61   = 0;.  }.  nHea
216f0 64 65 72 20 2b 3d 20 70 75 74 56 61 72 69 6e 74  der += putVarint
21700 28 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d  (&pCell[nHeader]
21710 2c 20 2a 28 75 36 34 2a 29 26 6e 4b 65 79 29 3b  , *(u64*)&nKey);
21720 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 50  .  sqlite3BtreeP
21730 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61 67  arseCellPtr(pPag
21740 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f 29  e, pCell, &info)
21750 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f  ;.  assert( info
21760 2e 6e 48 65 61 64 65 72 3d 3d 6e 48 65 61 64 65  .nHeader==nHeade
21770 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69  r );.  assert( i
21780 6e 66 6f 2e 6e 4b 65 79 3d 3d 6e 4b 65 79 20 29  nfo.nKey==nKey )
21790 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 66 6f  ;.  assert( info
217a0 2e 6e 44 61 74 61 3d 3d 6e 44 61 74 61 2b 6e 5a  .nData==nData+nZ
217b0 65 72 6f 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 46  ero );.  .  /* F
217c0 69 6c 6c 20 69 6e 20 74 68 65 20 70 61 79 6c 6f  ill in the paylo
217d0 61 64 20 2a 2f 0a 20 20 6e 50 61 79 6c 6f 61 64  ad */.  nPayload
217e0 20 3d 20 6e 44 61 74 61 20 2b 20 6e 5a 65 72 6f   = nData + nZero
217f0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 2d 3e 69  ;.  if( pPage->i
21800 6e 74 4b 65 79 20 29 7b 0a 20 20 20 20 70 53 72  ntKey ){.    pSr
21810 63 20 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 6e  c = pData;.    n
21820 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a 20 20 20  Src = nData;.   
21830 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 7d 65   nData = 0;.  }e
21840 6c 73 65 7b 0a 20 20 20 20 6e 50 61 79 6c 6f 61  lse{.    nPayloa
21850 64 20 2b 3d 20 6e 4b 65 79 3b 0a 20 20 20 20 70  d += nKey;.    p
21860 53 72 63 20 3d 20 70 4b 65 79 3b 0a 20 20 20 20  Src = pKey;.    
21870 6e 53 72 63 20 3d 20 6e 4b 65 79 3b 0a 20 20 7d  nSrc = nKey;.  }
21880 0a 20 20 2a 70 6e 53 69 7a 65 20 3d 20 69 6e 66  .  *pnSize = inf
21890 6f 2e 6e 53 69 7a 65 3b 0a 20 20 73 70 61 63 65  o.nSize;.  space
218a0 4c 65 66 74 20 3d 20 69 6e 66 6f 2e 6e 4c 6f 63  Left = info.nLoc
218b0 61 6c 3b 0a 20 20 70 50 61 79 6c 6f 61 64 20 3d  al;.  pPayload =
218c0 20 26 70 43 65 6c 6c 5b 6e 48 65 61 64 65 72 5d   &pCell[nHeader]
218d0 3b 0a 20 20 70 50 72 69 6f 72 20 3d 20 26 70 43  ;.  pPrior = &pC
218e0 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65 72 66 6c  ell[info.iOverfl
218f0 6f 77 5d 3b 0a 0a 20 20 77 68 69 6c 65 28 20 6e  ow];..  while( n
21900 50 61 79 6c 6f 61 64 3e 30 20 29 7b 0a 20 20 20  Payload>0 ){.   
21910 20 69 66 28 20 73 70 61 63 65 4c 65 66 74 3d 3d   if( spaceLeft==
21920 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
21930 73 45 78 61 63 74 20 3d 20 30 3b 0a 23 69 66 6e  sExact = 0;.#ifn
21940 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
21950 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
21960 20 50 67 6e 6f 20 70 67 6e 6f 50 74 72 6d 61 70   Pgno pgnoPtrmap
21970 20 3d 20 70 67 6e 6f 4f 76 66 6c 3b 20 2f 2a 20   = pgnoOvfl; /* 
21980 4f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 70 6f  Overflow page po
21990 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74 72 79 20  inter-map entry 
219a0 70 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 69 66  page */.      if
219b0 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
219c0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b  m ){.        do{
219d0 0a 20 20 20 20 20 20 20 20 20 20 70 67 6e 6f 4f  .          pgnoO
219e0 76 66 6c 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  vfl++;.        }
219f0 20 77 68 69 6c 65 28 20 0a 20 20 20 20 20 20 20   while( .       
21a00 20 20 20 50 54 52 4d 41 50 5f 49 53 50 41 47 45     PTRMAP_ISPAGE
21a10 28 70 42 74 2c 20 70 67 6e 6f 4f 76 66 6c 29 20  (pBt, pgnoOvfl) 
21a20 7c 7c 20 70 67 6e 6f 4f 76 66 6c 3d 3d 50 45 4e  || pgnoOvfl==PEN
21a30 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
21a40 42 74 29 20 0a 20 20 20 20 20 20 20 20 29 3b 0a  Bt) .        );.
21a50 20 20 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f          if( pgno
21a60 4f 76 66 6c 3e 31 20 29 7b 0a 20 20 20 20 20 20  Ovfl>1 ){.      
21a70 20 20 20 20 2f 2a 20 69 73 45 78 61 63 74 20 3d      /* isExact =
21a80 20 31 3b 20 2a 2f 0a 20 20 20 20 20 20 20 20 7d   1; */.        }
21a90 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
21aa0 20 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63        rc = alloc
21ab0 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
21ac0 2c 20 26 70 4f 76 66 6c 2c 20 26 70 67 6e 6f 4f  , &pOvfl, &pgnoO
21ad0 76 66 6c 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 69  vfl, pgnoOvfl, i
21ae0 73 45 78 61 63 74 29 3b 0a 23 69 66 6e 64 65 66  sExact);.#ifndef
21af0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
21b00 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 2f 2a  OVACUUM.      /*
21b10 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
21b20 20 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76   supports auto-v
21b30 61 63 75 75 6d 2c 20 61 6e 64 20 74 68 65 20 73  acuum, and the s
21b40 65 63 6f 6e 64 20 6f 72 20 73 75 62 73 65 71 75  econd or subsequ
21b50 65 6e 74 0a 20 20 20 20 20 20 2a 2a 20 6f 76 65  ent.      ** ove
21b60 72 66 6c 6f 77 20 70 61 67 65 20 69 73 20 62 65  rflow page is be
21b70 69 6e 67 20 61 6c 6c 6f 63 61 74 65 64 2c 20 61  ing allocated, a
21b80 64 64 20 61 6e 20 65 6e 74 72 79 20 74 6f 20 74  dd an entry to t
21b90 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 0a 20  he pointer-map. 
21ba0 20 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 61 74       ** for that
21bb0 20 70 61 67 65 20 6e 6f 77 2e 20 0a 20 20 20 20   page now. .    
21bc0 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66    **.      ** If
21bd0 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
21be0 73 74 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65  st overflow page
21bf0 2c 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 70  , then write a p
21c00 61 72 74 69 61 6c 20 65 6e 74 72 79 20 0a 20 20  artial entry .  
21c10 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 70 6f      ** to the po
21c20 69 6e 74 65 72 2d 6d 61 70 2e 20 49 66 20 77 65  inter-map. If we
21c30 20 77 72 69 74 65 20 6e 6f 74 68 69 6e 67 20 74   write nothing t
21c40 6f 20 74 68 69 73 20 70 6f 69 6e 74 65 72 2d 6d  o this pointer-m
21c50 61 70 20 73 6c 6f 74 2c 0a 20 20 20 20 20 20 2a  ap slot,.      *
21c60 2a 20 74 68 65 6e 20 74 68 65 20 6f 70 74 69 6d  * then the optim
21c70 69 73 74 69 63 20 6f 76 65 72 66 6c 6f 77 20 63  istic overflow c
21c80 68 61 69 6e 20 70 72 6f 63 65 73 73 69 6e 67 20  hain processing 
21c90 69 6e 20 63 6c 65 61 72 43 65 6c 6c 28 29 0a 20  in clearCell(). 
21ca0 20 20 20 20 20 2a 2a 20 6d 61 79 20 6d 69 73 69       ** may misi
21cb0 6e 74 65 72 70 72 65 74 20 74 68 65 20 75 6e 69  nterpret the uni
21cc0 6e 69 74 69 61 6c 69 73 65 64 20 76 61 6c 75 65  nitialised value
21cd0 73 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65  s and delete the
21ce0 0a 20 20 20 20 20 20 2a 2a 20 77 72 6f 6e 67 20  .      ** wrong 
21cf0 70 61 67 65 73 20 66 72 6f 6d 20 74 68 65 20 64  pages from the d
21d00 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 20 2a  atabase..      *
21d10 2f 0a 20 20 20 20 20 20 69 66 28 20 70 42 74 2d  /.      if( pBt-
21d20 3e 61 75 74 6f 56 61 63 75 75 6d 20 26 26 20 72  >autoVacuum && r
21d30 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
21d40 20 20 20 20 20 20 20 20 75 38 20 65 54 79 70 65          u8 eType
21d50 20 3d 20 28 70 67 6e 6f 50 74 72 6d 61 70 3f 50   = (pgnoPtrmap?P
21d60 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 32 3a  TRMAP_OVERFLOW2:
21d70 50 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31  PTRMAP_OVERFLOW1
21d80 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
21d90 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
21da0 67 6e 6f 4f 76 66 6c 2c 20 65 54 79 70 65 2c 20  gnoOvfl, eType, 
21db0 70 67 6e 6f 50 74 72 6d 61 70 29 3b 0a 20 20 20  pgnoPtrmap);.   
21dc0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
21dd0 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
21de0 50 61 67 65 28 70 4f 76 66 6c 29 3b 0a 20 20 20  Page(pOvfl);.   
21df0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23       }.      }.#
21e00 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
21e10 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  rc ){.        re
21e20 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52 65 6c  leasePage(pToRel
21e30 65 61 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72  ease);.        r
21e40 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
21e50 7d 0a 20 20 20 20 20 20 70 75 74 34 62 79 74 65  }.      put4byte
21e60 28 70 50 72 69 6f 72 2c 20 70 67 6e 6f 4f 76 66  (pPrior, pgnoOvf
21e70 6c 29 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73  l);.      releas
21e80 65 50 61 67 65 28 70 54 6f 52 65 6c 65 61 73 65  ePage(pToRelease
21e90 29 3b 0a 20 20 20 20 20 20 70 54 6f 52 65 6c 65  );.      pToRele
21ea0 61 73 65 20 3d 20 70 4f 76 66 6c 3b 0a 20 20 20  ase = pOvfl;.   
21eb0 20 20 20 70 50 72 69 6f 72 20 3d 20 70 4f 76 66     pPrior = pOvf
21ec0 6c 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 20 20  l->aData;.      
21ed0 70 75 74 34 62 79 74 65 28 70 50 72 69 6f 72 2c  put4byte(pPrior,
21ee0 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 79 6c   0);.      pPayl
21ef0 6f 61 64 20 3d 20 26 70 4f 76 66 6c 2d 3e 61 44  oad = &pOvfl->aD
21f00 61 74 61 5b 34 5d 3b 0a 20 20 20 20 20 20 73 70  ata[4];.      sp
21f10 61 63 65 4c 65 66 74 20 3d 20 70 42 74 2d 3e 75  aceLeft = pBt->u
21f20 73 61 62 6c 65 53 69 7a 65 20 2d 20 34 3b 0a 20  sableSize - 4;. 
21f30 20 20 20 7d 0a 20 20 20 20 6e 20 3d 20 6e 50 61     }.    n = nPa
21f40 79 6c 6f 61 64 3b 0a 20 20 20 20 69 66 28 20 6e  yload;.    if( n
21f50 3e 73 70 61 63 65 4c 65 66 74 20 29 20 6e 20 3d  >spaceLeft ) n =
21f60 20 73 70 61 63 65 4c 65 66 74 3b 0a 20 20 20 20   spaceLeft;.    
21f70 69 66 28 20 6e 53 72 63 3e 30 20 29 7b 0a 20 20  if( nSrc>0 ){.  
21f80 20 20 20 20 69 66 28 20 6e 3e 6e 53 72 63 20 29      if( n>nSrc )
21f90 20 6e 20 3d 20 6e 53 72 63 3b 0a 20 20 20 20 20   n = nSrc;.     
21fa0 20 61 73 73 65 72 74 28 20 70 53 72 63 20 29 3b   assert( pSrc );
21fb0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50  .      memcpy(pP
21fc0 61 79 6c 6f 61 64 2c 20 70 53 72 63 2c 20 6e 29  ayload, pSrc, n)
21fd0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21fe0 20 20 20 6d 65 6d 73 65 74 28 70 50 61 79 6c 6f     memset(pPaylo
21ff0 61 64 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 7d  ad, 0, n);.    }
22000 0a 20 20 20 20 6e 50 61 79 6c 6f 61 64 20 2d 3d  .    nPayload -=
22010 20 6e 3b 0a 20 20 20 20 70 50 61 79 6c 6f 61 64   n;.    pPayload
22020 20 2b 3d 20 6e 3b 0a 20 20 20 20 70 53 72 63 20   += n;.    pSrc 
22030 2b 3d 20 6e 3b 0a 20 20 20 20 6e 53 72 63 20 2d  += n;.    nSrc -
22040 3d 20 6e 3b 0a 20 20 20 20 73 70 61 63 65 4c 65  = n;.    spaceLe
22050 66 74 20 2d 3d 20 6e 3b 0a 20 20 20 20 69 66 28  ft -= n;.    if(
22060 20 6e 53 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20   nSrc==0 ){.    
22070 20 20 6e 53 72 63 20 3d 20 6e 44 61 74 61 3b 0a    nSrc = nData;.
22080 20 20 20 20 20 20 70 53 72 63 20 3d 20 70 44 61        pSrc = pDa
22090 74 61 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ta;.    }.  }.  
220a0 72 65 6c 65 61 73 65 50 61 67 65 28 70 54 6f 52  releasePage(pToR
220b0 65 6c 65 61 73 65 29 3b 0a 20 20 72 65 74 75 72  elease);.  retur
220c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
220d0 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 74 68 65  /*.** Remove the
220e0 20 69 2d 74 68 20 63 65 6c 6c 20 66 72 6f 6d 20   i-th cell from 
220f0 70 50 61 67 65 2e 20 20 54 68 69 73 20 72 6f 75  pPage.  This rou
22100 74 69 6e 65 20 65 66 66 65 63 74 73 20 70 50 61  tine effects pPa
22110 67 65 20 6f 6e 6c 79 2e 0a 2a 2a 20 54 68 65 20  ge only..** The 
22120 63 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 73 20  cell content is 
22130 6e 6f 74 20 66 72 65 65 64 20 6f 72 20 64 65 61  not freed or dea
22140 6c 6c 6f 63 61 74 65 64 2e 20 20 49 74 20 69 73  llocated.  It is
22150 20 61 73 73 75 6d 65 64 20 74 68 61 74 0a 2a 2a   assumed that.**
22160 20 74 68 65 20 63 65 6c 6c 20 63 6f 6e 74 65 6e   the cell conten
22170 74 20 68 61 73 20 62 65 65 6e 20 63 6f 70 69 65  t has been copie
22180 64 20 73 6f 6d 65 70 6c 61 63 65 20 65 6c 73 65  d someplace else
22190 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
221a0 6a 75 73 74 0a 2a 2a 20 72 65 6d 6f 76 65 73 20  just.** removes 
221b0 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 6f  the reference to
221c0 20 74 68 65 20 63 65 6c 6c 20 66 72 6f 6d 20 70   the cell from p
221d0 50 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 22 73 7a 22  Page..**.** "sz"
221e0 20 6d 75 73 74 20 62 65 20 74 68 65 20 6e 75 6d   must be the num
221f0 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
22200 74 68 65 20 63 65 6c 6c 2e 0a 2a 2f 0a 73 74 61  the cell..*/.sta
22210 74 69 63 20 76 6f 69 64 20 64 72 6f 70 43 65 6c  tic void dropCel
22220 6c 28 4d 65 6d 50 61 67 65 20 2a 70 50 61 67 65  l(MemPage *pPage
22230 2c 20 69 6e 74 20 69 64 78 2c 20 69 6e 74 20 73  , int idx, int s
22240 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  z){.  int i;    
22250 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
22260 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 70  unter */.  int p
22270 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66  c;         /* Of
22280 66 73 65 74 20 74 6f 20 63 65 6c 6c 20 63 6f 6e  fset to cell con
22290 74 65 6e 74 20 6f 66 20 63 65 6c 6c 20 62 65 69  tent of cell bei
222a0 6e 67 20 64 65 6c 65 74 65 64 20 2a 2f 0a 20 20  ng deleted */.  
222b0 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20 20 20  u8 *data;       
222c0 2f 2a 20 70 50 61 67 65 2d 3e 61 44 61 74 61 20  /* pPage->aData 
222d0 2a 2f 0a 20 20 75 38 20 2a 70 74 72 3b 20 20 20  */.  u8 *ptr;   
222e0 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
222f0 6d 6f 76 65 20 62 79 74 65 73 20 61 72 6f 75 6e  move bytes aroun
22300 64 20 77 69 74 68 69 6e 20 64 61 74 61 5b 5d 20  d within data[] 
22310 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 69 64  */..  assert( id
22320 78 3e 3d 30 20 26 26 20 69 64 78 3c 70 50 61 67  x>=0 && idx<pPag
22330 65 2d 3e 6e 43 65 6c 6c 20 29 3b 0a 20 20 61 73  e->nCell );.  as
22340 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c 53 69  sert( sz==cellSi
22350 7a 65 28 70 50 61 67 65 2c 20 69 64 78 29 20 29  ze(pPage, idx) )
22360 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
22370 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
22380 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62 50 61  ble(pPage->pDbPa
22390 67 65 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ge) );.  assert(
223a0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
223b0 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
223c0 6d 75 74 65 78 29 20 29 3b 0a 20 20 64 61 74 61  mutex) );.  data
223d0 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61 3b   = pPage->aData;
223e0 0a 20 20 70 74 72 20 3d 20 26 64 61 74 61 5b 70  .  ptr = &data[p
223f0 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73 65 74  Page->cellOffset
22400 20 2b 20 32 2a 69 64 78 5d 3b 0a 20 20 70 63 20   + 2*idx];.  pc 
22410 3d 20 67 65 74 32 62 79 74 65 28 70 74 72 29 3b  = get2byte(ptr);
22420 0a 20 20 61 73 73 65 72 74 28 20 70 63 3e 31 30  .  assert( pc>10
22430 20 26 26 20 70 63 2b 73 7a 3c 3d 70 50 61 67 65   && pc+sz<=pPage
22440 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a  ->pBt->usableSiz
22450 65 20 29 3b 0a 20 20 66 72 65 65 53 70 61 63 65  e );.  freeSpace
22460 28 70 50 61 67 65 2c 20 70 63 2c 20 73 7a 29 3b  (pPage, pc, sz);
22470 0a 20 20 66 6f 72 28 69 3d 69 64 78 2b 31 3b 20  .  for(i=idx+1; 
22480 69 3c 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3b 20  i<pPage->nCell; 
22490 69 2b 2b 2c 20 70 74 72 2b 3d 32 29 7b 0a 20 20  i++, ptr+=2){.  
224a0 20 20 70 74 72 5b 30 5d 20 3d 20 70 74 72 5b 32    ptr[0] = ptr[2
224b0 5d 3b 0a 20 20 20 20 70 74 72 5b 31 5d 20 3d 20  ];.    ptr[1] = 
224c0 70 74 72 5b 33 5d 3b 0a 20 20 7d 0a 20 20 70 50  ptr[3];.  }.  pP
224d0 61 67 65 2d 3e 6e 43 65 6c 6c 2d 2d 3b 0a 20 20  age->nCell--;.  
224e0 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b 70  put2byte(&data[p
224f0 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b  Page->hdrOffset+
22500 33 5d 2c 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c  3], pPage->nCell
22510 29 3b 0a 20 20 70 50 61 67 65 2d 3e 6e 46 72 65  );.  pPage->nFre
22520 65 20 2b 3d 20 32 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  e += 2;.}../*.**
22530 20 49 6e 73 65 72 74 20 61 20 6e 65 77 20 63 65   Insert a new ce
22540 6c 6c 20 6f 6e 20 70 50 61 67 65 20 61 74 20 63  ll on pPage at c
22550 65 6c 6c 20 69 6e 64 65 78 20 22 69 22 2e 20 20  ell index "i".  
22560 70 43 65 6c 6c 20 70 6f 69 6e 74 73 20 74 6f 20  pCell points to 
22570 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6f  the.** content o
22580 66 20 74 68 65 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a  f the cell..**.*
22590 2a 20 49 66 20 74 68 65 20 63 65 6c 6c 20 63 6f  * If the cell co
225a0 6e 74 65 6e 74 20 77 69 6c 6c 20 66 69 74 20 6f  ntent will fit o
225b0 6e 20 74 68 65 20 70 61 67 65 2c 20 74 68 65 6e  n the page, then
225c0 20 70 75 74 20 69 74 20 74 68 65 72 65 2e 20 20   put it there.  
225d0 49 66 20 69 74 0a 2a 2a 20 77 69 6c 6c 20 6e 6f  If it.** will no
225e0 74 20 66 69 74 2c 20 74 68 65 6e 20 6d 61 6b 65  t fit, then make
225f0 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
22600 65 6c 6c 20 63 6f 6e 74 65 6e 74 20 69 6e 74 6f  ell content into
22610 20 70 54 65 6d 70 20 69 66 0a 2a 2a 20 70 54 65   pTemp if.** pTe
22620 6d 70 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 2e 20  mp is not null. 
22630 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 70   Regardless of p
22640 54 65 6d 70 2c 20 61 6c 6c 6f 63 61 74 65 20 61  Temp, allocate a
22650 20 6e 65 77 20 65 6e 74 72 79 0a 2a 2a 20 69 6e   new entry.** in
22660 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 5d 20   pPage->aOvfl[] 
22670 61 6e 64 20 6d 61 6b 65 20 69 74 20 70 6f 69 6e  and make it poin
22680 74 20 74 6f 20 74 68 65 20 63 65 6c 6c 20 63 6f  t to the cell co
22690 6e 74 65 6e 74 20 28 65 69 74 68 65 72 0a 2a 2a  ntent (either.**
226a0 20 69 6e 20 70 54 65 6d 70 20 6f 72 20 74 68 65   in pTemp or the
226b0 20 6f 72 69 67 69 6e 61 6c 20 70 43 65 6c 6c 29   original pCell)
226c0 20 61 6e 64 20 61 6c 73 6f 20 72 65 63 6f 72 64   and also record
226d0 20 69 74 73 20 69 6e 64 65 78 2e 20 0a 2a 2a 20   its index. .** 
226e0 41 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77  Allocating a new
226f0 20 65 6e 74 72 79 20 69 6e 20 70 50 61 67 65 2d   entry in pPage-
22700 3e 61 43 65 6c 6c 5b 5d 20 69 6d 70 6c 69 65 73  >aCell[] implies
22710 20 74 68 61 74 20 0a 2a 2a 20 70 50 61 67 65 2d   that .** pPage-
22720 3e 6e 4f 76 65 72 66 6c 6f 77 20 69 73 20 69 6e  >nOverflow is in
22730 63 72 65 6d 65 6e 74 65 64 2e 0a 2a 2a 0a 2a 2a  cremented..**.**
22740 20 49 66 20 6e 53 6b 69 70 20 69 73 20 6e 6f 6e   If nSkip is non
22750 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 64 6f 20 6e  -zero, then do n
22760 6f 74 20 63 6f 70 79 20 74 68 65 20 66 69 72 73  ot copy the firs
22770 74 20 6e 53 6b 69 70 20 62 79 74 65 73 20 6f 66  t nSkip bytes of
22780 20 74 68 65 0a 2a 2a 20 63 65 6c 6c 2e 20 54 68   the.** cell. Th
22790 65 20 63 61 6c 6c 65 72 20 77 69 6c 6c 20 6f 76  e caller will ov
227a0 65 72 77 72 69 74 65 20 74 68 65 6d 20 61 66 74  erwrite them aft
227b0 65 72 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  er this function
227c0 20 72 65 74 75 72 6e 73 2e 20 49 66 0a 2a 2a 20   returns. If.** 
227d0 6e 53 6b 69 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  nSkip is non-zer
227e0 6f 2c 20 74 68 65 6e 20 70 43 65 6c 6c 20 6d 61  o, then pCell ma
227f0 79 20 6e 6f 74 20 70 6f 69 6e 74 20 74 6f 20 61  y not point to a
22800 6e 20 69 6e 76 61 6c 69 64 20 6d 65 6d 6f 72 79  n invalid memory
22810 20 6c 6f 63 61 74 69 6f 6e 20 0a 2a 2a 20 28 62   location .** (b
22820 75 74 20 70 43 65 6c 6c 2b 6e 53 6b 69 70 20 69  ut pCell+nSkip i
22830 73 20 61 6c 77 61 79 73 20 76 61 6c 69 64 29 2e  s always valid).
22840 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 69  .*/.static int i
22850 6e 73 65 72 74 43 65 6c 6c 28 0a 20 20 4d 65 6d  nsertCell(.  Mem
22860 50 61 67 65 20 2a 70 50 61 67 65 2c 20 20 20 2f  Page *pPage,   /
22870 2a 20 50 61 67 65 20 69 6e 74 6f 20 77 68 69 63  * Page into whic
22880 68 20 77 65 20 61 72 65 20 63 6f 70 79 69 6e 67  h we are copying
22890 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20   */.  int i,    
228a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63          /* New c
228b0 65 6c 6c 20 62 65 63 6f 6d 65 73 20 74 68 65 20  ell becomes the 
228c0 69 2d 74 68 20 63 65 6c 6c 20 6f 66 20 74 68 65  i-th cell of the
228d0 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 70   page */.  u8 *p
228e0 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  Cell,        /* 
228f0 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6e  Content of the n
22900 65 77 20 63 65 6c 6c 20 2a 2f 0a 20 20 69 6e 74  ew cell */.  int
22910 20 73 7a 2c 20 20 20 20 20 20 20 20 20 20 20 2f   sz,           /
22920 2a 20 42 79 74 65 73 20 6f 66 20 63 6f 6e 74 65  * Bytes of conte
22930 6e 74 20 69 6e 20 70 43 65 6c 6c 20 2a 2f 0a 20  nt in pCell */. 
22940 20 75 38 20 2a 70 54 65 6d 70 2c 20 20 20 20 20   u8 *pTemp,     
22950 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
22960 67 65 20 73 70 61 63 65 20 66 6f 72 20 70 43 65  ge space for pCe
22970 6c 6c 2c 20 69 66 20 6e 65 65 64 65 64 20 2a 2f  ll, if needed */
22980 0a 20 20 75 38 20 6e 53 6b 69 70 20 20 20 20 20  .  u8 nSkip     
22990 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 77       /* Do not w
229a0 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6e  rite the first n
229b0 53 6b 69 70 20 62 79 74 65 73 20 6f 66 20 74 68  Skip bytes of th
229c0 65 20 63 65 6c 6c 20 2a 2f 0a 29 7b 0a 20 20 69  e cell */.){.  i
229d0 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20 20 20  nt idx;         
229e0 20 2f 2a 20 57 68 65 72 65 20 74 6f 20 77 72 69   /* Where to wri
229f0 74 65 20 6e 65 77 20 63 65 6c 6c 20 63 6f 6e 74  te new cell cont
22a00 65 6e 74 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f  ent in data[] */
22a10 0a 20 20 69 6e 74 20 6a 3b 20 20 20 20 20 20 20  .  int j;       
22a20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
22a30 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 74 6f  nter */.  int to
22a40 70 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  p;          /* F
22a50 69 72 73 74 20 62 79 74 65 20 6f 66 20 63 6f 6e  irst byte of con
22a60 74 65 6e 74 20 66 6f 72 20 61 6e 79 20 63 65 6c  tent for any cel
22a70 6c 20 69 6e 20 64 61 74 61 5b 5d 20 2a 2f 0a 20  l in data[] */. 
22a80 20 69 6e 74 20 65 6e 64 3b 20 20 20 20 20 20 20   int end;       
22a90 20 20 20 2f 2a 20 46 69 72 73 74 20 62 79 74 65     /* First byte
22aa0 20 70 61 73 74 20 74 68 65 20 6c 61 73 74 20 63   past the last c
22ab0 65 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64  ell pointer in d
22ac0 61 74 61 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69  ata[] */.  int i
22ad0 6e 73 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ns;          /* 
22ae0 49 6e 64 65 78 20 69 6e 20 64 61 74 61 5b 5d 20  Index in data[] 
22af0 77 68 65 72 65 20 6e 65 77 20 63 65 6c 6c 20 70  where new cell p
22b00 6f 69 6e 74 65 72 20 69 73 20 69 6e 73 65 72 74  ointer is insert
22b10 65 64 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  ed */.  int hdr;
22b20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66            /* Off
22b30 73 65 74 20 69 6e 74 6f 20 64 61 74 61 5b 5d 20  set into data[] 
22b40 6f 66 20 74 68 65 20 70 61 67 65 20 68 65 61 64  of the page head
22b50 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c  er */.  int cell
22b60 4f 66 66 73 65 74 3b 20 20 20 2f 2a 20 41 64 64  Offset;   /* Add
22b70 72 65 73 73 20 6f 66 20 66 69 72 73 74 20 63 65  ress of first ce
22b80 6c 6c 20 70 6f 69 6e 74 65 72 20 69 6e 20 64 61  ll pointer in da
22b90 74 61 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 64 61  ta[] */.  u8 *da
22ba0 74 61 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ta;         /* T
22bb0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
22bc0 65 20 77 68 6f 6c 65 20 70 61 67 65 20 2a 2f 0a  e whole page */.
22bd0 20 20 75 38 20 2a 70 74 72 3b 20 20 20 20 20 20    u8 *ptr;      
22be0 20 20 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20      /* Used for 
22bf0 6d 6f 76 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  moving informati
22c00 6f 6e 20 61 72 6f 75 6e 64 20 69 6e 20 64 61 74  on around in dat
22c10 61 5b 5d 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  a[] */..  assert
22c20 28 20 69 3e 3d 30 20 26 26 20 69 3c 3d 70 50 61  ( i>=0 && i<=pPa
22c30 67 65 2d 3e 6e 43 65 6c 6c 2b 70 50 61 67 65 2d  ge->nCell+pPage-
22c40 3e 6e 4f 76 65 72 66 6c 6f 77 20 29 3b 0a 20 20  >nOverflow );.  
22c50 61 73 73 65 72 74 28 20 73 7a 3d 3d 63 65 6c 6c  assert( sz==cell
22c60 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70  SizePtr(pPage, p
22c70 43 65 6c 6c 29 20 29 3b 0a 20 20 61 73 73 65 72  Cell) );.  asser
22c80 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
22c90 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
22ca0 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
22cb0 28 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c  ( pPage->nOverfl
22cc0 6f 77 20 7c 7c 20 73 7a 2b 32 3e 70 50 61 67 65  ow || sz+2>pPage
22cd0 2d 3e 6e 46 72 65 65 20 29 7b 0a 20 20 20 20 69  ->nFree ){.    i
22ce0 66 28 20 70 54 65 6d 70 20 29 7b 0a 20 20 20 20  f( pTemp ){.    
22cf0 20 20 6d 65 6d 63 70 79 28 70 54 65 6d 70 2b 6e    memcpy(pTemp+n
22d00 53 6b 69 70 2c 20 70 43 65 6c 6c 2b 6e 53 6b 69  Skip, pCell+nSki
22d10 70 2c 20 73 7a 2d 6e 53 6b 69 70 29 3b 0a 20 20  p, sz-nSkip);.  
22d20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54 65 6d      pCell = pTem
22d30 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6a 20 3d  p;.    }.    j =
22d40 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
22d50 77 2b 2b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  w++;.    assert(
22d60 20 6a 3c 73 69 7a 65 6f 66 28 70 50 61 67 65 2d   j<sizeof(pPage-
22d70 3e 61 4f 76 66 6c 29 2f 73 69 7a 65 6f 66 28 70  >aOvfl)/sizeof(p
22d80 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 20  Page->aOvfl[0]) 
22d90 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 61 4f  );.    pPage->aO
22da0 76 66 6c 5b 6a 5d 2e 70 43 65 6c 6c 20 3d 20 70  vfl[j].pCell = p
22db0 43 65 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 2d  Cell;.    pPage-
22dc0 3e 61 4f 76 66 6c 5b 6a 5d 2e 69 64 78 20 3d 20  >aOvfl[j].idx = 
22dd0 69 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 46  i;.    pPage->nF
22de0 72 65 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ree = 0;.  }else
22df0 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73  {.    int rc = s
22e00 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
22e10 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
22e20 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
22e30 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22e40 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
22e50 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  }.    assert( sq
22e60 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69 74  lite3PagerIswrit
22e70 65 61 62 6c 65 28 70 50 61 67 65 2d 3e 70 44 62  eable(pPage->pDb
22e80 50 61 67 65 29 20 29 3b 0a 20 20 20 20 64 61 74  Page) );.    dat
22e90 61 20 3d 20 70 50 61 67 65 2d 3e 61 44 61 74 61  a = pPage->aData
22ea0 3b 0a 20 20 20 20 68 64 72 20 3d 20 70 50 61 67  ;.    hdr = pPag
22eb0 65 2d 3e 68 64 72 4f 66 66 73 65 74 3b 0a 20 20  e->hdrOffset;.  
22ec0 20 20 74 6f 70 20 3d 20 67 65 74 32 62 79 74 65    top = get2byte
22ed0 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 3b 0a  (&data[hdr+5]);.
22ee0 20 20 20 20 63 65 6c 6c 4f 66 66 73 65 74 20 3d      cellOffset =
22ef0 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
22f00 65 74 3b 0a 20 20 20 20 65 6e 64 20 3d 20 63 65  et;.    end = ce
22f10 6c 6c 4f 66 66 73 65 74 20 2b 20 32 2a 70 50 61  llOffset + 2*pPa
22f20 67 65 2d 3e 6e 43 65 6c 6c 20 2b 20 32 3b 0a 20  ge->nCell + 2;. 
22f30 20 20 20 69 6e 73 20 3d 20 63 65 6c 6c 4f 66 66     ins = cellOff
22f40 73 65 74 20 2b 20 32 2a 69 3b 0a 20 20 20 20 69  set + 2*i;.    i
22f50 66 28 20 65 6e 64 20 3e 20 74 6f 70 20 2d 20 73  f( end > top - s
22f60 7a 20 29 7b 0a 20 20 20 20 20 20 64 65 66 72 61  z ){.      defra
22f70 67 6d 65 6e 74 50 61 67 65 28 70 50 61 67 65 29  gmentPage(pPage)
22f80 3b 0a 20 20 20 20 20 20 74 6f 70 20 3d 20 67 65  ;.      top = ge
22f90 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
22fa0 2b 35 5d 29 3b 0a 20 20 20 20 20 20 61 73 73 65  +5]);.      asse
22fb0 72 74 28 20 65 6e 64 20 2b 20 73 7a 20 3c 3d 20  rt( end + sz <= 
22fc0 74 6f 70 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20  top );.    }.   
22fd0 20 69 64 78 20 3d 20 61 6c 6c 6f 63 61 74 65 53   idx = allocateS
22fe0 70 61 63 65 28 70 50 61 67 65 2c 20 73 7a 29 3b  pace(pPage, sz);
22ff0 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 64 78  .    assert( idx
23000 3e 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  >0 );.    assert
23010 28 20 65 6e 64 20 3c 3d 20 67 65 74 32 62 79 74  ( end <= get2byt
23020 65 28 26 64 61 74 61 5b 68 64 72 2b 35 5d 29 20  e(&data[hdr+5]) 
23030 29 3b 0a 20 20 20 20 70 50 61 67 65 2d 3e 6e 43  );.    pPage->nC
23040 65 6c 6c 2b 2b 3b 0a 20 20 20 20 70 50 61 67 65  ell++;.    pPage
23050 2d 3e 6e 46 72 65 65 20 2d 3d 20 32 3b 0a 20 20  ->nFree -= 2;.  
23060 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 5b 69    memcpy(&data[i
23070 64 78 2b 6e 53 6b 69 70 5d 2c 20 70 43 65 6c 6c  dx+nSkip], pCell
23080 2b 6e 53 6b 69 70 2c 20 73 7a 2d 6e 53 6b 69 70  +nSkip, sz-nSkip
23090 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 65 6e 64  );.    for(j=end
230a0 2d 32 2c 20 70 74 72 3d 26 64 61 74 61 5b 6a 5d  -2, ptr=&data[j]
230b0 3b 20 6a 3e 69 6e 73 3b 20 6a 2d 3d 32 2c 20 70  ; j>ins; j-=2, p
230c0 74 72 2d 3d 32 29 7b 0a 20 20 20 20 20 20 70 74  tr-=2){.      pt
230d0 72 5b 30 5d 20 3d 20 70 74 72 5b 2d 32 5d 3b 0a  r[0] = ptr[-2];.
230e0 20 20 20 20 20 20 70 74 72 5b 31 5d 20 3d 20 70        ptr[1] = p
230f0 74 72 5b 2d 31 5d 3b 0a 20 20 20 20 7d 0a 20 20  tr[-1];.    }.  
23100 20 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61    put2byte(&data
23110 5b 69 6e 73 5d 2c 20 69 64 78 29 3b 0a 20 20 20  [ins], idx);.   
23120 20 70 75 74 32 62 79 74 65 28 26 64 61 74 61 5b   put2byte(&data[
23130 68 64 72 2b 33 5d 2c 20 70 50 61 67 65 2d 3e 6e  hdr+3], pPage->n
23140 43 65 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53  Cell);.#ifndef S
23150 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
23160 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70 50  ACUUM.    if( pP
23170 61 67 65 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61  age->pBt->autoVa
23180 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 2f 2a  cuum ){.      /*
23190 20 54 68 65 20 63 65 6c 6c 20 6d 61 79 20 63 6f   The cell may co
231a0 6e 74 61 69 6e 20 61 20 70 6f 69 6e 74 65 72 20  ntain a pointer 
231b0 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20 70  to an overflow p
231c0 61 67 65 2e 20 49 66 20 73 6f 2c 20 77 72 69 74  age. If so, writ
231d0 65 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 65  e.      ** the e
231e0 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f 76 65  ntry for the ove
231f0 72 66 6c 6f 77 20 70 61 67 65 20 69 6e 74 6f 20  rflow page into 
23200 74 68 65 20 70 6f 69 6e 74 65 72 20 6d 61 70 2e  the pointer map.
23210 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
23220 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 20  CellInfo info;. 
23230 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
23240 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50  eParseCellPtr(pP
23250 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66  age, pCell, &inf
23260 6f 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  o);.      assert
23270 28 20 28 69 6e 66 6f 2e 6e 44 61 74 61 2b 28 70  ( (info.nData+(p
23280 50 61 67 65 2d 3e 69 6e 74 4b 65 79 3f 30 3a 69  Page->intKey?0:i
23290 6e 66 6f 2e 6e 4b 65 79 29 29 3d 3d 69 6e 66 6f  nfo.nKey))==info
232a0 2e 6e 50 61 79 6c 6f 61 64 20 29 3b 0a 20 20 20  .nPayload );.   
232b0 20 20 20 69 66 28 20 28 69 6e 66 6f 2e 6e 44 61     if( (info.nDa
232c0 74 61 2b 28 70 50 61 67 65 2d 3e 69 6e 74 4b 65  ta+(pPage->intKe
232d0 79 3f 30 3a 69 6e 66 6f 2e 6e 4b 65 79 29 29 3e  y?0:info.nKey))>
232e0 69 6e 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20  info.nLocal ){. 
232f0 20 20 20 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f         Pgno pgno
23300 4f 76 66 6c 20 3d 20 67 65 74 34 62 79 74 65 28  Ovfl = get4byte(
23310 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e 69 4f 76 65  &pCell[info.iOve
23320 72 66 6c 6f 77 5d 29 3b 0a 20 20 20 20 20 20 20  rflow]);.       
23330 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28   rc = ptrmapPut(
23340 70 50 61 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f  pPage->pBt, pgno
23350 4f 76 66 6c 2c 20 50 54 52 4d 41 50 5f 4f 56 45  Ovfl, PTRMAP_OVE
23360 52 46 4c 4f 57 31 2c 20 70 50 61 67 65 2d 3e 70  RFLOW1, pPage->p
23370 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  gno);.        if
23380 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23390 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
233a0 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
233b0 66 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  f.  }..  return 
233c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
233d0 0a 2a 2a 20 41 64 64 20 61 20 6c 69 73 74 20 6f  .** Add a list o
233e0 66 20 63 65 6c 6c 73 20 74 6f 20 61 20 70 61 67  f cells to a pag
233f0 65 2e 20 20 54 68 65 20 70 61 67 65 20 73 68 6f  e.  The page sho
23400 75 6c 64 20 62 65 20 69 6e 69 74 69 61 6c 6c 79  uld be initially
23410 20 65 6d 70 74 79 2e 0a 2a 2a 20 54 68 65 20 63   empty..** The c
23420 65 6c 6c 73 20 61 72 65 20 67 75 61 72 61 6e 74  ells are guarant
23430 65 65 64 20 74 6f 20 66 69 74 20 6f 6e 20 74 68  eed to fit on th
23440 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69  e page..*/.stati
23450 63 20 76 6f 69 64 20 61 73 73 65 6d 62 6c 65 50  c void assembleP
23460 61 67 65 28 0a 20 20 4d 65 6d 50 61 67 65 20 2a  age(.  MemPage *
23470 70 50 61 67 65 2c 20 20 20 2f 2a 20 54 68 65 20  pPage,   /* The 
23480 70 61 67 65 20 74 6f 20 62 65 20 61 73 73 65 6d  page to be assem
23490 62 6c 69 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  blied */.  int n
234a0 43 65 6c 6c 2c 20 20 20 20 20 20 20 20 2f 2a 20  Cell,        /* 
234b0 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 65  The number of ce
234c0 6c 6c 73 20 74 6f 20 61 64 64 20 74 6f 20 74 68  lls to add to th
234d0 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20  is page */.  u8 
234e0 2a 2a 61 70 43 65 6c 6c 2c 20 20 20 20 20 20 2f  **apCell,      /
234f0 2a 20 50 6f 69 6e 74 65 72 73 20 74 6f 20 63 65  * Pointers to ce
23500 6c 6c 20 62 6f 64 69 65 73 20 2a 2f 0a 20 20 75  ll bodies */.  u
23510 31 36 20 2a 61 53 69 7a 65 20 20 20 20 20 20 20  16 *aSize       
23520 20 2f 2a 20 53 69 7a 65 73 20 6f 66 20 74 68 65   /* Sizes of the
23530 20 63 65 6c 6c 73 20 2a 2f 0a 29 7b 0a 20 20 69   cells */.){.  i
23540 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
23550 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
23560 20 2a 2f 0a 20 20 69 6e 74 20 74 6f 74 61 6c 53   */.  int totalS
23570 69 7a 65 3b 20 20 20 20 2f 2a 20 54 6f 74 61 6c  ize;    /* Total
23580 20 73 69 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c   size of all cel
23590 6c 73 20 2a 2f 0a 20 20 69 6e 74 20 68 64 72 3b  ls */.  int hdr;
235a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
235b0 65 78 20 6f 66 20 70 61 67 65 20 68 65 61 64 65  ex of page heade
235c0 72 20 2a 2f 0a 20 20 69 6e 74 20 63 65 6c 6c 70  r */.  int cellp
235d0 74 72 3b 20 20 20 20 20 20 2f 2a 20 41 64 64 72  tr;      /* Addr
235e0 65 73 73 20 6f 66 20 6e 65 78 74 20 63 65 6c 6c  ess of next cell
235f0 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 69 6e   pointer */.  in
23600 74 20 63 65 6c 6c 62 6f 64 79 3b 20 20 20 20 20  t cellbody;     
23610 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 6e 65  /* Address of ne
23620 78 74 20 63 65 6c 6c 20 62 6f 64 79 20 2a 2f 0a  xt cell body */.
23630 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20 20 20    u8 *data;     
23640 20 20 20 20 2f 2a 20 44 61 74 61 20 66 6f 72 20      /* Data for 
23650 74 68 65 20 70 61 67 65 20 2a 2f 0a 0a 20 20 61  the page */..  a
23660 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 4f  ssert( pPage->nO
23670 76 65 72 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20  verflow==0 );.  
23680 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
23690 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67 65  mutex_held(pPage
236a0 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29 3b  ->pBt->mutex) );
236b0 0a 20 20 74 6f 74 61 6c 53 69 7a 65 20 3d 20 30  .  totalSize = 0
236c0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
236d0 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Cell; i++){.    
236e0 74 6f 74 61 6c 53 69 7a 65 20 2b 3d 20 61 53 69  totalSize += aSi
236f0 7a 65 5b 69 5d 3b 0a 20 20 7d 0a 20 20 61 73 73  ze[i];.  }.  ass
23700 65 72 74 28 20 74 6f 74 61 6c 53 69 7a 65 2b 32  ert( totalSize+2
23710 2a 6e 43 65 6c 6c 3c 3d 70 50 61 67 65 2d 3e 6e  *nCell<=pPage->n
23720 46 72 65 65 20 29 3b 0a 20 20 61 73 73 65 72 74  Free );.  assert
23730 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3d 3d  ( pPage->nCell==
23740 30 20 29 3b 0a 20 20 63 65 6c 6c 70 74 72 20 3d  0 );.  cellptr =
23750 20 70 50 61 67 65 2d 3e 63 65 6c 6c 4f 66 66 73   pPage->cellOffs
23760 65 74 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61  et;.  data = pPa
23770 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72  ge->aData;.  hdr
23780 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
23790 73 65 74 3b 0a 20 20 70 75 74 32 62 79 74 65 28  set;.  put2byte(
237a0 26 64 61 74 61 5b 68 64 72 2b 33 5d 2c 20 6e 43  &data[hdr+3], nC
237b0 65 6c 6c 29 3b 0a 20 20 69 66 28 20 6e 43 65 6c  ell);.  if( nCel
237c0 6c 20 29 7b 0a 20 20 20 20 63 65 6c 6c 62 6f 64  l ){.    cellbod
237d0 79 20 3d 20 61 6c 6c 6f 63 61 74 65 53 70 61 63  y = allocateSpac
237e0 65 28 70 50 61 67 65 2c 20 74 6f 74 61 6c 53 69  e(pPage, totalSi
237f0 7a 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ze);.    assert(
23800 20 63 65 6c 6c 62 6f 64 79 3e 30 20 29 3b 0a 20   cellbody>0 );. 
23810 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
23820 2d 3e 6e 46 72 65 65 20 3e 3d 20 32 2a 6e 43 65  ->nFree >= 2*nCe
23830 6c 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65 2d  ll );.    pPage-
23840 3e 6e 46 72 65 65 20 2d 3d 20 32 2a 6e 43 65 6c  >nFree -= 2*nCel
23850 6c 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  l;.    for(i=0; 
23860 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20  i<nCell; i++){. 
23870 20 20 20 20 20 70 75 74 32 62 79 74 65 28 26 64       put2byte(&d
23880 61 74 61 5b 63 65 6c 6c 70 74 72 5d 2c 20 63 65  ata[cellptr], ce
23890 6c 6c 62 6f 64 79 29 3b 0a 20 20 20 20 20 20 6d  llbody);.      m
238a0 65 6d 63 70 79 28 26 64 61 74 61 5b 63 65 6c 6c  emcpy(&data[cell
238b0 62 6f 64 79 5d 2c 20 61 70 43 65 6c 6c 5b 69 5d  body], apCell[i]
238c0 2c 20 61 53 69 7a 65 5b 69 5d 29 3b 0a 20 20 20  , aSize[i]);.   
238d0 20 20 20 63 65 6c 6c 70 74 72 20 2b 3d 20 32 3b     cellptr += 2;
238e0 0a 20 20 20 20 20 20 63 65 6c 6c 62 6f 64 79 20  .      cellbody 
238f0 2b 3d 20 61 53 69 7a 65 5b 69 5d 3b 0a 20 20 20  += aSize[i];.   
23900 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 63   }.    assert( c
23910 65 6c 6c 62 6f 64 79 3d 3d 70 50 61 67 65 2d 3e  ellbody==pPage->
23920 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65 20  pBt->usableSize 
23930 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 2d 3e  );.  }.  pPage->
23940 6e 43 65 6c 6c 20 3d 20 6e 43 65 6c 6c 3b 0a 7d  nCell = nCell;.}
23950 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
23960 6f 77 69 6e 67 20 70 61 72 61 6d 65 74 65 72 73  owing parameters
23970 20 64 65 74 65 72 6d 69 6e 65 20 68 6f 77 20 6d   determine how m
23980 61 6e 79 20 61 64 6a 61 63 65 6e 74 20 70 61 67  any adjacent pag
23990 65 73 20 67 65 74 20 69 6e 76 6f 6c 76 65 64 0a  es get involved.
239a0 2a 2a 20 69 6e 20 61 20 62 61 6c 61 6e 63 69 6e  ** in a balancin
239b0 67 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 4e 4e  g operation.  NN
239c0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
239d0 66 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65  f neighbors on e
239e0 69 74 68 65 72 20 73 69 64 65 0a 2a 2a 20 6f 66  ither side.** of
239f0 20 74 68 65 20 70 61 67 65 20 74 68 61 74 20 70   the page that p
23a00 61 72 74 69 63 69 70 61 74 65 20 69 6e 20 74 68  articipate in th
23a10 65 20 62 61 6c 61 6e 63 69 6e 67 20 6f 70 65 72  e balancing oper
23a20 61 74 69 6f 6e 2e 20 20 4e 42 20 69 73 20 74 68  ation.  NB is th
23a30 65 0a 2a 2a 20 74 6f 74 61 6c 20 6e 75 6d 62 65  e.** total numbe
23a40 72 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  r of pages that 
23a50 70 61 72 74 69 63 69 70 61 74 65 2c 20 69 6e 63  participate, inc
23a60 6c 75 64 69 6e 67 20 74 68 65 20 74 61 72 67 65  luding the targe
23a70 74 20 70 61 67 65 20 61 6e 64 0a 2a 2a 20 4e 4e  t page and.** NN
23a80 20 6e 65 69 67 68 62 6f 72 73 20 6f 6e 20 65 69   neighbors on ei
23a90 74 68 65 72 20 73 69 64 65 2e 0a 2a 2a 0a 2a 2a  ther side..**.**
23aa0 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 76 61 6c   The minimum val
23ab0 75 65 20 6f 66 20 4e 4e 20 69 73 20 31 20 28 6f  ue of NN is 1 (o
23ac0 66 20 63 6f 75 72 73 65 29 2e 20 20 49 6e 63 72  f course).  Incr
23ad0 65 61 73 69 6e 67 20 4e 4e 20 61 62 6f 76 65 20  easing NN above 
23ae0 31 0a 2a 2a 20 28 74 6f 20 32 20 6f 72 20 33 29  1.** (to 2 or 3)
23af0 20 67 69 76 65 73 20 61 20 6d 6f 64 65 73 74 20   gives a modest 
23b00 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e 20 53  improvement in S
23b10 45 4c 45 43 54 20 61 6e 64 20 44 45 4c 45 54 45  ELECT and DELETE
23b20 20 70 65 72 66 6f 72 6d 61 6e 63 65 0a 2a 2a 20   performance.** 
23b30 69 6e 20 65 78 63 68 61 6e 67 65 20 66 6f 72 20  in exchange for 
23b40 61 20 6c 61 72 67 65 72 20 64 65 67 72 61 64 61  a larger degrada
23b50 74 69 6f 6e 20 69 6e 20 49 4e 53 45 52 54 20 61  tion in INSERT a
23b60 6e 64 20 55 50 44 41 54 45 20 70 65 72 66 6f 72  nd UPDATE perfor
23b70 6d 61 6e 63 65 2e 0a 2a 2a 20 54 68 65 20 76 61  mance..** The va
23b80 6c 75 65 20 6f 66 20 4e 4e 20 61 70 70 65 61 72  lue of NN appear
23b90 73 20 74 6f 20 67 69 76 65 20 74 68 65 20 62 65  s to give the be
23ba0 73 74 20 72 65 73 75 6c 74 73 20 6f 76 65 72 61  st results overa
23bb0 6c 6c 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e  ll..*/.#define N
23bc0 4e 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20  N 1             
23bd0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6e 65 69  /* Number of nei
23be0 67 68 62 6f 72 73 20 6f 6e 20 65 69 74 68 65 72  ghbors on either
23bf0 20 73 69 64 65 20 6f 66 20 70 50 61 67 65 20 2a   side of pPage *
23c00 2f 0a 23 64 65 66 69 6e 65 20 4e 42 20 28 4e 4e  /.#define NB (NN
23c10 2a 32 2b 31 29 20 20 20 20 20 20 2f 2a 20 54 6f  *2+1)      /* To
23c20 74 61 6c 20 70 61 67 65 73 20 69 6e 76 6f 6c 76  tal pages involv
23c30 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63  ed in the balanc
23c40 65 20 2a 2f 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  e */../* Forward
23c50 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
23c60 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65  atic int balance
23c70 28 42 74 43 75 72 73 6f 72 2a 2c 20 69 6e 74 29  (BtCursor*, int)
23c80 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
23c90 45 5f 4f 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41  E_OMIT_QUICKBALA
23ca0 4e 43 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 76  NCE./*.** This v
23cb0 65 72 73 69 6f 6e 20 6f 66 20 62 61 6c 61 6e 63  ersion of balanc
23cc0 65 28 29 20 68 61 6e 64 6c 65 73 20 74 68 65 20  e() handles the 
23cd0 63 6f 6d 6d 6f 6e 20 73 70 65 63 69 61 6c 20 63  common special c
23ce0 61 73 65 20 77 68 65 72 65 0a 2a 2a 20 61 20 6e  ase where.** a n
23cf0 65 77 20 65 6e 74 72 79 20 69 73 20 62 65 69 6e  ew entry is bein
23d00 67 20 69 6e 73 65 72 74 65 64 20 6f 6e 20 74 68  g inserted on th
23d10 65 20 65 78 74 72 65 6d 65 20 72 69 67 68 74 2d  e extreme right-
23d20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 74 72  end of the.** tr
23d30 65 65 2c 20 69 6e 20 6f 74 68 65 72 20 77 6f 72  ee, in other wor
23d40 64 73 2c 20 77 68 65 6e 20 74 68 65 20 6e 65 77  ds, when the new
23d50 20 65 6e 74 72 79 20 77 69 6c 6c 20 62 65 63 6f   entry will beco
23d60 6d 65 20 74 68 65 20 6c 61 72 67 65 73 74 0a 2a  me the largest.*
23d70 2a 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 74  * entry in the t
23d80 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 73 74 65  ree..**.** Inste
23d90 61 64 20 6f 66 20 74 72 79 69 6e 67 20 62 61 6c  ad of trying bal
23da0 61 6e 63 65 20 74 68 65 20 33 20 72 69 67 68 74  ance the 3 right
23db0 2d 6d 6f 73 74 20 6c 65 61 66 20 70 61 67 65 73  -most leaf pages
23dc0 2c 20 6a 75 73 74 20 61 64 64 0a 2a 2a 20 61 20  , just add.** a 
23dd0 6e 65 77 20 70 61 67 65 20 74 6f 20 74 68 65 20  new page to the 
23de0 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
23df0 61 6e 64 20 70 75 74 20 74 68 65 20 6f 6e 65 20  and put the one 
23e00 6e 65 77 20 65 6e 74 72 79 20 69 6e 0a 2a 2a 20  new entry in.** 
23e10 74 68 61 74 20 70 61 67 65 2e 20 20 54 68 69 73  that page.  This
23e20 20 6c 65 61 76 65 73 20 74 68 65 20 72 69 67 68   leaves the righ
23e30 74 20 73 69 64 65 20 6f 66 20 74 68 65 20 74 72  t side of the tr
23e40 65 65 20 73 6f 6d 65 77 68 61 74 0a 2a 2a 20 75  ee somewhat.** u
23e50 6e 62 61 6c 61 6e 63 65 64 2e 20 20 42 75 74 20  nbalanced.  But 
23e60 6f 64 64 73 20 61 72 65 20 74 68 61 74 20 77 65  odds are that we
23e70 20 77 69 6c 6c 20 62 65 20 69 6e 73 65 72 74 69   will be inserti
23e80 6e 67 20 6e 65 77 20 65 6e 74 72 69 65 73 0a 2a  ng new entries.*
23e90 2a 20 61 74 20 74 68 65 20 65 6e 64 20 73 6f 6f  * at the end soo
23ea0 6e 20 61 66 74 65 72 77 61 72 64 73 20 73 6f 20  n afterwards so 
23eb0 74 68 65 20 6e 65 61 72 6c 79 20 65 6d 70 74 79  the nearly empty
23ec0 20 70 61 67 65 20 77 69 6c 6c 20 71 75 69 63 6b   page will quick
23ed0 6c 79 0a 2a 2a 20 66 69 6c 6c 20 75 70 2e 20 20  ly.** fill up.  
23ee0 4f 6e 20 61 76 65 72 61 67 65 2e 0a 2a 2a 0a 2a  On average..**.*
23ef0 2a 20 70 50 61 67 65 20 69 73 20 74 68 65 20 6c  * pPage is the l
23f00 65 61 66 20 70 61 67 65 20 77 68 69 63 68 20 69  eaf page which i
23f10 73 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  s the right-most
23f20 20 70 61 67 65 20 69 6e 20 74 68 65 20 74 72 65   page in the tre
23f30 65 2e 0a 2a 2a 20 70 50 61 72 65 6e 74 20 69 73  e..** pParent is
23f40 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 70 50   its parent.  pP
23f50 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 20  age must have a 
23f60 73 69 6e 67 6c 65 20 6f 76 65 72 66 6c 6f 77 20  single overflow 
23f70 65 6e 74 72 79 0a 2a 2a 20 77 68 69 63 68 20 69  entry.** which i
23f80 73 20 61 6c 73 6f 20 74 68 65 20 72 69 67 68 74  s also the right
23f90 2d 6d 6f 73 74 20 65 6e 74 72 79 20 6f 6e 20 74  -most entry on t
23fa0 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  he page..*/.stat
23fb0 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f 71  ic int balance_q
23fc0 75 69 63 6b 28 42 74 43 75 72 73 6f 72 20 2a 70  uick(BtCursor *p
23fd0 43 75 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  Cur){.  int rc;.
23fe0 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65 77 20    MemPage *pNew 
23ff0 3d 20 30 3b 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  = 0;.  Pgno pgno
24000 4e 65 77 3b 0a 20 20 75 38 20 2a 70 43 65 6c 6c  New;.  u8 *pCell
24010 3b 0a 20 20 75 31 36 20 73 7a 43 65 6c 6c 3b 0a  ;.  u16 szCell;.
24020 20 20 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b    CellInfo info;
24030 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 67  .  MemPage *pPag
24040 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
24050 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
24060 20 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e   MemPage *pParen
24070 74 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  t = pCur->apPage
24080 5b 70 43 75 72 2d 3e 69 50 61 67 65 2d 31 5d 3b  [pCur->iPage-1];
24090 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
240a0 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
240b0 20 69 6e 74 20 70 61 72 65 6e 74 49 64 78 20 3d   int parentIdx =
240c0 20 70 50 61 72 65 6e 74 2d 3e 6e 43 65 6c 6c 3b   pParent->nCell;
240d0 20 20 20 2f 2a 20 70 50 61 72 65 6e 74 20 6e 65     /* pParent ne
240e0 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c 20 69  w divider cell i
240f0 6e 64 65 78 20 2a 2f 0a 20 20 69 6e 74 20 70 61  ndex */.  int pa
24100 72 65 6e 74 53 69 7a 65 3b 20 20 20 20 20 20 20  rentSize;       
24110 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
24120 69 7a 65 20 6f 66 20 6e 65 77 20 64 69 76 69 64  ize of new divid
24130 65 72 20 63 65 6c 6c 20 2a 2f 0a 20 20 75 38 20  er cell */.  u8 
24140 70 61 72 65 6e 74 43 65 6c 6c 5b 36 34 5d 3b 20  parentCell[64]; 
24150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
24160 2a 20 53 70 61 63 65 20 66 6f 72 20 74 68 65 20  * Space for the 
24170 6e 65 77 20 64 69 76 69 64 65 72 20 63 65 6c 6c  new divider cell
24180 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
24190 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
241a0 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e 6d 75  d(pPage->pBt->mu
241b0 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c  tex) );..  /* Al
241c0 6c 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67  locate a new pag
241d0 65 2e 20 49 6e 73 65 72 74 20 74 68 65 20 6f 76  e. Insert the ov
241e0 65 72 66 6c 6f 77 20 63 65 6c 6c 20 66 72 6f 6d  erflow cell from
241f0 20 70 50 61 67 65 0a 20 20 2a 2a 20 69 6e 74 6f   pPage.  ** into
24200 20 69 74 2e 20 54 68 65 6e 20 72 65 6d 6f 76 65   it. Then remove
24210 20 74 68 65 20 6f 76 65 72 66 6c 6f 77 20 63 65   the overflow ce
24220 6c 6c 20 66 72 6f 6d 20 70 50 61 67 65 2e 0a 20  ll from pPage.. 
24230 20 2a 2f 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63   */.  rc = alloc
24240 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
24250 2c 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65  , &pNew, &pgnoNe
24260 77 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  w, 0, 0);.  if( 
24270 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24280 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 50 61  .    pCell = pPa
24290 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 2e 70 43 65  ge->aOvfl[0].pCe
242a0 6c 6c 3b 0a 20 20 20 20 73 7a 43 65 6c 6c 20 3d  ll;.    szCell =
242b0 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61   cellSizePtr(pPa
242c0 67 65 2c 20 70 43 65 6c 6c 29 3b 0a 20 20 20 20  ge, pCell);.    
242d0 7a 65 72 6f 50 61 67 65 28 70 4e 65 77 2c 20 70  zeroPage(pNew, p
242e0 50 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 29 3b  Page->aData[0]);
242f0 0a 20 20 20 20 61 73 73 65 6d 62 6c 65 50 61 67  .    assemblePag
24300 65 28 70 4e 65 77 2c 20 31 2c 20 26 70 43 65 6c  e(pNew, 1, &pCel
24310 6c 2c 20 26 73 7a 43 65 6c 6c 29 3b 0a 20 20 20  l, &szCell);.   
24320 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f   pPage->nOverflo
24330 77 20 3d 20 30 3b 0a 20 20 0a 20 20 20 20 2f 2a  w = 0;.  .    /*
24340 20 70 50 61 67 65 20 69 73 20 63 75 72 72 65 6e   pPage is curren
24350 74 6c 79 20 74 68 65 20 72 69 67 68 74 2d 63 68  tly the right-ch
24360 69 6c 64 20 6f 66 20 70 50 61 72 65 6e 74 2e 20  ild of pParent. 
24370 43 68 61 6e 67 65 20 74 68 69 73 0a 20 20 20 20  Change this.    
24380 2a 2a 20 73 6f 20 74 68 61 74 20 74 68 65 20 72  ** so that the r
24390 69 67 68 74 2d 63 68 69 6c 64 20 69 73 20 74 68  ight-child is th
243a0 65 20 6e 65 77 20 70 61 67 65 20 61 6c 6c 6f 63  e new page alloc
243b0 61 74 65 64 20 61 62 6f 76 65 20 61 6e 64 0a 20  ated above and. 
243c0 20 20 20 2a 2a 20 70 50 61 67 65 20 69 73 20 74     ** pPage is t
243d0 68 65 20 6e 65 78 74 2d 74 6f 2d 72 69 67 68 74  he next-to-right
243e0 20 63 68 69 6c 64 2e 20 0a 20 20 20 20 2a 2a 0a   child. .    **.
243f0 20 20 20 20 2a 2a 20 49 67 6e 6f 72 65 20 74 68      ** Ignore th
24400 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f  e return value o
24410 66 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 66 69  f the call to fi
24420 6c 6c 49 6e 43 65 6c 6c 28 29 2e 20 66 69 6c 6c  llInCell(). fill
24430 49 6e 43 65 6c 6c 28 29 0a 20 20 20 20 2a 2a 20  InCell().    ** 
24440 6d 61 79 20 6f 6e 6c 79 20 72 65 74 75 72 6e 20  may only return 
24450 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
24460 45 5f 4f 4b 20 69 66 20 69 74 20 69 73 20 72 65  E_OK if it is re
24470 71 75 69 72 65 64 20 74 6f 20 61 6c 6c 6f 63 61  quired to alloca
24480 74 65 0a 20 20 20 20 2a 2a 20 6f 6e 65 20 6f 72  te.    ** one or
24490 20 6d 6f 72 65 20 6f 76 65 72 66 6c 6f 77 20 70   more overflow p
244a0 61 67 65 73 2e 20 53 69 6e 63 65 20 61 6e 20 69  ages. Since an i
244b0 6e 74 65 72 6e 61 6c 20 74 61 62 6c 65 20 42 2d  nternal table B-
244c0 54 72 65 65 20 63 65 6c 6c 20 0a 20 20 20 20 2a  Tree cell .    *
244d0 2a 20 6d 61 79 20 6e 65 76 65 72 20 73 70 69 6c  * may never spil
244e0 6c 20 6f 76 65 72 20 6f 6e 74 6f 20 61 6e 20 6f  l over onto an o
244f0 76 65 72 66 6c 6f 77 20 70 61 67 65 20 28 69 74  verflow page (it
24500 20 69 73 20 61 20 6d 61 78 69 6d 75 6d 20 6f 66   is a maximum of
24510 20 0a 20 20 20 20 2a 2a 20 31 33 20 62 79 74 65   .    ** 13 byte
24520 73 20 69 6e 20 73 69 7a 65 29 2c 20 69 74 20 69  s in size), it i
24530 73 20 6e 6f 74 20 6e 65 63 63 65 73 73 61 72 79  s not neccessary
24540 20 74 6f 20 63 68 65 63 6b 20 74 68 65 20 72 65   to check the re
24550 74 75 72 6e 20 63 6f 64 65 2e 0a 20 20 20 20 2a  turn code..    *
24560 2a 0a 20 20 20 20 2a 2a 20 53 69 6d 69 6c 61 72  *.    ** Similar
24570 6c 79 2c 20 74 68 65 20 69 6e 73 65 72 74 43 65  ly, the insertCe
24580 6c 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20 63 61  ll() function ca
24590 6e 6e 6f 74 20 66 61 69 6c 20 69 66 20 74 68 65  nnot fail if the
245a0 20 70 61 67 65 0a 20 20 20 20 2a 2a 20 62 65 69   page.    ** bei
245b0 6e 67 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f  ng inserted into
245c0 20 69 73 20 61 6c 72 65 61 64 79 20 77 72 69 74   is already writ
245d0 61 62 6c 65 20 61 6e 64 20 74 68 65 20 63 65 6c  able and the cel
245e0 6c 20 64 6f 65 73 20 6e 6f 74 20 0a 20 20 20 20  l does not .    
245f0 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 6e 20 6f 76  ** contain an ov
24600 65 72 66 6c 6f 77 20 70 6f 69 6e 74 65 72 2e 20  erflow pointer. 
24610 53 6f 20 69 67 6e 6f 72 65 20 74 68 69 73 20 72  So ignore this r
24620 65 74 75 72 6e 20 63 6f 64 65 20 74 6f 6f 2e 0a  eturn code too..
24630 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
24640 74 28 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  t( pPage->nCell>
24650 30 20 29 3b 0a 20 20 20 20 70 43 65 6c 6c 20 3d  0 );.    pCell =
24660 20 66 69 6e 64 43 65 6c 6c 28 70 50 61 67 65 2c   findCell(pPage,
24670 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 31 29   pPage->nCell-1)
24680 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
24690 65 65 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70  eeParseCellPtr(p
246a0 50 61 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e  Page, pCell, &in
246b0 66 6f 29 3b 0a 20 20 20 20 66 69 6c 6c 49 6e 43  fo);.    fillInC
246c0 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 61 72  ell(pParent, par
246d0 65 6e 74 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f  entCell, 0, info
246e0 2e 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 30 2c 20  .nKey, 0, 0, 0, 
246f0 26 70 61 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20  &parentSize);.  
24700 20 20 61 73 73 65 72 74 28 20 70 61 72 65 6e 74    assert( parent
24710 53 69 7a 65 3c 36 34 20 29 3b 0a 20 20 20 20 61  Size<64 );.    a
24720 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 61  ssert( sqlite3Pa
24730 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 70  gerIswriteable(p
24740 50 61 72 65 6e 74 2d 3e 70 44 62 50 61 67 65 29  Parent->pDbPage)
24750 20 29 3b 0a 20 20 20 20 69 6e 73 65 72 74 43 65   );.    insertCe
24760 6c 6c 28 70 50 61 72 65 6e 74 2c 20 70 61 72 65  ll(pParent, pare
24770 6e 74 49 64 78 2c 20 70 61 72 65 6e 74 43 65 6c  ntIdx, parentCel
24780 6c 2c 20 70 61 72 65 6e 74 53 69 7a 65 2c 20 30  l, parentSize, 0
24790 2c 20 34 29 3b 0a 20 20 20 20 70 75 74 34 62 79  , 4);.    put4by
247a0 74 65 28 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43  te(findOverflowC
247b0 65 6c 6c 28 70 50 61 72 65 6e 74 2c 70 61 72 65  ell(pParent,pare
247c0 6e 74 49 64 78 29 2c 20 70 50 61 67 65 2d 3e 70  ntIdx), pPage->p
247d0 67 6e 6f 29 3b 0a 20 20 20 20 70 75 74 34 62 79  gno);.    put4by
247e0 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
247f0 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
24800 66 66 73 65 74 2b 38 5d 2c 20 70 67 6e 6f 4e 65  ffset+8], pgnoNe
24810 77 29 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66  w);.  .    /* If
24820 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74 6f   this is an auto
24830 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65  -vacuum database
24840 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69  , update the poi
24850 6e 74 65 72 20 6d 61 70 0a 20 20 20 20 2a 2a 20  nter map.    ** 
24860 77 69 74 68 20 65 6e 74 72 69 65 73 20 66 6f 72  with entries for
24870 20 74 68 65 20 6e 65 77 20 70 61 67 65 2c 20 61   the new page, a
24880 6e 64 20 61 6e 79 20 70 6f 69 6e 74 65 72 20 66  nd any pointer f
24890 72 6f 6d 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  rom the .    ** 
248a0 63 65 6c 6c 20 6f 6e 20 74 68 65 20 70 61 67 65  cell on the page
248b0 20 74 6f 20 61 6e 20 6f 76 65 72 66 6c 6f 77 20   to an overflow 
248c0 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
248d0 20 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55   if( ISAUTOVACUU
248e0 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  M ){.      rc = 
248f0 70 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70  ptrmapPut(pBt, p
24900 67 6e 6f 4e 65 77 2c 20 50 54 52 4d 41 50 5f 42  gnoNew, PTRMAP_B
24910 54 52 45 45 2c 20 70 50 61 72 65 6e 74 2d 3e 70  TREE, pParent->p
24920 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20  gno);.      if( 
24930 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
24940 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 74  .        rc = pt
24950 72 6d 61 70 50 75 74 4f 76 66 6c 28 70 4e 65 77  rmapPutOvfl(pNew
24960 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
24970 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c 65    }..    /* Rele
24980 61 73 65 20 74 68 65 20 72 65 66 65 72 65 6e 63  ase the referenc
24990 65 20 74 6f 20 74 68 65 20 6e 65 77 20 70 61 67  e to the new pag
249a0 65 2e 20 2a 2f 0a 20 20 20 20 72 65 6c 65 61 73  e. */.    releas
249b0 65 50 61 67 65 28 70 4e 65 77 29 3b 0a 20 20 7d  ePage(pNew);.  }
249c0 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
249d0 6f 69 6e 74 20 74 68 65 20 70 50 61 67 65 2d 3e  oint the pPage->
249e0 6e 46 72 65 65 20 76 61 72 69 61 62 6c 65 20 69  nFree variable i
249f0 73 20 6e 6f 74 20 73 65 74 20 63 6f 72 72 65 63  s not set correc
24a00 74 6c 79 20 77 69 74 68 0a 20 20 2a 2a 20 72 65  tly with.  ** re
24a10 73 70 65 63 74 20 74 6f 20 74 68 65 20 63 6f 6e  spect to the con
24a20 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
24a30 20 28 62 65 63 61 75 73 65 20 69 74 20 77 61 73   (because it was
24a40 20 73 65 74 20 74 6f 20 30 20 62 79 20 0a 20 20   set to 0 by .  
24a50 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c 29 2e 20  ** insertCell). 
24a60 53 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 42  So call sqlite3B
24a70 74 72 65 65 49 6e 69 74 50 61 67 65 28 29 20 74  treeInitPage() t
24a80 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74 20 69  o make sure it i
24a90 73 0a 20 20 2a 2a 20 63 6f 72 72 65 63 74 2e 0a  s.  ** correct..
24aa0 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69 73 20 68    **.  ** This h
24ab0 61 73 20 74 6f 20 62 65 20 64 6f 6e 65 20 65 76  as to be done ev
24ac0 65 6e 20 69 66 20 61 6e 20 65 72 72 6f 72 20 77  en if an error w
24ad0 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e  ill be returned.
24ae0 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 0a 20 20   Normally, if.  
24af0 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  ** an error occu
24b00 72 73 20 64 75 72 69 6e 67 20 74 72 65 65 20 62  rs during tree b
24b10 61 6c 61 6e 63 69 6e 67 2c 20 74 68 65 20 63 6f  alancing, the co
24b20 6e 74 65 6e 74 73 20 6f 66 20 4d 65 6d 50 61 67  ntents of MemPag
24b30 65 20 61 72 65 0a 20 20 2a 2a 20 6e 6f 74 20 69  e are.  ** not i
24b40 6d 70 6f 72 74 61 6e 74 2c 20 61 73 20 74 68 65  mportant, as the
24b50 79 20 77 69 6c 6c 20 62 65 20 72 65 63 61 6c 63  y will be recalc
24b60 75 6c 61 74 65 64 20 77 68 65 6e 20 74 68 65 20  ulated when the 
24b70 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64 0a 20  page is rolled. 
24b80 20 2a 2a 20 62 61 63 6b 2e 20 42 75 74 20 68 65   ** back. But he
24b90 72 65 2c 20 69 6e 20 62 61 6c 61 6e 63 65 5f 71  re, in balance_q
24ba0 75 69 63 6b 28 29 2c 20 69 74 20 69 73 20 70 6f  uick(), it is po
24bb0 73 73 69 62 6c 65 20 74 68 61 74 20 70 50 61 67  ssible that pPag
24bc0 65 20 68 61 73 20 0a 20 20 2a 2a 20 6e 6f 74 20  e has .  ** not 
24bd0 79 65 74 20 62 65 65 6e 20 6d 61 72 6b 65 64 20  yet been marked 
24be0 64 69 72 74 79 20 6f 72 20 77 72 69 74 74 65 6e  dirty or written
24bf0 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
24c00 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 66 6f 72  l file. Therefor
24c10 65 0a 20 20 2a 2a 20 69 74 20 77 69 6c 6c 20 6e  e.  ** it will n
24c20 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ot be rolled bac
24c30 6b 20 61 6e 64 20 73 6f 20 69 74 20 69 73 20 69  k and so it is i
24c40 6d 70 6f 72 74 61 6e 74 20 74 6f 20 6d 61 6b 65  mportant to make
24c50 20 73 75 72 65 20 74 68 61 74 0a 20 20 2a 2a 20   sure that.  ** 
24c60 74 68 65 20 70 61 67 65 20 64 61 74 61 20 61 6e  the page data an
24c70 64 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 4d 65  d contents of Me
24c80 6d 50 61 67 65 20 61 72 65 20 63 6f 6e 73 69 73  mPage are consis
24c90 74 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 70 50 61  tent..  */.  pPa
24ca0 67 65 2d 3e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  ge->isInit = 0;.
24cb0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e    sqlite3BtreeIn
24cc0 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a 0a  itPage(pPage);..
24cd0 20 20 2f 2a 20 49 66 20 65 76 65 72 79 74 68 69    /* If everythi
24ce0 6e 67 20 65 6c 73 65 20 73 75 63 63 65 65 64 65  ng else succeede
24cf0 64 2c 20 62 61 6c 61 6e 63 65 20 74 68 65 20 70  d, balance the p
24d00 61 72 65 6e 74 20 70 61 67 65 2c 20 69 6e 20 0a  arent page, in .
24d10 20 20 2a 2a 20 63 61 73 65 20 74 68 65 20 64 69    ** case the di
24d20 76 69 64 65 72 20 63 65 6c 6c 20 69 6e 73 65 72  vider cell inser
24d30 74 65 64 20 63 61 75 73 65 64 20 69 74 20 74 6f  ted caused it to
24d40 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c   become overfull
24d50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
24d60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24d70 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
24d80 61 67 65 29 3b 0a 20 20 20 20 70 43 75 72 2d 3e  age);.    pCur->
24d90 69 50 61 67 65 2d 2d 3b 0a 20 20 20 20 72 63 20  iPage--;.    rc 
24da0 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72 2c 20  = balance(pCur, 
24db0 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
24dc0 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a   rc;.}.#endif /*
24dd0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 51 55 49   SQLITE_OMIT_QUI
24de0 43 4b 42 41 4c 41 4e 43 45 20 2a 2f 0a 0a 2f 2a  CKBALANCE */../*
24df0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
24e00 20 72 65 64 69 73 74 72 69 62 75 74 65 73 20 43   redistributes C
24e10 65 6c 6c 73 20 6f 6e 20 70 50 61 67 65 20 61 6e  ells on pPage an
24e20 64 20 75 70 20 74 6f 20 4e 4e 2a 32 20 73 69 62  d up to NN*2 sib
24e30 6c 69 6e 67 73 0a 2a 2a 20 6f 66 20 70 50 61 67  lings.** of pPag
24e40 65 20 73 6f 20 74 68 61 74 20 61 6c 6c 20 70 61  e so that all pa
24e50 67 65 73 20 68 61 76 65 20 61 62 6f 75 74 20 74  ges have about t
24e60 68 65 20 73 61 6d 65 20 61 6d 6f 75 6e 74 20 6f  he same amount o
24e70 66 20 66 72 65 65 20 73 70 61 63 65 2e 0a 2a 2a  f free space..**
24e80 20 55 73 75 61 6c 6c 79 20 4e 4e 20 73 69 62 6c   Usually NN sibl
24e90 69 6e 67 73 20 6f 6e 20 65 69 74 68 65 72 20 73  ings on either s
24ea0 69 64 65 20 6f 66 20 70 50 61 67 65 20 69 73 20  ide of pPage is 
24eb0 75 73 65 64 20 69 6e 20 74 68 65 20 62 61 6c 61  used in the bala
24ec0 6e 63 69 6e 67 2c 0a 2a 2a 20 74 68 6f 75 67 68  ncing,.** though
24ed0 20 6d 6f 72 65 20 73 69 62 6c 69 6e 67 73 20 6d   more siblings m
24ee0 69 67 68 74 20 63 6f 6d 65 20 66 72 6f 6d 20 6f  ight come from o
24ef0 6e 65 20 73 69 64 65 20 69 66 20 70 50 61 67 65  ne side if pPage
24f00 20 69 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   is the first.**
24f10 20 6f 72 20 6c 61 73 74 20 63 68 69 6c 64 20 6f   or last child o
24f20 66 20 69 74 73 20 70 61 72 65 6e 74 2e 20 20 49  f its parent.  I
24f30 66 20 70 50 61 67 65 20 68 61 73 20 66 65 77 65  f pPage has fewe
24f40 72 20 74 68 61 6e 20 32 2a 4e 4e 20 73 69 62 6c  r than 2*NN sibl
24f50 69 6e 67 73 0a 2a 2a 20 28 73 6f 6d 65 74 68 69  ings.** (somethi
24f60 6e 67 20 77 68 69 63 68 20 63 61 6e 20 6f 6e 6c  ng which can onl
24f70 79 20 68 61 70 70 65 6e 20 69 66 20 70 50 61 67  y happen if pPag
24f80 65 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70 61  e is the root pa
24f90 67 65 20 6f 72 20 61 20 0a 2a 2a 20 63 68 69 6c  ge or a .** chil
24fa0 64 20 6f 66 20 72 6f 6f 74 29 20 74 68 65 6e 20  d of root) then 
24fb0 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 73 69  all available si
24fc0 62 6c 69 6e 67 73 20 70 61 72 74 69 63 69 70 61  blings participa
24fd0 74 65 20 69 6e 20 74 68 65 20 62 61 6c 61 6e 63  te in the balanc
24fe0 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  ing..**.** The n
24ff0 75 6d 62 65 72 20 6f 66 20 73 69 62 6c 69 6e 67  umber of sibling
25000 73 20 6f 66 20 70 50 61 67 65 20 6d 69 67 68 74  s of pPage might
25010 20 62 65 20 69 6e 63 72 65 61 73 65 64 20 6f 72   be increased or
25020 20 64 65 63 72 65 61 73 65 64 20 62 79 20 6f 6e   decreased by on
25030 65 20 6f 72 0a 2a 2a 20 74 77 6f 20 69 6e 20 61  e or.** two in a
25040 6e 20 65 66 66 6f 72 74 20 74 6f 20 6b 65 65 70  n effort to keep
25050 20 70 61 67 65 73 20 6e 65 61 72 6c 79 20 66 75   pages nearly fu
25060 6c 6c 20 62 75 74 20 6e 6f 74 20 6f 76 65 72 20  ll but not over 
25070 66 75 6c 6c 2e 20 54 68 65 20 72 6f 6f 74 20 70  full. The root p
25080 61 67 65 0a 2a 2a 20 69 73 20 73 70 65 63 69 61  age.** is specia
25090 6c 20 61 6e 64 20 69 73 20 61 6c 6c 6f 77 65 64  l and is allowed
250a0 20 74 6f 20 62 65 20 6e 65 61 72 6c 79 20 65 6d   to be nearly em
250b0 70 74 79 2e 20 49 66 20 70 50 61 67 65 20 69 73  pty. If pPage is
250c0 20 0a 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61   .** the root pa
250d0 67 65 2c 20 74 68 65 6e 20 74 68 65 20 64 65 70  ge, then the dep
250e0 74 68 20 6f 66 20 74 68 65 20 74 72 65 65 20 6d  th of the tree m
250f0 69 67 68 74 20 62 65 20 69 6e 63 72 65 61 73 65  ight be increase
25100 64 0a 2a 2a 20 6f 72 20 64 65 63 72 65 61 73 65  d.** or decrease
25110 64 20 62 79 20 6f 6e 65 2c 20 61 73 20 6e 65 63  d by one, as nec
25120 65 73 73 61 72 79 2c 20 74 6f 20 6b 65 65 70 20  essary, to keep 
25130 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 66 72  the root page fr
25140 6f 6d 20 62 65 69 6e 67 0a 2a 2a 20 6f 76 65 72  om being.** over
25150 66 75 6c 6c 20 6f 72 20 63 6f 6d 70 6c 65 74 65  full or complete
25160 6c 79 20 65 6d 70 74 79 2e 0a 2a 2a 0a 2a 2a 20  ly empty..**.** 
25170 4e 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20 74  Note that when t
25180 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
25190 61 6c 6c 65 64 2c 20 73 6f 6d 65 20 6f 66 20 74  alled, some of t
251a0 68 65 20 43 65 6c 6c 73 20 6f 6e 20 70 50 61 67  he Cells on pPag
251b0 65 0a 2a 2a 20 6d 69 67 68 74 20 6e 6f 74 20 61  e.** might not a
251c0 63 74 75 61 6c 6c 79 20 62 65 20 73 74 6f 72 65  ctually be store
251d0 64 20 69 6e 20 70 50 61 67 65 2d 3e 61 44 61 74  d in pPage->aDat
251e0 61 5b 5d 2e 20 20 54 68 69 73 20 63 61 6e 20 68  a[].  This can h
251f0 61 70 70 65 6e 0a 2a 2a 20 69 66 20 74 68 65 20  appen.** if the 
25200 70 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c  page is overfull
25210 2e 20 20 50 61 72 74 20 6f 66 20 74 68 65 20 6a  .  Part of the j
25220 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ob of this routi
25230 6e 65 20 69 73 20 74 6f 0a 2a 2a 20 6d 61 6b 65  ne is to.** make
25240 20 73 75 72 65 20 61 6c 6c 20 43 65 6c 6c 73 20   sure all Cells 
25250 66 6f 72 20 70 50 61 67 65 20 6f 6e 63 65 20 61  for pPage once a
25260 67 61 69 6e 20 66 69 74 20 69 6e 20 70 50 61 67  gain fit in pPag
25270 65 2d 3e 61 44 61 74 61 5b 5d 2e 0a 2a 2a 0a 2a  e->aData[]..**.*
25280 2a 20 49 6e 20 74 68 65 20 63 6f 75 72 73 65 20  * In the course 
25290 6f 66 20 62 61 6c 61 6e 63 69 6e 67 20 74 68 65  of balancing the
252a0 20 73 69 62 6c 69 6e 67 73 20 6f 66 20 70 50 61   siblings of pPa
252b0 67 65 2c 20 74 68 65 20 70 61 72 65 6e 74 20 6f  ge, the parent o
252c0 66 20 70 50 61 67 65 0a 2a 2a 20 6d 69 67 68 74  f pPage.** might
252d0 20 62 65 63 6f 6d 65 20 6f 76 65 72 66 75 6c 6c   become overfull
252e0 20 6f 72 20 75 6e 64 65 72 66 75 6c 6c 2e 20 20   or underfull.  
252f0 49 66 20 74 68 61 74 20 68 61 70 70 65 6e 73 2c  If that happens,
25300 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
25310 6e 65 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  ne.** is called 
25320 72 65 63 75 72 73 69 76 65 6c 79 20 6f 6e 20 74  recursively on t
25330 68 65 20 70 61 72 65 6e 74 2e 0a 2a 2a 0a 2a 2a  he parent..**.**
25340 20 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65   If this routine
25350 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72   fails for any r
25360 65 61 73 6f 6e 2c 20 69 74 20 6d 69 67 68 74 20  eason, it might 
25370 6c 65 61 76 65 20 74 68 65 20 64 61 74 61 62 61  leave the databa
25380 73 65 0a 2a 2a 20 69 6e 20 61 20 63 6f 72 72 75  se.** in a corru
25390 70 74 65 64 20 73 74 61 74 65 2e 20 20 53 6f 20  pted state.  So 
253a0 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  if this routine 
253b0 66 61 69 6c 73 2c 20 74 68 65 20 64 61 74 61 62  fails, the datab
253c0 61 73 65 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65  ase should.** be
253d0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2f   rolled back..*/
253e0 0a 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61  .static int bala
253f0 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 42 74 43 75  nce_nonroot(BtCu
25400 72 73 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d  rsor *pCur){.  M
25410 65 6d 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20  emPage *pPage;  
25420 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
25430 68 65 20 6f 76 65 72 20 6f 72 20 75 6e 64 65 72  he over or under
25440 66 75 6c 6c 20 70 61 67 65 20 74 6f 20 62 61 6c  full page to bal
25450 61 6e 63 65 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ance */.  MemPag
25460 65 20 2a 70 50 61 72 65 6e 74 3b 20 20 20 20 20  e *pParent;     
25470 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
25480 72 65 6e 74 20 6f 66 20 70 50 61 67 65 20 2a 2f  rent of pPage */
25490 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
254a0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
254b0 2f 2a 20 54 68 65 20 77 68 6f 6c 65 20 64 61 74  /* The whole dat
254c0 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  abase */.  int n
254d0 43 65 6c 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  Cell = 0;       
254e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
254f0 72 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70  r of cells in ap
25500 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  Cell[] */.  int 
25510 6e 4d 61 78 43 65 6c 6c 73 20 3d 20 30 3b 20 20  nMaxCells = 0;  
25520 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
25530 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 61 70  cated size of ap
25540 43 65 6c 6c 2c 20 73 7a 43 65 6c 6c 2c 20 61 46  Cell, szCell, aF
25550 72 6f 6d 2e 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f  rom. */.  int nO
25560 6c 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ld;             
25570 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
25580 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4f   of pages in apO
25590 6c 64 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e  ld[] */.  int nN
255a0 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ew;             
255b0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
255c0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 61 70 4e   of pages in apN
255d0 65 77 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 44  ew[] */.  int nD
255e0 69 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  iv;             
255f0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
25600 20 6f 66 20 63 65 6c 6c 73 20 69 6e 20 61 70 44   of cells in apD
25610 69 76 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  iv[] */.  int i,
25620 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20   j, k;          
25630 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
25640 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
25650 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20 20   idx;           
25660 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
25670 65 78 20 6f 66 20 70 50 61 67 65 20 69 6e 20 70  ex of pPage in p
25680 50 61 72 65 6e 74 2d 3e 61 43 65 6c 6c 5b 5d 20  Parent->aCell[] 
25690 2a 2f 0a 20 20 69 6e 74 20 6e 78 44 69 76 3b 20  */.  int nxDiv; 
256a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
256b0 20 20 2f 2a 20 4e 65 78 74 20 64 69 76 69 64 65    /* Next divide
256c0 72 20 73 6c 6f 74 20 69 6e 20 70 50 61 72 65 6e  r slot in pParen
256d0 74 2d 3e 61 43 65 6c 6c 5b 5d 20 2a 2f 0a 20 20  t->aCell[] */.  
256e0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
256f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25700 54 68 65 20 72 65 74 75 72 6e 20 63 6f 64 65 20  The return code 
25710 2a 2f 0a 20 20 69 6e 74 20 6c 65 61 66 43 6f 72  */.  int leafCor
25720 72 65 63 74 69 6f 6e 3b 20 20 20 20 20 20 20 20  rection;        
25730 20 20 2f 2a 20 34 20 69 66 20 70 50 61 67 65 20    /* 4 if pPage 
25740 69 73 20 61 20 6c 65 61 66 2e 20 20 30 20 69 66  is a leaf.  0 if
25750 20 6e 6f 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 65   not */.  int le
25760 61 66 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  afData;         
25770 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
25780 66 20 70 50 61 67 65 20 69 73 20 61 20 6c 65 61  f pPage is a lea
25790 66 20 6f 66 20 61 20 4c 45 41 46 44 41 54 41 20  f of a LEAFDATA 
257a0 74 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73  tree */.  int us
257b0 61 62 6c 65 53 70 61 63 65 3b 20 20 20 20 20 20  ableSpace;      
257c0 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
257d0 69 6e 20 70 50 61 67 65 20 62 65 79 6f 6e 64 20  in pPage beyond 
257e0 74 68 65 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  the header */.  
257f0 69 6e 74 20 70 61 67 65 46 6c 61 67 73 3b 20 20  int pageFlags;  
25800 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25810 56 61 6c 75 65 20 6f 66 20 70 50 61 67 65 2d 3e  Value of pPage->
25820 61 44 61 74 61 5b 30 5d 20 2a 2f 0a 20 20 69 6e  aData[0] */.  in
25830 74 20 73 75 62 74 6f 74 61 6c 3b 20 20 20 20 20  t subtotal;     
25840 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
25850 62 74 6f 74 61 6c 20 6f 66 20 62 79 74 65 73 20  btotal of bytes 
25860 69 6e 20 63 65 6c 6c 73 20 6f 6e 20 6f 6e 65 20  in cells on one 
25870 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 69 53  page */.  int iS
25880 70 61 63 65 31 20 3d 20 30 3b 20 20 20 20 20 20  pace1 = 0;      
25890 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
258a0 75 6e 75 73 65 64 20 62 79 74 65 20 6f 66 20 61  unused byte of a
258b0 53 70 61 63 65 31 5b 5d 20 2a 2f 0a 20 20 69 6e  Space1[] */.  in
258c0 74 20 69 53 70 61 63 65 32 20 3d 20 30 3b 20 20  t iSpace2 = 0;  
258d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
258e0 72 73 74 20 75 6e 75 73 65 64 20 62 79 74 65 20  rst unused byte 
258f0 6f 66 20 61 53 70 61 63 65 32 5b 5d 20 2a 2f 0a  of aSpace2[] */.
25900 20 20 69 6e 74 20 73 7a 53 63 72 61 74 63 68 3b    int szScratch;
25910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25920 2a 20 53 69 7a 65 20 6f 66 20 73 63 72 61 74 63  * Size of scratc
25930 68 20 6d 65 6d 6f 72 79 20 72 65 71 75 65 73 74  h memory request
25940 65 64 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  ed */.  MemPage 
25950 2a 61 70 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20  *apOld[NB];     
25960 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20 61 6e       /* pPage an
25970 64 20 75 70 20 74 6f 20 74 77 6f 20 73 69 62 6c  d up to two sibl
25980 69 6e 67 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  ings */.  Pgno p
25990 67 6e 6f 4f 6c 64 5b 4e 42 5d 3b 20 20 20 20 20  gnoOld[NB];     
259a0 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
259b0 75 6d 62 65 72 73 20 66 6f 72 20 65 61 63 68 20  umbers for each 
259c0 70 61 67 65 20 69 6e 20 61 70 4f 6c 64 5b 5d 20  page in apOld[] 
259d0 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 61 70  */.  MemPage *ap
259e0 43 6f 70 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20  Copy[NB];       
259f0 20 20 2f 2a 20 50 72 69 76 61 74 65 20 63 6f 70    /* Private cop
25a00 69 65 73 20 6f 66 20 61 70 4f 6c 64 5b 5d 20 70  ies of apOld[] p
25a10 61 67 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  ages */.  MemPag
25a20 65 20 2a 61 70 4e 65 77 5b 4e 42 2b 32 5d 3b 20  e *apNew[NB+2]; 
25a30 20 20 20 20 20 20 20 2f 2a 20 70 50 61 67 65 20         /* pPage 
25a40 61 6e 64 20 75 70 20 74 6f 20 4e 42 20 73 69 62  and up to NB sib
25a50 6c 69 6e 67 73 20 61 66 74 65 72 20 62 61 6c 61  lings after bala
25a60 6e 63 69 6e 67 20 2a 2f 0a 20 20 50 67 6e 6f 20  ncing */.  Pgno 
25a70 70 67 6e 6f 4e 65 77 5b 4e 42 2b 32 5d 3b 20 20  pgnoNew[NB+2];  
25a80 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
25a90 6e 75 6d 62 65 72 73 20 66 6f 72 20 65 61 63 68  numbers for each
25aa0 20 70 61 67 65 20 69 6e 20 61 70 4e 65 77 5b 5d   page in apNew[]
25ab0 20 2a 2f 0a 20 20 75 38 20 2a 61 70 44 69 76 5b   */.  u8 *apDiv[
25ac0 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20  NB];            
25ad0 20 20 20 2f 2a 20 44 69 76 69 64 65 72 20 63 65     /* Divider ce
25ae0 6c 6c 73 20 69 6e 20 70 50 61 72 65 6e 74 20 2a  lls in pParent *
25af0 2f 0a 20 20 69 6e 74 20 63 6e 74 4e 65 77 5b 4e  /.  int cntNew[N
25b00 42 2b 32 5d 3b 20 20 20 20 20 20 20 20 20 20 20  B+2];           
25b10 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 43 65   /* Index in aCe
25b20 6c 6c 5b 5d 20 6f 66 20 63 65 6c 6c 20 61 66 74  ll[] of cell aft
25b30 65 72 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a  er i-th page */.
25b40 20 20 69 6e 74 20 73 7a 4e 65 77 5b 4e 42 2b 32    int szNew[NB+2
25b50 5d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ];             /
25b60 2a 20 43 6f 6d 62 69 6e 65 64 20 73 69 7a 65 20  * Combined size 
25b70 6f 66 20 63 65 6c 6c 73 20 70 6c 61 63 65 20 6f  of cells place o
25b80 6e 20 69 2d 74 68 20 70 61 67 65 20 2a 2f 0a 20  n i-th page */. 
25b90 20 75 38 20 2a 2a 61 70 43 65 6c 6c 20 3d 20 30   u8 **apCell = 0
25ba0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
25bb0 20 41 6c 6c 20 63 65 6c 6c 73 20 62 65 67 69 6e   All cells begin
25bc0 20 62 61 6c 61 6e 63 65 64 20 2a 2f 0a 20 20 75   balanced */.  u
25bd0 31 36 20 2a 73 7a 43 65 6c 6c 3b 20 20 20 20 20  16 *szCell;     
25be0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
25bf0 6f 63 61 6c 20 73 69 7a 65 20 6f 66 20 61 6c 6c  ocal size of all
25c00 20 63 65 6c 6c 73 20 69 6e 20 61 70 43 65 6c 6c   cells in apCell
25c10 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 43 6f 70  [] */.  u8 *aCop
25c20 79 5b 4e 42 5d 3b 20 20 20 20 20 20 20 20 20 2f  y[NB];         /
25c30 2a 20 53 70 61 63 65 20 66 6f 72 20 68 6f 6c 64  * Space for hold
25c40 69 6e 67 20 64 61 74 61 20 6f 66 20 61 70 43 6f  ing data of apCo
25c50 70 79 5b 5d 20 2a 2f 0a 20 20 75 38 20 2a 61 53  py[] */.  u8 *aS
25c60 70 61 63 65 31 3b 20 20 20 20 20 20 20 20 20 20  pace1;          
25c70 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 63 6f   /* Space for co
25c80 70 69 65 73 20 6f 66 20 64 69 76 69 64 65 72 73  pies of dividers
25c90 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 62 61   cells before ba
25ca0 6c 61 6e 63 65 20 2a 2f 0a 20 20 75 38 20 2a 61  lance */.  u8 *a
25cb0 53 70 61 63 65 32 20 3d 20 30 3b 20 20 20 20 20  Space2 = 0;     
25cc0 20 20 2f 2a 20 53 70 61 63 65 20 66 6f 72 20 6f    /* Space for o
25cd0 76 65 72 66 6c 6f 77 20 64 69 76 69 64 65 72 73  verflow dividers
25ce0 20 63 65 6c 6c 73 20 61 66 74 65 72 20 62 61 6c   cells after bal
25cf0 61 6e 63 65 20 2a 2f 0a 20 20 75 38 20 2a 61 46  ance */.  u8 *aF
25d00 72 6f 6d 20 3d 20 30 3b 0a 0a 20 20 70 50 61 67  rom = 0;..  pPag
25d10 65 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65  e = pCur->apPage
25d20 5b 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20  [pCur->iPage];. 
25d30 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
25d40 5f 6d 75 74 65 78 5f 68 65 6c 64 28 70 50 61 67  _mutex_held(pPag
25d50 65 2d 3e 70 42 74 2d 3e 6d 75 74 65 78 29 20 29  e->pBt->mutex) )
25d60 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 46 69  ;..  /* .  ** Fi
25d70 6e 64 20 74 68 65 20 70 61 72 65 6e 74 20 70 61  nd the parent pa
25d80 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ge..  */.  asser
25d90 74 28 20 70 43 75 72 2d 3e 69 50 61 67 65 3e 30  t( pCur->iPage>0
25da0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
25db0 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b 0a 20  age->isInit );. 
25dc0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
25dd0 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65  PagerIswriteable
25de0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
25df0 20 7c 7c 20 70 50 61 67 65 2d 3e 6e 4f 76 65 72   || pPage->nOver
25e00 66 6c 6f 77 3d 3d 31 20 29 3b 0a 20 20 70 42 74  flow==1 );.  pBt
25e10 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a 20   = pPage->pBt;. 
25e20 20 70 50 61 72 65 6e 74 20 3d 20 70 43 75 72 2d   pParent = pCur-
25e30 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
25e40 61 67 65 2d 31 5d 3b 0a 20 20 61 73 73 65 72 74  age-1];.  assert
25e50 28 20 70 50 61 72 65 6e 74 20 29 3b 0a 20 20 69  ( pParent );.  i
25e60 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
25e70 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
25e80 57 72 69 74 65 28 70 50 61 72 65 6e 74 2d 3e 70  Write(pParent->p
25e90 44 62 50 61 67 65 29 29 20 29 7b 0a 20 20 20 20  DbPage)) ){.    
25ea0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
25eb0 20 20 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43    TRACE(("BALANC
25ec0 45 3a 20 62 65 67 69 6e 20 70 61 67 65 20 25 64  E: begin page %d
25ed0 20 63 68 69 6c 64 20 6f 66 20 25 64 5c 6e 22 2c   child of %d\n",
25ee0 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 50   pPage->pgno, pP
25ef0 61 72 65 6e 74 2d 3e 70 67 6e 6f 29 29 3b 0a 0a  arent->pgno));..
25f00 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
25f10 4d 49 54 5f 51 55 49 43 4b 42 41 4c 41 4e 43 45  MIT_QUICKBALANCE
25f20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 41 20 73 70 65  .  /*.  ** A spe
25f30 63 69 61 6c 20 63 61 73 65 3a 20 20 49 66 20 61  cial case:  If a
25f40 20 6e 65 77 20 65 6e 74 72 79 20 68 61 73 20 6a   new entry has j
25f50 75 73 74 20 62 65 65 6e 20 69 6e 73 65 72 74 65  ust been inserte
25f60 64 20 69 6e 74 6f 20 61 0a 20 20 2a 2a 20 74 61  d into a.  ** ta
25f70 62 6c 65 20 28 74 68 61 74 20 69 73 2c 20 61 20  ble (that is, a 
25f80 62 74 72 65 65 20 77 69 74 68 20 69 6e 74 65 67  btree with integ
25f90 65 72 20 6b 65 79 73 20 61 6e 64 20 61 6c 6c 20  er keys and all 
25fa0 64 61 74 61 20 61 74 20 74 68 65 20 6c 65 61 76  data at the leav
25fb0 65 73 29 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  es).  ** and the
25fc0 20 6e 65 77 20 65 6e 74 72 79 20 69 73 20 74 68   new entry is th
25fd0 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 65 6e 74  e right-most ent
25fe0 72 79 20 69 6e 20 74 68 65 20 74 72 65 65 20 28  ry in the tree (
25ff0 69 74 20 68 61 73 20 74 68 65 0a 20 20 2a 2a 20  it has the.  ** 
26000 6c 61 72 67 65 73 74 20 6b 65 79 29 20 74 68 65  largest key) the
26010 6e 20 75 73 65 20 74 68 65 20 73 70 65 63 69 61  n use the specia
26020 6c 20 62 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28  l balance_quick(
26030 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 0a 20 20  ) routine for.  
26040 2a 2a 20 62 61 6c 61 6e 63 69 6e 67 2e 20 20 62  ** balancing.  b
26050 61 6c 61 6e 63 65 5f 71 75 69 63 6b 28 29 20 69  alance_quick() i
26060 73 20 6d 75 63 68 20 66 61 73 74 65 72 20 61 6e  s much faster an
26070 64 20 72 65 73 75 6c 74 73 20 69 6e 20 61 20 74  d results in a t
26080 69 67 68 74 65 72 0a 20 20 2a 2a 20 70 61 63 6b  ighter.  ** pack
26090 69 6e 67 20 6f 66 20 64 61 74 61 20 69 6e 20 74  ing of data in t
260a0 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 2e 0a  he common case..
260b0 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
260c0 2d 3e 6c 65 61 66 20 26 26 0a 20 20 20 20 20 20  ->leaf &&.      
260d0 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 26 26  pPage->intKey &&
260e0 0a 20 20 20 20 20 20 70 50 61 67 65 2d 3e 6e 4f  .      pPage->nO
260f0 76 65 72 66 6c 6f 77 3d 3d 31 20 26 26 0a 20 20  verflow==1 &&.  
26100 20 20 20 20 70 50 61 67 65 2d 3e 61 4f 76 66 6c      pPage->aOvfl
26110 5b 30 5d 2e 69 64 78 3d 3d 70 50 61 67 65 2d 3e  [0].idx==pPage->
26120 6e 43 65 6c 6c 20 26 26 0a 20 20 20 20 20 20 70  nCell &&.      p
26130 50 61 72 65 6e 74 2d 3e 70 67 6e 6f 21 3d 31 20  Parent->pgno!=1 
26140 26 26 0a 20 20 20 20 20 20 67 65 74 34 62 79 74  &&.      get4byt
26150 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61 74  e(&pParent->aDat
26160 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f 66  a[pParent->hdrOf
26170 66 73 65 74 2b 38 5d 29 3d 3d 70 50 61 67 65 2d  fset+8])==pPage-
26180 3e 70 67 6e 6f 0a 20 20 29 7b 0a 20 20 20 20 61  >pgno.  ){.    a
26190 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69 6e  ssert( pPage->in
261a0 74 4b 65 79 20 29 3b 0a 20 20 20 20 2f 2a 0a 20  tKey );.    /*. 
261b0 20 20 20 2a 2a 20 54 4f 44 4f 3a 20 43 68 65 63     ** TODO: Chec
261c0 6b 20 74 68 65 20 73 69 62 6c 69 6e 67 73 20 74  k the siblings t
261d0 6f 20 74 68 65 20 6c 65 66 74 20 6f 66 20 70 50  o the left of pP
261e0 61 67 65 2e 20 49 74 20 6d 61 79 20 62 65 20 74  age. It may be t
261f0 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 79 20  hat.    ** they 
26200 61 72 65 20 6e 6f 74 20 66 75 6c 6c 20 61 6e 64  are not full and
26210 20 6e 6f 20 6e 65 77 20 70 61 67 65 20 69 73 20   no new page is 
26220 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a 2f  required..    */
26230 0a 20 20 20 20 72 65 74 75 72 6e 20 62 61 6c 61  .    return bala
26240 6e 63 65 5f 71 75 69 63 6b 28 70 43 75 72 29 3b  nce_quick(pCur);
26250 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69  .  }.#endif..  i
26260 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
26270 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
26280 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70 44 62  Write(pPage->pDb
26290 50 61 67 65 29 29 20 29 7b 0a 20 20 20 20 72 65  Page)) ){.    re
262a0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
262b0 2f 2a 0a 20 20 2a 2a 20 46 69 6e 64 20 74 68 65  /*.  ** Find the
262c0 20 63 65 6c 6c 20 69 6e 20 74 68 65 20 70 61 72   cell in the par
262d0 65 6e 74 20 70 61 67 65 20 77 68 6f 73 65 20 6c  ent page whose l
262e0 65 66 74 20 63 68 69 6c 64 20 70 6f 69 6e 74 73  eft child points
262f0 20 62 61 63 6b 0a 20 20 2a 2a 20 74 6f 20 70 50   back.  ** to pP
26300 61 67 65 2e 20 20 54 68 65 20 22 69 64 78 22 20  age.  The "idx" 
26310 76 61 72 69 61 62 6c 65 20 69 73 20 74 68 65 20  variable is the 
26320 69 6e 64 65 78 20 6f 66 20 74 68 61 74 20 63 65  index of that ce
26330 6c 6c 2e 20 20 49 66 20 70 50 61 67 65 0a 20 20  ll.  If pPage.  
26340 2a 2a 20 69 73 20 74 68 65 20 72 69 67 68 74 6d  ** is the rightm
26350 6f 73 74 20 63 68 69 6c 64 20 6f 66 20 70 50 61  ost child of pPa
26360 72 65 6e 74 20 74 68 65 6e 20 73 65 74 20 69 64  rent then set id
26370 78 20 74 6f 20 70 50 61 72 65 6e 74 2d 3e 6e 43  x to pParent->nC
26380 65 6c 6c 20 0a 20 20 2a 2f 0a 20 20 69 64 78 20  ell .  */.  idx 
26390 3d 20 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43  = pCur->aiIdx[pC
263a0 75 72 2d 3e 69 50 61 67 65 2d 31 5d 3b 0a 20 20  ur->iPage-1];.  
263b0 61 73 73 65 72 74 50 61 72 65 6e 74 49 6e 64 65  assertParentInde
263c0 78 28 70 50 61 72 65 6e 74 2c 20 69 64 78 2c 20  x(pParent, idx, 
263d0 70 50 61 67 65 2d 3e 70 67 6e 6f 29 3b 0a 0a 20  pPage->pgno);.. 
263e0 20 2f 2a 0a 20 20 2a 2a 20 49 6e 69 74 69 61 6c   /*.  ** Initial
263f0 69 7a 65 20 76 61 72 69 61 62 6c 65 73 20 73 6f  ize variables so
26400 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65   that it will be
26410 20 73 61 66 65 20 74 6f 20 6a 75 6d 70 0a 20 20   safe to jump.  
26420 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 62  ** directly to b
26430 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 20 61  alance_cleanup a
26440 74 20 61 6e 79 20 6d 6f 6d 65 6e 74 2e 0a 20 20  t any moment..  
26450 2a 2f 0a 20 20 6e 4f 6c 64 20 3d 20 6e 4e 65 77  */.  nOld = nNew
26460 20 3d 20 30 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a   = 0;..  /*.  **
26470 20 46 69 6e 64 20 73 69 62 6c 69 6e 67 20 70 61   Find sibling pa
26480 67 65 73 20 74 6f 20 70 50 61 67 65 20 61 6e 64  ges to pPage and
26490 20 74 68 65 20 63 65 6c 6c 73 20 69 6e 20 70 50   the cells in pP
264a0 61 72 65 6e 74 20 74 68 61 74 20 64 69 76 69 64  arent that divid
264b0 65 0a 20 20 2a 2a 20 74 68 65 20 73 69 62 6c 69  e.  ** the sibli
264c0 6e 67 73 2e 20 20 41 6e 20 61 74 74 65 6d 70 74  ngs.  An attempt
264d0 20 69 73 20 6d 61 64 65 20 74 6f 20 66 69 6e 64   is made to find
264e0 20 4e 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20   NN siblings on 
264f0 65 69 74 68 65 72 0a 20 20 2a 2a 20 73 69 64 65  either.  ** side
26500 20 6f 66 20 70 50 61 67 65 2e 20 20 4d 6f 72 65   of pPage.  More
26510 20 73 69 62 6c 69 6e 67 73 20 61 72 65 20 74 61   siblings are ta
26520 6b 65 6e 20 66 72 6f 6d 20 6f 6e 65 20 73 69 64  ken from one sid
26530 65 2c 20 68 6f 77 65 76 65 72 2c 20 69 66 0a 20  e, however, if. 
26540 20 2a 2a 20 70 50 61 67 65 20 74 68 65 72 65 20   ** pPage there 
26550 61 72 65 20 66 65 77 65 72 20 74 68 61 6e 20 4e  are fewer than N
26560 4e 20 73 69 62 6c 69 6e 67 73 20 6f 6e 20 74 68  N siblings on th
26570 65 20 6f 74 68 65 72 20 73 69 64 65 2e 20 20 49  e other side.  I
26580 66 20 70 50 61 72 65 6e 74 0a 20 20 2a 2a 20 68  f pParent.  ** h
26590 61 73 20 4e 42 20 6f 72 20 66 65 77 65 72 20 63  as NB or fewer c
265a0 68 69 6c 64 72 65 6e 20 74 68 65 6e 20 61 6c 6c  hildren then all
265b0 20 63 68 69 6c 64 72 65 6e 20 6f 66 20 70 50 61   children of pPa
265c0 72 65 6e 74 20 61 72 65 20 74 61 6b 65 6e 2e 0a  rent are taken..
265d0 20 20 2a 2f 0a 20 20 6e 78 44 69 76 20 3d 20 69    */.  nxDiv = i
265e0 64 78 20 2d 20 4e 4e 3b 0a 20 20 69 66 28 20 6e  dx - NN;.  if( n
265f0 78 44 69 76 20 2b 20 4e 42 20 3e 20 70 50 61 72  xDiv + NB > pPar
26600 65 6e 74 2d 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20  ent->nCell ){.  
26610 20 20 6e 78 44 69 76 20 3d 20 70 50 61 72 65 6e    nxDiv = pParen
26620 74 2d 3e 6e 43 65 6c 6c 20 2d 20 4e 42 20 2b 20  t->nCell - NB + 
26630 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 78 44  1;.  }.  if( nxD
26640 69 76 3c 30 20 29 7b 0a 20 20 20 20 6e 78 44 69  iv<0 ){.    nxDi
26650 76 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 6e 44 69  v = 0;.  }.  nDi
26660 76 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  v = 0;.  for(i=0
26670 2c 20 6b 3d 6e 78 44 69 76 3b 20 69 3c 4e 42 3b  , k=nxDiv; i<NB;
26680 20 69 2b 2b 2c 20 6b 2b 2b 29 7b 0a 20 20 20 20   i++, k++){.    
26690 69 66 28 20 6b 3c 70 50 61 72 65 6e 74 2d 3e 6e  if( k<pParent->n
266a0 43 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 61 70  Cell ){.      ap
266b0 44 69 76 5b 69 5d 20 3d 20 66 69 6e 64 43 65 6c  Div[i] = findCel
266c0 6c 28 70 50 61 72 65 6e 74 2c 20 6b 29 3b 0a 20  l(pParent, k);. 
266d0 20 20 20 20 20 6e 44 69 76 2b 2b 3b 0a 20 20 20       nDiv++;.   
266e0 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 72     assert( !pPar
266f0 65 6e 74 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 20  ent->leaf );.   
26700 20 20 20 70 67 6e 6f 4f 6c 64 5b 69 5d 20 3d 20     pgnoOld[i] = 
26710 67 65 74 34 62 79 74 65 28 61 70 44 69 76 5b 69  get4byte(apDiv[i
26720 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ]);.    }else if
26730 28 20 6b 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43  ( k==pParent->nC
26740 65 6c 6c 20 29 7b 0a 20 20 20 20 20 20 70 67 6e  ell ){.      pgn
26750 6f 4f 6c 64 5b 69 5d 20 3d 20 67 65 74 34 62 79  oOld[i] = get4by
26760 74 65 28 26 70 50 61 72 65 6e 74 2d 3e 61 44 61  te(&pParent->aDa
26770 74 61 5b 70 50 61 72 65 6e 74 2d 3e 68 64 72 4f  ta[pParent->hdrO
26780 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 7d  ffset+8]);.    }
26790 65 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61  else{.      brea
267a0 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  k;.    }.    rc 
267b0 3d 20 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65  = getAndInitPage
267c0 28 70 42 74 2c 20 70 67 6e 6f 4f 6c 64 5b 69 5d  (pBt, pgnoOld[i]
267d0 2c 20 26 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20  , &apOld[i]);.  
267e0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
267f0 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b  balance_cleanup;
26800 0a 20 20 20 20 2f 2a 20 61 70 4f 6c 64 5b 69 5d  .    /* apOld[i]
26810 2d 3e 69 64 78 50 61 72 65 6e 74 20 3d 20 6b 3b  ->idxParent = k;
26820 20 2a 2f 0a 20 20 20 20 61 70 43 6f 70 79 5b 69   */.    apCopy[i
26830 5d 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72  ] = 0;.    asser
26840 74 28 20 69 3d 3d 6e 4f 6c 64 20 29 3b 0a 20 20  t( i==nOld );.  
26850 20 20 6e 4f 6c 64 2b 2b 3b 0a 20 20 20 20 6e 4d    nOld++;.    nM
26860 61 78 43 65 6c 6c 73 20 2b 3d 20 31 2b 61 70 4f  axCells += 1+apO
26870 6c 64 5b 69 5d 2d 3e 6e 43 65 6c 6c 2b 61 70 4f  ld[i]->nCell+apO
26880 6c 64 5b 69 5d 2d 3e 6e 4f 76 65 72 66 6c 6f 77  ld[i]->nOverflow
26890 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
268a0 20 6e 4d 61 78 43 65 6c 6c 73 20 61 20 6d 75 6c   nMaxCells a mul
268b0 74 69 70 6c 65 20 6f 66 20 34 20 69 6e 20 6f 72  tiple of 4 in or
268c0 64 65 72 20 74 6f 20 70 72 65 73 65 72 76 65 20  der to preserve 
268d0 38 2d 62 79 74 65 0a 20 20 2a 2a 20 61 6c 69 67  8-byte.  ** alig
268e0 6e 6d 65 6e 74 20 2a 2f 0a 20 20 6e 4d 61 78 43  nment */.  nMaxC
268f0 65 6c 6c 73 20 3d 20 28 6e 4d 61 78 43 65 6c 6c  ells = (nMaxCell
26900 73 20 2b 20 33 29 26 7e 33 3b 0a 0a 20 20 2f 2a  s + 3)&~3;..  /*
26910 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73  .  ** Allocate s
26920 70 61 63 65 20 66 6f 72 20 6d 65 6d 6f 72 79 20  pace for memory 
26930 73 74 72 75 63 74 75 72 65 73 0a 20 20 2a 2f 0a  structures.  */.
26940 20 20 73 7a 53 63 72 61 74 63 68 20 3d 0a 20 20    szScratch =.  
26950 20 20 20 20 20 6e 4d 61 78 43 65 6c 6c 73 2a 73       nMaxCells*s
26960 69 7a 65 6f 66 28 75 38 2a 29 20 20 20 20 20 20  izeof(u8*)      
26970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26980 20 2f 2a 20 61 70 43 65 6c 6c 20 2a 2f 0a 20 20   /* apCell */.  
26990 20 20 20 2b 20 6e 4d 61 78 43 65 6c 6c 73 2a 73     + nMaxCells*s
269a0 69 7a 65 6f 66 28 75 31 36 29 20 20 20 20 20 20  izeof(u16)      
269b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
269c0 20 2f 2a 20 73 7a 43 65 6c 6c 20 2a 2f 0a 20 20   /* szCell */.  
269d0 20 20 20 2b 20 28 52 4f 55 4e 44 38 28 73 69 7a     + (ROUND8(siz
269e0 65 6f 66 28 4d 65 6d 50 61 67 65 29 29 2b 70 42  eof(MemPage))+pB
269f0 74 2d 3e 70 61 67 65 53 69 7a 65 29 2a 4e 42 20  t->pageSize)*NB 
26a00 20 2f 2a 20 61 43 6f 70 79 20 2a 2f 0a 20 20 20   /* aCopy */.   
26a10 20 20 2b 20 70 42 74 2d 3e 70 61 67 65 53 69 7a    + pBt->pageSiz
26a20 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
26a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a40 2f 2a 20 61 53 70 61 63 65 31 20 2a 2f 0a 20 20  /* aSpace1 */.  
26a50 20 20 20 2b 20 28 49 53 41 55 54 4f 56 41 43 55     + (ISAUTOVACU
26a60 55 4d 20 3f 20 6e 4d 61 78 43 65 6c 6c 73 20 3a  UM ? nMaxCells :
26a70 20 30 29 3b 20 20 20 20 20 20 20 20 20 20 20 20   0);            
26a80 20 2f 2a 20 61 46 72 6f 6d 20 2a 2f 0a 20 20 61   /* aFrom */.  a
26a90 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74 65 33 53  pCell = sqlite3S
26aa0 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 20 73 7a  cratchMalloc( sz
26ab0 53 63 72 61 74 63 68 20 29 3b 20 0a 20 20 69 66  Scratch ); .  if
26ac0 28 20 61 70 43 65 6c 6c 3d 3d 30 20 29 7b 0a 20  ( apCell==0 ){. 
26ad0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
26ae0 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62  OMEM;.    goto b
26af0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
26b00 20 20 7d 0a 20 20 73 7a 43 65 6c 6c 20 3d 20 28    }.  szCell = (
26b10 75 31 36 2a 29 26 61 70 43 65 6c 6c 5b 6e 4d 61  u16*)&apCell[nMa
26b20 78 43 65 6c 6c 73 5d 3b 0a 20 20 61 43 6f 70 79  xCells];.  aCopy
26b30 5b 30 5d 20 3d 20 28 75 38 2a 29 26 73 7a 43 65  [0] = (u8*)&szCe
26b40 6c 6c 5b 6e 4d 61 78 43 65 6c 6c 73 5d 3b 0a 20  ll[nMaxCells];. 
26b50 20 61 73 73 65 72 74 28 20 28 28 61 43 6f 70 79   assert( ((aCopy
26b60 5b 30 5d 20 2d 20 28 75 38 2a 29 61 70 43 65 6c  [0] - (u8*)apCel
26b70 6c 29 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a  l) & 7)==0 ); /*
26b80 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e   8-byte alignmen
26b90 74 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  t required */.  
26ba0 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 42 3b 20 69  for(i=1; i<NB; i
26bb0 2b 2b 29 7b 0a 20 20 20 20 61 43 6f 70 79 5b 69  ++){.    aCopy[i
26bc0 5d 20 3d 20 26 61 43 6f 70 79 5b 69 2d 31 5d 5b  ] = &aCopy[i-1][
26bd0 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 2b 52 4f  pBt->pageSize+RO
26be0 55 4e 44 38 28 73 69 7a 65 6f 66 28 4d 65 6d 50  UND8(sizeof(MemP
26bf0 61 67 65 29 29 5d 3b 0a 20 20 20 20 61 73 73 65  age))];.    asse
26c00 72 74 28 20 28 28 61 43 6f 70 79 5b 69 5d 20 2d  rt( ((aCopy[i] -
26c10 20 28 75 38 2a 29 61 70 43 65 6c 6c 29 20 26 20   (u8*)apCell) & 
26c20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38 2d 62 79  7)==0 ); /* 8-by
26c30 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20 72 65 71  te alignment req
26c40 75 69 72 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 61  uired */.  }.  a
26c50 53 70 61 63 65 31 20 3d 20 26 61 43 6f 70 79 5b  Space1 = &aCopy[
26c60 4e 42 2d 31 5d 5b 70 42 74 2d 3e 70 61 67 65 53  NB-1][pBt->pageS
26c70 69 7a 65 2b 52 4f 55 4e 44 38 28 73 69 7a 65 6f  ize+ROUND8(sizeo
26c80 66 28 4d 65 6d 50 61 67 65 29 29 5d 3b 0a 20 20  f(MemPage))];.  
26c90 61 73 73 65 72 74 28 20 28 28 61 53 70 61 63 65  assert( ((aSpace
26ca0 31 20 2d 20 28 75 38 2a 29 61 70 43 65 6c 6c 29  1 - (u8*)apCell)
26cb0 20 26 20 37 29 3d 3d 30 20 29 3b 20 2f 2a 20 38   & 7)==0 ); /* 8
26cc0 2d 62 79 74 65 20 61 6c 69 67 6e 6d 65 6e 74 20  -byte alignment 
26cd0 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 66  required */.  if
26ce0 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29  ( ISAUTOVACUUM )
26cf0 7b 0a 20 20 20 20 61 46 72 6f 6d 20 3d 20 26 61  {.    aFrom = &a
26d00 53 70 61 63 65 31 5b 70 42 74 2d 3e 70 61 67 65  Space1[pBt->page
26d10 53 69 7a 65 5d 3b 0a 20 20 7d 0a 20 20 61 53 70  Size];.  }.  aSp
26d20 61 63 65 32 20 3d 20 73 71 6c 69 74 65 33 50 61  ace2 = sqlite3Pa
26d30 67 65 4d 61 6c 6c 6f 63 28 70 42 74 2d 3e 70 61  geMalloc(pBt->pa
26d40 67 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 61  geSize);.  if( a
26d50 53 70 61 63 65 32 3d 3d 30 20 29 7b 0a 20 20 20  Space2==0 ){.   
26d60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
26d70 45 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 62 61 6c  EM;.    goto bal
26d80 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20  ance_cleanup;.  
26d90 7d 0a 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 4d  }.  .  /*.  ** M
26da0 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  ake copies of th
26db0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 50 61  e content of pPa
26dc0 67 65 20 61 6e 64 20 69 74 73 20 73 69 62 6c 69  ge and its sibli
26dd0 6e 67 73 20 69 6e 74 6f 20 61 4f 6c 64 5b 5d 2e  ngs into aOld[].
26de0 0a 20 20 2a 2a 20 54 68 65 20 72 65 73 74 20 6f  .  ** The rest o
26df0 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
26e00 77 69 6c 6c 20 75 73 65 20 64 61 74 61 20 66 72  will use data fr
26e10 6f 6d 20 74 68 65 20 63 6f 70 69 65 73 20 72 61  om the copies ra
26e20 74 68 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 74  ther.  ** that t
26e30 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
26e40 73 20 73 69 6e 63 65 20 74 68 65 20 6f 72 69 67  s since the orig
26e50 69 6e 61 6c 20 70 61 67 65 73 20 77 69 6c 6c 20  inal pages will 
26e60 62 65 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 70  be in the.  ** p
26e70 72 6f 63 65 73 73 20 6f 66 20 62 65 69 6e 67 20  rocess of being 
26e80 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 20 20 2a  overwritten..  *
26e90 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  /.  for(i=0; i<n
26ea0 4f 6c 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 4d  Old; i++){.    M
26eb0 65 6d 50 61 67 65 20 2a 70 20 3d 20 61 70 43 6f  emPage *p = apCo
26ec0 70 79 5b 69 5d 20 3d 20 28 4d 65 6d 50 61 67 65  py[i] = (MemPage
26ed0 2a 29 61 43 6f 70 79 5b 69 5d 3b 0a 20 20 20 20  *)aCopy[i];.    
26ee0 6d 65 6d 63 70 79 28 70 2c 20 61 70 4f 6c 64 5b  memcpy(p, apOld[
26ef0 69 5d 2c 20 73 69 7a 65 6f 66 28 4d 65 6d 50 61  i], sizeof(MemPa
26f00 67 65 29 29 3b 0a 20 20 20 20 70 2d 3e 61 44 61  ge));.    p->aDa
26f10 74 61 20 3d 20 28 76 6f 69 64 2a 29 26 70 5b 31  ta = (void*)&p[1
26f20 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 2d  ];.    memcpy(p-
26f30 3e 61 44 61 74 61 2c 20 61 70 4f 6c 64 5b 69 5d  >aData, apOld[i]
26f40 2d 3e 61 44 61 74 61 2c 20 70 42 74 2d 3e 70 61  ->aData, pBt->pa
26f50 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20  geSize);.  }..  
26f60 2f 2a 0a 20 20 2a 2a 20 4c 6f 61 64 20 70 6f 69  /*.  ** Load poi
26f70 6e 74 65 72 73 20 74 6f 20 61 6c 6c 20 63 65 6c  nters to all cel
26f80 6c 73 20 6f 6e 20 73 69 62 6c 69 6e 67 20 70 61  ls on sibling pa
26f90 67 65 73 20 61 6e 64 20 74 68 65 20 64 69 76 69  ges and the divi
26fa0 64 65 72 20 63 65 6c 6c 73 0a 20 20 2a 2a 20 69  der cells.  ** i
26fb0 6e 74 6f 20 74 68 65 20 6c 6f 63 61 6c 20 61 70  nto the local ap
26fc0 43 65 6c 6c 5b 5d 20 61 72 72 61 79 2e 20 20 4d  Cell[] array.  M
26fd0 61 6b 65 20 63 6f 70 69 65 73 20 6f 66 20 74 68  ake copies of th
26fe0 65 20 64 69 76 69 64 65 72 20 63 65 6c 6c 73 0a  e divider cells.
26ff0 20 20 2a 2a 20 69 6e 74 6f 20 73 70 61 63 65 20    ** into space 
27000 6f 62 74 61 69 6e 65 64 20 66 6f 72 6d 20 61 53  obtained form aS
27010 70 61 63 65 31 5b 5d 20 61 6e 64 20 72 65 6d 6f  pace1[] and remo
27020 76 65 20 74 68 65 20 74 68 65 20 64 69 76 69 64  ve the the divid
27030 65 72 20 43 65 6c 6c 73 0a 20 20 2a 2a 20 66 72  er Cells.  ** fr
27040 6f 6d 20 70 50 61 72 65 6e 74 2e 0a 20 20 2a 2a  om pParent..  **
27050 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 73 69 62  .  ** If the sib
27060 6c 69 6e 67 73 20 61 72 65 20 6f 6e 20 6c 65 61  lings are on lea
27070 66 20 70 61 67 65 73 2c 20 74 68 65 6e 20 74 68  f pages, then th
27080 65 20 63 68 69 6c 64 20 70 6f 69 6e 74 65 72 73  e child pointers
27090 20 6f 66 20 74 68 65 0a 20 20 2a 2a 20 64 69 76   of the.  ** div
270a0 69 64 65 72 20 63 65 6c 6c 73 20 61 72 65 20 73  ider cells are s
270b0 74 72 69 70 70 65 64 20 66 72 6f 6d 20 74 68 65  tripped from the
270c0 20 63 65 6c 6c 73 20 62 65 66 6f 72 65 20 74 68   cells before th
270d0 65 79 20 61 72 65 20 63 6f 70 69 65 64 0a 20 20  ey are copied.  
270e0 2a 2a 20 69 6e 74 6f 20 61 53 70 61 63 65 31 5b  ** into aSpace1[
270f0 5d 2e 20 20 49 6e 20 74 68 69 73 20 77 61 79 2c  ].  In this way,
27100 20 61 6c 6c 20 63 65 6c 6c 73 20 69 6e 20 61 70   all cells in ap
27110 43 65 6c 6c 5b 5d 20 61 72 65 20 77 69 74 68 6f  Cell[] are witho
27120 75 74 0a 20 20 2a 2a 20 63 68 69 6c 64 20 70 6f  ut.  ** child po
27130 69 6e 74 65 72 73 2e 20 20 49 66 20 73 69 62 6c  inters.  If sibl
27140 69 6e 67 73 20 61 72 65 20 6e 6f 74 20 6c 65 61  ings are not lea
27150 76 65 73 2c 20 74 68 65 6e 20 61 6c 6c 20 63 65  ves, then all ce
27160 6c 6c 20 69 6e 0a 20 20 2a 2a 20 61 70 43 65 6c  ll in.  ** apCel
27170 6c 5b 5d 20 69 6e 63 6c 75 64 65 20 63 68 69 6c  l[] include chil
27180 64 20 70 6f 69 6e 74 65 72 73 2e 20 20 45 69 74  d pointers.  Eit
27190 68 65 72 20 77 61 79 2c 20 61 6c 6c 20 63 65 6c  her way, all cel
271a0 6c 73 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 0a 20  ls in apCell[]. 
271b0 20 2a 2a 20 61 72 65 20 61 6c 69 6b 65 2e 0a 20   ** are alike.. 
271c0 20 2a 2a 0a 20 20 2a 2a 20 6c 65 61 66 43 6f 72   **.  ** leafCor
271d0 72 65 63 74 69 6f 6e 3a 20 20 34 20 69 66 20 70  rection:  4 if p
271e0 50 61 67 65 20 69 73 20 61 20 6c 65 61 66 2e 20  Page is a leaf. 
271f0 20 30 20 69 66 20 70 50 61 67 65 20 69 73 20 6e   0 if pPage is n
27200 6f 74 20 61 20 6c 65 61 66 2e 0a 20 20 2a 2a 20  ot a leaf..  ** 
27210 20 20 20 20 20 20 6c 65 61 66 44 61 74 61 3a 20        leafData: 
27220 20 31 20 69 66 20 70 50 61 67 65 20 68 6f 6c 64   1 if pPage hold
27230 73 20 6b 65 79 2b 64 61 74 61 20 61 6e 64 20 70  s key+data and p
27240 50 61 72 65 6e 74 20 68 6f 6c 64 73 20 6f 6e 6c  Parent holds onl
27250 79 20 6b 65 79 73 2e 0a 20 20 2a 2f 0a 20 20 6e  y keys..  */.  n
27260 43 65 6c 6c 20 3d 20 30 3b 0a 20 20 6c 65 61 66  Cell = 0;.  leaf
27270 43 6f 72 72 65 63 74 69 6f 6e 20 3d 20 70 50 61  Correction = pPa
27280 67 65 2d 3e 6c 65 61 66 2a 34 3b 0a 20 20 6c 65  ge->leaf*4;.  le
27290 61 66 44 61 74 61 20 3d 20 70 50 61 67 65 2d 3e  afData = pPage->
272a0 68 61 73 44 61 74 61 3b 0a 20 20 66 6f 72 28 69  hasData;.  for(i
272b0 3d 30 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29  =0; i<nOld; i++)
272c0 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70  {.    MemPage *p
272d0 4f 6c 64 20 3d 20 61 70 43 6f 70 79 5b 69 5d 3b  Old = apCopy[i];
272e0 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d  .    int limit =
272f0 20 70 4f 6c 64 2d 3e 6e 43 65 6c 6c 2b 70 4f 6c   pOld->nCell+pOl
27300 64 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20  d->nOverflow;.  
27310 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 6c 69 6d    for(j=0; j<lim
27320 69 74 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  it; j++){.      
27330 61 73 73 65 72 74 28 20 6e 43 65 6c 6c 3c 6e 4d  assert( nCell<nM
27340 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
27350 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20 3d   apCell[nCell] =
27360 20 66 69 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c   findOverflowCel
27370 6c 28 70 4f 6c 64 2c 20 6a 29 3b 0a 20 20 20 20  l(pOld, j);.    
27380 20 20 73 7a 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    szCell[nCell] 
27390 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4f  = cellSizePtr(pO
273a0 6c 64 2c 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c  ld, apCell[nCell
273b0 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 49 53  ]);.      if( IS
273c0 41 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20  AUTOVACUUM ){.  
273d0 20 20 20 20 20 20 69 6e 74 20 61 3b 0a 20 20 20        int a;.   
273e0 20 20 20 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c       aFrom[nCell
273f0 5d 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 66  ] = i;.        f
27400 6f 72 28 61 3d 30 3b 20 61 3c 70 4f 6c 64 2d 3e  or(a=0; a<pOld->
27410 6e 4f 76 65 72 66 6c 6f 77 3b 20 61 2b 2b 29 7b  nOverflow; a++){
27420 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
27430 4f 6c 64 2d 3e 61 4f 76 66 6c 5b 61 5d 2e 70 43  Old->aOvfl[a].pC
27440 65 6c 6c 3d 3d 61 70 43 65 6c 6c 5b 6e 43 65 6c  ell==apCell[nCel
27450 6c 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l] ){.          
27460 20 20 61 46 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d    aFrom[nCell] =
27470 20 30 78 46 46 3b 0a 20 20 20 20 20 20 20 20 20   0xFF;.         
27480 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
27490 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
274a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 43        }.      nC
274b0 65 6c 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  ell++;.    }.   
274c0 20 69 66 28 20 69 3c 6e 4f 6c 64 2d 31 20 29 7b   if( i<nOld-1 ){
274d0 0a 20 20 20 20 20 20 75 31 36 20 73 7a 20 3d 20  .      u16 sz = 
274e0 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 72  cellSizePtr(pPar
274f0 65 6e 74 2c 20 61 70 44 69 76 5b 69 5d 29 3b 0a  ent, apDiv[i]);.
27500 20 20 20 20 20 20 69 66 28 20 6c 65 61 66 44 61        if( leafDa
27510 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ta ){.        /*
27520 20 57 69 74 68 20 74 68 65 20 4c 45 41 46 44 41   With the LEAFDA
27530 54 41 20 66 6c 61 67 2c 20 70 50 61 72 65 6e 74  TA flag, pParent
27540 20 63 65 6c 6c 73 20 68 6f 6c 64 20 6f 6e 6c 79   cells hold only
27550 20 49 4e 54 4b 45 59 73 20 74 68 61 74 0a 20 20   INTKEYs that.  
27560 20 20 20 20 20 20 2a 2a 20 61 72 65 20 64 75 70        ** are dup
27570 6c 69 63 61 74 65 73 20 6f 66 20 6b 65 79 73 20  licates of keys 
27580 6f 6e 20 74 68 65 20 63 68 69 6c 64 20 70 61 67  on the child pag
27590 65 73 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20  es.  We need to 
275a0 72 65 6d 6f 76 65 0a 20 20 20 20 20 20 20 20 2a  remove.        *
275b0 2a 20 74 68 65 20 64 69 76 69 64 65 72 20 63 65  * the divider ce
275c0 6c 6c 73 20 66 72 6f 6d 20 70 50 61 72 65 6e 74  lls from pParent
275d0 2c 20 62 75 74 20 74 68 65 20 64 69 76 69 64 65  , but the divide
275e0 72 73 20 63 65 6c 6c 73 20 61 72 65 20 6e 6f 74  rs cells are not
275f0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 64 64 65  .        ** adde
27600 64 20 74 6f 20 61 70 43 65 6c 6c 5b 5d 20 62 65  d to apCell[] be
27610 63 61 75 73 65 20 74 68 65 79 20 61 72 65 20 64  cause they are d
27620 75 70 6c 69 63 61 74 65 73 20 6f 66 20 63 68 69  uplicates of chi
27630 6c 64 20 63 65 6c 6c 73 2e 0a 20 20 20 20 20 20  ld cells..      
27640 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 64 72 6f    */.        dro
27650 70 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c 20 6e  pCell(pParent, n
27660 78 44 69 76 2c 20 73 7a 29 3b 0a 20 20 20 20 20  xDiv, sz);.     
27670 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
27680 75 38 20 2a 70 54 65 6d 70 3b 0a 20 20 20 20 20  u8 *pTemp;.     
27690 20 20 20 61 73 73 65 72 74 28 20 6e 43 65 6c 6c     assert( nCell
276a0 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20  <nMaxCells );.  
276b0 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43 65        szCell[nCe
276c0 6c 6c 5d 20 3d 20 73 7a 3b 0a 20 20 20 20 20 20  ll] = sz;.      
276d0 20 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63    pTemp = &aSpac
276e0 65 31 5b 69 53 70 61 63 65 31 5d 3b 0a 20 20 20  e1[iSpace1];.   
276f0 20 20 20 20 20 69 53 70 61 63 65 31 20 2b 3d 20       iSpace1 += 
27700 73 7a 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  sz;.        asse
27710 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67  rt( sz<=pBt->pag
27720 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20  eSize/4 );.     
27730 20 20 20 61 73 73 65 72 74 28 20 69 53 70 61 63     assert( iSpac
27740 65 31 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a  e1<=pBt->pageSiz
27750 65 20 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  e );.        mem
27760 63 70 79 28 70 54 65 6d 70 2c 20 61 70 44 69 76  cpy(pTemp, apDiv
27770 5b 69 5d 2c 20 73 7a 29 3b 0a 20 20 20 20 20 20  [i], sz);.      
27780 20 20 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 20    apCell[nCell] 
27790 3d 20 70 54 65 6d 70 2b 6c 65 61 66 43 6f 72 72  = pTemp+leafCorr
277a0 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20  ection;.        
277b0 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
277c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 46   ){.          aF
277d0 72 6f 6d 5b 6e 43 65 6c 6c 5d 20 3d 20 30 78 46  rom[nCell] = 0xF
277e0 46 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  F;.        }.   
277f0 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50       dropCell(pP
27800 61 72 65 6e 74 2c 20 6e 78 44 69 76 2c 20 73 7a  arent, nxDiv, sz
27810 29 3b 0a 20 20 20 20 20 20 20 20 73 7a 43 65 6c  );.        szCel
27820 6c 5b 6e 43 65 6c 6c 5d 20 2d 3d 20 6c 65 61 66  l[nCell] -= leaf
27830 43 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20  Correction;.    
27840 20 20 20 20 61 73 73 65 72 74 28 20 67 65 74 34      assert( get4
27850 62 79 74 65 28 70 54 65 6d 70 29 3d 3d 70 67 6e  byte(pTemp)==pgn
27860 6f 4f 6c 64 5b 69 5d 20 29 3b 0a 20 20 20 20 20  oOld[i] );.     
27870 20 20 20 69 66 28 20 21 70 4f 6c 64 2d 3e 6c 65     if( !pOld->le
27880 61 66 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  af ){.          
27890 61 73 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72  assert( leafCorr
278a0 65 63 74 69 6f 6e 3d 3d 30 20 29 3b 0a 20 20 20  ection==0 );.   
278b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69         /* The ri
278c0 67 68 74 20 70 6f 69 6e 74 65 72 20 6f 66 20 74  ght pointer of t
278d0 68 65 20 63 68 69 6c 64 20 70 61 67 65 20 70 4f  he child page pO
278e0 6c 64 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c  ld becomes the l
278f0 65 66 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  eft.          **
27900 20 70 6f 69 6e 74 65 72 20 6f 66 20 74 68 65 20   pointer of the 
27910 64 69 76 69 64 65 72 20 63 65 6c 6c 20 2a 2f 0a  divider cell */.
27920 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
27930 28 61 70 43 65 6c 6c 5b 6e 43 65 6c 6c 5d 2c 20  (apCell[nCell], 
27940 26 70 4f 6c 64 2d 3e 61 44 61 74 61 5b 70 4f 6c  &pOld->aData[pOl
27950 64 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  d->hdrOffset+8],
27960 20 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   4);.        }el
27970 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73  se{.          as
27980 73 65 72 74 28 20 6c 65 61 66 43 6f 72 72 65 63  sert( leafCorrec
27990 74 69 6f 6e 3d 3d 34 20 29 3b 0a 20 20 20 20 20  tion==4 );.     
279a0 20 20 20 20 20 69 66 28 20 73 7a 43 65 6c 6c 5b       if( szCell[
279b0 6e 43 65 6c 6c 5d 3c 34 20 29 7b 0a 20 20 20 20  nCell]<4 ){.    
279c0 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
279d0 74 20 61 6c 6c 6f 77 20 61 6e 79 20 63 65 6c 6c  t allow any cell
279e0 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 34  s smaller than 4
279f0 20 62 79 74 65 73 2e 20 2a 2f 0a 20 20 20 20 20   bytes. */.     
27a00 20 20 20 20 20 20 20 73 7a 43 65 6c 6c 5b 6e 43         szCell[nC
27a10 65 6c 6c 5d 20 3d 20 34 3b 0a 20 20 20 20 20 20  ell] = 4;.      
27a20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
27a30 20 20 20 20 20 20 20 20 6e 43 65 6c 6c 2b 2b 3b          nCell++;
27a40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
27a50 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 69   }..  /*.  ** Fi
27a60 67 75 72 65 20 6f 75 74 20 74 68 65 20 6e 75 6d  gure out the num
27a70 62 65 72 20 6f 66 20 70 61 67 65 73 20 6e 65 65  ber of pages nee
27a80 64 65 64 20 74 6f 20 68 6f 6c 64 20 61 6c 6c 20  ded to hold all 
27a90 6e 43 65 6c 6c 20 63 65 6c 6c 73 2e 0a 20 20 2a  nCell cells..  *
27aa0 2a 20 53 74 6f 72 65 20 74 68 69 73 20 6e 75 6d  * Store this num
27ab0 62 65 72 20 69 6e 20 22 6b 22 2e 20 20 41 6c 73  ber in "k".  Als
27ac0 6f 20 63 6f 6d 70 75 74 65 20 73 7a 4e 65 77 5b  o compute szNew[
27ad0 5d 20 77 68 69 63 68 20 69 73 20 74 68 65 20 74  ] which is the t
27ae0 6f 74 61 6c 0a 20 20 2a 2a 20 73 69 7a 65 20 6f  otal.  ** size o
27af0 66 20 61 6c 6c 20 63 65 6c 6c 73 20 6f 6e 20 74  f all cells on t
27b00 68 65 20 69 2d 74 68 20 70 61 67 65 20 61 6e 64  he i-th page and
27b10 20 63 6e 74 4e 65 77 5b 5d 20 77 68 69 63 68 20   cntNew[] which 
27b20 69 73 20 74 68 65 20 69 6e 64 65 78 0a 20 20 2a  is the index.  *
27b30 2a 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20 6f 66  * in apCell[] of
27b40 20 74 68 65 20 63 65 6c 6c 20 74 68 61 74 20 64   the cell that d
27b50 69 76 69 64 65 73 20 70 61 67 65 20 69 20 66 72  ivides page i fr
27b60 6f 6d 20 70 61 67 65 20 69 2b 31 2e 20 20 0a 20  om page i+1.  . 
27b70 20 2a 2a 20 63 6e 74 4e 65 77 5b 6b 5d 20 73 68   ** cntNew[k] sh
27b80 6f 75 6c 64 20 65 71 75 61 6c 20 6e 43 65 6c 6c  ould equal nCell
27b90 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 56 61 6c 75  ..  **.  ** Valu
27ba0 65 73 20 63 6f 6d 70 75 74 65 64 20 62 79 20 74  es computed by t
27bb0 68 69 73 20 62 6c 6f 63 6b 3a 0a 20 20 2a 2a 0a  his block:.  **.
27bc0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 6b    **           k
27bd0 3a 20 54 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  : The total numb
27be0 65 72 20 6f 66 20 73 69 62 6c 69 6e 67 20 70 61  er of sibling pa
27bf0 67 65 73 0a 20 20 2a 2a 20 20 20 20 73 7a 4e 65  ges.  **    szNe
27c00 77 5b 69 5d 3a 20 53 70 61 63 65 64 20 75 73 65  w[i]: Spaced use
27c10 64 20 6f 6e 20 74 68 65 20 69 2d 74 68 20 73 69  d on the i-th si
27c20 62 6c 69 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a  bling page..  **
27c30 20 20 20 63 6e 74 4e 65 77 5b 69 5d 3a 20 49 6e     cntNew[i]: In
27c40 64 65 78 20 69 6e 20 61 70 43 65 6c 6c 5b 5d 20  dex in apCell[] 
27c50 61 6e 64 20 73 7a 43 65 6c 6c 5b 5d 20 66 6f 72  and szCell[] for
27c60 20 74 68 65 20 66 69 72 73 74 20 63 65 6c 6c 20   the first cell 
27c70 74 6f 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 20  to.  **         
27c80 20 20 20 20 20 74 68 65 20 72 69 67 68 74 20 6f       the right o
27c90 66 20 74 68 65 20 69 2d 74 68 20 73 69 62 6c 69  f the i-th sibli
27ca0 6e 67 20 70 61 67 65 2e 0a 20 20 2a 2a 20 75 73  ng page..  ** us
27cb0 61 62 6c 65 53 70 61 63 65 3a 20 4e 75 6d 62 65  ableSpace: Numbe
27cc0 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70  r of bytes of sp
27cd0 61 63 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e  ace available on
27ce0 20 65 61 63 68 20 73 69 62 6c 69 6e 67 2e 0a 20   each sibling.. 
27cf0 20 2a 2a 20 0a 20 20 2a 2f 0a 20 20 75 73 61 62   ** .  */.  usab
27d00 6c 65 53 70 61 63 65 20 3d 20 70 42 74 2d 3e 75  leSpace = pBt->u
27d10 73 61 62 6c 65 53 69 7a 65 20 2d 20 31 32 20 2b  sableSize - 12 +
27d20 20 6c 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3b   leafCorrection;
27d30 0a 20 20 66 6f 72 28 73 75 62 74 6f 74 61 6c 3d  .  for(subtotal=
27d40 6b 3d 69 3d 30 3b 20 69 3c 6e 43 65 6c 6c 3b 20  k=i=0; i<nCell; 
27d50 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74  i++){.    assert
27d60 28 20 69 3c 6e 4d 61 78 43 65 6c 6c 73 20 29 3b  ( i<nMaxCells );
27d70 0a 20 20 20 20 73 75 62 74 6f 74 61 6c 20 2b 3d  .    subtotal +=
27d80 20 73 7a 43 65 6c 6c 5b 69 5d 20 2b 20 32 3b 0a   szCell[i] + 2;.
27d90 20 20 20 20 69 66 28 20 73 75 62 74 6f 74 61 6c      if( subtotal
27da0 20 3e 20 75 73 61 62 6c 65 53 70 61 63 65 20 29   > usableSpace )
27db0 7b 0a 20 20 20 20 20 20 73 7a 4e 65 77 5b 6b 5d  {.      szNew[k]
27dc0 20 3d 20 73 75 62 74 6f 74 61 6c 20 2d 20 73 7a   = subtotal - sz
27dd0 43 65 6c 6c 5b 69 5d 3b 0a 20 20 20 20 20 20 63  Cell[i];.      c
27de0 6e 74 4e 65 77 5b 6b 5d 20 3d 20 69 3b 0a 20 20  ntNew[k] = i;.  
27df0 20 20 20 20 69 66 28 20 6c 65 61 66 44 61 74 61      if( leafData
27e00 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ i--; }.     
27e10 20 73 75 62 74 6f 74 61 6c 20 3d 20 30 3b 0a 20   subtotal = 0;. 
27e20 20 20 20 20 20 6b 2b 2b 3b 0a 20 20 20 20 7d 0a       k++;.    }.
27e30 20 20 7d 0a 20 20 73 7a 4e 65 77 5b 6b 5d 20 3d    }.  szNew[k] =
27e40 20 73 75 62 74 6f 74 61 6c 3b 0a 20 20 63 6e 74   subtotal;.  cnt
27e50 4e 65 77 5b 6b 5d 20 3d 20 6e 43 65 6c 6c 3b 0a  New[k] = nCell;.
27e60 20 20 6b 2b 2b 3b 0a 0a 20 20 2f 2a 0a 20 20 2a    k++;..  /*.  *
27e70 2a 20 54 68 65 20 70 61 63 6b 69 6e 67 20 63 6f  * The packing co
27e80 6d 70 75 74 65 64 20 62 79 20 74 68 65 20 70 72  mputed by the pr
27e90 65 76 69 6f 75 73 20 62 6c 6f 63 6b 20 69 73 20  evious block is 
27ea0 62 69 61 73 65 64 20 74 6f 77 61 72 64 20 74 68  biased toward th
27eb0 65 20 73 69 62 6c 69 6e 67 73 0a 20 20 2a 2a 20  e siblings.  ** 
27ec0 6f 6e 20 74 68 65 20 6c 65 66 74 20 73 69 64 65  on the left side
27ed0 2e 20 20 54 68 65 20 6c 65 66 74 20 73 69 62 6c  .  The left sibl
27ee0 69 6e 67 73 20 61 72 65 20 61 6c 77 61 79 73 20  ings are always 
27ef0 6e 65 61 72 6c 79 20 66 75 6c 6c 2c 20 77 68 69  nearly full, whi
27f00 6c 65 20 74 68 65 0a 20 20 2a 2a 20 72 69 67 68  le the.  ** righ
27f10 74 2d 6d 6f 73 74 20 73 69 62 6c 69 6e 67 20 6d  t-most sibling m
27f20 69 67 68 74 20 62 65 20 6e 65 61 72 6c 79 20 65  ight be nearly e
27f30 6d 70 74 79 2e 20 20 54 68 69 73 20 62 6c 6f 63  mpty.  This bloc
27f40 6b 20 6f 66 20 63 6f 64 65 20 61 74 74 65 6d 70  k of code attemp
27f50 74 73 0a 20 20 2a 2a 20 74 6f 20 61 64 6a 75 73  ts.  ** to adjus
27f60 74 20 74 68 65 20 70 61 63 6b 69 6e 67 20 6f 66  t the packing of
27f70 20 73 69 62 6c 69 6e 67 73 20 74 6f 20 67 65 74   siblings to get
27f80 20 61 20 62 65 74 74 65 72 20 62 61 6c 61 6e 63   a better balanc
27f90 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 69  e..  **.  ** Thi
27fa0 73 20 61 64 6a 75 73 74 6d 65 6e 74 20 69 73 20  s adjustment is 
27fb0 6d 6f 72 65 20 74 68 61 6e 20 61 6e 20 6f 70 74  more than an opt
27fc0 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 54 68 65 20  imization.  The 
27fd0 70 61 63 6b 69 6e 67 20 61 62 6f 76 65 20 6d 69  packing above mi
27fe0 67 68 74 0a 20 20 2a 2a 20 62 65 20 73 6f 20 6f  ght.  ** be so o
27ff0 75 74 20 6f 66 20 62 61 6c 61 6e 63 65 20 61 73  ut of balance as
28000 20 74 6f 20 62 65 20 69 6c 6c 65 67 61 6c 2e 20   to be illegal. 
28010 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 68   For example, th
28020 65 20 72 69 67 68 74 2d 6d 6f 73 74 0a 20 20 2a  e right-most.  *
28030 2a 20 73 69 62 6c 69 6e 67 20 6d 69 67 68 74 20  * sibling might 
28040 62 65 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d  be completely em
28050 70 74 79 2e 20 20 54 68 69 73 20 61 64 6a 75 73  pty.  This adjus
28060 74 6d 65 6e 74 20 69 73 20 6e 6f 74 20 6f 70 74  tment is not opt
28070 69 6f 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 66 6f  ional..  */.  fo
28080 72 28 69 3d 6b 2d 31 3b 20 69 3e 30 3b 20 69 2d  r(i=k-1; i>0; i-
28090 2d 29 7b 0a 20 20 20 20 69 6e 74 20 73 7a 52 69  -){.    int szRi
280a0 67 68 74 20 3d 20 73 7a 4e 65 77 5b 69 5d 3b 20  ght = szNew[i]; 
280b0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c   /* Size of sibl
280c0 69 6e 67 20 6f 6e 20 74 68 65 20 72 69 67 68 74  ing on the right
280d0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 4c 65   */.    int szLe
280e0 66 74 20 3d 20 73 7a 4e 65 77 5b 69 2d 31 5d 3b  ft = szNew[i-1];
280f0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 73 69 62 6c   /* Size of sibl
28100 69 6e 67 20 6f 6e 20 74 68 65 20 6c 65 66 74 20  ing on the left 
28110 2a 2f 0a 20 20 20 20 69 6e 74 20 72 3b 20 20 20  */.    int r;   
28120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
28130 64 65 78 20 6f 66 20 72 69 67 68 74 2d 6d 6f 73  dex of right-mos
28140 74 20 63 65 6c 6c 20 69 6e 20 6c 65 66 74 20 73  t cell in left s
28150 69 62 6c 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e  ibling */.    in
28160 74 20 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  t d;            
28170 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 66 69    /* Index of fi
28180 72 73 74 20 63 65 6c 6c 20 74 6f 20 74 68 65 20  rst cell to the 
28190 6c 65 66 74 20 6f 66 20 72 69 67 68 74 20 73 69  left of right si
281a0 62 6c 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 72 20  bling */..    r 
281b0 3d 20 63 6e 74 4e 65 77 5b 69 2d 31 5d 20 2d 20  = cntNew[i-1] - 
281c0 31 3b 0a 20 20 20 20 64 20 3d 20 72 20 2b 20 31  1;.    d = r + 1
281d0 20 2d 20 6c 65 61 66 44 61 74 61 3b 0a 20 20 20   - leafData;.   
281e0 20 61 73 73 65 72 74 28 20 64 3c 6e 4d 61 78 43   assert( d<nMaxC
281f0 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73 65  ells );.    asse
28200 72 74 28 20 72 3c 6e 4d 61 78 43 65 6c 6c 73 20  rt( r<nMaxCells 
28210 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 7a  );.    while( sz
28220 52 69 67 68 74 3d 3d 30 20 7c 7c 20 73 7a 52 69  Right==0 || szRi
28230 67 68 74 2b 73 7a 43 65 6c 6c 5b 64 5d 2b 32 3c  ght+szCell[d]+2<
28240 3d 73 7a 4c 65 66 74 2d 28 73 7a 43 65 6c 6c 5b  =szLeft-(szCell[
28250 72 5d 2b 32 29 20 29 7b 0a 20 20 20 20 20 20 73  r]+2) ){.      s
28260 7a 52 69 67 68 74 20 2b 3d 20 73 7a 43 65 6c 6c  zRight += szCell
28270 5b 64 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 73  [d] + 2;.      s
28280 7a 4c 65 66 74 20 2d 3d 20 73 7a 43 65 6c 6c 5b  zLeft -= szCell[
28290 72 5d 20 2b 20 32 3b 0a 20 20 20 20 20 20 63 6e  r] + 2;.      cn
282a0 74 4e 65 77 5b 69 2d 31 5d 2d 2d 3b 0a 20 20 20  tNew[i-1]--;.   
282b0 20 20 20 72 20 3d 20 63 6e 74 4e 65 77 5b 69 2d     r = cntNew[i-
282c0 31 5d 20 2d 20 31 3b 0a 20 20 20 20 20 20 64 20  1] - 1;.      d 
282d0 3d 20 72 20 2b 20 31 20 2d 20 6c 65 61 66 44 61  = r + 1 - leafDa
282e0 74 61 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 7a  ta;.    }.    sz
282f0 4e 65 77 5b 69 5d 20 3d 20 73 7a 52 69 67 68 74  New[i] = szRight
28300 3b 0a 20 20 20 20 73 7a 4e 65 77 5b 69 2d 31 5d  ;.    szNew[i-1]
28310 20 3d 20 73 7a 4c 65 66 74 3b 0a 20 20 7d 0a 0a   = szLeft;.  }..
28320 20 20 2f 2a 20 45 69 74 68 65 72 20 77 65 20 66    /* Either we f
28330 6f 75 6e 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ound one or more
28340 20 63 65 6c 6c 73 20 28 63 6e 74 6e 65 77 5b 30   cells (cntnew[0
28350 5d 29 3e 30 29 20 6f 72 20 77 65 20 61 72 65 20  ])>0) or we are 
28360 74 68 65 0a 20 20 2a 2a 20 61 20 76 69 72 74 75  the.  ** a virtu
28370 61 6c 20 72 6f 6f 74 20 70 61 67 65 2e 20 20 41  al root page.  A
28380 20 76 69 72 74 75 61 6c 20 72 6f 6f 74 20 70 61   virtual root pa
28390 67 65 20 69 73 20 77 68 65 6e 20 74 68 65 20 72  ge is when the r
283a0 65 61 6c 20 72 6f 6f 74 0a 20 20 2a 2a 20 70 61  eal root.  ** pa
283b0 67 65 20 69 73 20 70 61 67 65 20 31 20 61 6e 64  ge is page 1 and
283c0 20 77 65 20 61 72 65 20 74 68 65 20 6f 6e 6c 79   we are the only
283d0 20 63 68 69 6c 64 20 6f 66 20 74 68 61 74 20 70   child of that p
283e0 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  age..  */.  asse
283f0 72 74 28 20 63 6e 74 4e 65 77 5b 30 5d 3e 30 20  rt( cntNew[0]>0 
28400 7c 7c 20 28 70 50 61 72 65 6e 74 2d 3e 70 67 6e  || (pParent->pgn
28410 6f 3d 3d 31 20 26 26 20 70 50 61 72 65 6e 74 2d  o==1 && pParent-
28420 3e 6e 43 65 6c 6c 3d 3d 30 29 20 29 3b 0a 0a 20  >nCell==0) );.. 
28430 20 2f 2a 0a 20 20 2a 2a 20 41 6c 6c 6f 63 61 74   /*.  ** Allocat
28440 65 20 6b 20 6e 65 77 20 70 61 67 65 73 2e 20 20  e k new pages.  
28450 52 65 75 73 65 20 6f 6c 64 20 70 61 67 65 73 20  Reuse old pages 
28460 77 68 65 72 65 20 70 6f 73 73 69 62 6c 65 2e 0a  where possible..
28470 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
28480 50 61 67 65 2d 3e 70 67 6e 6f 3e 31 20 29 3b 0a  Page->pgno>1 );.
28490 20 20 70 61 67 65 46 6c 61 67 73 20 3d 20 70 50    pageFlags = pP
284a0 61 67 65 2d 3e 61 44 61 74 61 5b 30 5d 3b 0a 20  age->aData[0];. 
284b0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6b 3b 20 69   for(i=0; i<k; i
284c0 2b 2b 29 7b 0a 20 20 20 20 4d 65 6d 50 61 67 65  ++){.    MemPage
284d0 20 2a 70 4e 65 77 3b 0a 20 20 20 20 69 66 28 20   *pNew;.    if( 
284e0 69 3c 6e 4f 6c 64 20 29 7b 0a 20 20 20 20 20 20  i<nOld ){.      
284f0 70 4e 65 77 20 3d 20 61 70 4e 65 77 5b 69 5d 20  pNew = apNew[i] 
28500 3d 20 61 70 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20  = apOld[i];.    
28510 20 20 70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70    pgnoNew[i] = p
28520 67 6e 6f 4f 6c 64 5b 69 5d 3b 0a 20 20 20 20 20  gnoOld[i];.     
28530 20 61 70 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20   apOld[i] = 0;. 
28540 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
28550 33 50 61 67 65 72 57 72 69 74 65 28 70 4e 65 77  3PagerWrite(pNew
28560 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  ->pDbPage);.    
28570 20 20 6e 4e 65 77 2b 2b 3b 0a 20 20 20 20 20 20    nNew++;.      
28580 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
28590 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
285a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
285b0 61 73 73 65 72 74 28 20 69 3e 30 20 29 3b 0a 20  assert( i>0 );. 
285c0 20 20 20 20 20 72 63 20 3d 20 61 6c 6c 6f 63 61       rc = alloca
285d0 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74 2c  teBtreePage(pBt,
285e0 20 26 70 4e 65 77 2c 20 26 70 67 6e 6f 4e 65 77   &pNew, &pgnoNew
285f0 5b 69 5d 2c 20 70 67 6e 6f 4e 65 77 5b 69 2d 31  [i], pgnoNew[i-1
28600 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28  ], 0);.      if(
28610 20 72 63 20 29 20 67 6f 74 6f 20 62 61 6c 61 6e   rc ) goto balan
28620 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20 20 20 20  ce_cleanup;.    
28630 20 20 61 70 4e 65 77 5b 69 5d 20 3d 20 70 4e 65    apNew[i] = pNe
28640 77 3b 0a 20 20 20 20 20 20 6e 4e 65 77 2b 2b 3b  w;.      nNew++;
28650 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
28660 20 46 72 65 65 20 61 6e 79 20 6f 6c 64 20 70 61   Free any old pa
28670 67 65 73 20 74 68 61 74 20 77 65 72 65 20 6e 6f  ges that were no
28680 74 20 72 65 75 73 65 64 20 61 73 20 6e 65 77 20  t reused as new 
28690 70 61 67 65 73 2e 0a 20 20 2a 2f 0a 20 20 77 68  pages..  */.  wh
286a0 69 6c 65 28 20 69 3c 6e 4f 6c 64 20 29 7b 0a 20  ile( i<nOld ){. 
286b0 20 20 20 72 63 20 3d 20 66 72 65 65 50 61 67 65     rc = freePage
286c0 28 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20  (apOld[i]);.    
286d0 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 62 61  if( rc ) goto ba
286e0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
286f0 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 61     releasePage(a
28700 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 20 20 61 70  pOld[i]);.    ap
28710 4f 6c 64 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20  Old[i] = 0;.    
28720 69 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  i++;.  }..  /*. 
28730 20 2a 2a 20 50 75 74 20 74 68 65 20 6e 65 77 20   ** Put the new 
28740 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69  pages in accendi
28750 6e 67 20 6f 72 64 65 72 2e 20 20 54 68 69 73 20  ng order.  This 
28760 68 65 6c 70 73 20 74 6f 0a 20 20 2a 2a 20 6b 65  helps to.  ** ke
28770 65 70 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ep entries in th
28780 65 20 64 69 73 6b 20 66 69 6c 65 20 69 6e 20 6f  e disk file in o
28790 72 64 65 72 20 73 6f 20 74 68 61 74 20 61 20 73  rder so that a s
287a0 63 61 6e 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  can.  ** of the 
287b0 74 61 62 6c 65 20 69 73 20 61 20 6c 69 6e 65 61  table is a linea
287c0 72 20 73 63 61 6e 20 74 68 72 6f 75 67 68 20 74  r scan through t
287d0 68 65 20 66 69 6c 65 2e 20 20 54 68 61 74 0a 20  he file.  That. 
287e0 20 2a 2a 20 69 6e 20 74 75 72 6e 20 68 65 6c 70   ** in turn help
287f0 73 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20  s the operating 
28800 73 79 73 74 65 6d 20 74 6f 20 64 65 6c 69 76 65  system to delive
28810 72 20 70 61 67 65 73 0a 20 20 2a 2a 20 66 72 6f  r pages.  ** fro
28820 6d 20 74 68 65 20 64 69 73 6b 20 6d 6f 72 65 20  m the disk more 
28830 72 61 70 69 64 6c 79 2e 0a 20 20 2a 2a 0a 20 20  rapidly..  **.  
28840 2a 2a 20 41 6e 20 4f 28 6e 5e 32 29 20 69 6e 73  ** An O(n^2) ins
28850 65 72 74 69 6f 6e 20 73 6f 72 74 20 61 6c 67 6f  ertion sort algo
28860 72 69 74 68 6d 20 69 73 20 75 73 65 64 2c 20 62  rithm is used, b
28870 75 74 20 73 69 6e 63 65 0a 20 20 2a 2a 20 6e 20  ut since.  ** n 
28880 69 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68  is never more th
28890 61 6e 20 4e 42 20 28 61 20 73 6d 61 6c 6c 20 63  an NB (a small c
288a0 6f 6e 73 74 61 6e 74 29 2c 20 74 68 61 74 20 73  onstant), that s
288b0 68 6f 75 6c 64 0a 20 20 2a 2a 20 6e 6f 74 20 62  hould.  ** not b
288c0 65 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 2a  e a problem..  *
288d0 2a 0a 20 20 2a 2a 20 57 68 65 6e 20 4e 42 3d 3d  *.  ** When NB==
288e0 33 2c 20 74 68 69 73 20 6f 6e 65 20 6f 70 74 69  3, this one opti
288f0 6d 69 7a 61 74 69 6f 6e 20 6d 61 6b 65 73 20 74  mization makes t
28900 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  he database.  **
28910 20 61 62 6f 75 74 20 32 35 25 20 66 61 73 74 65   about 25% faste
28920 72 20 66 6f 72 20 6c 61 72 67 65 20 69 6e 73 65  r for large inse
28930 72 74 69 6f 6e 73 20 61 6e 64 20 64 65 6c 65 74  rtions and delet
28940 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  ions..  */.  for
28950 28 69 3d 30 3b 20 69 3c 6b 2d 31 3b 20 69 2b 2b  (i=0; i<k-1; i++
28960 29 7b 0a 20 20 20 20 69 6e 74 20 6d 69 6e 56 20  ){.    int minV 
28970 3d 20 70 67 6e 6f 4e 65 77 5b 69 5d 3b 0a 20 20  = pgnoNew[i];.  
28980 20 20 69 6e 74 20 6d 69 6e 49 20 3d 20 69 3b 0a    int minI = i;.
28990 20 20 20 20 66 6f 72 28 6a 3d 69 2b 31 3b 20 6a      for(j=i+1; j
289a0 3c 6b 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <k; j++){.      
289b0 69 66 28 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3c 28  if( pgnoNew[j]<(
289c0 75 6e 73 69 67 6e 65 64 29 6d 69 6e 56 20 29 7b  unsigned)minV ){
289d0 0a 20 20 20 20 20 20 20 20 6d 69 6e 49 20 3d 20  .        minI = 
289e0 6a 3b 0a 20 20 20 20 20 20 20 20 6d 69 6e 56 20  j;.        minV 
289f0 3d 20 70 67 6e 6f 4e 65 77 5b 6a 5d 3b 0a 20 20  = pgnoNew[j];.  
28a00 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
28a10 69 66 28 20 6d 69 6e 49 3e 69 20 29 7b 0a 20 20  if( minI>i ){.  
28a20 20 20 20 20 69 6e 74 20 74 3b 0a 20 20 20 20 20      int t;.     
28a30 20 4d 65 6d 50 61 67 65 20 2a 70 54 3b 0a 20 20   MemPage *pT;.  
28a40 20 20 20 20 74 20 3d 20 70 67 6e 6f 4e 65 77 5b      t = pgnoNew[
28a50 69 5d 3b 0a 20 20 20 20 20 20 70 54 20 3d 20 61  i];.      pT = a
28a60 70 4e 65 77 5b 69 5d 3b 0a 20 20 20 20 20 20 70  pNew[i];.      p
28a70 67 6e 6f 4e 65 77 5b 69 5d 20 3d 20 70 67 6e 6f  gnoNew[i] = pgno
28a80 4e 65 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20  New[minI];.     
28a90 20 61 70 4e 65 77 5b 69 5d 20 3d 20 61 70 4e 65   apNew[i] = apNe
28aa0 77 5b 6d 69 6e 49 5d 3b 0a 20 20 20 20 20 20 70  w[minI];.      p
28ab0 67 6e 6f 4e 65 77 5b 6d 69 6e 49 5d 20 3d 20 74  gnoNew[minI] = t
28ac0 3b 0a 20 20 20 20 20 20 61 70 4e 65 77 5b 6d 69  ;.      apNew[mi
28ad0 6e 49 5d 20 3d 20 70 54 3b 0a 20 20 20 20 7d 0a  nI] = pT;.    }.
28ae0 20 20 7d 0a 20 20 54 52 41 43 45 28 28 22 42 41    }.  TRACE(("BA
28af0 4c 41 4e 43 45 3a 20 6f 6c 64 3a 20 25 64 20 25  LANCE: old: %d %
28b00 64 20 25 64 20 20 6e 65 77 3a 20 25 64 28 25 64  d %d  new: %d(%d
28b10 29 20 25 64 28 25 64 29 20 25 64 28 25 64 29 20  ) %d(%d) %d(%d) 
28b20 25 64 28 25 64 29 20 25 64 28 25 64 29 5c 6e 22  %d(%d) %d(%d)\n"
28b30 2c 0a 20 20 20 20 70 67 6e 6f 4f 6c 64 5b 30 5d  ,.    pgnoOld[0]
28b40 2c 20 0a 20 20 20 20 6e 4f 6c 64 3e 3d 32 20 3f  , .    nOld>=2 ?
28b50 20 70 67 6e 6f 4f 6c 64 5b 31 5d 20 3a 20 30 2c   pgnoOld[1] : 0,
28b60 0a 20 20 20 20 6e 4f 6c 64 3e 3d 33 20 3f 20 70  .    nOld>=3 ? p
28b70 67 6e 6f 4f 6c 64 5b 32 5d 20 3a 20 30 2c 0a 20  gnoOld[2] : 0,. 
28b80 20 20 20 70 67 6e 6f 4e 65 77 5b 30 5d 2c 20 73     pgnoNew[0], s
28b90 7a 4e 65 77 5b 30 5d 2c 0a 20 20 20 20 6e 4e 65  zNew[0],.    nNe
28ba0 77 3e 3d 32 20 3f 20 70 67 6e 6f 4e 65 77 5b 31  w>=2 ? pgnoNew[1
28bb0 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 32 20 3f  ] : 0, nNew>=2 ?
28bc0 20 73 7a 4e 65 77 5b 31 5d 20 3a 20 30 2c 0a 20   szNew[1] : 0,. 
28bd0 20 20 20 6e 4e 65 77 3e 3d 33 20 3f 20 70 67 6e     nNew>=3 ? pgn
28be0 6f 4e 65 77 5b 32 5d 20 3a 20 30 2c 20 6e 4e 65  oNew[2] : 0, nNe
28bf0 77 3e 3d 33 20 3f 20 73 7a 4e 65 77 5b 32 5d 20  w>=3 ? szNew[2] 
28c00 3a 20 30 2c 0a 20 20 20 20 6e 4e 65 77 3e 3d 34  : 0,.    nNew>=4
28c10 20 3f 20 70 67 6e 6f 4e 65 77 5b 33 5d 20 3a 20   ? pgnoNew[3] : 
28c20 30 2c 20 6e 4e 65 77 3e 3d 34 20 3f 20 73 7a 4e  0, nNew>=4 ? szN
28c30 65 77 5b 33 5d 20 3a 20 30 2c 0a 20 20 20 20 6e  ew[3] : 0,.    n
28c40 4e 65 77 3e 3d 35 20 3f 20 70 67 6e 6f 4e 65 77  New>=5 ? pgnoNew
28c50 5b 34 5d 20 3a 20 30 2c 20 6e 4e 65 77 3e 3d 35  [4] : 0, nNew>=5
28c60 20 3f 20 73 7a 4e 65 77 5b 34 5d 20 3a 20 30 29   ? szNew[4] : 0)
28c70 29 3b 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 45 76  );..  /*.  ** Ev
28c80 65 6e 6c 79 20 64 69 73 74 72 69 62 75 74 65 20  enly distribute 
28c90 74 68 65 20 64 61 74 61 20 69 6e 20 61 70 43 65  the data in apCe
28ca0 6c 6c 5b 5d 20 61 63 72 6f 73 73 20 74 68 65 20  ll[] across the 
28cb0 6e 65 77 20 70 61 67 65 73 2e 0a 20 20 2a 2a 20  new pages..  ** 
28cc0 49 6e 73 65 72 74 20 64 69 76 69 64 65 72 20 63  Insert divider c
28cd0 65 6c 6c 73 20 69 6e 74 6f 20 70 50 61 72 65 6e  ells into pParen
28ce0 74 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  t as necessary..
28cf0 20 20 2a 2f 0a 20 20 6a 20 3d 20 30 3b 0a 20 20    */.  j = 0;.  
28d00 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77 3b  for(i=0; i<nNew;
28d10 20 69 2b 2b 29 7b 0a 20 20 20 20 2f 2a 20 41 73   i++){.    /* As
28d20 73 65 6d 62 6c 65 20 74 68 65 20 6e 65 77 20 73  semble the new s
28d30 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a  ibling page. */.
28d40 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 4e 65      MemPage *pNe
28d50 77 20 3d 20 61 70 4e 65 77 5b 69 5d 3b 0a 20 20  w = apNew[i];.  
28d60 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d 61 78    assert( j<nMax
28d70 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 61 73 73  Cells );.    ass
28d80 65 72 74 28 20 70 4e 65 77 2d 3e 70 67 6e 6f 3d  ert( pNew->pgno=
28d90 3d 70 67 6e 6f 4e 65 77 5b 69 5d 20 29 3b 0a 20  =pgnoNew[i] );. 
28da0 20 20 20 7a 65 72 6f 50 61 67 65 28 70 4e 65 77     zeroPage(pNew
28db0 2c 20 70 61 67 65 46 6c 61 67 73 29 3b 0a 20 20  , pageFlags);.  
28dc0 20 20 61 73 73 65 6d 62 6c 65 50 61 67 65 28 70    assemblePage(p
28dd0 4e 65 77 2c 20 63 6e 74 4e 65 77 5b 69 5d 2d 6a  New, cntNew[i]-j
28de0 2c 20 26 61 70 43 65 6c 6c 5b 6a 5d 2c 20 26 73  , &apCell[j], &s
28df0 7a 43 65 6c 6c 5b 6a 5d 29 3b 0a 20 20 20 20 61  zCell[j]);.    a
28e00 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 6e 43 65  ssert( pNew->nCe
28e10 6c 6c 3e 30 20 7c 7c 20 28 6e 4e 65 77 3d 3d 31  ll>0 || (nNew==1
28e20 20 26 26 20 63 6e 74 4e 65 77 5b 30 5d 3d 3d 30   && cntNew[0]==0
28e30 29 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ) );.    assert(
28e40 20 70 4e 65 77 2d 3e 6e 4f 76 65 72 66 6c 6f 77   pNew->nOverflow
28e50 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  ==0 );..    /* I
28e60 66 20 74 68 69 73 20 69 73 20 61 6e 20 61 75 74  f this is an aut
28e70 6f 2d 76 61 63 75 75 6d 20 64 61 74 61 62 61 73  o-vacuum databas
28e80 65 2c 20 75 70 64 61 74 65 20 74 68 65 20 70 6f  e, update the po
28e90 69 6e 74 65 72 20 6d 61 70 20 65 6e 74 72 69 65  inter map entrie
28ea0 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 70 6f  s.    ** that po
28eb0 69 6e 74 20 74 6f 20 74 68 65 20 73 69 62 6c 69  int to the sibli
28ec0 6e 67 73 20 74 68 61 74 20 77 65 72 65 20 72 65  ngs that were re
28ed0 61 72 72 61 6e 67 65 64 2e 20 54 68 65 73 65 20  arranged. These 
28ee0 63 61 6e 20 62 65 3a 20 6c 65 66 74 0a 20 20 20  can be: left.   
28ef0 20 2a 2a 20 63 68 69 6c 64 72 65 6e 20 6f 66 20   ** children of 
28f00 63 65 6c 6c 73 2c 20 74 68 65 20 72 69 67 68 74  cells, the right
28f10 2d 63 68 69 6c 64 20 6f 66 20 74 68 65 20 70 61  -child of the pa
28f20 67 65 2c 20 6f 72 20 6f 76 65 72 66 6c 6f 77 20  ge, or overflow 
28f30 70 61 67 65 73 0a 20 20 20 20 2a 2a 20 70 6f 69  pages.    ** poi
28f40 6e 74 65 64 20 74 6f 20 62 79 20 63 65 6c 6c 73  nted to by cells
28f50 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
28f60 20 49 53 41 55 54 4f 56 41 43 55 55 4d 20 29 7b   ISAUTOVACUUM ){
28f70 0a 20 20 20 20 20 20 66 6f 72 28 6b 3d 6a 3b 20  .      for(k=j; 
28f80 6b 3c 63 6e 74 4e 65 77 5b 69 5d 3b 20 6b 2b 2b  k<cntNew[i]; k++
28f90 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
28fa0 74 28 20 6b 3c 6e 4d 61 78 43 65 6c 6c 73 20 29  t( k<nMaxCells )
28fb0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 46  ;.        if( aF
28fc0 72 6f 6d 5b 6b 5d 3d 3d 30 78 46 46 20 7c 7c 20  rom[k]==0xFF || 
28fd0 61 70 43 6f 70 79 5b 61 46 72 6f 6d 5b 6b 5d 5d  apCopy[aFrom[k]]
28fe0 2d 3e 70 67 6e 6f 21 3d 70 4e 65 77 2d 3e 70 67  ->pgno!=pNew->pg
28ff0 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  no ){.          
29000 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76  rc = ptrmapPutOv
29010 66 6c 28 70 4e 65 77 2c 20 6b 2d 6a 29 3b 0a 20  fl(pNew, k-j);. 
29020 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
29030 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6c 65  =SQLITE_OK && le
29040 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 30 20  afCorrection==0 
29050 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
29060 63 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42  c = ptrmapPut(pB
29070 74 2c 20 67 65 74 34 62 79 74 65 28 61 70 43 65  t, get4byte(apCe
29080 6c 6c 5b 6b 5d 29 2c 20 50 54 52 4d 41 50 5f 42  ll[k]), PTRMAP_B
29090 54 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f  TREE, pNew->pgno
290a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
290b0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
290c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
290d0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62            goto b
290e0 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a  alance_cleanup;.
290f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
29100 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
29110 20 20 7d 0a 0a 20 20 20 20 6a 20 3d 20 63 6e 74    }..    j = cnt
29120 4e 65 77 5b 69 5d 3b 0a 0a 20 20 20 20 2f 2a 20  New[i];..    /* 
29130 49 66 20 74 68 65 20 73 69 62 6c 69 6e 67 20 70  If the sibling p
29140 61 67 65 20 61 73 73 65 6d 62 6c 65 64 20 61 62  age assembled ab
29150 6f 76 65 20 77 61 73 20 6e 6f 74 20 74 68 65 20  ove was not the 
29160 72 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69  right-most sibli
29170 6e 67 2c 0a 20 20 20 20 2a 2a 20 69 6e 73 65 72  ng,.    ** inser
29180 74 20 61 20 64 69 76 69 64 65 72 20 63 65 6c 6c  t a divider cell
29190 20 69 6e 74 6f 20 74 68 65 20 70 61 72 65 6e 74   into the parent
291a0 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   page..    */.  
291b0 20 20 69 66 28 20 69 3c 6e 4e 65 77 2d 31 20 26    if( i<nNew-1 &
291c0 26 20 6a 3c 6e 43 65 6c 6c 20 29 7b 0a 20 20 20  & j<nCell ){.   
291d0 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a 20 20     u8 *pCell;.  
291e0 20 20 20 20 75 38 20 2a 70 54 65 6d 70 3b 0a 20      u8 *pTemp;. 
291f0 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 0a 20 20       int sz;..  
29200 20 20 20 20 61 73 73 65 72 74 28 20 6a 3c 6e 4d      assert( j<nM
29210 61 78 43 65 6c 6c 73 20 29 3b 0a 20 20 20 20 20  axCells );.     
29220 20 70 43 65 6c 6c 20 3d 20 61 70 43 65 6c 6c 5b   pCell = apCell[
29230 6a 5d 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 73  j];.      sz = s
29240 7a 43 65 6c 6c 5b 6a 5d 20 2b 20 6c 65 61 66 43  zCell[j] + leafC
29250 6f 72 72 65 63 74 69 6f 6e 3b 0a 20 20 20 20 20  orrection;.     
29260 20 70 54 65 6d 70 20 3d 20 26 61 53 70 61 63 65   pTemp = &aSpace
29270 32 5b 69 53 70 61 63 65 32 5d 3b 0a 20 20 20 20  2[iSpace2];.    
29280 20 20 69 66 28 20 21 70 4e 65 77 2d 3e 6c 65 61    if( !pNew->lea
29290 66 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  f ){.        mem
292a0 63 70 79 28 26 70 4e 65 77 2d 3e 61 44 61 74 61  cpy(&pNew->aData
292b0 5b 38 5d 2c 20 70 43 65 6c 6c 2c 20 34 29 3b 0a  [8], pCell, 4);.
292c0 20 20 20 20 20 20 20 20 69 66 28 20 49 53 41 55          if( ISAU
292d0 54 4f 56 41 43 55 55 4d 20 0a 20 20 20 20 20 20  TOVACUUM .      
292e0 20 20 20 26 26 20 28 61 46 72 6f 6d 5b 6a 5d 3d     && (aFrom[j]=
292f0 3d 30 78 46 46 20 7c 7c 20 61 70 43 6f 70 79 5b  =0xFF || apCopy[
29300 61 46 72 6f 6d 5b 6a 5d 5d 2d 3e 70 67 6e 6f 21  aFrom[j]]->pgno!
29310 3d 70 4e 65 77 2d 3e 70 67 6e 6f 29 0a 20 20 20  =pNew->pgno).   
29320 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
29330 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75 74    rc = ptrmapPut
29340 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 70  (pBt, get4byte(p
29350 43 65 6c 6c 29 2c 20 50 54 52 4d 41 50 5f 42 54  Cell), PTRMAP_BT
29360 52 45 45 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 29  REE, pNew->pgno)
29370 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
29380 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
29390 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
293a0 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61 6e 75  o balance_cleanu
293b0 70 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  p;.          }. 
293c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
293d0 65 6c 73 65 20 69 66 28 20 6c 65 61 66 44 61 74  else if( leafDat
293e0 61 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  a ){.        /* 
293f0 49 66 20 74 68 65 20 74 72 65 65 20 69 73 20 61  If the tree is a
29400 20 6c 65 61 66 2d 64 61 74 61 20 74 72 65 65 2c   leaf-data tree,
29410 20 61 6e 64 20 74 68 65 20 73 69 62 6c 69 6e 67   and the sibling
29420 73 20 61 72 65 20 6c 65 61 76 65 73 2c 20 0a 20  s are leaves, . 
29430 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74         ** then t
29440 68 65 72 65 20 69 73 20 6e 6f 20 64 69 76 69 64  here is no divid
29450 65 72 20 63 65 6c 6c 20 69 6e 20 61 70 43 65 6c  er cell in apCel
29460 6c 5b 5d 2e 20 49 6e 73 74 65 61 64 2c 20 74 68  l[]. Instead, th
29470 65 20 64 69 76 69 64 65 72 20 0a 20 20 20 20 20  e divider .     
29480 20 20 20 2a 2a 20 63 65 6c 6c 20 63 6f 6e 73 69     ** cell consi
29490 73 74 73 20 6f 66 20 74 68 65 20 69 6e 74 65 67  sts of the integ
294a0 65 72 20 6b 65 79 20 66 6f 72 20 74 68 65 20 72  er key for the r
294b0 69 67 68 74 2d 6d 6f 73 74 20 63 65 6c 6c 20 6f  ight-most cell o
294c0 66 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  f .        ** th
294d0 65 20 73 69 62 6c 69 6e 67 2d 70 61 67 65 20 61  e sibling-page a
294e0 73 73 65 6d 62 6c 65 64 20 61 62 6f 76 65 20 6f  ssembled above o
294f0 6e 6c 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  nly..        */.
29500 20 20 20 20 20 20 20 20 43 65 6c 6c 49 6e 66 6f          CellInfo
29510 20 69 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 6a   info;.        j
29520 2d 2d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  --;.        sqli
29530 74 65 33 42 74 72 65 65 50 61 72 73 65 43 65 6c  te3BtreeParseCel
29540 6c 50 74 72 28 70 4e 65 77 2c 20 61 70 43 65 6c  lPtr(pNew, apCel
29550 6c 5b 6a 5d 2c 20 26 69 6e 66 6f 29 3b 0a 20 20  l[j], &info);.  
29560 20 20 20 20 20 20 70 43 65 6c 6c 20 3d 20 70 54        pCell = pT
29570 65 6d 70 3b 0a 20 20 20 20 20 20 20 20 66 69 6c  emp;.        fil
29580 6c 49 6e 43 65 6c 6c 28 70 50 61 72 65 6e 74 2c  lInCell(pParent,
29590 20 70 43 65 6c 6c 2c 20 30 2c 20 69 6e 66 6f 2e   pCell, 0, info.
295a0 6e 4b 65 79 2c 20 30 2c 20 30 2c 20 30 2c 20 26  nKey, 0, 0, 0, &
295b0 73 7a 29 3b 0a 20 20 20 20 20 20 20 20 70 54 65  sz);.        pTe
295c0 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  mp = 0;.      }e
295d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 43 65  lse{.        pCe
295e0 6c 6c 20 2d 3d 20 34 3b 0a 20 20 20 20 20 20 20  ll -= 4;.       
295f0 20 2f 2a 20 4f 62 73 63 75 72 65 20 63 61 73 65   /* Obscure case
29600 20 66 6f 72 20 6e 6f 6e 2d 6c 65 61 66 2d 64 61   for non-leaf-da
29610 74 61 20 74 72 65 65 73 3a 20 49 66 20 74 68 65  ta trees: If the
29620 20 63 65 6c 6c 20 61 74 20 70 43 65 6c 6c 20 77   cell at pCell w
29630 61 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  as.        ** pr
29640 65 76 69 6f 75 73 6c 79 20 73 74 6f 72 65 64 20  eviously stored 
29650 6f 6e 20 61 20 6c 65 61 66 20 6e 6f 64 65 2c 20  on a leaf node, 
29660 61 6e 64 20 69 74 73 20 72 65 70 6f 72 74 65 64  and its reported
29670 20 73 69 7a 65 20 77 61 73 20 34 0a 20 20 20 20   size was 4.    
29680 20 20 20 20 2a 2a 20 62 79 74 65 73 2c 20 74 68      ** bytes, th
29690 65 6e 20 69 74 20 6d 61 79 20 61 63 74 75 61 6c  en it may actual
296a0 6c 79 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68  ly be smaller th
296b0 61 6e 20 74 68 69 73 20 0a 20 20 20 20 20 20 20  an this .       
296c0 20 2a 2a 20 28 73 65 65 20 73 71 6c 69 74 65 33   ** (see sqlite3
296d0 42 74 72 65 65 50 61 72 73 65 43 65 6c 6c 50 74  BtreeParseCellPt
296e0 72 28 29 2c 20 34 20 62 79 74 65 73 20 69 73 20  r(), 4 bytes is 
296f0 74 68 65 20 6d 69 6e 69 6d 75 6d 20 73 69 7a 65  the minimum size
29700 20 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 61   of.        ** a
29710 6e 79 20 63 65 6c 6c 29 2e 20 42 75 74 20 69 74  ny cell). But it
29720 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
29730 20 70 61 73 73 20 74 68 65 20 63 6f 72 72 65 63   pass the correc
29740 74 20 73 69 7a 65 20 74 6f 20 0a 20 20 20 20 20  t size to .     
29750 20 20 20 2a 2a 20 69 6e 73 65 72 74 43 65 6c 6c     ** insertCell
29760 28 29 2c 20 73 6f 20 72 65 70 61 72 73 65 20 74  (), so reparse t
29770 68 65 20 63 65 6c 6c 20 6e 6f 77 2e 0a 20 20 20  he cell now..   
29780 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
29790 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69  ** Note that thi
297a0 73 20 63 61 6e 20 6e 65 76 65 72 20 68 61 70 70  s can never happ
297b0 65 6e 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20  en in an SQLite 
297c0 64 61 74 61 20 66 69 6c 65 2c 20 61 73 20 61 6c  data file, as al
297d0 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 65 6c  l.        ** cel
297e0 6c 73 20 61 72 65 20 61 74 20 6c 65 61 73 74 20  ls are at least 
297f0 34 20 62 79 74 65 73 2e 20 49 74 20 6f 6e 6c 79  4 bytes. It only
29800 20 68 61 70 70 65 6e 73 20 69 6e 20 62 2d 74 72   happens in b-tr
29810 65 65 73 20 75 73 65 64 0a 20 20 20 20 20 20 20  ees used.       
29820 20 2a 2a 20 74 6f 20 65 76 61 6c 75 61 74 65 20   ** to evaluate 
29830 22 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29  "IN (SELECT ...)
29840 22 20 61 6e 64 20 73 69 6d 69 6c 61 72 20 63 6c  " and similar cl
29850 61 75 73 65 73 2e 0a 20 20 20 20 20 20 20 20 2a  auses..        *
29860 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 7a  /.        if( sz
29870 43 65 6c 6c 5b 6a 5d 3d 3d 34 20 29 7b 0a 20 20  Cell[j]==4 ){.  
29880 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 6c          assert(l
29890 65 61 66 43 6f 72 72 65 63 74 69 6f 6e 3d 3d 34  eafCorrection==4
298a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20  );.          sz 
298b0 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  = cellSizePtr(pP
298c0 61 72 65 6e 74 2c 20 70 43 65 6c 6c 29 3b 0a 20  arent, pCell);. 
298d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
298e0 0a 20 20 20 20 20 20 69 53 70 61 63 65 32 20 2b  .      iSpace2 +
298f0 3d 20 73 7a 3b 0a 20 20 20 20 20 20 61 73 73 65  = sz;.      asse
29900 72 74 28 20 73 7a 3c 3d 70 42 74 2d 3e 70 61 67  rt( sz<=pBt->pag
29910 65 53 69 7a 65 2f 34 20 29 3b 0a 20 20 20 20 20  eSize/4 );.     
29920 20 61 73 73 65 72 74 28 20 69 53 70 61 63 65 32   assert( iSpace2
29930 3c 3d 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  <=pBt->pageSize 
29940 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 69 6e  );.      rc = in
29950 73 65 72 74 43 65 6c 6c 28 70 50 61 72 65 6e 74  sertCell(pParent
29960 2c 20 6e 78 44 69 76 2c 20 70 43 65 6c 6c 2c 20  , nxDiv, pCell, 
29970 73 7a 2c 20 70 54 65 6d 70 2c 20 34 29 3b 0a 20  sz, pTemp, 4);. 
29980 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
29990 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 62 61  ITE_OK ) goto ba
299a0 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
299b0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 66 69       put4byte(fi
299c0 6e 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70  ndOverflowCell(p
299d0 50 61 72 65 6e 74 2c 6e 78 44 69 76 29 2c 20 70  Parent,nxDiv), p
299e0 4e 65 77 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20  New->pgno);..   
299f0 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
29a00 20 61 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   an auto-vacuum 
29a10 64 61 74 61 62 61 73 65 2c 20 61 6e 64 20 6e 6f  database, and no
29a20 74 20 61 20 6c 65 61 66 2d 64 61 74 61 20 74 72  t a leaf-data tr
29a30 65 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  ee,.      ** the
29a40 6e 20 75 70 64 61 74 65 20 74 68 65 20 70 6f 69  n update the poi
29a50 6e 74 65 72 20 6d 61 70 20 77 69 74 68 20 61 6e  nter map with an
29a60 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65 20 6f   entry for the o
29a70 76 65 72 66 6c 6f 77 20 70 61 67 65 0a 20 20 20  verflow page.   
29a80 20 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20 63     ** that the c
29a90 65 6c 6c 20 6a 75 73 74 20 69 6e 73 65 72 74 65  ell just inserte
29aa0 64 20 70 6f 69 6e 74 73 20 74 6f 20 28 69 66 20  d points to (if 
29ab0 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  any)..      */. 
29ac0 20 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56       if( ISAUTOV
29ad0 41 43 55 55 4d 20 26 26 20 21 6c 65 61 66 44 61  ACUUM && !leafDa
29ae0 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ta ){.        rc
29af0 20 3d 20 70 74 72 6d 61 70 50 75 74 4f 76 66 6c   = ptrmapPutOvfl
29b00 28 70 50 61 72 65 6e 74 2c 20 6e 78 44 69 76 29  (pParent, nxDiv)
29b10 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
29b20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
29b30 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 62 61           goto ba
29b40 6c 61 6e 63 65 5f 63 6c 65 61 6e 75 70 3b 0a 20  lance_cleanup;. 
29b50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
29b60 0a 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20  .      j++;.    
29b70 20 20 6e 78 44 69 76 2b 2b 3b 0a 20 20 20 20 7d    nxDiv++;.    }
29b80 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
29b90 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65 6e 74   pointer-map ent
29ba0 72 79 20 66 6f 72 20 74 68 65 20 6e 65 77 20 73  ry for the new s
29bb0 69 62 6c 69 6e 67 20 70 61 67 65 2e 20 2a 2f 0a  ibling page. */.
29bc0 20 20 20 20 69 66 28 20 49 53 41 55 54 4f 56 41      if( ISAUTOVA
29bd0 43 55 55 4d 20 29 7b 0a 20 20 20 20 20 20 72 63  CUUM ){.      rc
29be0 20 3d 20 70 74 72 6d 61 70 50 75 74 28 70 42 74   = ptrmapPut(pBt
29bf0 2c 20 70 4e 65 77 2d 3e 70 67 6e 6f 2c 20 50 54  , pNew->pgno, PT
29c00 52 4d 41 50 5f 42 54 52 45 45 2c 20 70 50 61 72  RMAP_BTREE, pPar
29c10 65 6e 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  ent->pgno);.    
29c20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
29c30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
29c40 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65 61  oto balance_clea
29c50 6e 75 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nup;.      }.   
29c60 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
29c70 20 6a 3d 3d 6e 43 65 6c 6c 20 29 3b 0a 20 20 61   j==nCell );.  a
29c80 73 73 65 72 74 28 20 6e 4f 6c 64 3e 30 20 29 3b  ssert( nOld>0 );
29c90 0a 20 20 61 73 73 65 72 74 28 20 6e 4e 65 77 3e  .  assert( nNew>
29ca0 30 20 29 3b 0a 20 20 69 66 28 20 28 70 61 67 65  0 );.  if( (page
29cb0 46 6c 61 67 73 20 26 20 50 54 46 5f 4c 45 41 46  Flags & PTF_LEAF
29cc0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 38 20 2a  )==0 ){.    u8 *
29cd0 7a 43 68 69 6c 64 20 3d 20 26 61 70 43 6f 70 79  zChild = &apCopy
29ce0 5b 6e 4f 6c 64 2d 31 5d 2d 3e 61 44 61 74 61 5b  [nOld-1]->aData[
29cf0 38 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  8];.    memcpy(&
29d00 61 70 4e 65 77 5b 6e 4e 65 77 2d 31 5d 2d 3e 61  apNew[nNew-1]->a
29d10 44 61 74 61 5b 38 5d 2c 20 7a 43 68 69 6c 64 2c  Data[8], zChild,
29d20 20 34 29 3b 0a 20 20 20 20 69 66 28 20 49 53 41   4);.    if( ISA
29d30 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
29d40 20 20 20 72 63 20 3d 20 70 74 72 6d 61 70 50 75     rc = ptrmapPu
29d50 74 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  t(pBt, get4byte(
29d60 7a 43 68 69 6c 64 29 2c 20 50 54 52 4d 41 50 5f  zChild), PTRMAP_
29d70 42 54 52 45 45 2c 20 61 70 4e 65 77 5b 6e 4e 65  BTREE, apNew[nNe
29d80 77 2d 31 5d 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  w-1]->pgno);.   
29d90 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
29da0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
29db0 67 6f 74 6f 20 62 61 6c 61 6e 63 65 5f 63 6c 65  goto balance_cle
29dc0 61 6e 75 70 3b 0a 20 20 20 20 20 20 7d 0a 20 20  anup;.      }.  
29dd0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 78    }.  }.  if( nx
29de0 44 69 76 3d 3d 70 50 61 72 65 6e 74 2d 3e 6e 43  Div==pParent->nC
29df0 65 6c 6c 2b 70 50 61 72 65 6e 74 2d 3e 6e 4f 76  ell+pParent->nOv
29e00 65 72 66 6c 6f 77 20 29 7b 0a 20 20 20 20 2f 2a  erflow ){.    /*
29e10 20 52 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c   Right-most sibl
29e20 69 6e 67 20 69 73 20 74 68 65 20 72 69 67 68 74  ing is the right
29e30 2d 6d 6f 73 74 20 63 68 69 6c 64 20 6f 66 20 70  -most child of p
29e40 50 61 72 65 6e 74 20 2a 2f 0a 20 20 20 20 70 75  Parent */.    pu
29e50 74 34 62 79 74 65 28 26 70 50 61 72 65 6e 74 2d  t4byte(&pParent-
29e60 3e 61 44 61 74 61 5b 70 50 61 72 65 6e 74 2d 3e  >aData[pParent->
29e70 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c 20 70 67  hdrOffset+8], pg
29e80 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a  noNew[nNew-1]);.
29e90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
29ea0 52 69 67 68 74 2d 6d 6f 73 74 20 73 69 62 6c 69  Right-most sibli
29eb0 6e 67 20 69 73 20 74 68 65 20 6c 65 66 74 20 63  ng is the left c
29ec0 68 69 6c 64 20 6f 66 20 74 68 65 20 66 69 72 73  hild of the firs
29ed0 74 20 65 6e 74 72 79 20 69 6e 20 70 50 61 72 65  t entry in pPare
29ee0 6e 74 0a 20 20 20 20 2a 2a 20 70 61 73 74 20 74  nt.    ** past t
29ef0 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20 64 69  he right-most di
29f00 76 69 64 65 72 20 65 6e 74 72 79 20 2a 2f 0a 20  vider entry */. 
29f10 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e 64     put4byte(find
29f20 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50 61  OverflowCell(pPa
29f30 72 65 6e 74 2c 20 6e 78 44 69 76 29 2c 20 70 67  rent, nxDiv), pg
29f40 6e 6f 4e 65 77 5b 6e 4e 65 77 2d 31 5d 29 3b 0a  noNew[nNew-1]);.
29f50 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 42    }..  /*.  ** B
29f60 61 6c 61 6e 63 65 20 74 68 65 20 70 61 72 65 6e  alance the paren
29f70 74 20 70 61 67 65 2e 20 20 4e 6f 74 65 20 74 68  t page.  Note th
29f80 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 70  at the current p
29f90 61 67 65 20 28 70 50 61 67 65 29 20 6d 69 67 68  age (pPage) migh
29fa0 74 0a 20 20 2a 2a 20 68 61 76 65 20 62 65 65 6e  t.  ** have been
29fb0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 66 72   added to the fr
29fc0 65 65 6c 69 73 74 20 73 6f 20 69 74 20 6d 69 67  eelist so it mig
29fd0 68 74 20 6e 6f 20 6c 6f 6e 67 65 72 20 62 65 20  ht no longer be 
29fe0 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20 20 2a  initialized..  *
29ff0 2a 20 42 75 74 20 74 68 65 20 70 61 72 65 6e 74  * But the parent
2a000 20 70 61 67 65 20 77 69 6c 6c 20 61 6c 77 61 79   page will alway
2a010 73 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65 64  s be initialized
2a020 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
2a030 20 70 50 61 72 65 6e 74 2d 3e 69 73 49 6e 69 74   pParent->isInit
2a040 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 63 72   );.  sqlite3Scr
2a050 61 74 63 68 46 72 65 65 28 61 70 43 65 6c 6c 29  atchFree(apCell)
2a060 3b 0a 20 20 61 70 43 65 6c 6c 20 3d 20 30 3b 0a  ;.  apCell = 0;.
2a070 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
2a080 61 67 65 29 3b 0a 20 20 70 43 75 72 2d 3e 69 50  age);.  pCur->iP
2a090 61 67 65 2d 2d 3b 0a 20 20 72 63 20 3d 20 62 61  age--;.  rc = ba
2a0a0 6c 61 6e 63 65 28 70 43 75 72 2c 20 30 29 3b 0a  lance(pCur, 0);.
2a0b0 20 20 0a 20 20 2f 2a 0a 20 20 2a 2a 20 43 6c 65    .  /*.  ** Cle
2a0c0 61 6e 75 70 20 62 65 66 6f 72 65 20 72 65 74 75  anup before retu
2a0d0 72 6e 69 6e 67 2e 0a 20 20 2a 2f 0a 62 61 6c 61  rning..  */.bala
2a0e0 6e 63 65 5f 63 6c 65 61 6e 75 70 3a 0a 20 20 73  nce_cleanup:.  s
2a0f0 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 61  qlite3PageFree(a
2a100 53 70 61 63 65 32 29 3b 0a 20 20 73 71 6c 69 74  Space2);.  sqlit
2a110 65 33 53 63 72 61 74 63 68 46 72 65 65 28 61 70  e3ScratchFree(ap
2a120 43 65 6c 6c 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Cell);.  for(i=0
2a130 3b 20 69 3c 6e 4f 6c 64 3b 20 69 2b 2b 29 7b 0a  ; i<nOld; i++){.
2a140 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65 28      releasePage(
2a150 61 70 4f 6c 64 5b 69 5d 29 3b 0a 20 20 7d 0a 20  apOld[i]);.  }. 
2a160 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 4e 65 77   for(i=0; i<nNew
2a170 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 65 6c 65  ; i++){.    rele
2a180 61 73 65 50 61 67 65 28 61 70 4e 65 77 5b 69 5d  asePage(apNew[i]
2a190 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 72 65 6c  );.  }..  /* rel
2a1a0 65 61 73 65 50 61 67 65 28 70 50 61 72 65 6e 74  easePage(pParent
2a1b0 29 3b 20 2a 2f 0a 20 20 54 52 41 43 45 28 28 22  ); */.  TRACE(("
2a1c0 42 41 4c 41 4e 43 45 3a 20 66 69 6e 69 73 68 65  BALANCE: finishe
2a1d0 64 20 77 69 74 68 20 25 64 3a 20 6f 6c 64 3d 25  d with %d: old=%
2a1e0 64 20 6e 65 77 3d 25 64 20 63 65 6c 6c 73 3d 25  d new=%d cells=%
2a1f0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
2a200 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 6e 4f 6c  pPage->pgno, nOl
2a210 64 2c 20 6e 4e 65 77 2c 20 6e 43 65 6c 6c 29 29  d, nNew, nCell))
2a220 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
2a230 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
2a240 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
2a250 66 6f 72 20 74 68 65 20 72 6f 6f 74 20 70 61 67  for the root pag
2a260 65 20 6f 66 20 61 20 62 74 72 65 65 20 77 68 65  e of a btree whe
2a270 6e 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61  n the root.** pa
2a280 67 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 63  ge contains no c
2a290 65 6c 6c 73 2e 20 20 54 68 69 73 20 69 73 20 61  ells.  This is a
2a2a0 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
2a2b0 20 6d 61 6b 65 20 74 68 65 20 74 72 65 65 0a 2a   make the tree.*
2a2c0 2a 20 73 68 61 6c 6c 6f 77 65 72 20 62 79 20 6f  * shallower by o
2a2d0 6e 65 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 73 74 61  ne level..*/.sta
2a2e0 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63 65 5f  tic int balance_
2a2f0 73 68 61 6c 6c 6f 77 65 72 28 42 74 43 75 72 73  shallower(BtCurs
2a300 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
2a310 50 61 67 65 20 2a 70 50 61 67 65 3b 20 20 20 20  Page *pPage;    
2a320 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 6f            /* Roo
2a330 74 20 70 61 67 65 20 6f 66 20 42 2d 54 72 65 65  t page of B-Tree
2a340 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70   */.  MemPage *p
2a350 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20 20  Child;          
2a360 20 20 20 2f 2a 20 54 68 65 20 6f 6e 6c 79 20 63     /* The only c
2a370 68 69 6c 64 20 70 61 67 65 20 6f 66 20 70 50 61  hild page of pPa
2a380 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  ge */.  Pgno pgn
2a390 6f 43 68 69 6c 64 3b 20 20 20 20 20 20 20 20 20  oChild;         
2a3a0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
2a3b0 62 65 72 20 66 6f 72 20 70 43 68 69 6c 64 20 2a  ber for pChild *
2a3c0 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
2a3d0 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
2a3e0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
2a3f0 66 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72  from subprocedur
2a400 65 73 20 2a 2f 0a 20 20 42 74 53 68 61 72 65 64  es */.  BtShared
2a410 20 2a 70 42 74 3b 20 20 20 20 20 20 20 20 20 20   *pBt;          
2a420 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d          /* The m
2a430 61 69 6e 20 42 54 72 65 65 20 73 74 72 75 63 74  ain BTree struct
2a440 75 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 43  ure */.  int mxC
2a450 65 6c 6c 50 65 72 50 61 67 65 3b 20 20 20 20 20  ellPerPage;     
2a460 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
2a470 20 6e 75 6d 62 65 72 20 6f 66 20 63 65 6c 6c 73   number of cells
2a480 20 70 65 72 20 70 61 67 65 20 2a 2f 0a 20 20 75   per page */.  u
2a490 38 20 2a 2a 61 70 43 65 6c 6c 3b 20 20 20 20 20  8 **apCell;     
2a4a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
2a4b0 6c 6c 20 63 65 6c 6c 73 20 66 72 6f 6d 20 70 61  ll cells from pa
2a4c0 67 65 73 20 62 65 69 6e 67 20 62 61 6c 61 6e 63  ges being balanc
2a4d0 65 64 20 2a 2f 0a 20 20 75 31 36 20 2a 73 7a 43  ed */.  u16 *szC
2a4e0 65 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  ell;            
2a4f0 20 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 73 69       /* Local si
2a500 7a 65 20 6f 66 20 61 6c 6c 20 63 65 6c 6c 73 20  ze of all cells 
2a510 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  */..  assert( pC
2a520 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29 3b 0a  ur->iPage==0 );.
2a530 20 20 70 50 61 67 65 20 3d 20 70 43 75 72 2d 3e    pPage = pCur->
2a540 61 70 50 61 67 65 5b 30 5d 3b 0a 0a 20 20 61 73  apPage[0];..  as
2a550 73 65 72 74 28 20 70 50 61 67 65 2d 3e 6e 43 65  sert( pPage->nCe
2a560 6c 6c 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ll==0 );.  asser
2a570 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
2a580 5f 68 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74  _held(pPage->pBt
2a590 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 70 42  ->mutex) );.  pB
2a5a0 74 20 3d 20 70 50 61 67 65 2d 3e 70 42 74 3b 0a  t = pPage->pBt;.
2a5b0 20 20 6d 78 43 65 6c 6c 50 65 72 50 61 67 65 20    mxCellPerPage 
2a5c0 3d 20 4d 58 5f 43 45 4c 4c 28 70 42 74 29 3b 0a  = MX_CELL(pBt);.
2a5d0 20 20 61 70 43 65 6c 6c 20 3d 20 73 71 6c 69 74    apCell = sqlit
2a5e0 65 33 4d 61 6c 6c 6f 63 28 20 6d 78 43 65 6c 6c  e3Malloc( mxCell
2a5f0 50 65 72 50 61 67 65 2a 28 73 69 7a 65 6f 66 28  PerPage*(sizeof(
2a600 75 38 2a 29 2b 73 69 7a 65 6f 66 28 75 31 36 29  u8*)+sizeof(u16)
2a610 29 20 29 3b 0a 20 20 69 66 28 20 61 70 43 65 6c  ) );.  if( apCel
2a620 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
2a630 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 73 7a  LITE_NOMEM;.  sz
2a640 43 65 6c 6c 20 3d 20 28 75 31 36 2a 29 26 61 70  Cell = (u16*)&ap
2a650 43 65 6c 6c 5b 6d 78 43 65 6c 6c 50 65 72 50 61  Cell[mxCellPerPa
2a660 67 65 5d 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ge];.  if( pPage
2a670 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f 2a  ->leaf ){.    /*
2a680 20 54 68 65 20 74 61 62 6c 65 20 69 73 20 63 6f   The table is co
2a690 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 2a  mpletely empty *
2a6a0 2f 0a 20 20 20 20 54 52 41 43 45 28 28 22 42 41  /.    TRACE(("BA
2a6b0 4c 41 4e 43 45 3a 20 65 6d 70 74 79 20 74 61 62  LANCE: empty tab
2a6c0 6c 65 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 2d  le %d\n", pPage-
2a6d0 3e 70 67 6e 6f 29 29 3b 0a 20 20 7d 65 6c 73 65  >pgno));.  }else
2a6e0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 6f 6f  {.    /* The roo
2a6f0 74 20 70 61 67 65 20 69 73 20 65 6d 70 74 79 20  t page is empty 
2a700 62 75 74 20 68 61 73 20 6f 6e 65 20 63 68 69 6c  but has one chil
2a710 64 2e 20 20 54 72 61 6e 73 66 65 72 20 74 68 65  d.  Transfer the
2a720 0a 20 20 20 20 2a 2a 20 69 6e 66 6f 72 6d 61 74  .    ** informat
2a730 69 6f 6e 20 66 72 6f 6d 20 74 68 61 74 20 6f 6e  ion from that on
2a740 65 20 63 68 69 6c 64 20 69 6e 74 6f 20 74 68 65  e child into the
2a750 20 72 6f 6f 74 20 70 61 67 65 20 69 66 20 69 74   root page if it
2a760 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c 20 66 69   .    ** will fi
2a770 74 2e 20 20 54 68 69 73 20 72 65 64 75 63 65 73  t.  This reduces
2a780 20 74 68 65 20 64 65 70 74 68 20 6f 66 20 74 68   the depth of th
2a790 65 20 74 72 65 65 20 62 79 20 6f 6e 65 2e 0a 20  e tree by one.. 
2a7a0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
2a7b0 74 68 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73  the root page is
2a7c0 20 70 61 67 65 20 31 2c 20 69 74 20 68 61 73 20   page 1, it has 
2a7d0 6c 65 73 73 20 73 70 61 63 65 20 61 76 61 69 6c  less space avail
2a7e0 61 62 6c 65 20 74 68 61 6e 0a 20 20 20 20 2a 2a  able than.    **
2a7f0 20 69 74 73 20 63 68 69 6c 64 20 28 64 75 65 20   its child (due 
2a800 74 6f 20 74 68 65 20 31 30 30 20 62 79 74 65 20  to the 100 byte 
2a810 68 65 61 64 65 72 20 74 68 61 74 20 6f 63 63 75  header that occu
2a820 72 73 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  rs at the beginn
2a830 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  ing.    ** of th
2a840 65 20 64 61 74 61 62 61 73 65 20 66 6c 65 29 2c  e database fle),
2a850 20 73 6f 20 69 74 20 6d 69 67 68 74 20 6e 6f 74   so it might not
2a860 20 62 65 20 61 62 6c 65 20 74 6f 20 68 6f 6c 64   be able to hold
2a870 20 61 6c 6c 20 6f 66 20 74 68 65 20 0a 20 20 20   all of the .   
2a880 20 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   ** information 
2a890 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69  currently contai
2a8a0 6e 65 64 20 69 6e 20 74 68 65 20 63 68 69 6c 64  ned in the child
2a8b0 2e 20 20 49 66 20 74 68 69 73 20 69 73 20 74 68  .  If this is th
2a8c0 65 20 0a 20 20 20 20 2a 2a 20 63 61 73 65 2c 20  e .    ** case, 
2a8d0 74 68 65 6e 20 64 6f 20 6e 6f 74 20 64 6f 20 74  then do not do t
2a8e0 68 65 20 74 72 61 6e 73 66 65 72 2e 20 20 4c 65  he transfer.  Le
2a8f0 61 76 65 20 70 61 67 65 20 31 20 65 6d 70 74 79  ave page 1 empty
2a900 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66   except.    ** f
2a910 6f 72 20 74 68 65 20 72 69 67 68 74 2d 70 6f 69  or the right-poi
2a920 6e 74 65 72 20 74 6f 20 74 68 65 20 63 68 69 6c  nter to the chil
2a930 64 20 70 61 67 65 2e 20 20 54 68 65 20 63 68 69  d page.  The chi
2a940 6c 64 20 70 61 67 65 20 62 65 63 6f 6d 65 73 0a  ld page becomes.
2a950 20 20 20 20 2a 2a 20 74 68 65 20 76 69 72 74 75      ** the virtu
2a960 61 6c 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74  al root of the t
2a970 72 65 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ree..    */.    
2a980 70 67 6e 6f 43 68 69 6c 64 20 3d 20 67 65 74 34  pgnoChild = get4
2a990 62 79 74 65 28 26 70 50 61 67 65 2d 3e 61 44 61  byte(&pPage->aDa
2a9a0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
2a9b0 73 65 74 2b 38 5d 29 3b 0a 20 20 20 20 61 73 73  set+8]);.    ass
2a9c0 65 72 74 28 20 70 67 6e 6f 43 68 69 6c 64 3e 30  ert( pgnoChild>0
2a9d0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2a9e0 70 67 6e 6f 43 68 69 6c 64 3c 3d 70 61 67 65 72  pgnoChild<=pager
2a9f0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 2d  Pagecount(pPage-
2aa00 3e 70 42 74 2d 3e 70 50 61 67 65 72 29 20 29 3b  >pBt->pPager) );
2aa10 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2aa20 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70 50  3BtreeGetPage(pP
2aa30 61 67 65 2d 3e 70 42 74 2c 20 70 67 6e 6f 43 68  age->pBt, pgnoCh
2aa40 69 6c 64 2c 20 26 70 43 68 69 6c 64 2c 20 30 29  ild, &pChild, 0)
2aa50 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67  ;.    if( rc ) g
2aa60 6f 74 6f 20 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f  oto end_shallow_
2aa70 62 61 6c 61 6e 63 65 3b 0a 20 20 20 20 69 66 28  balance;.    if(
2aa80 20 70 50 61 67 65 2d 3e 70 67 6e 6f 3d 3d 31 20   pPage->pgno==1 
2aa90 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
2aaa0 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74 50 61  lite3BtreeInitPa
2aab0 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20 20 20  ge(pChild);.    
2aac0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2aad0 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62 61 6c 61  end_shallow_bala
2aae0 6e 63 65 3b 0a 20 20 20 20 20 20 61 73 73 65 72  nce;.      asser
2aaf0 74 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72  t( pChild->nOver
2ab00 66 6c 6f 77 3d 3d 30 20 29 3b 0a 20 20 20 20 20  flow==0 );.     
2ab10 20 69 66 28 20 70 43 68 69 6c 64 2d 3e 6e 46 72   if( pChild->nFr
2ab20 65 65 3e 3d 31 30 30 20 29 7b 0a 20 20 20 20 20  ee>=100 ){.     
2ab30 20 20 20 2f 2a 20 54 68 65 20 63 68 69 6c 64 20     /* The child 
2ab40 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 77 69 6c 6c  information will
2ab50 20 66 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f 74   fit on the root
2ab60 20 70 61 67 65 2c 20 73 6f 20 64 6f 20 74 68 65   page, so do the
2ab70 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70 79  .        ** copy
2ab80 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
2ab90 69 3b 0a 20 20 20 20 20 20 20 20 7a 65 72 6f 50  i;.        zeroP
2aba0 61 67 65 28 70 50 61 67 65 2c 20 70 43 68 69 6c  age(pPage, pChil
2abb0 64 2d 3e 61 44 61 74 61 5b 30 5d 29 3b 0a 20 20  d->aData[0]);.  
2abc0 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2abd0 3c 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c 3b 20  <pChild->nCell; 
2abe0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
2abf0 61 70 43 65 6c 6c 5b 69 5d 20 3d 20 66 69 6e 64  apCell[i] = find
2ac00 43 65 6c 6c 28 70 43 68 69 6c 64 2c 69 29 3b 0a  Cell(pChild,i);.
2ac10 20 20 20 20 20 20 20 20 20 20 73 7a 43 65 6c 6c            szCell
2ac20 5b 69 5d 20 3d 20 63 65 6c 6c 53 69 7a 65 50 74  [i] = cellSizePt
2ac30 72 28 70 43 68 69 6c 64 2c 20 61 70 43 65 6c 6c  r(pChild, apCell
2ac40 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  [i]);.        }.
2ac50 20 20 20 20 20 20 20 20 61 73 73 65 6d 62 6c 65          assemble
2ac60 50 61 67 65 28 70 50 61 67 65 2c 20 70 43 68 69  Page(pPage, pChi
2ac70 6c 64 2d 3e 6e 43 65 6c 6c 2c 20 61 70 43 65 6c  ld->nCell, apCel
2ac80 6c 2c 20 73 7a 43 65 6c 6c 29 3b 0a 20 20 20 20  l, szCell);.    
2ac90 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20      /* Copy the 
2aca0 72 69 67 68 74 2d 70 6f 69 6e 74 65 72 20 6f 66  right-pointer of
2acb0 20 74 68 65 20 63 68 69 6c 64 20 74 6f 20 74 68   the child to th
2acc0 65 20 70 61 72 65 6e 74 2e 20 2a 2f 0a 20 20 20  e parent. */.   
2acd0 20 20 20 20 20 70 75 74 34 62 79 74 65 28 26 70       put4byte(&p
2ace0 50 61 67 65 2d 3e 61 44 61 74 61 5b 70 50 61 67  Page->aData[pPag
2acf0 65 2d 3e 68 64 72 4f 66 66 73 65 74 2b 38 5d 2c  e->hdrOffset+8],
2ad00 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 65   .            ge
2ad10 74 34 62 79 74 65 28 26 70 43 68 69 6c 64 2d 3e  t4byte(&pChild->
2ad20 61 44 61 74 61 5b 70 43 68 69 6c 64 2d 3e 68 64  aData[pChild->hd
2ad30 72 4f 66 66 73 65 74 2b 38 5d 29 29 3b 0a 20 20  rOffset+8]));.  
2ad40 20 20 20 20 20 20 66 72 65 65 50 61 67 65 28 70        freePage(p
2ad50 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 20 20  Child);.        
2ad60 54 52 41 43 45 28 28 22 42 41 4c 41 4e 43 45 3a  TRACE(("BALANCE:
2ad70 20 63 68 69 6c 64 20 25 64 20 74 72 61 6e 73 66   child %d transf
2ad80 65 72 20 74 6f 20 70 61 67 65 20 31 5c 6e 22 2c  er to page 1\n",
2ad90 20 70 43 68 69 6c 64 2d 3e 70 67 6e 6f 29 29 3b   pChild->pgno));
2ada0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2adb0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 68 69        /* The chi
2adc0 6c 64 20 68 61 73 20 6d 6f 72 65 20 69 6e 66 6f  ld has more info
2add0 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  rmation that wil
2ade0 6c 20 66 69 74 20 6f 6e 20 74 68 65 20 72 6f 6f  l fit on the roo
2adf0 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  t..        ** Th
2ae00 65 20 74 72 65 65 20 69 73 20 61 6c 72 65 61 64  e tree is alread
2ae10 79 20 62 61 6c 61 6e 63 65 64 2e 20 20 44 6f 20  y balanced.  Do 
2ae20 6e 6f 74 68 69 6e 67 2e 20 2a 2f 0a 20 20 20 20  nothing. */.    
2ae30 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c 41      TRACE(("BALA
2ae40 4e 43 45 3a 20 63 68 69 6c 64 20 25 64 20 77 69  NCE: child %d wi
2ae50 6c 6c 20 6e 6f 74 20 66 69 74 20 6f 6e 20 70 61  ll not fit on pa
2ae60 67 65 20 31 5c 6e 22 2c 20 70 43 68 69 6c 64 2d  ge 1\n", pChild-
2ae70 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 7d  >pgno));.      }
2ae80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2ae90 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2d 3e    memcpy(pPage->
2aea0 61 44 61 74 61 2c 20 70 43 68 69 6c 64 2d 3e 61  aData, pChild->a
2aeb0 44 61 74 61 2c 20 70 50 61 67 65 2d 3e 70 42 74  Data, pPage->pBt
2aec0 2d 3e 75 73 61 62 6c 65 53 69 7a 65 29 3b 0a 20  ->usableSize);. 
2aed0 20 20 20 20 20 70 50 61 67 65 2d 3e 69 73 49 6e       pPage->isIn
2aee0 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 63  it = 0;.      rc
2aef0 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
2af00 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 3b 0a  nitPage(pPage);.
2af10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
2af20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
2af30 20 20 20 20 20 66 72 65 65 50 61 67 65 28 70 43       freePage(pC
2af40 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 54 52 41  hild);.      TRA
2af50 43 45 28 28 22 42 41 4c 41 4e 43 45 3a 20 74 72  CE(("BALANCE: tr
2af60 61 6e 73 66 65 72 20 63 68 69 6c 64 20 25 64 20  ansfer child %d 
2af70 69 6e 74 6f 20 72 6f 6f 74 20 25 64 5c 6e 22 2c  into root %d\n",
2af80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2af90 43 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20 70 50 61  Child->pgno, pPa
2afa0 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  ge->pgno));.    
2afb0 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
2afc0 61 67 65 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3d 3d  age->nOverflow==
2afd0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 49 53 41  0 );.    if( ISA
2afe0 55 54 4f 56 41 43 55 55 4d 20 29 7b 0a 20 20 20  UTOVACUUM ){.   
2aff0 20 20 20 72 63 20 3d 20 73 65 74 43 68 69 6c 64     rc = setChild
2b000 50 74 72 6d 61 70 73 28 70 50 61 67 65 29 3b 0a  Ptrmaps(pPage);.
2b010 20 20 20 20 7d 0a 20 20 20 20 72 65 6c 65 61 73      }.    releas
2b020 65 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20  ePage(pChild);. 
2b030 20 7d 0a 65 6e 64 5f 73 68 61 6c 6c 6f 77 5f 62   }.end_shallow_b
2b040 61 6c 61 6e 63 65 3a 0a 20 20 73 71 6c 69 74 65  alance:.  sqlite
2b050 33 5f 66 72 65 65 28 61 70 43 65 6c 6c 29 3b 0a  3_free(apCell);.
2b060 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2b070 0a 2f 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 20  ./*.** The root 
2b080 70 61 67 65 20 69 73 20 6f 76 65 72 66 75 6c 6c  page is overfull
2b090 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
2b0a0 20 68 61 70 70 65 6e 73 2c 20 43 72 65 61 74 65   happens, Create
2b0b0 20 61 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67   a new child pag
2b0c0 65 20 61 6e 64 20 63 6f 70 79 20 74 68 65 0a 2a  e and copy the.*
2b0d0 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
2b0e0 65 20 72 6f 6f 74 20 69 6e 74 6f 20 74 68 65 20  e root into the 
2b0f0 63 68 69 6c 64 2e 20 20 54 68 65 6e 20 6d 61 6b  child.  Then mak
2b100 65 20 74 68 65 20 72 6f 6f 74 0a 2a 2a 20 70 61  e the root.** pa
2b110 67 65 20 61 6e 20 65 6d 70 74 79 20 70 61 67 65  ge an empty page
2b120 20 77 69 74 68 20 72 69 67 68 74 43 68 69 6c 64   with rightChild
2b130 20 70 6f 69 6e 74 69 6e 67 20 74 6f 20 74 68 65   pointing to the
2b140 20 6e 65 77 0a 2a 2a 20 63 68 69 6c 64 2e 20 20   new.** child.  
2b150 20 46 69 6e 61 6c 6c 79 2c 20 63 61 6c 6c 20 62   Finally, call b
2b160 61 6c 61 6e 63 65 5f 69 6e 74 65 72 6e 61 6c 28  alance_internal(
2b170 29 20 6f 6e 20 74 68 65 20 6e 65 77 20 63 68 69  ) on the new chi
2b180 6c 64 0a 2a 2a 20 74 6f 20 63 61 75 73 65 20 69  ld.** to cause i
2b190 74 20 74 6f 20 73 70 6c 69 74 2e 0a 2a 2f 0a 73  t to split..*/.s
2b1a0 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e 63  tatic int balanc
2b1b0 65 5f 64 65 65 70 65 72 28 42 74 43 75 72 73 6f  e_deeper(BtCurso
2b1c0 72 20 2a 70 43 75 72 29 7b 0a 20 20 69 6e 74 20  r *pCur){.  int 
2b1d0 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
2b1e0 2f 2a 20 52 65 74 75 72 6e 20 76 61 6c 75 65 20  /* Return value 
2b1f0 66 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75 72  from subprocedur
2b200 65 73 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20  es */.  MemPage 
2b210 2a 70 50 61 67 65 3b 20 20 20 20 20 2f 2a 20 50  *pPage;     /* P
2b220 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72 6f  ointer to the ro
2b230 6f 74 20 70 61 67 65 20 2a 2f 0a 20 20 4d 65 6d  ot page */.  Mem
2b240 50 61 67 65 20 2a 70 43 68 69 6c 64 3b 20 20 20  Page *pChild;   
2b250 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61   /* Pointer to a
2b260 20 6e 65 77 20 63 68 69 6c 64 20 70 61 67 65 20   new child page 
2b270 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 43 68  */.  Pgno pgnoCh
2b280 69 6c 64 3b 20 20 20 20 20 2f 2a 20 50 61 67 65  ild;     /* Page
2b290 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20 6e   number of the n
2b2a0 65 77 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f  ew child page */
2b2b0 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2b2c0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  ;         /* The
2b2d0 20 42 54 72 65 65 20 2a 2f 0a 20 20 69 6e 74 20   BTree */.  int 
2b2e0 75 73 61 62 6c 65 53 69 7a 65 3b 20 20 20 20 20  usableSize;     
2b2f0 2f 2a 20 54 6f 74 61 6c 20 75 73 61 62 6c 65 20  /* Total usable 
2b300 73 69 7a 65 20 6f 66 20 61 20 70 61 67 65 20 2a  size of a page *
2b310 2f 0a 20 20 75 38 20 2a 64 61 74 61 3b 20 20 20  /.  u8 *data;   
2b320 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65          /* Conte
2b330 6e 74 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  nt of the parent
2b340 20 70 61 67 65 20 2a 2f 0a 20 20 75 38 20 2a 63   page */.  u8 *c
2b350 64 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 2f  data;          /
2b360 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * Content of the
2b370 20 63 68 69 6c 64 20 70 61 67 65 20 2a 2f 0a 20   child page */. 
2b380 20 69 6e 74 20 68 64 72 3b 20 20 20 20 20 20 20   int hdr;       
2b390 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 74       /* Offset t
2b3a0 6f 20 70 61 67 65 20 68 65 61 64 65 72 20 69 6e  o page header in
2b3b0 20 70 61 72 65 6e 74 20 2a 2f 0a 20 20 69 6e 74   parent */.  int
2b3c0 20 63 62 72 6b 3b 20 20 20 20 20 20 20 20 20 20   cbrk;          
2b3d0 20 2f 2a 20 4f 66 66 73 65 74 20 74 6f 20 63 6f   /* Offset to co
2b3e0 6e 74 65 6e 74 20 6f 66 20 66 69 72 73 74 20 63  ntent of first c
2b3f0 65 6c 6c 20 69 6e 20 70 61 72 65 6e 74 20 2a 2f  ell in parent */
2b400 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 75 72  ..  assert( pCur
2b410 2d 3e 69 50 61 67 65 3d 3d 30 20 29 3b 0a 20 20  ->iPage==0 );.  
2b420 61 73 73 65 72 74 28 20 70 43 75 72 2d 3e 61 70  assert( pCur->ap
2b430 50 61 67 65 5b 30 5d 2d 3e 6e 4f 76 65 72 66 6c  Page[0]->nOverfl
2b440 6f 77 3e 30 20 29 3b 0a 0a 20 20 70 50 61 67 65  ow>0 );..  pPage
2b450 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2b460 30 5d 3b 0a 20 20 70 42 74 20 3d 20 70 50 61 67  0];.  pBt = pPag
2b470 65 2d 3e 70 42 74 3b 0a 20 20 61 73 73 65 72 74  e->pBt;.  assert
2b480 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
2b490 68 65 6c 64 28 70 42 74 2d 3e 6d 75 74 65 78 29  held(pBt->mutex)
2b4a0 20 29 3b 0a 20 20 72 63 20 3d 20 61 6c 6c 6f 63   );.  rc = alloc
2b4b0 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42 74  ateBtreePage(pBt
2b4c0 2c 20 26 70 43 68 69 6c 64 2c 20 26 70 67 6e 6f  , &pChild, &pgno
2b4d0 43 68 69 6c 64 2c 20 70 50 61 67 65 2d 3e 70 67  Child, pPage->pg
2b4e0 6e 6f 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  no, 0);.  if( rc
2b4f0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
2b500 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
2b510 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
2b520 70 43 68 69 6c 64 2d 3e 70 44 62 50 61 67 65 29  pChild->pDbPage)
2b530 20 29 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65   );.  usableSize
2b540 20 3d 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69   = pBt->usableSi
2b550 7a 65 3b 0a 20 20 64 61 74 61 20 3d 20 70 50 61  ze;.  data = pPa
2b560 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68 64 72  ge->aData;.  hdr
2b570 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f 66 66   = pPage->hdrOff
2b580 73 65 74 3b 0a 20 20 63 62 72 6b 20 3d 20 67 65  set;.  cbrk = ge
2b590 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
2b5a0 2b 35 5d 29 3b 0a 20 20 63 64 61 74 61 20 3d 20  +5]);.  cdata = 
2b5b0 70 43 68 69 6c 64 2d 3e 61 44 61 74 61 3b 0a 20  pChild->aData;. 
2b5c0 20 6d 65 6d 63 70 79 28 63 64 61 74 61 2c 20 26   memcpy(cdata, &
2b5d0 64 61 74 61 5b 68 64 72 5d 2c 20 70 50 61 67 65  data[hdr], pPage
2b5e0 2d 3e 63 65 6c 6c 4f 66 66 73 65 74 2b 32 2a 70  ->cellOffset+2*p
2b5f0 50 61 67 65 2d 3e 6e 43 65 6c 6c 2d 68 64 72 29  Page->nCell-hdr)
2b600 3b 0a 20 20 6d 65 6d 63 70 79 28 26 63 64 61 74  ;.  memcpy(&cdat
2b610 61 5b 63 62 72 6b 5d 2c 20 26 64 61 74 61 5b 63  a[cbrk], &data[c
2b620 62 72 6b 5d 2c 20 75 73 61 62 6c 65 53 69 7a 65  brk], usableSize
2b630 2d 63 62 72 6b 29 3b 0a 20 20 0a 20 20 72 63 20  -cbrk);.  .  rc 
2b640 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e  = sqlite3BtreeIn
2b650 69 74 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a  itPage(pChild);.
2b660 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2b670 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  _OK ){.    int n
2b680 43 6f 70 79 20 3d 20 70 50 61 67 65 2d 3e 6e 4f  Copy = pPage->nO
2b690 76 65 72 66 6c 6f 77 2a 73 69 7a 65 6f 66 28 70  verflow*sizeof(p
2b6a0 50 61 67 65 2d 3e 61 4f 76 66 6c 5b 30 5d 29 3b  Page->aOvfl[0]);
2b6b0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 43 68 69  .    memcpy(pChi
2b6c0 6c 64 2d 3e 61 4f 76 66 6c 2c 20 70 50 61 67 65  ld->aOvfl, pPage
2b6d0 2d 3e 61 4f 76 66 6c 2c 20 6e 43 6f 70 79 29 3b  ->aOvfl, nCopy);
2b6e0 0a 20 20 20 20 70 43 68 69 6c 64 2d 3e 6e 4f 76  .    pChild->nOv
2b6f0 65 72 66 6c 6f 77 20 3d 20 70 50 61 67 65 2d 3e  erflow = pPage->
2b700 6e 4f 76 65 72 66 6c 6f 77 3b 0a 20 20 20 20 69  nOverflow;.    i
2b710 66 28 20 70 43 68 69 6c 64 2d 3e 6e 4f 76 65 72  f( pChild->nOver
2b720 66 6c 6f 77 20 29 7b 0a 20 20 20 20 20 20 70 43  flow ){.      pC
2b730 68 69 6c 64 2d 3e 6e 46 72 65 65 20 3d 20 30 3b  hild->nFree = 0;
2b740 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
2b750 74 28 20 70 43 68 69 6c 64 2d 3e 6e 43 65 6c 6c  t( pChild->nCell
2b760 3d 3d 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 20 29  ==pPage->nCell )
2b770 3b 0a 20 20 20 20 7a 65 72 6f 50 61 67 65 28 70  ;.    zeroPage(p
2b780 50 61 67 65 2c 20 70 43 68 69 6c 64 2d 3e 61 44  Page, pChild->aD
2b790 61 74 61 5b 30 5d 20 26 20 7e 50 54 46 5f 4c 45  ata[0] & ~PTF_LE
2b7a0 41 46 29 3b 0a 20 20 20 20 70 75 74 34 62 79 74  AF);.    put4byt
2b7b0 65 28 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b  e(&pPage->aData[
2b7c0 70 50 61 67 65 2d 3e 68 64 72 4f 66 66 73 65 74  pPage->hdrOffset
2b7d0 2b 38 5d 2c 20 70 67 6e 6f 43 68 69 6c 64 29 3b  +8], pgnoChild);
2b7e0 0a 20 20 20 20 54 52 41 43 45 28 28 22 42 41 4c  .    TRACE(("BAL
2b7f0 41 4e 43 45 3a 20 63 6f 70 79 20 72 6f 6f 74 20  ANCE: copy root 
2b800 25 64 20 69 6e 74 6f 20 25 64 5c 6e 22 2c 20 70  %d into %d\n", p
2b810 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 43 68 69  Page->pgno, pChi
2b820 6c 64 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  ld->pgno));.    
2b830 69 66 28 20 49 53 41 55 54 4f 56 41 43 55 55 4d  if( ISAUTOVACUUM
2b840 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
2b850 74 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 43  trmapPut(pBt, pC
2b860 68 69 6c 64 2d 3e 70 67 6e 6f 2c 20 50 54 52 4d  hild->pgno, PTRM
2b870 41 50 5f 42 54 52 45 45 2c 20 70 50 61 67 65 2d  AP_BTREE, pPage-
2b880 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66  >pgno);.      if
2b890 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b8a0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
2b8b0 73 65 74 43 68 69 6c 64 50 74 72 6d 61 70 73 28  setChildPtrmaps(
2b8c0 70 43 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 7d  pChild);.      }
2b8d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
2b8e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2b8f0 29 7b 0a 20 20 20 20 70 43 75 72 2d 3e 69 50 61  ){.    pCur->iPa
2b900 67 65 2b 2b 3b 0a 20 20 20 20 70 43 75 72 2d 3e  ge++;.    pCur->
2b910 61 70 50 61 67 65 5b 31 5d 20 3d 20 70 43 68 69  apPage[1] = pChi
2b920 6c 64 3b 0a 20 20 20 20 70 43 75 72 2d 3e 61 69  ld;.    pCur->ai
2b930 49 64 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  Idx[0] = 0;.    
2b940 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f 6e 6f 6e  rc = balance_non
2b950 72 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 65  root(pCur);.  }e
2b960 6c 73 65 7b 0a 20 20 20 20 72 65 6c 65 61 73 65  lse{.    release
2b970 50 61 67 65 28 70 43 68 69 6c 64 29 3b 0a 20 20  Page(pChild);.  
2b980 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
2b990 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67  }../*.** The pag
2b9a0 65 20 74 68 61 74 20 70 43 75 72 20 63 75 72 72  e that pCur curr
2b9b0 65 6e 74 6c 79 20 70 6f 69 6e 74 73 20 74 6f 20  ently points to 
2b9c0 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 6d 6f  has just been mo
2b9d0 64 69 66 69 65 64 20 69 6e 0a 2a 2a 20 73 6f 6d  dified in.** som
2b9e0 65 20 77 61 79 2e 20 54 68 69 73 20 66 75 6e 63  e way. This func
2b9f0 74 69 6f 6e 20 66 69 67 75 72 65 73 20 6f 75 74  tion figures out
2ba00 20 69 66 20 74 68 69 73 20 6d 6f 64 69 66 69 63   if this modific
2ba10 61 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 65 0a  ation means the.
2ba20 2a 2a 20 74 72 65 65 20 6e 65 65 64 73 20 74 6f  ** tree needs to
2ba30 20 62 65 20 62 61 6c 61 6e 63 65 64 2c 20 61 6e   be balanced, an
2ba40 64 20 69 66 20 73 6f 20 63 61 6c 6c 73 20 74 68  d if so calls th
2ba50 65 20 61 70 70 72 6f 70 72 69 61 74 65 20 62 61  e appropriate ba
2ba60 6c 61 6e 63 69 6e 67 20 0a 2a 2a 20 72 6f 75 74  lancing .** rout
2ba70 69 6e 65 2e 0a 2a 2a 20 0a 2a 2a 20 50 61 72 61  ine..** .** Para
2ba80 6d 65 74 65 72 20 69 73 49 6e 73 65 72 74 20 69  meter isInsert i
2ba90 73 20 74 72 75 65 20 69 66 20 61 20 6e 65 77 20  s true if a new 
2baa0 63 65 6c 6c 20 77 61 73 20 6a 75 73 74 20 69 6e  cell was just in
2bab0 73 65 72 74 65 64 20 69 6e 74 6f 20 74 68 65 0a  serted into the.
2bac0 2a 2a 20 70 61 67 65 2c 20 6f 72 20 66 61 6c 73  ** page, or fals
2bad0 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  e otherwise..*/.
2bae0 73 74 61 74 69 63 20 69 6e 74 20 62 61 6c 61 6e  static int balan
2baf0 63 65 28 42 74 43 75 72 73 6f 72 20 2a 70 43 75  ce(BtCursor *pCu
2bb00 72 2c 20 69 6e 74 20 69 73 49 6e 73 65 72 74 29  r, int isInsert)
2bb10 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
2bb20 49 54 45 5f 4f 4b 3b 0a 20 20 4d 65 6d 50 61 67  ITE_OK;.  MemPag
2bb30 65 20 2a 70 50 61 67 65 20 3d 20 70 43 75 72 2d  e *pPage = pCur-
2bb40 3e 61 70 50 61 67 65 5b 70 43 75 72 2d 3e 69 50  >apPage[pCur->iP
2bb50 61 67 65 5d 3b 0a 0a 20 20 61 73 73 65 72 74 28  age];..  assert(
2bb60 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
2bb70 65 6c 64 28 70 50 61 67 65 2d 3e 70 42 74 2d 3e  eld(pPage->pBt->
2bb80 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
2bb90 70 43 75 72 2d 3e 69 50 61 67 65 3d 3d 30 20 29  pCur->iPage==0 )
2bba0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
2bbb0 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50 61  e3PagerWrite(pPa
2bbc0 67 65 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20  ge->pDbPage);.  
2bbd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2bbe0 5f 4f 4b 20 26 26 20 70 50 61 67 65 2d 3e 6e 4f  _OK && pPage->nO
2bbf0 76 65 72 66 6c 6f 77 3e 30 20 29 7b 0a 20 20 20  verflow>0 ){.   
2bc00 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 5f     rc = balance_
2bc10 64 65 65 70 65 72 28 70 43 75 72 29 3b 0a 20 20  deeper(pCur);.  
2bc20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
2bc30 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61  SQLITE_OK && pPa
2bc40 67 65 2d 3e 6e 43 65 6c 6c 3d 3d 30 20 29 7b 0a  ge->nCell==0 ){.
2bc50 20 20 20 20 20 20 72 63 20 3d 20 62 61 6c 61 6e        rc = balan
2bc60 63 65 5f 73 68 61 6c 6c 6f 77 65 72 28 70 43 75  ce_shallower(pCu
2bc70 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  r);.    }.  }els
2bc80 65 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  e{.    if( pPage
2bc90 2d 3e 6e 4f 76 65 72 66 6c 6f 77 3e 30 20 7c 7c  ->nOverflow>0 ||
2bca0 20 0a 20 20 20 20 20 20 20 20 28 21 69 73 49 6e   .        (!isIn
2bcb0 73 65 72 74 20 26 26 20 70 50 61 67 65 2d 3e 6e  sert && pPage->n
2bcc0 46 72 65 65 3e 70 50 61 67 65 2d 3e 70 42 74 2d  Free>pPage->pBt-
2bcd0 3e 75 73 61 62 6c 65 53 69 7a 65 2a 32 2f 33 29  >usableSize*2/3)
2bce0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 62   ){.      rc = b
2bcf0 61 6c 61 6e 63 65 5f 6e 6f 6e 72 6f 6f 74 28 70  alance_nonroot(p
2bd00 43 75 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Cur);.    }.  }.
2bd10 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2bd20 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
2bd30 6e 65 20 63 68 65 63 6b 73 20 61 6c 6c 20 63 75  ne checks all cu
2bd40 72 73 6f 72 73 20 74 68 61 74 20 70 6f 69 6e 74  rsors that point
2bd50 20 74 6f 20 74 61 62 6c 65 20 70 67 6e 6f 52 6f   to table pgnoRo
2bd60 6f 74 2e 0a 2a 2a 20 49 66 20 61 6e 79 20 6f 66  ot..** If any of
2bd70 20 74 68 6f 73 65 20 63 75 72 73 6f 72 73 20 77   those cursors w
2bd80 65 72 65 20 6f 70 65 6e 65 64 20 77 69 74 68 20  ere opened with 
2bd90 77 72 46 6c 61 67 3d 3d 30 20 69 6e 20 61 20 64  wrFlag==0 in a d
2bda0 69 66 66 65 72 65 6e 74 0a 2a 2a 20 64 61 74 61  ifferent.** data
2bdb0 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
2bdc0 28 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  (a database conn
2bdd0 65 63 74 69 6f 6e 20 74 68 61 74 20 73 68 61 72  ection that shar
2bde0 65 73 20 74 68 65 20 70 61 67 65 72 0a 2a 2a 20  es the pager.** 
2bdf0 63 61 63 68 65 20 77 69 74 68 20 74 68 65 20 63  cache with the c
2be00 75 72 72 65 6e 74 20 63 6f 6e 6e 65 63 74 69 6f  urrent connectio
2be10 6e 29 20 61 6e 64 20 74 68 61 74 20 6f 74 68 65  n) and that othe
2be20 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a  r connection .**
2be30 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 52   is not in the R
2be40 65 61 64 55 6e 63 6f 6d 6d 6d 69 74 74 65 64 20  eadUncommmitted 
2be50 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 69 73  state, then this
2be60 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
2be70 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b   .** SQLITE_LOCK
2be80 45 44 2e 0a 2a 2a 0a 2a 2a 20 41 73 20 77 65 6c  ED..**.** As wel
2be90 6c 20 61 73 20 63 75 72 73 6f 72 73 20 77 69 74  l as cursors wit
2bea0 68 20 77 72 46 6c 61 67 3d 3d 30 2c 20 63 75 72  h wrFlag==0, cur
2beb0 73 6f 72 73 20 77 69 74 68 20 77 72 46 6c 61 67  sors with wrFlag
2bec0 3d 3d 31 20 61 6e 64 20 0a 2a 2a 20 69 73 49 6e  ==1 and .** isIn
2bed0 63 72 62 6c 6f 62 48 61 6e 64 6c 65 3d 3d 31 20  crblobHandle==1 
2bee0 61 72 65 20 61 6c 73 6f 20 63 6f 6e 73 69 64 65  are also conside
2bef0 72 65 64 20 27 72 65 61 64 27 20 63 75 72 73 6f  red 'read' curso
2bf00 72 73 2e 20 49 6e 63 72 65 6d 65 6e 74 61 6c 20  rs. Incremental 
2bf10 0a 2a 2a 20 62 6c 6f 62 20 63 75 72 73 6f 72 73  .** blob cursors
2bf20 20 61 72 65 20 75 73 65 64 20 66 6f 72 20 62 6f   are used for bo
2bf30 74 68 20 72 65 61 64 69 6e 67 20 61 6e 64 20 77  th reading and w
2bf40 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 57 68  riting..**.** Wh
2bf50 65 6e 20 70 67 6e 6f 52 6f 6f 74 20 69 73 20 74  en pgnoRoot is t
2bf60 68 65 20 72 6f 6f 74 20 70 61 67 65 20 6f 66 20  he root page of 
2bf70 61 6e 20 69 6e 74 6b 65 79 20 74 61 62 6c 65 2c  an intkey table,
2bf80 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2bf90 73 20 61 6c 73 6f 0a 2a 2a 20 72 65 73 70 6f 6e  s also.** respon
2bfa0 73 69 62 6c 65 20 66 6f 72 20 69 6e 76 61 6c 69  sible for invali
2bfb0 64 61 74 69 6e 67 20 69 6e 63 72 65 6d 65 6e 74  dating increment
2bfc0 61 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72 73 20  al blob cursors 
2bfd0 77 68 65 6e 20 74 68 65 20 74 61 62 6c 65 20 72  when the table r
2bfe0 6f 77 0a 2a 2a 20 6f 6e 20 77 68 69 63 68 20 74  ow.** on which t
2bff0 68 65 79 20 61 72 65 20 6f 70 65 6e 65 64 20 69  hey are opened i
2c000 73 20 64 65 6c 65 74 65 64 20 6f 72 20 6d 6f 64  s deleted or mod
2c010 69 66 69 65 64 2e 20 43 75 72 73 6f 72 73 20 61  ified. Cursors a
2c020 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
2c030 2a 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  * according to t
2c040 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 75 6c  he following rul
2c050 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 57  es:.**.**   1) W
2c060 68 65 6e 20 42 74 72 65 65 43 6c 65 61 72 54 61  hen BtreeClearTa
2c070 62 6c 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ble() is called 
2c080 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64 65  to completely de
2c090 6c 65 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  lete the content
2c0a0 73 0a 2a 2a 20 20 20 20 20 20 6f 66 20 61 20 42  s.**      of a B
2c0b0 2d 54 72 65 65 20 74 61 62 6c 65 2c 20 70 45 78  -Tree table, pEx
2c0c0 63 6c 75 64 65 20 69 73 20 73 65 74 20 74 6f 20  clude is set to 
2c0d0 7a 65 72 6f 20 61 6e 64 20 70 61 72 61 6d 65 74  zero and paramet
2c0e0 65 72 20 69 52 6f 77 20 69 73 20 0a 2a 2a 20 20  er iRow is .**  
2c0f0 20 20 20 20 73 65 74 20 74 6f 20 6e 6f 6e 2d 7a      set to non-z
2c100 65 72 6f 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ero. In this cas
2c110 65 20 61 6c 6c 20 69 6e 63 72 65 6d 65 6e 74 61  e all incrementa
2c120 6c 20 62 6c 6f 62 20 63 75 72 73 6f 72 73 20 6f  l blob cursors o
2c130 70 65 6e 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74  pen.**      on t
2c140 68 65 20 74 61 62 6c 65 20 72 6f 6f 74 65 64 20  he table rooted 
2c150 61 74 20 70 67 6e 6f 52 6f 6f 74 20 61 72 65 20  at pgnoRoot are 
2c160 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 2a 2a 0a  invalidated..**.
2c170 2a 2a 20 20 20 32 29 20 57 68 65 6e 20 42 74 72  **   2) When Btr
2c180 65 65 49 6e 73 65 72 74 28 29 2c 20 42 74 72 65  eeInsert(), Btre
2c190 65 44 65 6c 65 74 65 28 29 20 6f 72 20 42 74 72  eDelete() or Btr
2c1a0 65 65 50 75 74 44 61 74 61 28 29 20 69 73 20 63  eePutData() is c
2c1b0 61 6c 6c 65 64 20 74 6f 20 0a 2a 2a 20 20 20 20  alled to .**    
2c1c0 20 20 6d 6f 64 69 66 79 20 61 20 74 61 62 6c 65    modify a table
2c1d0 20 72 6f 77 20 76 69 61 20 61 6e 20 53 51 4c 20   row via an SQL 
2c1e0 73 74 61 74 65 6d 65 6e 74 2c 20 70 45 78 63 6c  statement, pExcl
2c1f0 75 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ude is set to th
2c200 65 20 0a 2a 2a 20 20 20 20 20 20 77 72 69 74 65  e .**      write
2c210 20 63 75 72 73 6f 72 20 75 73 65 64 20 74 6f 20   cursor used to 
2c220 64 6f 20 74 68 65 20 6d 6f 64 69 66 69 63 61 74  do the modificat
2c230 69 6f 6e 20 61 6e 64 20 70 61 72 61 6d 65 74 65  ion and paramete
2c240 72 20 69 52 6f 77 20 69 73 20 73 65 74 0a 2a 2a  r iRow is set.**
2c250 20 20 20 20 20 20 74 6f 20 74 68 65 20 69 6e 74        to the int
2c260 65 67 65 72 20 72 6f 77 20 69 64 20 6f 66 20 74  eger row id of t
2c270 68 65 20 42 2d 54 72 65 65 20 65 6e 74 72 79 20  he B-Tree entry 
2c280 62 65 69 6e 67 20 6d 6f 64 69 66 69 65 64 2e 20  being modified. 
2c290 55 6e 6c 65 73 73 0a 2a 2a 20 20 20 20 20 20 70  Unless.**      p
2c2a0 45 78 63 6c 75 64 65 20 69 73 20 69 74 73 65 6c  Exclude is itsel
2c2b0 66 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61 6c  f an incremental
2c2c0 20 62 6c 6f 62 20 63 75 72 73 6f 72 2c 20 74 68   blob cursor, th
2c2d0 65 6e 20 61 6c 6c 20 69 6e 63 72 65 6d 65 6e 74  en all increment
2c2e0 61 6c 0a 2a 2a 20 20 20 20 20 20 62 6c 6f 62 20  al.**      blob 
2c2f0 63 75 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20  cursors open on 
2c300 72 6f 77 20 69 52 6f 77 20 6f 66 20 74 68 65 20  row iRow of the 
2c310 42 2d 54 72 65 65 20 61 72 65 20 69 6e 76 61 6c  B-Tree are inval
2c320 69 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20  idated..**.**   
2c330 33 29 20 49 66 20 62 6f 74 68 20 70 45 78 63 6c  3) If both pExcl
2c340 75 64 65 20 61 6e 64 20 69 52 6f 77 20 61 72 65  ude and iRow are
2c350 20 73 65 74 20 74 6f 20 7a 65 72 6f 2c 20 6e 6f   set to zero, no
2c360 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c 6f   incremental blo
2c370 62 20 0a 2a 2a 20 20 20 20 20 20 63 75 72 73 6f  b .**      curso
2c380 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  rs are invalidat
2c390 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
2c3a0 74 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73  t checkReadLocks
2c3b0 28 0a 20 20 42 74 72 65 65 20 2a 70 42 74 72 65  (.  Btree *pBtre
2c3c0 65 2c 20 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 52  e, .  Pgno pgnoR
2c3d0 6f 6f 74 2c 20 0a 20 20 42 74 43 75 72 73 6f 72  oot, .  BtCursor
2c3e0 20 2a 70 45 78 63 6c 75 64 65 2c 0a 20 20 69 36   *pExclude,.  i6
2c3f0 34 20 69 52 6f 77 0a 29 7b 0a 20 20 42 74 43 75  4 iRow.){.  BtCu
2c400 72 73 6f 72 20 2a 70 3b 0a 20 20 42 74 53 68 61  rsor *p;.  BtSha
2c410 72 65 64 20 2a 70 42 74 20 3d 20 70 42 74 72 65  red *pBt = pBtre
2c420 65 2d 3e 70 42 74 3b 0a 20 20 73 71 6c 69 74 65  e->pBt;.  sqlite
2c430 33 20 2a 64 62 20 3d 20 70 42 74 72 65 65 2d 3e  3 *db = pBtree->
2c440 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  db;.  assert( sq
2c450 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73 4d  lite3BtreeHoldsM
2c460 75 74 65 78 28 70 42 74 72 65 65 29 20 29 3b 0a  utex(pBtree) );.
2c470 20 20 66 6f 72 28 70 3d 70 42 74 2d 3e 70 43 75    for(p=pBt->pCu
2c480 72 73 6f 72 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  rsor; p; p=p->pN
2c490 65 78 74 29 7b 0a 20 20 20 20 69 66 28 20 70 3d  ext){.    if( p=
2c4a0 3d 70 45 78 63 6c 75 64 65 20 29 20 63 6f 6e 74  =pExclude ) cont
2c4b0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 70 2d  inue;.    if( p-
2c4c0 3e 70 67 6e 6f 52 6f 6f 74 21 3d 70 67 6e 6f 52  >pgnoRoot!=pgnoR
2c4d0 6f 6f 74 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  oot ) continue;.
2c4e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2c4f0 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
2c500 20 69 66 28 20 70 2d 3e 69 73 49 6e 63 72 62 6c   if( p->isIncrbl
2c510 6f 62 48 61 6e 64 6c 65 20 26 26 20 28 20 0a 20  obHandle && ( . 
2c520 20 20 20 20 20 20 20 20 28 21 70 45 78 63 6c 75          (!pExclu
2c530 64 65 20 26 26 20 69 52 6f 77 29 0a 20 20 20 20  de && iRow).    
2c540 20 20 7c 7c 20 28 70 45 78 63 6c 75 64 65 20 26    || (pExclude &
2c550 26 20 21 70 45 78 63 6c 75 64 65 2d 3e 69 73 49  & !pExclude->isI
2c560 6e 63 72 62 6c 6f 62 48 61 6e 64 6c 65 20 26 26  ncrblobHandle &&
2c570 20 70 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 3d 3d 69   p->info.nKey==i
2c580 52 6f 77 29 0a 20 20 20 20 29 29 7b 0a 20 20 20  Row).    )){.   
2c590 20 20 20 70 2d 3e 65 53 74 61 74 65 20 3d 20 43     p->eState = C
2c5a0 55 52 53 4f 52 5f 49 4e 56 41 4c 49 44 3b 0a 20  URSOR_INVALID;. 
2c5b0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
2c5c0 69 66 28 20 70 2d 3e 65 53 74 61 74 65 21 3d 43  if( p->eState!=C
2c5d0 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 20 63 6f  URSOR_VALID ) co
2c5e0 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
2c5f0 70 2d 3e 77 72 46 6c 61 67 3d 3d 30 20 0a 23 69  p->wrFlag==0 .#i
2c600 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2c610 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20  T_INCRBLOB.     
2c620 7c 7c 20 70 2d 3e 69 73 49 6e 63 72 62 6c 6f 62  || p->isIncrblob
2c630 48 61 6e 64 6c 65 0a 23 65 6e 64 69 66 0a 20 20  Handle.#endif.  
2c640 20 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74    ){.      sqlit
2c650 65 33 20 2a 64 62 4f 74 68 65 72 20 3d 20 70 2d  e3 *dbOther = p-
2c660 3e 70 42 74 72 65 65 2d 3e 64 62 3b 0a 20 20 20  >pBtree->db;.   
2c670 20 20 20 69 66 28 20 64 62 4f 74 68 65 72 3d 3d     if( dbOther==
2c680 30 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 28 64  0 ||.         (d
2c690 62 4f 74 68 65 72 21 3d 64 62 20 26 26 20 28 64  bOther!=db && (d
2c6a0 62 4f 74 68 65 72 2d 3e 66 6c 61 67 73 20 26 20  bOther->flags & 
2c6b0 53 51 4c 49 54 45 5f 52 65 61 64 55 6e 63 6f 6d  SQLITE_ReadUncom
2c6c0 6d 69 74 74 65 64 29 3d 3d 30 29 20 29 7b 0a 20  mitted)==0) ){. 
2c6d0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
2c6e0 4c 49 54 45 5f 4c 4f 43 4b 45 44 3b 0a 20 20 20  LITE_LOCKED;.   
2c6f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
2c700 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
2c710 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 73 65  K;.}../*.** Inse
2c720 72 74 20 61 20 6e 65 77 20 72 65 63 6f 72 64 20  rt a new record 
2c730 69 6e 74 6f 20 74 68 65 20 42 54 72 65 65 2e 20  into the BTree. 
2c740 20 54 68 65 20 6b 65 79 20 69 73 20 67 69 76 65   The key is give
2c750 6e 20 62 79 20 28 70 4b 65 79 2c 6e 4b 65 79 29  n by (pKey,nKey)
2c760 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 61 74 61  .** and the data
2c770 20 69 73 20 67 69 76 65 6e 20 62 79 20 28 70 44   is given by (pD
2c780 61 74 61 2c 6e 44 61 74 61 29 2e 20 20 54 68 65  ata,nData).  The
2c790 20 63 75 72 73 6f 72 20 69 73 20 75 73 65 64 20   cursor is used 
2c7a0 6f 6e 6c 79 20 74 6f 0a 2a 2a 20 64 65 66 69 6e  only to.** defin
2c7b0 65 20 77 68 61 74 20 74 61 62 6c 65 20 74 68 65  e what table the
2c7c0 20 72 65 63 6f 72 64 20 73 68 6f 75 6c 64 20 62   record should b
2c7d0 65 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 2e  e inserted into.
2c7e0 20 20 54 68 65 20 63 75 72 73 6f 72 0a 2a 2a 20    The cursor.** 
2c7f0 69 73 20 6c 65 66 74 20 70 6f 69 6e 74 69 6e 67  is left pointing
2c800 20 61 74 20 61 20 72 61 6e 64 6f 6d 20 6c 6f 63   at a random loc
2c810 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  ation..**.** For
2c820 20 61 6e 20 49 4e 54 4b 45 59 20 74 61 62 6c 65   an INTKEY table
2c830 2c 20 6f 6e 6c 79 20 74 68 65 20 6e 4b 65 79 20  , only the nKey 
2c840 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6b 65 79  value of the key
2c850 20 69 73 20 75 73 65 64 2e 20 20 70 4b 65 79 20   is used.  pKey 
2c860 69 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 2e 20 20  is.** ignored.  
2c870 46 6f 72 20 61 20 5a 45 52 4f 44 41 54 41 20 74  For a ZERODATA t
2c880 61 62 6c 65 2c 20 74 68 65 20 70 44 61 74 61 20  able, the pData 
2c890 61 6e 64 20 6e 44 61 74 61 20 61 72 65 20 62 6f  and nData are bo
2c8a0 74 68 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 69  th ignored..*/.i
2c8b0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
2c8c0 6e 73 65 72 74 28 0a 20 20 42 74 43 75 72 73 6f  nsert(.  BtCurso
2c8d0 72 20 2a 70 43 75 72 2c 20 20 20 20 20 20 20 20  r *pCur,        
2c8e0 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65 72          /* Inser
2c8f0 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 65 20  t data into the 
2c900 74 61 62 6c 65 20 6f 66 20 74 68 69 73 20 63 75  table of this cu
2c910 72 73 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rsor */.  const 
2c920 76 6f 69 64 20 2a 70 4b 65 79 2c 20 69 36 34 20  void *pKey, i64 
2c930 6e 4b 65 79 2c 20 20 20 20 2f 2a 20 54 68 65 20  nKey,    /* The 
2c940 6b 65 79 20 6f 66 20 74 68 65 20 6e 65 77 20 72  key of the new r
2c950 65 63 6f 72 64 20 2a 2f 0a 20 20 63 6f 6e 73 74  ecord */.  const
2c960 20 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e   void *pData, in
2c970 74 20 6e 44 61 74 61 2c 20 20 2f 2a 20 54 68 65  t nData,  /* The
2c980 20 64 61 74 61 20 6f 66 20 74 68 65 20 6e 65 77   data of the new
2c990 20 72 65 63 6f 72 64 20 2a 2f 0a 20 20 69 6e 74   record */.  int
2c9a0 20 6e 5a 65 72 6f 2c 20 20 20 20 20 20 20 20 20   nZero,         
2c9b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2c9c0 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61 20 30  umber of extra 0
2c9d0 20 62 79 74 65 73 20 74 6f 20 61 70 70 65 6e 64   bytes to append
2c9e0 20 74 6f 20 64 61 74 61 20 2a 2f 0a 20 20 69 6e   to data */.  in
2c9f0 74 20 61 70 70 65 6e 64 42 69 61 73 20 20 20 20  t appendBias    
2ca00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ca10 54 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  True if this is 
2ca20 6c 69 6b 65 6c 79 20 61 6e 20 61 70 70 65 6e 64  likely an append
2ca30 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
2ca40 0a 20 20 69 6e 74 20 6c 6f 63 3b 0a 20 20 69 6e  .  int loc;.  in
2ca50 74 20 73 7a 4e 65 77 3b 0a 20 20 69 6e 74 20 69  t szNew;.  int i
2ca60 64 78 3b 0a 20 20 4d 65 6d 50 61 67 65 20 2a 70  dx;.  MemPage *p
2ca70 50 61 67 65 3b 0a 20 20 42 74 72 65 65 20 2a 70  Page;.  Btree *p
2ca80 20 3d 20 70 43 75 72 2d 3e 70 42 74 72 65 65 3b   = pCur->pBtree;
2ca90 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
2caa0 20 3d 20 70 2d 3e 70 42 74 3b 0a 20 20 75 6e 73   = p->pBt;.  uns
2cab0 69 67 6e 65 64 20 63 68 61 72 20 2a 6f 6c 64 43  igned char *oldC
2cac0 65 6c 6c 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ell;.  unsigned 
2cad0 63 68 61 72 20 2a 6e 65 77 43 65 6c 6c 20 3d 20  char *newCell = 
2cae0 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75  0;..  assert( cu
2caf0 72 73 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70  rsorHoldsMutex(p
2cb00 43 75 72 29 20 29 3b 0a 20 20 69 66 28 20 70 42  Cur) );.  if( pB
2cb10 74 2d 3e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  t->inTransaction
2cb20 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  !=TRANS_WRITE ){
2cb30 0a 20 20 20 20 2f 2a 20 4d 75 73 74 20 73 74 61  .    /* Must sta
2cb40 72 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  rt a transaction
2cb50 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 61 6e   before doing an
2cb60 20 69 6e 73 65 72 74 20 2a 2f 0a 20 20 20 20 72   insert */.    r
2cb70 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f 6e 6c  c = pBt->readOnl
2cb80 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  y ? SQLITE_READO
2cb90 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45 52 52  NLY : SQLITE_ERR
2cba0 4f 52 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  OR;.    return r
2cbb0 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
2cbc0 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e 6c 79 20   !pBt->readOnly 
2cbd0 29 3b 0a 20 20 69 66 28 20 21 70 43 75 72 2d 3e  );.  if( !pCur->
2cbe0 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20 72 65  wrFlag ){.    re
2cbf0 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
2cc00 3b 20 20 20 2f 2a 20 43 75 72 73 6f 72 20 6e 6f  ;   /* Cursor no
2cc10 74 20 6f 70 65 6e 20 66 6f 72 20 77 72 69 74 69  t open for writi
2cc20 6e 67 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20  ng */.  }.  if( 
2cc30 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b 73 28 70  checkReadLocks(p
2cc40 43 75 72 2d 3e 70 42 74 72 65 65 2c 20 70 43 75  Cur->pBtree, pCu
2cc50 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 43 75  r->pgnoRoot, pCu
2cc60 72 2c 20 6e 4b 65 79 29 20 29 7b 0a 20 20 20 20  r, nKey) ){.    
2cc70 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
2cc80 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62  CKED; /* The tab
2cc90 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74  le pCur points t
2cca0 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  o has a read loc
2ccb0 6b 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  k */.  }.  if( p
2ccc0 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Cur->eState==CUR
2ccd0 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20 20 20  SOR_FAULT ){.   
2cce0 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e 73 6b   return pCur->sk
2ccf0 69 70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 61  ip;.  }..  /* Sa
2cd00 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
2cd10 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75   of any other cu
2cd20 72 73 6f 72 73 20 6f 70 65 6e 20 6f 6e 20 74 68  rsors open on th
2cd30 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 63 6c  is table */.  cl
2cd40 65 61 72 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  earCursorPositio
2cd50 6e 28 70 43 75 72 29 3b 0a 20 20 69 66 28 20 0a  n(pCur);.  if( .
2cd60 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28      SQLITE_OK!=(
2cd70 72 63 20 3d 20 73 61 76 65 41 6c 6c 43 75 72 73  rc = saveAllCurs
2cd80 6f 72 73 28 70 42 74 2c 20 70 43 75 72 2d 3e 70  ors(pBt, pCur->p
2cd90 67 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 29 29 20  gnoRoot, pCur)) 
2cda0 7c 7c 0a 20 20 20 20 53 51 4c 49 54 45 5f 4f 4b  ||.    SQLITE_OK
2cdb0 21 3d 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42  !=(rc = sqlite3B
2cdc0 74 72 65 65 4d 6f 76 65 74 6f 28 70 43 75 72 2c  treeMoveto(pCur,
2cdd0 20 70 4b 65 79 2c 20 6e 4b 65 79 2c 20 61 70 70   pKey, nKey, app
2cde0 65 6e 64 42 69 61 73 2c 20 26 6c 6f 63 29 29 0a  endBias, &loc)).
2cdf0 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
2ce00 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65  rc;.  }..  pPage
2ce10 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
2ce20 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
2ce30 61 73 73 65 72 74 28 20 70 50 61 67 65 2d 3e 69  assert( pPage->i
2ce40 6e 74 4b 65 79 20 7c 7c 20 6e 4b 65 79 3e 3d 30  ntKey || nKey>=0
2ce50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
2ce60 61 67 65 2d 3e 6c 65 61 66 20 7c 7c 20 21 70 50  age->leaf || !pP
2ce70 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20  age->intKey );. 
2ce80 20 54 52 41 43 45 28 28 22 49 4e 53 45 52 54 3a   TRACE(("INSERT:
2ce90 20 74 61 62 6c 65 3d 25 64 20 6e 6b 65 79 3d 25   table=%d nkey=%
2cea0 6c 6c 64 20 6e 64 61 74 61 3d 25 64 20 70 61 67  lld ndata=%d pag
2ceb0 65 3d 25 64 20 25 73 5c 6e 22 2c 0a 20 20 20 20  e=%d %s\n",.    
2cec0 20 20 20 20 20 20 70 43 75 72 2d 3e 70 67 6e 6f        pCur->pgno
2ced0 52 6f 6f 74 2c 20 6e 4b 65 79 2c 20 6e 44 61 74  Root, nKey, nDat
2cee0 61 2c 20 70 50 61 67 65 2d 3e 70 67 6e 6f 2c 0a  a, pPage->pgno,.
2cef0 20 20 20 20 20 20 20 20 20 20 6c 6f 63 3d 3d 30            loc==0
2cf00 20 3f 20 22 6f 76 65 72 77 72 69 74 65 22 20 3a   ? "overwrite" :
2cf10 20 22 6e 65 77 20 65 6e 74 72 79 22 29 29 3b 0a   "new entry"));.
2cf20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 2d    assert( pPage-
2cf30 3e 69 73 49 6e 69 74 20 29 3b 0a 20 20 61 6c 6c  >isInit );.  all
2cf40 6f 63 61 74 65 54 65 6d 70 53 70 61 63 65 28 70  ocateTempSpace(p
2cf50 42 74 29 3b 0a 20 20 6e 65 77 43 65 6c 6c 20 3d  Bt);.  newCell =
2cf60 20 70 42 74 2d 3e 70 54 6d 70 53 70 61 63 65 3b   pBt->pTmpSpace;
2cf70 0a 20 20 69 66 28 20 6e 65 77 43 65 6c 6c 3d 3d  .  if( newCell==
2cf80 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
2cf90 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 72 63 20 3d 20  E_NOMEM;.  rc = 
2cfa0 66 69 6c 6c 49 6e 43 65 6c 6c 28 70 50 61 67 65  fillInCell(pPage
2cfb0 2c 20 6e 65 77 43 65 6c 6c 2c 20 70 4b 65 79 2c  , newCell, pKey,
2cfc0 20 6e 4b 65 79 2c 20 70 44 61 74 61 2c 20 6e 44   nKey, pData, nD
2cfd0 61 74 61 2c 20 6e 5a 65 72 6f 2c 20 26 73 7a 4e  ata, nZero, &szN
2cfe0 65 77 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ew);.  if( rc ) 
2cff0 67 6f 74 6f 20 65 6e 64 5f 69 6e 73 65 72 74 3b  goto end_insert;
2d000 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77  .  assert( szNew
2d010 3d 3d 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 50  ==cellSizePtr(pP
2d020 61 67 65 2c 20 6e 65 77 43 65 6c 6c 29 20 29 3b  age, newCell) );
2d030 0a 20 20 61 73 73 65 72 74 28 20 73 7a 4e 65 77  .  assert( szNew
2d040 3c 3d 4d 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70  <=MX_CELL_SIZE(p
2d050 42 74 29 20 29 3b 0a 20 20 69 64 78 20 3d 20 70  Bt) );.  idx = p
2d060 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d  Cur->aiIdx[pCur-
2d070 3e 69 50 61 67 65 5d 3b 0a 20 20 69 66 28 20 6c  >iPage];.  if( l
2d080 6f 63 3d 3d 30 20 26 26 20 43 55 52 53 4f 52 5f  oc==0 && CURSOR_
2d090 56 41 4c 49 44 3d 3d 70 43 75 72 2d 3e 65 53 74  VALID==pCur->eSt
2d0a0 61 74 65 20 29 7b 0a 20 20 20 20 75 31 36 20 73  ate ){.    u16 s
2d0b0 7a 4f 6c 64 3b 0a 20 20 20 20 61 73 73 65 72 74  zOld;.    assert
2d0c0 28 20 69 64 78 3c 70 50 61 67 65 2d 3e 6e 43 65  ( idx<pPage->nCe
2d0d0 6c 6c 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ll );.    rc = s
2d0e0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
2d0f0 28 70 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29  (pPage->pDbPage)
2d100 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
2d110 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 69        goto end_i
2d120 6e 73 65 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20  nsert;.    }.   
2d130 20 6f 6c 64 43 65 6c 6c 20 3d 20 66 69 6e 64 43   oldCell = findC
2d140 65 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 29 3b  ell(pPage, idx);
2d150 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 2d  .    if( !pPage-
2d160 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 20 20 6d  >leaf ){.      m
2d170 65 6d 63 70 79 28 6e 65 77 43 65 6c 6c 2c 20 6f  emcpy(newCell, o
2d180 6c 64 43 65 6c 6c 2c 20 34 29 3b 0a 20 20 20 20  ldCell, 4);.    
2d190 7d 0a 20 20 20 20 73 7a 4f 6c 64 20 3d 20 63 65  }.    szOld = ce
2d1a0 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65 2c  llSizePtr(pPage,
2d1b0 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20 20 20 20 72   oldCell);.    r
2d1c0 63 20 3d 20 63 6c 65 61 72 43 65 6c 6c 28 70 50  c = clearCell(pP
2d1d0 61 67 65 2c 20 6f 6c 64 43 65 6c 6c 29 3b 0a 20  age, oldCell);. 
2d1e0 20 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f     if( rc ) goto
2d1f0 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 20   end_insert;.   
2d200 20 64 72 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c   dropCell(pPage,
2d210 20 69 64 78 2c 20 73 7a 4f 6c 64 29 3b 0a 20 20   idx, szOld);.  
2d220 7d 65 6c 73 65 20 69 66 28 20 6c 6f 63 3c 30 20  }else if( loc<0 
2d230 26 26 20 70 50 61 67 65 2d 3e 6e 43 65 6c 6c 3e  && pPage->nCell>
2d240 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  0 ){.    assert(
2d250 20 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a   pPage->leaf );.
2d260 20 20 20 20 69 64 78 20 3d 20 2b 2b 70 43 75 72      idx = ++pCur
2d270 2d 3e 61 69 49 64 78 5b 70 43 75 72 2d 3e 69 50  ->aiIdx[pCur->iP
2d280 61 67 65 5d 3b 0a 20 20 20 20 70 43 75 72 2d 3e  age];.    pCur->
2d290 69 6e 66 6f 2e 6e 53 69 7a 65 20 3d 20 30 3b 0a  info.nSize = 0;.
2d2a0 20 20 20 20 70 43 75 72 2d 3e 76 61 6c 69 64 4e      pCur->validN
2d2b0 4b 65 79 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  Key = 0;.  }else
2d2c0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
2d2d0 61 67 65 2d 3e 6c 65 61 66 20 29 3b 0a 20 20 7d  age->leaf );.  }
2d2e0 0a 20 20 72 63 20 3d 20 69 6e 73 65 72 74 43 65  .  rc = insertCe
2d2f0 6c 6c 28 70 50 61 67 65 2c 20 69 64 78 2c 20 6e  ll(pPage, idx, n
2d300 65 77 43 65 6c 6c 2c 20 73 7a 4e 65 77 2c 20 30  ewCell, szNew, 0
2d310 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
2d320 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
2d330 20 65 6e 64 5f 69 6e 73 65 72 74 3b 0a 20 20 72   end_insert;.  r
2d340 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72  c = balance(pCur
2d350 2c 20 31 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , 1);.  if( rc==
2d360 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2d370 20 6d 6f 76 65 54 6f 52 6f 6f 74 28 70 43 75 72   moveToRoot(pCur
2d380 29 3b 0a 20 20 7d 0a 65 6e 64 5f 69 6e 73 65 72  );.  }.end_inser
2d390 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  t:.  return rc;.
2d3a0 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
2d3b0 74 68 65 20 65 6e 74 72 79 20 74 68 61 74 20 74  the entry that t
2d3c0 68 65 20 63 75 72 73 6f 72 20 69 73 20 70 6f 69  he cursor is poi
2d3d0 6e 74 69 6e 67 20 74 6f 2e 20 20 54 68 65 20 63  nting to.  The c
2d3e0 75 72 73 6f 72 0a 2a 2a 20 69 73 20 6c 65 66 74  ursor.** is left
2d3f0 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 61 20 72   pointing at a r
2d400 61 6e 64 6f 6d 20 6c 6f 63 61 74 69 6f 6e 2e 0a  andom location..
2d410 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
2d420 72 65 65 44 65 6c 65 74 65 28 42 74 43 75 72 73  reeDelete(BtCurs
2d430 6f 72 20 2a 70 43 75 72 29 7b 0a 20 20 4d 65 6d  or *pCur){.  Mem
2d440 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 70 43  Page *pPage = pC
2d450 75 72 2d 3e 61 70 50 61 67 65 5b 70 43 75 72 2d  ur->apPage[pCur-
2d460 3e 69 50 61 67 65 5d 3b 0a 20 20 69 6e 74 20 69  >iPage];.  int i
2d470 64 78 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  dx;.  unsigned c
2d480 68 61 72 20 2a 70 43 65 6c 6c 3b 0a 20 20 69 6e  har *pCell;.  in
2d490 74 20 72 63 3b 0a 20 20 50 67 6e 6f 20 70 67 6e  t rc;.  Pgno pgn
2d4a0 6f 43 68 69 6c 64 20 3d 20 30 3b 0a 20 20 42 74  oChild = 0;.  Bt
2d4b0 72 65 65 20 2a 70 20 3d 20 70 43 75 72 2d 3e 70  ree *p = pCur->p
2d4c0 42 74 72 65 65 3b 0a 20 20 42 74 53 68 61 72 65  Btree;.  BtShare
2d4d0 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74 3b  d *pBt = p->pBt;
2d4e0 0a 0a 20 20 61 73 73 65 72 74 28 20 63 75 72 73  ..  assert( curs
2d4f0 6f 72 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 75  orHoldsMutex(pCu
2d500 72 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  r) );.  assert( 
2d510 70 50 61 67 65 2d 3e 69 73 49 6e 69 74 20 29 3b  pPage->isInit );
2d520 0a 20 20 69 66 28 20 70 42 74 2d 3e 69 6e 54 72  .  if( pBt->inTr
2d530 61 6e 73 61 63 74 69 6f 6e 21 3d 54 52 41 4e 53  ansaction!=TRANS
2d540 5f 57 52 49 54 45 20 29 7b 0a 20 20 20 20 2f 2a  _WRITE ){.    /*
2d550 20 4d 75 73 74 20 73 74 61 72 74 20 61 20 74 72   Must start a tr
2d560 61 6e 73 61 63 74 69 6f 6e 20 62 65 66 6f 72 65  ansaction before
2d570 20 64 6f 69 6e 67 20 61 20 64 65 6c 65 74 65 20   doing a delete 
2d580 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d  */.    rc = pBt-
2d590 3e 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49  >readOnly ? SQLI
2d5a0 54 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51  TE_READONLY : SQ
2d5b0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
2d5c0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
2d5d0 20 61 73 73 65 72 74 28 20 21 70 42 74 2d 3e 72   assert( !pBt->r
2d5e0 65 61 64 4f 6e 6c 79 20 29 3b 0a 20 20 69 66 28  eadOnly );.  if(
2d5f0 20 70 43 75 72 2d 3e 65 53 74 61 74 65 3d 3d 43   pCur->eState==C
2d600 55 52 53 4f 52 5f 46 41 55 4c 54 20 29 7b 0a 20  URSOR_FAULT ){. 
2d610 20 20 20 72 65 74 75 72 6e 20 70 43 75 72 2d 3e     return pCur->
2d620 73 6b 69 70 3b 0a 20 20 7d 0a 20 20 69 66 28 20  skip;.  }.  if( 
2d630 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2d640 2d 3e 69 50 61 67 65 5d 3e 3d 70 50 61 67 65 2d  ->iPage]>=pPage-
2d650 3e 6e 43 65 6c 6c 20 29 7b 0a 20 20 20 20 72 65  >nCell ){.    re
2d660 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
2d670 52 3b 20 20 2f 2a 20 54 68 65 20 63 75 72 73 6f  R;  /* The curso
2d680 72 20 69 73 20 6e 6f 74 20 70 6f 69 6e 74 69 6e  r is not pointin
2d690 67 20 74 6f 20 61 6e 79 74 68 69 6e 67 20 2a 2f  g to anything */
2d6a0 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 43 75 72  .  }.  if( !pCur
2d6b0 2d 3e 77 72 46 6c 61 67 20 29 7b 0a 20 20 20 20  ->wrFlag ){.    
2d6c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45  return SQLITE_PE
2d6d0 52 4d 3b 20 20 20 2f 2a 20 44 69 64 20 6e 6f 74  RM;   /* Did not
2d6e0 20 6f 70 65 6e 20 74 68 69 73 20 63 75 72 73 6f   open this curso
2d6f0 72 20 66 6f 72 20 77 72 69 74 69 6e 67 20 2a 2f  r for writing */
2d700 0a 20 20 7d 0a 20 20 69 66 28 20 63 68 65 63 6b  .  }.  if( check
2d710 52 65 61 64 4c 6f 63 6b 73 28 70 43 75 72 2d 3e  ReadLocks(pCur->
2d720 70 42 74 72 65 65 2c 20 70 43 75 72 2d 3e 70 67  pBtree, pCur->pg
2d730 6e 6f 52 6f 6f 74 2c 20 70 43 75 72 2c 20 70 43  noRoot, pCur, pC
2d740 75 72 2d 3e 69 6e 66 6f 2e 6e 4b 65 79 29 20 29  ur->info.nKey) )
2d750 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
2d760 49 54 45 5f 4c 4f 43 4b 45 44 3b 20 2f 2a 20 54  ITE_LOCKED; /* T
2d770 68 65 20 74 61 62 6c 65 20 70 43 75 72 20 70 6f  he table pCur po
2d780 69 6e 74 73 20 74 6f 20 68 61 73 20 61 20 72 65  ints to has a re
2d790 61 64 20 6c 6f 63 6b 20 2a 2f 0a 20 20 7d 0a 0a  ad lock */.  }..
2d7a0 20 20 2f 2a 20 52 65 73 74 6f 72 65 20 74 68 65    /* Restore the
2d7b0 20 63 75 72 72 65 6e 74 20 63 75 72 73 6f 72 20   current cursor 
2d7c0 70 6f 73 69 74 69 6f 6e 20 28 61 20 6e 6f 2d 6f  position (a no-o
2d7d0 70 20 69 66 20 74 68 65 20 63 75 72 73 6f 72 20  p if the cursor 
2d7e0 69 73 20 6e 6f 74 20 69 6e 20 0a 20 20 2a 2a 20  is not in .  ** 
2d7f0 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
2d800 45 4b 20 73 74 61 74 65 29 20 61 6e 64 20 73 61  EK state) and sa
2d810 76 65 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  ve the positions
2d820 20 6f 66 20 61 6e 79 20 6f 74 68 65 72 20 63 75   of any other cu
2d830 72 73 6f 72 73 20 0a 20 20 2a 2a 20 6f 70 65 6e  rsors .  ** open
2d840 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 74 61 62   on the same tab
2d850 6c 65 2e 20 54 68 65 6e 20 63 61 6c 6c 20 73 71  le. Then call sq
2d860 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2d870 29 20 6f 6e 20 74 68 65 20 70 61 67 65 0a 20 20  ) on the page.  
2d880 2a 2a 20 74 68 61 74 20 74 68 65 20 65 6e 74 72  ** that the entr
2d890 79 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65  y will be delete
2d8a0 64 20 66 72 6f 6d 2e 0a 20 20 2a 2f 0a 20 20 69  d from..  */.  i
2d8b0 66 28 20 0a 20 20 20 20 28 72 63 20 3d 20 72 65  f( .    (rc = re
2d8c0 73 74 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74  storeCursorPosit
2d8d0 69 6f 6e 28 70 43 75 72 29 29 21 3d 30 20 7c 7c  ion(pCur))!=0 ||
2d8e0 0a 20 20 20 20 28 72 63 20 3d 20 73 61 76 65 41  .    (rc = saveA
2d8f0 6c 6c 43 75 72 73 6f 72 73 28 70 42 74 2c 20 70  llCursors(pBt, p
2d900 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
2d910 43 75 72 29 29 21 3d 30 20 7c 7c 0a 20 20 20 20  Cur))!=0 ||.    
2d920 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (rc = sqlite3Pag
2d930 65 72 57 72 69 74 65 28 70 50 61 67 65 2d 3e 70  erWrite(pPage->p
2d940 44 62 50 61 67 65 29 29 21 3d 30 0a 20 20 29 7b  DbPage))!=0.  ){
2d950 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2d960 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
2d970 20 74 68 65 20 63 65 6c 6c 20 77 69 74 68 69 6e   the cell within
2d980 20 69 74 73 20 70 61 67 65 20 61 6e 64 20 6c 65   its page and le
2d990 61 76 65 20 70 43 65 6c 6c 20 70 6f 69 6e 74 69  ave pCell pointi
2d9a0 6e 67 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64  ng to the.  ** d
2d9b0 61 74 61 2e 20 54 68 65 20 63 6c 65 61 72 43 65  ata. The clearCe
2d9c0 6c 6c 28 29 20 63 61 6c 6c 20 66 72 65 65 73 20  ll() call frees 
2d9d0 61 6e 79 20 6f 76 65 72 66 6c 6f 77 20 70 61 67  any overflow pag
2d9e0 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
2d9f0 74 68 20 74 68 65 0a 20 20 2a 2a 20 63 65 6c 6c  th the.  ** cell
2da00 2e 20 54 68 65 20 63 65 6c 6c 20 69 74 73 65 6c  . The cell itsel
2da10 66 20 69 73 20 73 74 69 6c 6c 20 69 6e 74 61 63  f is still intac
2da20 74 2e 0a 20 20 2a 2f 0a 20 20 69 64 78 20 3d 20  t..  */.  idx = 
2da30 70 43 75 72 2d 3e 61 69 49 64 78 5b 70 43 75 72  pCur->aiIdx[pCur
2da40 2d 3e 69 50 61 67 65 5d 3b 0a 20 20 70 43 65 6c  ->iPage];.  pCel
2da50 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 50 61  l = findCell(pPa
2da60 67 65 2c 20 69 64 78 29 3b 0a 20 20 69 66 28 20  ge, idx);.  if( 
2da70 21 70 50 61 67 65 2d 3e 6c 65 61 66 20 29 7b 0a  !pPage->leaf ){.
2da80 20 20 20 20 70 67 6e 6f 43 68 69 6c 64 20 3d 20      pgnoChild = 
2da90 67 65 74 34 62 79 74 65 28 70 43 65 6c 6c 29 3b  get4byte(pCell);
2daa0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 63 6c 65 61  .  }.  rc = clea
2dab0 72 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65  rCell(pPage, pCe
2dac0 6c 6c 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ll);.  if( rc ){
2dad0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
2dae0 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67    }..  if( !pPag
2daf0 65 2d 3e 6c 65 61 66 20 29 7b 0a 20 20 20 20 2f  e->leaf ){.    /
2db00 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 65 6e 74  *.    ** The ent
2db10 72 79 20 77 65 20 61 72 65 20 61 62 6f 75 74 20  ry we are about 
2db20 74 6f 20 64 65 6c 65 74 65 20 69 73 20 6e 6f 74  to delete is not
2db30 20 61 20 6c 65 61 66 20 73 6f 20 69 66 20 77 65   a leaf so if we
2db40 20 64 6f 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 64   do not.    ** d
2db50 6f 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 20 77  o something we w
2db60 69 6c 6c 20 6c 65 61 76 65 20 61 20 68 6f 6c 65  ill leave a hole
2db70 20 6f 6e 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   on an internal 
2db80 70 61 67 65 2e 0a 20 20 20 20 2a 2a 20 57 65 20  page..    ** We 
2db90 68 61 76 65 20 74 6f 20 66 69 6c 6c 20 74 68 65  have to fill the
2dba0 20 68 6f 6c 65 20 62 79 20 6d 6f 76 69 6e 67 20   hole by moving 
2dbb0 69 6e 20 61 20 63 65 6c 6c 20 66 72 6f 6d 20 61  in a cell from a
2dbc0 20 6c 65 61 66 2e 20 20 54 68 65 0a 20 20 20 20   leaf.  The.    
2dbd0 2a 2a 20 6e 65 78 74 20 43 65 6c 6c 20 61 66 74  ** next Cell aft
2dbe0 65 72 20 74 68 65 20 6f 6e 65 20 74 6f 20 62 65  er the one to be
2dbf0 20 64 65 6c 65 74 65 64 20 69 73 20 67 75 61 72   deleted is guar
2dc00 61 6e 74 65 65 64 20 74 6f 20 65 78 69 73 74 20  anteed to exist 
2dc10 61 6e 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65  and.    ** to be
2dc20 20 61 20 6c 65 61 66 20 73 6f 20 77 65 20 63 61   a leaf so we ca
2dc30 6e 20 75 73 65 20 69 74 2e 0a 20 20 20 20 2a 2f  n use it..    */
2dc40 0a 20 20 20 20 42 74 43 75 72 73 6f 72 20 6c 65  .    BtCursor le
2dc50 61 66 43 75 72 3b 0a 20 20 20 20 4d 65 6d 50 61  afCur;.    MemPa
2dc60 67 65 20 2a 70 4c 65 61 66 50 61 67 65 3b 0a 20  ge *pLeafPage;. 
2dc70 20 20 20 69 6e 74 20 69 4c 65 61 66 49 64 78 3b     int iLeafIdx;
2dc80 0a 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20 63  ..    unsigned c
2dc90 68 61 72 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20  har *pNext;.    
2dca0 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20  int notUsed;.   
2dcb0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2dcc0 74 65 6d 70 43 65 6c 6c 20 3d 20 30 3b 0a 20 20  tempCell = 0;.  
2dcd0 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
2dce0 2d 3e 69 6e 74 4b 65 79 20 29 3b 0a 20 20 20 20  ->intKey );.    
2dcf0 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 54  sqlite3BtreeGetT
2dd00 65 6d 70 43 75 72 73 6f 72 28 70 43 75 72 2c 20  empCursor(pCur, 
2dd10 26 6c 65 61 66 43 75 72 29 3b 0a 20 20 20 20 72  &leafCur);.    r
2dd20 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2dd30 4e 65 78 74 28 26 6c 65 61 66 43 75 72 2c 20 26  Next(&leafCur, &
2dd40 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66  notUsed);.    if
2dd50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2dd60 29 7b 0a 20 20 20 20 20 20 70 4c 65 61 66 50 61  ){.      pLeafPa
2dd70 67 65 20 3d 20 6c 65 61 66 43 75 72 2e 61 70 50  ge = leafCur.apP
2dd80 61 67 65 5b 6c 65 61 66 43 75 72 2e 69 50 61 67  age[leafCur.iPag
2dd90 65 5d 3b 0a 20 20 20 20 20 20 69 4c 65 61 66 49  e];.      iLeafI
2dda0 64 78 20 3d 20 6c 65 61 66 43 75 72 2e 61 69 49  dx = leafCur.aiI
2ddb0 64 78 5b 6c 65 61 66 43 75 72 2e 69 50 61 67 65  dx[leafCur.iPage
2ddc0 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ];.      rc = sq
2ddd0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
2dde0 70 4c 65 61 66 50 61 67 65 2d 3e 70 44 62 50 61  pLeafPage->pDbPa
2ddf0 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ge);.    }.    i
2de00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2de10 20 29 7b 0a 20 20 20 20 20 20 75 31 36 20 73 7a   ){.      u16 sz
2de20 4e 65 78 74 3b 0a 20 20 20 20 20 20 54 52 41 43  Next;.      TRAC
2de30 45 28 28 22 44 45 4c 45 54 45 3a 20 74 61 62 6c  E(("DELETE: tabl
2de40 65 3d 25 64 20 64 65 6c 65 74 65 20 69 6e 74 65  e=%d delete inte
2de50 72 6e 61 6c 20 66 72 6f 6d 20 25 64 20 72 65 70  rnal from %d rep
2de60 6c 61 63 65 20 66 72 6f 6d 20 6c 65 61 66 20 25  lace from leaf %
2de70 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70  d\n",.         p
2de80 43 75 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70  Cur->pgnoRoot, p
2de90 50 61 67 65 2d 3e 70 67 6e 6f 2c 20 70 4c 65 61  Page->pgno, pLea
2dea0 66 50 61 67 65 2d 3e 70 67 6e 6f 29 29 3b 0a 20  fPage->pgno));. 
2deb0 20 20 20 20 20 64 72 6f 70 43 65 6c 6c 28 70 50       dropCell(pP
2dec0 61 67 65 2c 20 69 64 78 2c 20 63 65 6c 6c 53 69  age, idx, cellSi
2ded0 7a 65 50 74 72 28 70 50 61 67 65 2c 20 70 43 65  zePtr(pPage, pCe
2dee0 6c 6c 29 29 3b 0a 20 20 20 20 20 20 70 4e 65 78  ll));.      pNex
2def0 74 20 3d 20 66 69 6e 64 43 65 6c 6c 28 70 4c 65  t = findCell(pLe
2df00 61 66 50 61 67 65 2c 20 69 4c 65 61 66 49 64 78  afPage, iLeafIdx
2df10 29 3b 0a 20 20 20 20 20 20 73 7a 4e 65 78 74 20  );.      szNext 
2df20 3d 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70 4c  = cellSizePtr(pL
2df30 65 61 66 50 61 67 65 2c 20 70 4e 65 78 74 29 3b  eafPage, pNext);
2df40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 4d  .      assert( M
2df50 58 5f 43 45 4c 4c 5f 53 49 5a 45 28 70 42 74 29  X_CELL_SIZE(pBt)
2df60 3e 3d 73 7a 4e 65 78 74 2b 34 20 29 3b 0a 20 20  >=szNext+4 );.  
2df70 20 20 20 20 61 6c 6c 6f 63 61 74 65 54 65 6d 70      allocateTemp
2df80 53 70 61 63 65 28 70 42 74 29 3b 0a 20 20 20 20  Space(pBt);.    
2df90 20 20 74 65 6d 70 43 65 6c 6c 20 3d 20 70 42 74    tempCell = pBt
2dfa0 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20  ->pTmpSpace;.   
2dfb0 20 20 20 69 66 28 20 74 65 6d 70 43 65 6c 6c 3d     if( tempCell=
2dfc0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
2dfd0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
2dfe0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2dff0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2e000 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2e010 20 69 6e 73 65 72 74 43 65 6c 6c 28 70 50 61 67   insertCell(pPag
2e020 65 2c 20 69 64 78 2c 20 70 4e 65 78 74 2d 34 2c  e, idx, pNext-4,
2e030 20 73 7a 4e 65 78 74 2b 34 2c 20 74 65 6d 70 43   szNext+4, tempC
2e040 65 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ell, 0);.      }
2e050 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2e060 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2e070 20 20 20 20 70 75 74 34 62 79 74 65 28 66 69 6e      put4byte(fin
2e080 64 4f 76 65 72 66 6c 6f 77 43 65 6c 6c 28 70 50  dOverflowCell(pP
2e090 61 67 65 2c 20 69 64 78 29 2c 20 70 67 6e 6f 43  age, idx), pgnoC
2e0a0 68 69 6c 64 29 3b 0a 20 20 20 20 20 20 20 20 72  hild);.        r
2e0b0 63 20 3d 20 62 61 6c 61 6e 63 65 28 70 43 75 72  c = balance(pCur
2e0c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
2e0d0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2e0e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2e0f0 20 64 72 6f 70 43 65 6c 6c 28 70 4c 65 61 66 50   dropCell(pLeafP
2e100 61 67 65 2c 20 69 4c 65 61 66 49 64 78 2c 20 73  age, iLeafIdx, s
2e110 7a 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20  zNext);.        
2e120 72 63 20 3d 20 62 61 6c 61 6e 63 65 28 26 6c 65  rc = balance(&le
2e130 61 66 43 75 72 2c 20 30 29 3b 0a 20 20 20 20 20  afCur, 0);.     
2e140 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
2e150 69 74 65 33 42 74 72 65 65 52 65 6c 65 61 73 65  ite3BtreeRelease
2e160 54 65 6d 70 43 75 72 73 6f 72 28 26 6c 65 61 66  TempCursor(&leaf
2e170 43 75 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Cur);.  }else{. 
2e180 20 20 20 54 52 41 43 45 28 28 22 44 45 4c 45 54     TRACE(("DELET
2e190 45 3a 20 74 61 62 6c 65 3d 25 64 20 64 65 6c 65  E: table=%d dele
2e1a0 74 65 20 66 72 6f 6d 20 6c 65 61 66 20 25 64 5c  te from leaf %d\
2e1b0 6e 22 2c 0a 20 20 20 20 20 20 20 70 43 75 72 2d  n",.       pCur-
2e1c0 3e 70 67 6e 6f 52 6f 6f 74 2c 20 70 50 61 67 65  >pgnoRoot, pPage
2e1d0 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 64 72  ->pgno));.    dr
2e1e0 6f 70 43 65 6c 6c 28 70 50 61 67 65 2c 20 69 64  opCell(pPage, id
2e1f0 78 2c 20 63 65 6c 6c 53 69 7a 65 50 74 72 28 70  x, cellSizePtr(p
2e200 50 61 67 65 2c 20 70 43 65 6c 6c 29 29 3b 0a 20  Page, pCell));. 
2e210 20 20 20 72 63 20 3d 20 62 61 6c 61 6e 63 65 28     rc = balance(
2e220 70 43 75 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  pCur, 0);.  }.  
2e230 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2e240 4b 20 29 7b 0a 20 20 20 20 6d 6f 76 65 54 6f 52  K ){.    moveToR
2e250 6f 6f 74 28 70 43 75 72 29 3b 0a 20 20 7d 0a 20  oot(pCur);.  }. 
2e260 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2e270 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65  *.** Create a ne
2e280 77 20 42 54 72 65 65 20 74 61 62 6c 65 2e 20 20  w BTree table.  
2e290 57 72 69 74 65 20 69 6e 74 6f 20 2a 70 69 54 61  Write into *piTa
2e2a0 62 6c 65 20 74 68 65 20 70 61 67 65 0a 2a 2a 20  ble the page.** 
2e2b0 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 72  number for the r
2e2c0 6f 6f 74 20 70 61 67 65 20 6f 66 20 74 68 65 20  oot page of the 
2e2d0 6e 65 77 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  new table..**.**
2e2e0 20 54 68 65 20 74 79 70 65 20 6f 66 20 74 79 70   The type of typ
2e2f0 65 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20  e is determined 
2e300 62 79 20 74 68 65 20 66 6c 61 67 73 20 70 61 72  by the flags par
2e310 61 6d 65 74 65 72 2e 20 20 4f 6e 6c 79 20 74 68  ameter.  Only th
2e320 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 76  e.** following v
2e330 61 6c 75 65 73 20 6f 66 20 66 6c 61 67 73 20 61  alues of flags a
2e340 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  re currently in 
2e350 75 73 65 2e 20 20 4f 74 68 65 72 20 76 61 6c 75  use.  Other valu
2e360 65 73 20 66 6f 72 0a 2a 2a 20 66 6c 61 67 73 20  es for.** flags 
2e370 6d 69 67 68 74 20 6e 6f 74 20 77 6f 72 6b 3a 0a  might not work:.
2e380 2a 2a 0a 2a 2a 20 20 20 20 20 42 54 52 45 45 5f  **.**     BTREE_
2e390 49 4e 54 4b 45 59 7c 42 54 52 45 45 5f 4c 45 41  INTKEY|BTREE_LEA
2e3a0 46 44 41 54 41 20 20 20 20 20 55 73 65 64 20 66  FDATA     Used f
2e3b0 6f 72 20 53 51 4c 20 74 61 62 6c 65 73 20 77 69  or SQL tables wi
2e3c0 74 68 20 72 6f 77 69 64 20 6b 65 79 73 0a 2a 2a  th rowid keys.**
2e3d0 20 20 20 20 20 42 54 52 45 45 5f 5a 45 52 4f 44       BTREE_ZEROD
2e3e0 41 54 41 20 20 20 20 20 20 20 20 20 20 20 20 20  ATA             
2e3f0 20 20 20 20 20 55 73 65 64 20 66 6f 72 20 53 51       Used for SQ
2e400 4c 20 69 6e 64 69 63 65 73 0a 2a 2f 0a 73 74 61  L indices.*/.sta
2e410 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 72 65  tic int btreeCre
2e420 61 74 65 54 61 62 6c 65 28 42 74 72 65 65 20 2a  ateTable(Btree *
2e430 70 2c 20 69 6e 74 20 2a 70 69 54 61 62 6c 65 2c  p, int *piTable,
2e440 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 42   int flags){.  B
2e450 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
2e460 2d 3e 70 42 74 3b 0a 20 20 4d 65 6d 50 61 67 65  ->pBt;.  MemPage
2e470 20 2a 70 52 6f 6f 74 3b 0a 20 20 50 67 6e 6f 20   *pRoot;.  Pgno 
2e480 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 69 6e 74 20  pgnoRoot;.  int 
2e490 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  rc;..  assert( s
2e4a0 71 6c 69 74 65 33 42 74 72 65 65 48 6f 6c 64 73  qlite3BtreeHolds
2e4b0 4d 75 74 65 78 28 70 29 20 29 3b 0a 20 20 69 66  Mutex(p) );.  if
2e4c0 28 20 70 42 74 2d 3e 69 6e 54 72 61 6e 73 61 63  ( pBt->inTransac
2e4d0 74 69 6f 6e 21 3d 54 52 41 4e 53 5f 57 52 49 54  tion!=TRANS_WRIT
2e4e0 45 20 29 7b 0a 20 20 20 20 2f 2a 20 4d 75 73 74  E ){.    /* Must
2e4f0 20 73 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   start a transac
2e500 74 69 6f 6e 20 66 69 72 73 74 20 2a 2f 0a 20 20  tion first */.  
2e510 20 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64    rc = pBt->read
2e520 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45  Only ? SQLITE_RE
2e530 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f  ADONLY : SQLITE_
2e540 45 52 52 4f 52 3b 0a 20 20 20 20 72 65 74 75 72  ERROR;.    retur
2e550 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
2e560 72 74 28 20 21 70 42 74 2d 3e 72 65 61 64 4f 6e  rt( !pBt->readOn
2e570 6c 79 20 29 3b 0a 0a 23 69 66 64 65 66 20 53 51  ly );..#ifdef SQ
2e580 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
2e590 43 55 55 4d 0a 20 20 72 63 20 3d 20 61 6c 6c 6f  CUUM.  rc = allo
2e5a0 63 61 74 65 42 74 72 65 65 50 61 67 65 28 70 42  cateBtreePage(pB
2e5b0 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67 6e 6f  t, &pRoot, &pgno
2e5c0 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 69  Root, 1, 0);.  i
2e5d0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74  f( rc ){.    ret
2e5e0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6c 73  urn rc;.  }.#els
2e5f0 65 0a 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74  e.  if( pBt->aut
2e600 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 50  oVacuum ){.    P
2e610 67 6e 6f 20 70 67 6e 6f 4d 6f 76 65 3b 20 20 20  gno pgnoMove;   
2e620 20 20 20 2f 2a 20 4d 6f 76 65 20 61 20 70 61 67     /* Move a pag
2e630 65 20 68 65 72 65 20 74 6f 20 6d 61 6b 65 20 72  e here to make r
2e640 6f 6f 6d 20 66 6f 72 20 74 68 65 20 72 6f 6f 74  oom for the root
2e650 2d 70 61 67 65 20 2a 2f 0a 20 20 20 20 4d 65 6d  -page */.    Mem
2e660 50 61 67 65 20 2a 70 50 61 67 65 4d 6f 76 65 3b  Page *pPageMove;
2e670 20 2f 2a 20 54 68 65 20 70 61 67 65 20 74 6f 20   /* The page to 
2e680 6d 6f 76 65 20 74 6f 2e 20 2a 2f 0a 0a 20 20 20  move to. */..   
2e690 20 2f 2a 20 43 72 65 61 74 69 6e 67 20 61 20 6e   /* Creating a n
2e6a0 65 77 20 74 61 62 6c 65 20 6d 61 79 20 70 72 6f  ew table may pro
2e6b0 62 61 62 6c 79 20 72 65 71 75 69 72 65 20 6d 6f  bably require mo
2e6c0 76 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e 67  ving an existing
2e6d0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a   database.    **
2e6e0 20 74 6f 20 6d 61 6b 65 20 72 6f 6f 6d 20 66 6f   to make room fo
2e6f0 72 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65 73  r the new tables
2e700 20 72 6f 6f 74 20 70 61 67 65 2e 20 49 6e 20 63   root page. In c
2e710 61 73 65 20 74 68 69 73 20 70 61 67 65 20 74 75  ase this page tu
2e720 72 6e 73 0a 20 20 20 20 2a 2a 20 6f 75 74 20 74  rns.    ** out t
2e730 6f 20 62 65 20 61 6e 20 6f 76 65 72 66 6c 6f 77  o be an overflow
2e740 20 70 61 67 65 2c 20 64 65 6c 65 74 65 20 61 6c   page, delete al
2e750 6c 20 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 2d  l overflow page-
2e760 6d 61 70 20 63 61 63 68 65 73 0a 20 20 20 20 2a  map caches.    *
2e770 2a 20 68 65 6c 64 20 62 79 20 6f 70 65 6e 20 63  * held by open c
2e780 75 72 73 6f 72 73 2e 0a 20 20 20 20 2a 2f 0a 20  ursors..    */. 
2e790 20 20 20 69 6e 76 61 6c 69 64 61 74 65 41 6c 6c     invalidateAll
2e7a0 4f 76 65 72 66 6c 6f 77 43 61 63 68 65 28 70 42  OverflowCache(pB
2e7b0 74 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64  t);..    /* Read
2e7c0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6d 65   the value of me
2e7d0 74 61 5b 33 5d 20 66 72 6f 6d 20 74 68 65 20 64  ta[3] from the d
2e7e0 61 74 61 62 61 73 65 20 74 6f 20 64 65 74 65 72  atabase to deter
2e7f0 6d 69 6e 65 20 77 68 65 72 65 20 74 68 65 0a 20  mine where the. 
2e800 20 20 20 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20     ** root page 
2e810 6f 66 20 74 68 65 20 6e 65 77 20 74 61 62 6c 65  of the new table
2e820 20 73 68 6f 75 6c 64 20 67 6f 2e 20 6d 65 74 61   should go. meta
2e830 5b 33 5d 20 69 73 20 74 68 65 20 6c 61 72 67 65  [3] is the large
2e840 73 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20  st root-page.   
2e850 20 2a 2a 20 63 72 65 61 74 65 64 20 73 6f 20 66   ** created so f
2e860 61 72 2c 20 73 6f 20 74 68 65 20 6e 65 77 20 72  ar, so the new r
2e870 6f 6f 74 2d 70 61 67 65 20 69 73 20 28 6d 65 74  oot-page is (met
2e880 61 5b 33 5d 2b 31 29 2e 0a 20 20 20 20 2a 2f 0a  a[3]+1)..    */.
2e890 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2e8a0 42 74 72 65 65 47 65 74 4d 65 74 61 28 70 2c 20  BtreeGetMeta(p, 
2e8b0 34 2c 20 26 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20  4, &pgnoRoot);. 
2e8c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2e8d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
2e8e0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
2e8f0 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a 0a     pgnoRoot++;..
2e900 20 20 20 20 2f 2a 20 54 68 65 20 6e 65 77 20 72      /* The new r
2e910 6f 6f 74 2d 70 61 67 65 20 6d 61 79 20 6e 6f 74  oot-page may not
2e920 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20 6f 6e   be allocated on
2e930 20 61 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 70   a pointer-map p
2e940 61 67 65 2c 20 6f 72 20 74 68 65 0a 20 20 20 20  age, or the.    
2e950 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20  ** PENDING_BYTE 
2e960 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  page..    */.   
2e970 20 77 68 69 6c 65 28 20 70 67 6e 6f 52 6f 6f 74   while( pgnoRoot
2e980 3d 3d 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28  ==PTRMAP_PAGENO(
2e990 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 29 20 7c  pBt, pgnoRoot) |
2e9a0 7c 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 52 6f  |.        pgnoRo
2e9b0 6f 74 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ot==PENDING_BYTE
2e9c0 5f 50 41 47 45 28 70 42 74 29 20 29 7b 0a 20 20  _PAGE(pBt) ){.  
2e9d0 20 20 20 20 70 67 6e 6f 52 6f 6f 74 2b 2b 3b 0a      pgnoRoot++;.
2e9e0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
2e9f0 28 20 70 67 6e 6f 52 6f 6f 74 3e 3d 33 20 29 3b  ( pgnoRoot>=3 );
2ea00 0a 0a 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  ..    /* Allocat
2ea10 65 20 61 20 70 61 67 65 2e 20 54 68 65 20 70 61  e a page. The pa
2ea20 67 65 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c  ge that currentl
2ea30 79 20 72 65 73 69 64 65 73 20 61 74 20 70 67 6e  y resides at pgn
2ea40 6f 52 6f 6f 74 20 77 69 6c 6c 0a 20 20 20 20 2a  oRoot will.    *
2ea50 2a 20 62 65 20 6d 6f 76 65 64 20 74 6f 20 74 68  * be moved to th
2ea60 65 20 61 6c 6c 6f 63 61 74 65 64 20 70 61 67 65  e allocated page
2ea70 20 28 75 6e 6c 65 73 73 20 74 68 65 20 61 6c 6c   (unless the all
2ea80 6f 63 61 74 65 64 20 70 61 67 65 20 68 61 70 70  ocated page happ
2ea90 65 6e 73 0a 20 20 20 20 2a 2a 20 74 6f 20 72 65  ens.    ** to re
2eaa0 73 69 64 65 20 61 74 20 70 67 6e 6f 52 6f 6f 74  side at pgnoRoot
2eab0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  )..    */.    rc
2eac0 20 3d 20 61 6c 6c 6f 63 61 74 65 42 74 72 65 65   = allocateBtree
2ead0 50 61 67 65 28 70 42 74 2c 20 26 70 50 61 67 65  Page(pBt, &pPage
2eae0 4d 6f 76 65 2c 20 26 70 67 6e 6f 4d 6f 76 65 2c  Move, &pgnoMove,
2eaf0 20 70 67 6e 6f 52 6f 6f 74 2c 20 31 29 3b 0a 20   pgnoRoot, 1);. 
2eb00 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2eb10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
2eb20 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
2eb30 20 20 20 20 69 66 28 20 70 67 6e 6f 4d 6f 76 65      if( pgnoMove
2eb40 21 3d 70 67 6e 6f 52 6f 6f 74 20 29 7b 0a 20 20  !=pgnoRoot ){.  
2eb50 20 20 20 20 2f 2a 20 70 67 6e 6f 52 6f 6f 74 20      /* pgnoRoot 
2eb60 69 73 20 74 68 65 20 70 61 67 65 20 74 68 61 74  is the page that
2eb70 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20 66 6f   will be used fo
2eb80 72 20 74 68 65 20 72 6f 6f 74 2d 70 61 67 65 20  r the root-page 
2eb90 6f 66 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  of.      ** the 
2eba0 6e 65 77 20 74 61 62 6c 65 20 28 61 73 73 75 6d  new table (assum
2ebb0 69 6e 67 20 61 6e 20 65 72 72 6f 72 20 64 69 64  ing an error did
2ebc0 20 6e 6f 74 20 6f 63 63 75 72 29 2e 20 42 75 74   not occur). But
2ebd0 20 77 65 20 77 65 72 65 0a 20 20 20 20 20 20 2a   we were.      *
2ebe0 2a 20 61 6c 6c 6f 63 61 74 65 64 20 70 67 6e 6f  * allocated pgno
2ebf0 4d 6f 76 65 2e 20 49 66 20 72 65 71 75 69 72 65  Move. If require
2ec00 64 20 28 69 2e 65 2e 20 69 66 20 69 74 20 77 61  d (i.e. if it wa
2ec10 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 0a  s not allocated.
2ec20 20 20 20 20 20 20 2a 2a 20 62 79 20 65 78 74 65        ** by exte
2ec30 6e 64 69 6e 67 20 74 68 65 20 66 69 6c 65 29 2c  nding the file),
2ec40 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
2ec50 65 20 61 74 20 70 6f 73 69 74 69 6f 6e 20 70 67  e at position pg
2ec60 6e 6f 4d 6f 76 65 0a 20 20 20 20 20 20 2a 2a 20  noMove.      ** 
2ec70 69 73 20 61 6c 72 65 61 64 79 20 6a 6f 75 72 6e  is already journ
2ec80 61 6c 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  aled..      */. 
2ec90 20 20 20 20 20 75 38 20 65 54 79 70 65 3b 0a 20       u8 eType;. 
2eca0 20 20 20 20 20 50 67 6e 6f 20 69 50 74 72 50 61       Pgno iPtrPa
2ecb0 67 65 3b 0a 0a 20 20 20 20 20 20 72 65 6c 65 61  ge;..      relea
2ecc0 73 65 50 61 67 65 28 70 50 61 67 65 4d 6f 76 65  sePage(pPageMove
2ecd0 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 4d 6f 76  );..      /* Mov
2ece0 65 20 74 68 65 20 70 61 67 65 20 63 75 72 72 65  e the page curre
2ecf0 6e 74 6c 79 20 61 74 20 70 67 6e 6f 52 6f 6f 74  ntly at pgnoRoot
2ed00 20 74 6f 20 70 67 6e 6f 4d 6f 76 65 2e 20 2a 2f   to pgnoMove. */
2ed10 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2ed20 74 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28  te3BtreeGetPage(
2ed30 70 42 74 2c 20 70 67 6e 6f 52 6f 6f 74 2c 20 26  pBt, pgnoRoot, &
2ed40 70 52 6f 6f 74 2c 20 30 29 3b 0a 20 20 20 20 20  pRoot, 0);.     
2ed50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2ed60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  OK ){.        re
2ed70 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
2ed80 0a 20 20 20 20 20 20 72 63 20 3d 20 70 74 72 6d  .      rc = ptrm
2ed90 61 70 47 65 74 28 70 42 74 2c 20 70 67 6e 6f 52  apGet(pBt, pgnoR
2eda0 6f 6f 74 2c 20 26 65 54 79 70 65 2c 20 26 69 50  oot, &eType, &iP
2edb0 74 72 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  trPage);.      i
2edc0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2edd0 20 7c 7c 20 65 54 79 70 65 3d 3d 50 54 52 4d 41   || eType==PTRMA
2ede0 50 5f 52 4f 4f 54 50 41 47 45 20 7c 7c 20 65 54  P_ROOTPAGE || eT
2edf0 79 70 65 3d 3d 50 54 52 4d 41 50 5f 46 52 45 45  ype==PTRMAP_FREE
2ee00 50 41 47 45 20 29 7b 0a 20 20 20 20 20 20 20 20  PAGE ){.        
2ee10 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
2ee20 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
2ee30 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
2ee40 20 20 20 20 20 61 73 73 65 72 74 28 20 65 54 79       assert( eTy
2ee50 70 65 21 3d 50 54 52 4d 41 50 5f 52 4f 4f 54 50  pe!=PTRMAP_ROOTP
2ee60 41 47 45 20 29 3b 0a 20 20 20 20 20 20 61 73 73  AGE );.      ass
2ee70 65 72 74 28 20 65 54 79 70 65 21 3d 50 54 52 4d  ert( eType!=PTRM
2ee80 41 50 5f 46 52 45 45 50 41 47 45 20 29 3b 0a 20  AP_FREEPAGE );. 
2ee90 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2eea0 33 50 61 67 65 72 57 72 69 74 65 28 70 52 6f 6f  3PagerWrite(pRoo
2eeb0 74 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  t->pDbPage);.   
2eec0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
2eed0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
2eee0 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
2eef0 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
2ef00 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
2ef10 20 20 20 20 20 72 63 20 3d 20 72 65 6c 6f 63 61       rc = reloca
2ef20 74 65 50 61 67 65 28 70 42 74 2c 20 70 52 6f 6f  tePage(pBt, pRoo
2ef30 74 2c 20 65 54 79 70 65 2c 20 69 50 74 72 50 61  t, eType, iPtrPa
2ef40 67 65 2c 20 70 67 6e 6f 4d 6f 76 65 2c 20 30 29  ge, pgnoMove, 0)
2ef50 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
2ef60 61 67 65 28 70 52 6f 6f 74 29 3b 0a 0a 20 20 20  age(pRoot);..   
2ef70 20 20 20 2f 2a 20 4f 62 74 61 69 6e 20 74 68 65     /* Obtain the
2ef80 20 70 61 67 65 20 61 74 20 70 67 6e 6f 52 6f 6f   page at pgnoRoo
2ef90 74 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72  t */.      if( r
2efa0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2efb0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2efc0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
2efd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
2efe0 65 65 47 65 74 50 61 67 65 28 70 42 74 2c 20 70  eeGetPage(pBt, p
2eff0 67 6e 6f 52 6f 6f 74 2c 20 26 70 52 6f 6f 74 2c  gnoRoot, &pRoot,
2f000 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
2f010 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2f020 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2f030 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
2f040 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2f050 65 72 57 72 69 74 65 28 70 52 6f 6f 74 2d 3e 70  erWrite(pRoot->p
2f060 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69  DbPage);.      i
2f070 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2f080 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c 65   ){.        rele
2f090 61 73 65 50 61 67 65 28 70 52 6f 6f 74 29 3b 0a  asePage(pRoot);.
2f0a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
2f0b0 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
2f0c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 52 6f 6f  else{.      pRoo
2f0d0 74 20 3d 20 70 50 61 67 65 4d 6f 76 65 3b 0a 20  t = pPageMove;. 
2f0e0 20 20 20 7d 20 0a 0a 20 20 20 20 2f 2a 20 55 70     } ..    /* Up
2f0f0 64 61 74 65 20 74 68 65 20 70 6f 69 6e 74 65 72  date the pointer
2f100 2d 6d 61 70 20 61 6e 64 20 6d 65 74 61 2d 64 61  -map and meta-da
2f110 74 61 20 77 69 74 68 20 74 68 65 20 6e 65 77 20  ta with the new 
2f120 72 6f 6f 74 2d 70 61 67 65 20 6e 75 6d 62 65 72  root-page number
2f130 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 74  . */.    rc = pt
2f140 72 6d 61 70 50 75 74 28 70 42 74 2c 20 70 67 6e  rmapPut(pBt, pgn
2f150 6f 52 6f 6f 74 2c 20 50 54 52 4d 41 50 5f 52 4f  oRoot, PTRMAP_RO
2f160 4f 54 50 41 47 45 2c 20 30 29 3b 0a 20 20 20 20  OTPAGE, 0);.    
2f170 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2f180 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
2f190 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
2f1a0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72   rc;.    }.    r
2f1b0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
2f1c0 55 70 64 61 74 65 4d 65 74 61 28 70 2c 20 34 2c  UpdateMeta(p, 4,
2f1d0 20 70 67 6e 6f 52 6f 6f 74 29 3b 0a 20 20 20 20   pgnoRoot);.    
2f1e0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2f1f0 72 65 6c 65 61 73 65 50 61 67 65 28 70 52 6f 6f  releasePage(pRoo
2f200 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
2f210 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65   rc;.    }..  }e
2f220 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 61 6c  lse{.    rc = al
2f230 6c 6f 63 61 74 65 42 74 72 65 65 50 61 67 65 28  locateBtreePage(
2f240 70 42 74 2c 20 26 70 52 6f 6f 74 2c 20 26 70 67  pBt, &pRoot, &pg
2f250 6e 6f 52 6f 6f 74 2c 20 31 2c 20 30 29 3b 0a 20  noRoot, 1, 0);. 
2f260 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
2f270 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn rc;.  }.#endi
2f280 66 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  f.  assert( sqli
2f290 74 65 33 50 61 67 65 72 49 73 77 72 69 74 65 61  te3PagerIswritea
2f2a0 62 6c 65 28 70 52 6f 6f 74 2d 3e 70 44 62 50 61  ble(pRoot->pDbPa
2f2b0 67 65 29 20 29 3b 0a 20 20 7a 65 72 6f 50 61 67  ge) );.  zeroPag
2f2c0 65 28 70 52 6f 6f 74 2c 20 66 6c 61 67 73 20 7c  e(pRoot, flags |
2f2d0 20 50 54 46 5f 4c 45 41 46 29 3b 0a 20 20 73 71   PTF_LEAF);.  sq
2f2e0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
2f2f0 70 52 6f 6f 74 2d 3e 70 44 62 50 61 67 65 29 3b  pRoot->pDbPage);
2f300 0a 20 20 2a 70 69 54 61 62 6c 65 20 3d 20 28 69  .  *piTable = (i
2f310 6e 74 29 70 67 6e 6f 52 6f 6f 74 3b 0a 20 20 72  nt)pgnoRoot;.  r
2f320 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
2f330 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
2f340 72 65 65 43 72 65 61 74 65 54 61 62 6c 65 28 42  reeCreateTable(B
2f350 74 72 65 65 20 2a 70 2c 20 69 6e 74 20 2a 70 69  tree *p, int *pi
2f360 54 61 62 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73  Table, int flags
2f370 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
2f380 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
2f390 28 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 64  (p);.  p->pBt->d
2f3a0 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20  b = p->db;.  rc 
2f3b0 3d 20 62 74 72 65 65 43 72 65 61 74 65 54 61 62  = btreeCreateTab
2f3c0 6c 65 28 70 2c 20 70 69 54 61 62 6c 65 2c 20 66  le(p, piTable, f
2f3d0 6c 61 67 73 29 3b 0a 20 20 73 71 6c 69 74 65 33  lags);.  sqlite3
2f3e0 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
2f3f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2f400 2a 0a 2a 2a 20 45 72 61 73 65 20 74 68 65 20 67  *.** Erase the g
2f410 69 76 65 6e 20 64 61 74 61 62 61 73 65 20 70 61  iven database pa
2f420 67 65 20 61 6e 64 20 61 6c 6c 20 69 74 73 20 63  ge and all its c
2f430 68 69 6c 64 72 65 6e 2e 20 20 52 65 74 75 72 6e  hildren.  Return
2f440 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 74 6f 20  .** the page to 
2f450 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2f  the freelist..*/
2f460 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6c 65 61  .static int clea
2f470 72 44 61 74 61 62 61 73 65 50 61 67 65 28 0a 20  rDatabasePage(. 
2f480 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 2c 20   BtShared *pBt, 
2f490 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
2f4a0 20 42 54 72 65 65 20 74 68 61 74 20 63 6f 6e 74   BTree that cont
2f4b0 61 69 6e 73 20 74 68 65 20 74 61 62 6c 65 20 2a  ains the table *
2f4c0 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
2f4d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
2f4e0 65 20 6e 75 6d 62 65 72 20 74 6f 20 63 6c 65 61  e number to clea
2f4f0 72 20 2a 2f 0a 20 20 4d 65 6d 50 61 67 65 20 2a  r */.  MemPage *
2f500 70 50 61 72 65 6e 74 2c 20 20 20 20 20 2f 2a 20  pParent,     /* 
2f510 50 61 72 65 6e 74 20 70 61 67 65 2e 20 20 4e 55  Parent page.  NU
2f520 4c 4c 20 66 6f 72 20 74 68 65 20 72 6f 6f 74 20  LL for the root 
2f530 2a 2f 0a 20 20 69 6e 74 20 66 72 65 65 50 61 67  */.  int freePag
2f540 65 46 6c 61 67 20 20 20 20 20 20 2f 2a 20 44 65  eFlag      /* De
2f550 61 6c 6c 6f 63 61 74 65 20 70 61 67 65 20 69 66  allocate page if
2f560 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 4d 65   true */.){.  Me
2f570 6d 50 61 67 65 20 2a 70 50 61 67 65 20 3d 20 30  mPage *pPage = 0
2f580 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e  ;.  int rc;.  un
2f590 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 43 65  signed char *pCe
2f5a0 6c 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  ll;.  int i;..  
2f5b0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
2f5c0 6d 75 74 65 78 5f 68 65 6c 64 28 70 42 74 2d 3e  mutex_held(pBt->
2f5d0 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
2f5e0 70 67 6e 6f 3e 70 61 67 65 72 50 61 67 65 63 6f  pgno>pagerPageco
2f5f0 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29  unt(pBt->pPager)
2f600 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2f610 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
2f620 50 54 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  PT;.  }..  rc = 
2f630 67 65 74 41 6e 64 49 6e 69 74 50 61 67 65 28 70  getAndInitPage(p
2f640 42 74 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65  Bt, pgno, &pPage
2f650 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
2f660 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61 73 65  to cleardatabase
2f670 70 61 67 65 5f 6f 75 74 3b 0a 20 20 66 6f 72 28  page_out;.  for(
2f680 69 3d 30 3b 20 69 3c 70 50 61 67 65 2d 3e 6e 43  i=0; i<pPage->nC
2f690 65 6c 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 70  ell; i++){.    p
2f6a0 43 65 6c 6c 20 3d 20 66 69 6e 64 43 65 6c 6c 28  Cell = findCell(
2f6b0 70 50 61 67 65 2c 20 69 29 3b 0a 20 20 20 20 69  pPage, i);.    i
2f6c0 66 28 20 21 70 50 61 67 65 2d 3e 6c 65 61 66 20  f( !pPage->leaf 
2f6d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 63 6c  ){.      rc = cl
2f6e0 65 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28  earDatabasePage(
2f6f0 70 42 74 2c 20 67 65 74 34 62 79 74 65 28 70 43  pBt, get4byte(pC
2f700 65 6c 6c 29 2c 20 70 50 61 67 65 2c 20 31 29 3b  ell), pPage, 1);
2f710 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20  .      if( rc ) 
2f720 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62 61  goto cleardataba
2f730 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 20 20  sepage_out;.    
2f740 7d 0a 20 20 20 20 72 63 20 3d 20 63 6c 65 61 72  }.    rc = clear
2f750 43 65 6c 6c 28 70 50 61 67 65 2c 20 70 43 65 6c  Cell(pPage, pCel
2f760 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
2f770 20 67 6f 74 6f 20 63 6c 65 61 72 64 61 74 61 62   goto cleardatab
2f780 61 73 65 70 61 67 65 5f 6f 75 74 3b 0a 20 20 7d  asepage_out;.  }
2f790 0a 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c  .  if( !pPage->l
2f7a0 65 61 66 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  eaf ){.    rc = 
2f7b0 63 6c 65 61 72 44 61 74 61 62 61 73 65 50 61 67  clearDatabasePag
2f7c0 65 28 70 42 74 2c 20 67 65 74 34 62 79 74 65 28  e(pBt, get4byte(
2f7d0 26 70 50 61 67 65 2d 3e 61 44 61 74 61 5b 38 5d  &pPage->aData[8]
2f7e0 29 2c 20 70 50 61 67 65 2c 20 31 29 3b 0a 20 20  ), pPage, 1);.  
2f7f0 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20    if( rc ) goto 
2f800 63 6c 65 61 72 64 61 74 61 62 61 73 65 70 61 67  cleardatabasepag
2f810 65 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 69 66 28  e_out;.  }.  if(
2f820 20 66 72 65 65 50 61 67 65 46 6c 61 67 20 29 7b   freePageFlag ){
2f830 0a 20 20 20 20 72 63 20 3d 20 66 72 65 65 50 61  .    rc = freePa
2f840 67 65 28 70 50 61 67 65 29 3b 0a 20 20 7d 65 6c  ge(pPage);.  }el
2f850 73 65 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c  se if( (rc = sql
2f860 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2f870 50 61 67 65 2d 3e 70 44 62 50 61 67 65 29 29 3d  Page->pDbPage))=
2f880 3d 30 20 29 7b 0a 20 20 20 20 7a 65 72 6f 50 61  =0 ){.    zeroPa
2f890 67 65 28 70 50 61 67 65 2c 20 70 50 61 67 65 2d  ge(pPage, pPage-
2f8a0 3e 61 44 61 74 61 5b 30 5d 20 7c 20 50 54 46 5f  >aData[0] | PTF_
2f8b0 4c 45 41 46 29 3b 0a 20 20 7d 0a 0a 63 6c 65 61  LEAF);.  }..clea
2f8c0 72 64 61 74 61 62 61 73 65 70 61 67 65 5f 6f 75  rdatabasepage_ou
2f8d0 74 3a 0a 20 20 72 65 6c 65 61 73 65 50 61 67 65  t:.  releasePage
2f8e0 28 70 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72  (pPage);.  retur
2f8f0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  n rc;.}../*.** D
2f900 65 6c 65 74 65 20 61 6c 6c 20 69 6e 66 6f 72 6d  elete all inform
2f910 61 74 69 6f 6e 20 66 72 6f 6d 20 61 20 73 69 6e  ation from a sin
2f920 67 6c 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65  gle table in the
2f930 20 64 61 74 61 62 61 73 65 2e 20 20 69 54 61 62   database.  iTab
2f940 6c 65 20 69 73 0a 2a 2a 20 74 68 65 20 70 61 67  le is.** the pag
2f950 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65 20  e number of the 
2f960 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 61 62 6c  root of the tabl
2f970 65 2e 20 20 41 66 74 65 72 20 74 68 69 73 20 72  e.  After this r
2f980 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 2c 0a  outine returns,.
2f990 2a 2a 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ** the root page
2f9a0 20 69 73 20 65 6d 70 74 79 2c 20 62 75 74 20 73   is empty, but s
2f9b0 74 69 6c 6c 20 65 78 69 73 74 73 2e 0a 2a 2a 0a  till exists..**.
2f9c0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2f9d0 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20 53  will fail with S
2f9e0 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66 20  QLITE_LOCKED if 
2f9f0 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f 70  there are any op
2fa00 65 6e 0a 2a 2a 20 72 65 61 64 20 63 75 72 73 6f  en.** read curso
2fa10 72 73 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 2e  rs on the table.
2fa20 20 20 4f 70 65 6e 20 77 72 69 74 65 20 63 75 72    Open write cur
2fa30 73 6f 72 73 20 61 72 65 20 6d 6f 76 65 64 20 74  sors are moved t
2fa40 6f 20 74 68 65 0a 2a 2a 20 72 6f 6f 74 20 6f 66  o the.** root of
2fa50 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69   the table..*/.i
2fa60 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 43  nt sqlite3BtreeC
2fa70 6c 65 61 72 54 61 62 6c 65 28 42 74 72 65 65 20  learTable(Btree 
2fa80 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c 65 29 7b  *p, int iTable){
2fa90 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 42 74 53  .  int rc;.  BtS
2faa0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
2fab0 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  pBt;.  sqlite3Bt
2fac0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 70  reeEnter(p);.  p
2fad0 42 74 2d 3e 64 62 20 3d 20 70 2d 3e 64 62 3b 0a  Bt->db = p->db;.
2fae0 20 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73    if( p->inTrans
2faf0 21 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b  !=TRANS_WRITE ){
2fb00 0a 20 20 20 20 72 63 20 3d 20 70 42 74 2d 3e 72  .    rc = pBt->r
2fb10 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54 45  eadOnly ? SQLITE
2fb20 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c 49  _READONLY : SQLI
2fb30 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73  TE_ERROR;.  }els
2fb40 65 20 69 66 28 20 28 72 63 20 3d 20 63 68 65 63  e if( (rc = chec
2fb50 6b 52 65 61 64 4c 6f 63 6b 73 28 70 2c 20 69 54  kReadLocks(p, iT
2fb60 61 62 6c 65 2c 20 30 2c 20 31 29 29 21 3d 53 51  able, 0, 1))!=SQ
2fb70 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
2fb80 2a 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 20  * nothing to do 
2fb90 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 53  */.  }else if( S
2fba0 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20  QLITE_OK!=(rc = 
2fbb0 73 61 76 65 41 6c 6c 43 75 72 73 6f 72 73 28 70  saveAllCursors(p
2fbc0 42 74 2c 20 69 54 61 62 6c 65 2c 20 30 29 29 20  Bt, iTable, 0)) 
2fbd0 29 7b 0a 20 20 20 20 2f 2a 20 6e 6f 74 68 69 6e  ){.    /* nothin
2fbe0 67 20 74 6f 20 64 6f 20 2a 2f 0a 20 20 7d 65 6c  g to do */.  }el
2fbf0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 63 6c 65  se{.    rc = cle
2fc00 61 72 44 61 74 61 62 61 73 65 50 61 67 65 28 70  arDatabasePage(p
2fc10 42 74 2c 20 28 50 67 6e 6f 29 69 54 61 62 6c 65  Bt, (Pgno)iTable
2fc20 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  , 0, 0);.  }.  s
2fc30 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
2fc40 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
2fc50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 61 73 65  ;.}../*.** Erase
2fc60 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   all information
2fc70 20 69 6e 20 61 20 74 61 62 6c 65 20 61 6e 64 20   in a table and 
2fc80 61 64 64 20 74 68 65 20 72 6f 6f 74 20 6f 66 20  add the root of 
2fc90 74 68 65 20 74 61 62 6c 65 20 74 6f 0a 2a 2a 20  the table to.** 
2fca0 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 45  the freelist.  E
2fcb0 78 63 65 70 74 2c 20 74 68 65 20 72 6f 6f 74 20  xcept, the root 
2fcc0 6f 66 20 74 68 65 20 70 72 69 6e 63 69 70 6c 65  of the principle
2fcd0 20 74 61 62 6c 65 20 28 74 68 65 20 6f 6e 65 20   table (the one 
2fce0 6f 6e 0a 2a 2a 20 70 61 67 65 20 31 29 20 69 73  on.** page 1) is
2fcf0 20 6e 65 76 65 72 20 61 64 64 65 64 20 74 6f 20   never added to 
2fd00 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
2fd10 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
2fd20 20 77 69 6c 6c 20 66 61 69 6c 20 77 69 74 68 20   will fail with 
2fd30 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 69 66  SQLITE_LOCKED if
2fd40 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f   there are any o
2fd50 70 65 6e 0a 2a 2a 20 63 75 72 73 6f 72 73 20 6f  pen.** cursors o
2fd60 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 0a  n the table..**.
2fd70 2a 2a 20 49 66 20 41 55 54 4f 56 41 43 55 55 4d  ** If AUTOVACUUM
2fd80 20 69 73 20 65 6e 61 62 6c 65 64 20 61 6e 64 20   is enabled and 
2fd90 74 68 65 20 70 61 67 65 20 61 74 20 69 54 61 62  the page at iTab
2fda0 6c 65 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61  le is not the la
2fdb0 73 74 0a 2a 2a 20 72 6f 6f 74 20 70 61 67 65 20  st.** root page 
2fdc0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2fdd0 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6c  file, then the l
2fde0 61 73 74 20 72 6f 6f 74 20 70 61 67 65 20 0a 2a  ast root page .*
2fdf0 2a 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  * in the databas
2fe00 65 20 66 69 6c 65 20 69 73 20 6d 6f 76 65 64 20  e file is moved 
2fe10 69 6e 74 6f 20 74 68 65 20 73 6c 6f 74 20 66 6f  into the slot fo
2fe20 72 6d 65 72 6c 79 20 6f 63 63 75 70 69 65 64 20  rmerly occupied 
2fe30 62 79 0a 2a 2a 20 69 54 61 62 6c 65 20 61 6e 64  by.** iTable and
2fe40 20 74 68 61 74 20 6c 61 73 74 20 73 6c 6f 74 20   that last slot 
2fe50 66 6f 72 6d 65 72 6c 79 20 6f 63 63 75 70 69 65  formerly occupie
2fe60 64 20 62 79 20 74 68 65 20 6c 61 73 74 20 72 6f  d by the last ro
2fe70 6f 74 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 64  ot page.** is ad
2fe80 64 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c  ded to the freel
2fe90 69 73 74 20 69 6e 73 74 65 61 64 20 6f 66 20 69  ist instead of i
2fea0 54 61 62 6c 65 2e 20 20 49 6e 20 74 68 69 73 20  Table.  In this 
2feb0 73 61 79 2c 20 61 6c 6c 0a 2a 2a 20 72 6f 6f 74  say, all.** root
2fec0 20 70 61 67 65 73 20 61 72 65 20 6b 65 70 74 20   pages are kept 
2fed0 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
2fee0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2fef0 20 66 69 6c 65 2c 20 77 68 69 63 68 0a 2a 2a 20   file, which.** 
2ff00 69 73 20 6e 65 63 65 73 73 61 72 79 20 66 6f 72  is necessary for
2ff10 20 41 55 54 4f 56 41 43 55 55 4d 20 74 6f 20 77   AUTOVACUUM to w
2ff20 6f 72 6b 20 72 69 67 68 74 2e 20 20 2a 70 69 4d  ork right.  *piM
2ff30 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f 20 74  oved is set to t
2ff40 68 65 20 0a 2a 2a 20 70 61 67 65 20 6e 75 6d 62  he .** page numb
2ff50 65 72 20 74 68 61 74 20 75 73 65 64 20 74 6f 20  er that used to 
2ff60 62 65 20 74 68 65 20 6c 61 73 74 20 72 6f 6f 74  be the last root
2ff70 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c   page in the fil
2ff80 65 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  e before.** the 
2ff90 6d 6f 76 65 2e 20 20 49 66 20 6e 6f 20 70 61 67  move.  If no pag
2ffa0 65 20 67 65 74 73 20 6d 6f 76 65 64 2c 20 2a 70  e gets moved, *p
2ffb0 69 4d 6f 76 65 64 20 69 73 20 73 65 74 20 74 6f  iMoved is set to
2ffc0 20 30 2e 0a 2a 2a 20 54 68 65 20 6c 61 73 74 20   0..** The last 
2ffd0 72 6f 6f 74 20 70 61 67 65 20 69 73 20 72 65 63  root page is rec
2ffe0 6f 72 64 65 64 20 69 6e 20 6d 65 74 61 5b 33 5d  orded in meta[3]
2fff0 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f   and the value o
30000 66 0a 2a 2a 20 6d 65 74 61 5b 33 5d 20 69 73 20  f.** meta[3] is 
30010 75 70 64 61 74 65 64 20 62 79 20 74 68 69 73 20  updated by this 
30020 70 72 6f 63 65 64 75 72 65 2e 0a 2a 2f 0a 73 74  procedure..*/.st
30030 61 74 69 63 20 69 6e 74 20 62 74 72 65 65 44 72  atic int btreeDr
30040 6f 70 54 61 62 6c 65 28 42 74 72 65 65 20 2a 70  opTable(Btree *p
30050 2c 20 69 6e 74 20 69 54 61 62 6c 65 2c 20 69 6e  , int iTable, in
30060 74 20 2a 70 69 4d 6f 76 65 64 29 7b 0a 20 20 69  t *piMoved){.  i
30070 6e 74 20 72 63 3b 0a 20 20 4d 65 6d 50 61 67 65  nt rc;.  MemPage
30080 20 2a 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 42   *pPage = 0;.  B
30090 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70  tShared *pBt = p
300a0 2d 3e 70 42 74 3b 0a 0a 20 20 61 73 73 65 72 74  ->pBt;..  assert
300b0 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 48 6f  ( sqlite3BtreeHo
300c0 6c 64 73 4d 75 74 65 78 28 70 29 20 29 3b 0a 20  ldsMutex(p) );. 
300d0 20 69 66 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21   if( p->inTrans!
300e0 3d 54 52 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a  =TRANS_WRITE ){.
300f0 20 20 20 20 72 65 74 75 72 6e 20 70 42 74 2d 3e      return pBt->
30100 72 65 61 64 4f 6e 6c 79 20 3f 20 53 51 4c 49 54  readOnly ? SQLIT
30110 45 5f 52 45 41 44 4f 4e 4c 59 20 3a 20 53 51 4c  E_READONLY : SQL
30120 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  ITE_ERROR;.  }..
30130 20 20 2f 2a 20 49 74 20 69 73 20 69 6c 6c 65 67    /* It is illeg
30140 61 6c 20 74 6f 20 64 72 6f 70 20 61 20 74 61 62  al to drop a tab
30150 6c 65 20 69 66 20 61 6e 79 20 63 75 72 73 6f 72  le if any cursor
30160 73 20 61 72 65 20 6f 70 65 6e 20 6f 6e 20 74 68  s are open on th
30170 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2e  e.  ** database.
30180 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
30190 20 69 6e 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   in auto-vacuum 
301a0 6d 6f 64 65 20 74 68 65 20 62 61 63 6b 65 6e 64  mode the backend
301b0 20 6d 61 79 0a 20 20 2a 2a 20 6e 65 65 64 20 74   may.  ** need t
301c0 6f 20 6d 6f 76 65 20 61 6e 6f 74 68 65 72 20 72  o move another r
301d0 6f 6f 74 2d 70 61 67 65 20 74 6f 20 66 69 6c 6c  oot-page to fill
301e0 20 61 20 67 61 70 20 6c 65 66 74 20 62 79 20 74   a gap left by t
301f0 68 65 20 64 65 6c 65 74 65 64 0a 20 20 2a 2a 20  he deleted.  ** 
30200 72 6f 6f 74 20 70 61 67 65 2e 20 49 66 20 61 6e  root page. If an
30210 20 6f 70 65 6e 20 63 75 72 73 6f 72 20 77 61 73   open cursor was
30220 20 75 73 69 6e 67 20 74 68 69 73 20 70 61 67 65   using this page
30230 20 61 20 70 72 6f 62 6c 65 6d 20 77 6f 75 6c 64   a problem would
30240 20 0a 20 20 2a 2a 20 6f 63 63 75 72 2e 0a 20 20   .  ** occur..  
30250 2a 2f 0a 20 20 69 66 28 20 70 42 74 2d 3e 70 43  */.  if( pBt->pC
30260 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 72 65 74  ursor ){.    ret
30270 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  urn SQLITE_LOCKE
30280 44 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73  D;.  }..  rc = s
30290 71 6c 69 74 65 33 42 74 72 65 65 47 65 74 50 61  qlite3BtreeGetPa
302a0 67 65 28 70 42 74 2c 20 28 50 67 6e 6f 29 69 54  ge(pBt, (Pgno)iT
302b0 61 62 6c 65 2c 20 26 70 50 61 67 65 2c 20 30 29  able, &pPage, 0)
302c0 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
302d0 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  urn rc;.  rc = s
302e0 71 6c 69 74 65 33 42 74 72 65 65 43 6c 65 61 72  qlite3BtreeClear
302f0 54 61 62 6c 65 28 70 2c 20 69 54 61 62 6c 65 29  Table(p, iTable)
30300 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
30310 20 20 72 65 6c 65 61 73 65 50 61 67 65 28 70 50    releasePage(pP
30320 61 67 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  age);.    return
30330 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2a 70 69 4d   rc;.  }..  *piM
30340 6f 76 65 64 20 3d 20 30 3b 0a 0a 20 20 69 66 28  oved = 0;..  if(
30350 20 69 54 61 62 6c 65 3e 31 20 29 7b 0a 23 69 66   iTable>1 ){.#if
30360 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
30370 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 72  AUTOVACUUM.    r
30380 63 20 3d 20 66 72 65 65 50 61 67 65 28 70 50 61  c = freePage(pPa
30390 67 65 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65  ge);.    release
303a0 50 61 67 65 28 70 50 61 67 65 29 3b 0a 23 65 6c  Page(pPage);.#el
303b0 73 65 0a 20 20 20 20 69 66 28 20 70 42 74 2d 3e  se.    if( pBt->
303c0 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20 20  autoVacuum ){.  
303d0 20 20 20 20 50 67 6e 6f 20 6d 61 78 52 6f 6f 74      Pgno maxRoot
303e0 50 67 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  Pgno;.      rc =
303f0 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
30400 4d 65 74 61 28 70 2c 20 34 2c 20 26 6d 61 78 52  Meta(p, 4, &maxR
30410 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20  ootPgno);.      
30420 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
30430 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 6c  K ){.        rel
30440 65 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b  easePage(pPage);
30450 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
30460 72 63 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  rc;.      }..   
30470 20 20 20 69 66 28 20 69 54 61 62 6c 65 3d 3d 6d     if( iTable==m
30480 61 78 52 6f 6f 74 50 67 6e 6f 20 29 7b 0a 20 20  axRootPgno ){.  
30490 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
304a0 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f 70  table being drop
304b0 70 65 64 20 69 73 20 74 68 65 20 74 61 62 6c 65  ped is the table
304c0 20 77 69 74 68 20 74 68 65 20 6c 61 72 67 65 73   with the larges
304d0 74 20 72 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20  t root-page.    
304e0 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e      ** number in
304f0 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 70   the database, p
30500 75 74 20 74 68 65 20 72 6f 6f 74 20 70 61 67 65  ut the root page
30510 20 6f 6e 20 74 68 65 20 66 72 65 65 20 6c 69 73   on the free lis
30520 74 2e 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  t. .        */. 
30530 20 20 20 20 20 20 20 72 63 20 3d 20 66 72 65 65         rc = free
30540 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20  Page(pPage);.   
30550 20 20 20 20 20 72 65 6c 65 61 73 65 50 61 67 65       releasePage
30560 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
30570 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30580 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
30590 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
305a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
305b0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
305c0 20 74 61 62 6c 65 20 62 65 69 6e 67 20 64 72 6f   table being dro
305d0 70 70 65 64 20 64 6f 65 73 20 6e 6f 74 20 68 61  pped does not ha
305e0 76 65 20 74 68 65 20 6c 61 72 67 65 73 74 20 72  ve the largest r
305f0 6f 6f 74 2d 70 61 67 65 0a 20 20 20 20 20 20 20  oot-page.       
30600 20 2a 2a 20 6e 75 6d 62 65 72 20 69 6e 20 74 68   ** number in th
30610 65 20 64 61 74 61 62 61 73 65 2e 20 53 6f 20 6d  e database. So m
30620 6f 76 65 20 74 68 65 20 70 61 67 65 20 74 68 61  ove the page tha
30630 74 20 64 6f 65 73 20 69 6e 74 6f 20 74 68 65 20  t does into the 
30640 0a 20 20 20 20 20 20 20 20 2a 2a 20 67 61 70 20  .        ** gap 
30650 6c 65 66 74 20 62 79 20 74 68 65 20 64 65 6c 65  left by the dele
30660 74 65 64 20 72 6f 6f 74 2d 70 61 67 65 2e 0a 20  ted root-page.. 
30670 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
30680 20 20 4d 65 6d 50 61 67 65 20 2a 70 4d 6f 76 65    MemPage *pMove
30690 3b 0a 20 20 20 20 20 20 20 20 72 65 6c 65 61 73  ;.        releas
306a0 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
306b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
306c0 65 33 42 74 72 65 65 47 65 74 50 61 67 65 28 70  e3BtreeGetPage(p
306d0 42 74 2c 20 6d 61 78 52 6f 6f 74 50 67 6e 6f 2c  Bt, maxRootPgno,
306e0 20 26 70 4d 6f 76 65 2c 20 30 29 3b 0a 20 20 20   &pMove, 0);.   
306f0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
30700 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
30710 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
30720 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
30730 20 72 63 20 3d 20 72 65 6c 6f 63 61 74 65 50 61   rc = relocatePa
30740 67 65 28 70 42 74 2c 20 70 4d 6f 76 65 2c 20 50  ge(pBt, pMove, P
30750 54 52 4d 41 50 5f 52 4f 4f 54 50 41 47 45 2c 20  TRMAP_ROOTPAGE, 
30760 30 2c 20 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20  0, iTable, 0);. 
30770 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50 61         releasePa
30780 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20 20  ge(pMove);.     
30790 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
307a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
307b0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
307c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
307d0 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
307e0 47 65 74 50 61 67 65 28 70 42 74 2c 20 6d 61 78  GetPage(pBt, max
307f0 52 6f 6f 74 50 67 6e 6f 2c 20 26 70 4d 6f 76 65  RootPgno, &pMove
30800 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
30810 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
30820 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
30830 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
30840 7d 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 66  }.        rc = f
30850 72 65 65 50 61 67 65 28 70 4d 6f 76 65 29 3b 0a  reePage(pMove);.
30860 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 50          releaseP
30870 61 67 65 28 70 4d 6f 76 65 29 3b 0a 20 20 20 20  age(pMove);.    
30880 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
30890 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
308a0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
308b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
308c0 2a 70 69 4d 6f 76 65 64 20 3d 20 6d 61 78 52 6f  *piMoved = maxRo
308d0 6f 74 50 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a  otPgno;.      }.
308e0 0a 20 20 20 20 20 20 2f 2a 20 53 65 74 20 74 68  .      /* Set th
308f0 65 20 6e 65 77 20 27 6d 61 78 2d 72 6f 6f 74 2d  e new 'max-root-
30900 70 61 67 65 27 20 76 61 6c 75 65 20 69 6e 20 74  page' value in t
30910 68 65 20 64 61 74 61 62 61 73 65 20 68 65 61 64  he database head
30920 65 72 2e 20 54 68 69 73 0a 20 20 20 20 20 20 2a  er. This.      *
30930 2a 20 69 73 20 74 68 65 20 6f 6c 64 20 76 61 6c  * is the old val
30940 75 65 20 6c 65 73 73 20 6f 6e 65 2c 20 6c 65 73  ue less one, les
30950 73 20 6f 6e 65 20 6d 6f 72 65 20 69 66 20 74 68  s one more if th
30960 61 74 20 68 61 70 70 65 6e 73 20 74 6f 0a 20 20  at happens to.  
30970 20 20 20 20 2a 2a 20 62 65 20 61 20 72 6f 6f 74      ** be a root
30980 2d 70 61 67 65 20 6e 75 6d 62 65 72 2c 20 6c 65  -page number, le
30990 73 73 20 6f 6e 65 20 61 67 61 69 6e 20 69 66 20  ss one again if 
309a0 74 68 61 74 20 69 73 20 74 68 65 0a 20 20 20 20  that is the.    
309b0 20 20 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54    ** PENDING_BYT
309c0 45 5f 50 41 47 45 2e 0a 20 20 20 20 20 20 2a 2f  E_PAGE..      */
309d0 0a 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50 67  .      maxRootPg
309e0 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 69 66 28 20  no--;.      if( 
309f0 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50 45 4e  maxRootPgno==PEN
30a00 44 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70  DING_BYTE_PAGE(p
30a10 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  Bt) ){.        m
30a20 61 78 52 6f 6f 74 50 67 6e 6f 2d 2d 3b 0a 20 20  axRootPgno--;.  
30a30 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
30a40 6d 61 78 52 6f 6f 74 50 67 6e 6f 3d 3d 50 54 52  maxRootPgno==PTR
30a50 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20  MAP_PAGENO(pBt, 
30a60 6d 61 78 52 6f 6f 74 50 67 6e 6f 29 20 29 7b 0a  maxRootPgno) ){.
30a70 20 20 20 20 20 20 20 20 6d 61 78 52 6f 6f 74 50          maxRootP
30a80 67 6e 6f 2d 2d 3b 0a 20 20 20 20 20 20 7d 0a 20  gno--;.      }. 
30a90 20 20 20 20 20 61 73 73 65 72 74 28 20 6d 61 78       assert( max
30aa0 52 6f 6f 74 50 67 6e 6f 21 3d 50 45 4e 44 49 4e  RootPgno!=PENDIN
30ab0 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42 74 29  G_BYTE_PAGE(pBt)
30ac0 20 29 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20   );..      rc = 
30ad0 73 71 6c 69 74 65 33 42 74 72 65 65 55 70 64 61  sqlite3BtreeUpda
30ae0 74 65 4d 65 74 61 28 70 2c 20 34 2c 20 6d 61 78  teMeta(p, 4, max
30af0 52 6f 6f 74 50 67 6e 6f 29 3b 0a 20 20 20 20 7d  RootPgno);.    }
30b00 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
30b10 20 66 72 65 65 50 61 67 65 28 70 50 61 67 65 29   freePage(pPage)
30b20 3b 0a 20 20 20 20 20 20 72 65 6c 65 61 73 65 50  ;.      releaseP
30b30 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
30b40 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  }.#endif.  }else
30b50 7b 0a 20 20 20 20 2f 2a 20 49 66 20 73 71 6c 69  {.    /* If sqli
30b60 74 65 33 42 74 72 65 65 44 72 6f 70 54 61 62 6c  te3BtreeDropTabl
30b70 65 20 77 61 73 20 63 61 6c 6c 65 64 20 6f 6e 20  e was called on 
30b80 70 61 67 65 20 31 2e 20 2a 2f 0a 20 20 20 20 7a  page 1. */.    z
30b90 65 72 6f 50 61 67 65 28 70 50 61 67 65 2c 20 50  eroPage(pPage, P
30ba0 54 46 5f 49 4e 54 4b 45 59 7c 50 54 46 5f 4c 45  TF_INTKEY|PTF_LE
30bb0 41 46 20 29 3b 0a 20 20 20 20 72 65 6c 65 61 73  AF );.    releas
30bc0 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20  ePage(pPage);.  
30bd0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20  }.  return rc;  
30be0 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  .}.int sqlite3Bt
30bf0 72 65 65 44 72 6f 70 54 61 62 6c 65 28 42 74 72  reeDropTable(Btr
30c00 65 65 20 2a 70 2c 20 69 6e 74 20 69 54 61 62 6c  ee *p, int iTabl
30c10 65 2c 20 69 6e 74 20 2a 70 69 4d 6f 76 65 64 29  e, int *piMoved)
30c20 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
30c30 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
30c40 70 29 3b 0a 20 20 70 2d 3e 70 42 74 2d 3e 64 62  p);.  p->pBt->db
30c50 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 72 63 20 3d   = p->db;.  rc =
30c60 20 62 74 72 65 65 44 72 6f 70 54 61 62 6c 65 28   btreeDropTable(
30c70 70 2c 20 69 54 61 62 6c 65 2c 20 70 69 4d 6f 76  p, iTable, piMov
30c80 65 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  ed);.  sqlite3Bt
30c90 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72  reeLeave(p);.  r
30ca0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
30cb0 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 6d 65 74  .** Read the met
30cc0 61 2d 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 75  a-information ou
30cd0 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  t of a database 
30ce0 66 69 6c 65 2e 20 20 4d 65 74 61 5b 30 5d 0a 2a  file.  Meta[0].*
30cf0 2a 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  * is the number 
30d00 6f 66 20 66 72 65 65 20 70 61 67 65 73 20 63 75  of free pages cu
30d10 72 72 65 6e 74 6c 79 20 69 6e 20 74 68 65 20 64  rrently in the d
30d20 61 74 61 62 61 73 65 2e 20 20 4d 65 74 61 5b 31  atabase.  Meta[1
30d30 5d 0a 2a 2a 20 74 68 72 6f 75 67 68 20 6d 65 74  ].** through met
30d40 61 5b 31 35 5d 20 61 72 65 20 61 76 61 69 6c 61  a[15] are availa
30d50 62 6c 65 20 66 6f 72 20 75 73 65 20 62 79 20 68  ble for use by h
30d60 69 67 68 65 72 20 6c 61 79 65 72 73 2e 20 20 4d  igher layers.  M
30d70 65 74 61 5b 30 5d 0a 2a 2a 20 69 73 20 72 65 61  eta[0].** is rea
30d80 64 2d 6f 6e 6c 79 2c 20 74 68 65 20 6f 74 68 65  d-only, the othe
30d90 72 73 20 61 72 65 20 72 65 61 64 2f 77 72 69 74  rs are read/writ
30da0 65 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 65 20 73 63  e..** .** The sc
30db0 68 65 6d 61 20 6c 61 79 65 72 20 6e 75 6d 62 65  hema layer numbe
30dc0 72 73 20 6d 65 74 61 20 76 61 6c 75 65 73 20 64  rs meta values d
30dd0 69 66 66 65 72 65 6e 74 6c 79 2e 20 20 41 74 20  ifferently.  At 
30de0 74 68 65 20 73 63 68 65 6d 61 0a 2a 2a 20 6c 61  the schema.** la
30df0 79 65 72 20 28 61 6e 64 20 74 68 65 20 53 65 74  yer (and the Set
30e00 43 6f 6f 6b 69 65 20 61 6e 64 20 52 65 61 64 43  Cookie and ReadC
30e10 6f 6f 6b 69 65 20 6f 70 63 6f 64 65 73 29 20 74  ookie opcodes) t
30e20 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
30e30 66 72 65 65 20 70 61 67 65 73 20 69 73 20 6e 6f  free pages is no
30e40 74 20 76 69 73 69 62 6c 65 2e 20 20 53 6f 20 43  t visible.  So C
30e50 6f 6f 6b 69 65 5b 30 5d 20 69 73 20 74 68 65 20  ookie[0] is the 
30e60 73 61 6d 65 20 61 73 20 4d 65 74 61 5b 31 5d 2e  same as Meta[1].
30e70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42  .*/.int sqlite3B
30e80 74 72 65 65 47 65 74 4d 65 74 61 28 42 74 72 65  treeGetMeta(Btre
30e90 65 20 2a 70 2c 20 69 6e 74 20 69 64 78 2c 20 75  e *p, int idx, u
30ea0 33 32 20 2a 70 4d 65 74 61 29 7b 0a 20 20 44 62  32 *pMeta){.  Db
30eb0 50 61 67 65 20 2a 70 44 62 50 61 67 65 3b 0a 20  Page *pDbPage;. 
30ec0 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67   int rc;.  unsig
30ed0 6e 65 64 20 63 68 61 72 20 2a 70 50 31 3b 0a 20  ned char *pP1;. 
30ee0 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
30ef0 20 70 2d 3e 70 42 74 3b 0a 0a 20 20 73 71 6c 69   p->pBt;..  sqli
30f00 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70 29  te3BtreeEnter(p)
30f10 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20 70 2d  ;.  pBt->db = p-
30f20 3e 64 62 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 69  >db;..  /* Readi
30f30 6e 67 20 61 20 6d 65 74 61 2d 64 61 74 61 20 76  ng a meta-data v
30f40 61 6c 75 65 20 72 65 71 75 69 72 65 73 20 61 20  alue requires a 
30f50 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70 61 67  read-lock on pag
30f60 65 20 31 20 28 61 6e 64 20 68 65 6e 63 65 0a 20  e 1 (and hence. 
30f70 20 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   ** the sqlite_m
30f80 61 73 74 65 72 20 74 61 62 6c 65 2e 20 57 65 20  aster table. We 
30f90 67 72 61 62 20 74 68 69 73 20 6c 6f 63 6b 20 72  grab this lock r
30fa0 65 67 61 72 64 6c 65 73 73 20 6f 66 20 77 68 65  egardless of whe
30fb0 74 68 65 72 20 6f 72 0a 20 20 2a 2a 20 6e 6f 74  ther or.  ** not
30fc0 20 74 68 65 20 53 51 4c 49 54 45 5f 52 65 61 64   the SQLITE_Read
30fd0 55 6e 63 6f 6d 6d 69 74 74 65 64 20 66 6c 61 67  Uncommitted flag
30fe0 20 69 73 20 73 65 74 20 28 74 68 65 20 74 61 62   is set (the tab
30ff0 6c 65 20 72 6f 6f 74 65 64 20 61 74 20 70 61 67  le rooted at pag
31000 65 0a 20 20 2a 2a 20 31 20 69 73 20 74 72 65 61  e.  ** 1 is trea
31010 74 65 64 20 61 73 20 61 20 73 70 65 63 69 61 6c  ted as a special
31020 20 63 61 73 65 20 62 79 20 71 75 65 72 79 54 61   case by queryTa
31030 62 6c 65 4c 6f 63 6b 28 29 20 61 6e 64 20 6c 6f  bleLock() and lo
31040 63 6b 54 61 62 6c 65 28 29 29 2e 0a 20 20 2a 2f  ckTable())..  */
31050 0a 20 20 72 63 20 3d 20 71 75 65 72 79 54 61 62  .  rc = queryTab
31060 6c 65 4c 6f 63 6b 28 70 2c 20 31 2c 20 52 45 41  leLock(p, 1, REA
31070 44 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72  D_LOCK);.  if( r
31080 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
31090 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
310a0 4c 65 61 76 65 28 70 29 3b 0a 20 20 20 20 72 65  Leave(p);.    re
310b0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
310c0 61 73 73 65 72 74 28 20 69 64 78 3e 3d 30 20 26  assert( idx>=0 &
310d0 26 20 69 64 78 3c 3d 31 35 20 29 3b 0a 20 20 69  & idx<=15 );.  i
310e0 66 28 20 70 42 74 2d 3e 70 50 61 67 65 31 20 29  f( pBt->pPage1 )
310f0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 62 2d 74  {.    /* The b-t
31100 72 65 65 20 69 73 20 61 6c 72 65 61 64 79 20 68  ree is already h
31110 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65 6e  olding a referen
31120 63 65 20 74 6f 20 70 61 67 65 20 31 20 6f 66 20  ce to page 1 of 
31130 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
31140 20 2a 2a 20 66 69 6c 65 2e 20 49 6e 20 74 68 69   ** file. In thi
31150 73 20 63 61 73 65 20 74 68 65 20 72 65 71 75 69  s case the requi
31160 72 65 64 20 6d 65 74 61 2d 64 61 74 61 20 76 61  red meta-data va
31170 6c 75 65 20 63 61 6e 20 62 65 20 72 65 61 64 20  lue can be read 
31180 64 69 72 65 63 74 6c 79 0a 20 20 20 20 2a 2a 20  directly.    ** 
31190 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 64 61  from the page da
311a0 74 61 20 6f 66 20 74 68 69 73 20 72 65 66 65 72  ta of this refer
311b0 65 6e 63 65 2e 20 54 68 69 73 20 69 73 20 73 6c  ence. This is sl
311c0 69 67 68 74 6c 79 20 66 61 73 74 65 72 20 74 68  ightly faster th
311d0 61 6e 0a 20 20 20 20 2a 2a 20 72 65 71 75 65 73  an.    ** reques
311e0 74 69 6e 67 20 61 20 6e 65 77 20 72 65 66 65 72  ting a new refer
311f0 65 6e 63 65 20 66 72 6f 6d 20 74 68 65 20 70 61  ence from the pa
31200 67 65 72 20 6c 61 79 65 72 2e 0a 20 20 20 20 2a  ger layer..    *
31210 2f 0a 20 20 20 20 70 50 31 20 3d 20 28 75 6e 73  /.    pP1 = (uns
31220 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 42 74  igned char *)pBt
31230 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61 74 61 3b  ->pPage1->aData;
31240 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
31250 20 54 68 65 20 62 2d 74 72 65 65 20 64 6f 65 73   The b-tree does
31260 20 6e 6f 74 20 68 61 76 65 20 61 20 72 65 66 65   not have a refe
31270 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 31 20  rence to page 1 
31280 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
31290 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 20 4f 62 74  file..    ** Obt
312a0 61 69 6e 20 6f 6e 65 20 66 72 6f 6d 20 74 68 65  ain one from the
312b0 20 70 61 67 65 72 20 6c 61 79 65 72 2e 0a 20 20   pager layer..  
312c0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
312d0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42  lite3PagerGet(pB
312e0 74 2d 3e 70 50 61 67 65 72 2c 20 31 2c 20 26 70  t->pPager, 1, &p
312f0 44 62 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28  DbPage);.    if(
31300 20 72 63 20 29 7b 0a 20 20 20 20 20 20 73 71 6c   rc ){.      sql
31310 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
31320 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
31330 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  rc;.    }.    pP
31340 31 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 63 68  1 = (unsigned ch
31350 61 72 20 2a 29 73 71 6c 69 74 65 33 50 61 67 65  ar *)sqlite3Page
31360 72 47 65 74 44 61 74 61 28 70 44 62 50 61 67 65  rGetData(pDbPage
31370 29 3b 0a 20 20 7d 0a 20 20 2a 70 4d 65 74 61 20  );.  }.  *pMeta 
31380 3d 20 67 65 74 34 62 79 74 65 28 26 70 50 31 5b  = get4byte(&pP1[
31390 33 36 20 2b 20 69 64 78 2a 34 5d 29 3b 0a 0a 20  36 + idx*4]);.. 
313a0 20 2f 2a 20 49 66 20 74 68 65 20 62 2d 74 72 65   /* If the b-tre
313b0 65 20 69 73 20 6e 6f 74 20 68 6f 6c 64 69 6e 67  e is not holding
313c0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
313d0 70 61 67 65 20 31 2c 20 74 68 65 6e 20 6f 6e 65  page 1, then one
313e0 20 77 61 73 20 0a 20 20 2a 2a 20 72 65 71 75 65   was .  ** reque
313f0 73 74 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61  sted from the pa
31400 67 65 72 20 6c 61 79 65 72 20 69 6e 20 74 68 65  ger layer in the
31410 20 61 62 6f 76 65 20 62 6c 6f 63 6b 2e 20 52 65   above block. Re
31420 6c 65 61 73 65 20 69 74 20 6e 6f 77 2e 0a 20 20  lease it now..  
31430 2a 2f 0a 20 20 69 66 28 20 21 70 42 74 2d 3e 70  */.  if( !pBt->p
31440 50 61 67 65 31 20 29 7b 0a 20 20 20 20 73 71 6c  Page1 ){.    sql
31450 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
31460 44 62 50 61 67 65 29 3b 0a 20 20 7d 0a 0a 20 20  DbPage);.  }..  
31470 2f 2a 20 49 66 20 61 75 74 6f 76 61 63 75 75 6d  /* If autovacuum
31480 65 64 20 69 73 20 64 69 73 61 62 6c 65 64 20 69  ed is disabled i
31490 6e 20 74 68 69 73 20 62 75 69 6c 64 20 62 75 74  n this build but
314a0 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74   we are trying t
314b0 6f 20 0a 20 20 2a 2a 20 61 63 63 65 73 73 20 61  o .  ** access a
314c0 6e 20 61 75 74 6f 76 61 63 75 75 6d 65 64 20 64  n autovacuumed d
314d0 61 74 61 62 61 73 65 2c 20 74 68 65 6e 20 6d 61  atabase, then ma
314e0 6b 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ke the database 
314f0 72 65 61 64 6f 6e 6c 79 2e 20 0a 20 20 2a 2f 0a  readonly. .  */.
31500 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
31510 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
31520 69 66 28 20 69 64 78 3d 3d 34 20 26 26 20 2a 70  if( idx==4 && *p
31530 4d 65 74 61 3e 30 20 29 20 70 42 74 2d 3e 72 65  Meta>0 ) pBt->re
31540 61 64 4f 6e 6c 79 20 3d 20 31 3b 0a 23 65 6e 64  adOnly = 1;.#end
31550 69 66 0a 0a 20 20 2f 2a 20 47 72 61 62 20 74 68  if..  /* Grab th
31560 65 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 70  e read-lock on p
31570 61 67 65 20 31 2e 20 2a 2f 0a 20 20 72 63 20 3d  age 1. */.  rc =
31580 20 6c 6f 63 6b 54 61 62 6c 65 28 70 2c 20 31 2c   lockTable(p, 1,
31590 20 52 45 41 44 5f 4c 4f 43 4b 29 3b 0a 20 20 73   READ_LOCK);.  s
315a0 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
315b0 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  (p);.  return rc
315c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ;.}../*.** Write
315d0 20 6d 65 74 61 2d 69 6e 66 6f 72 6d 61 74 69 6f   meta-informatio
315e0 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  n back into the 
315f0 64 61 74 61 62 61 73 65 2e 20 20 4d 65 74 61 5b  database.  Meta[
31600 30 5d 20 69 73 0a 2a 2a 20 72 65 61 64 2d 6f 6e  0] is.** read-on
31610 6c 79 20 61 6e 64 20 6d 61 79 20 6e 6f 74 20 62  ly and may not b
31620 65 20 77 72 69 74 74 65 6e 2e 0a 2a 2f 0a 69 6e  e written..*/.in
31630 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 55 70  t sqlite3BtreeUp
31640 64 61 74 65 4d 65 74 61 28 42 74 72 65 65 20 2a  dateMeta(Btree *
31650 70 2c 20 69 6e 74 20 69 64 78 2c 20 75 33 32 20  p, int idx, u32 
31660 69 4d 65 74 61 29 7b 0a 20 20 42 74 53 68 61 72  iMeta){.  BtShar
31670 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e 70 42 74  ed *pBt = p->pBt
31680 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
31690 72 20 2a 70 50 31 3b 0a 20 20 69 6e 74 20 72 63  r *pP1;.  int rc
316a0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 64 78 3e  ;.  assert( idx>
316b0 3d 31 20 26 26 20 69 64 78 3c 3d 31 35 20 29 3b  =1 && idx<=15 );
316c0 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
316d0 6e 74 65 72 28 70 29 3b 0a 20 20 70 42 74 2d 3e  nter(p);.  pBt->
316e0 64 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 69 66  db = p->db;.  if
316f0 28 20 70 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  ( p->inTrans!=TR
31700 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
31710 20 72 63 20 3d 20 70 42 74 2d 3e 72 65 61 64 4f   rc = pBt->readO
31720 6e 6c 79 20 3f 20 53 51 4c 49 54 45 5f 52 45 41  nly ? SQLITE_REA
31730 44 4f 4e 4c 59 20 3a 20 53 51 4c 49 54 45 5f 45  DONLY : SQLITE_E
31740 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RROR;.  }else{. 
31750 20 20 20 61 73 73 65 72 74 28 20 70 42 74 2d 3e     assert( pBt->
31760 70 50 61 67 65 31 21 3d 30 20 29 3b 0a 20 20 20  pPage1!=0 );.   
31770 20 70 50 31 20 3d 20 70 42 74 2d 3e 70 50 61 67   pP1 = pBt->pPag
31780 65 31 2d 3e 61 44 61 74 61 3b 0a 20 20 20 20 72  e1->aData;.    r
31790 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
317a0 57 72 69 74 65 28 70 42 74 2d 3e 70 50 61 67 65  Write(pBt->pPage
317b0 31 2d 3e 70 44 62 50 61 67 65 29 3b 0a 20 20 20  1->pDbPage);.   
317c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
317d0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 75 74 34  OK ){.      put4
317e0 62 79 74 65 28 26 70 50 31 5b 33 36 20 2b 20 69  byte(&pP1[36 + i
317f0 64 78 2a 34 5d 2c 20 69 4d 65 74 61 29 3b 0a 23  dx*4], iMeta);.#
31800 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
31810 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
31820 20 20 20 20 69 66 28 20 69 64 78 3d 3d 37 20 29      if( idx==7 )
31830 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
31840 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75 75  ( pBt->autoVacuu
31850 6d 20 7c 7c 20 69 4d 65 74 61 3d 3d 30 20 29 3b  m || iMeta==0 );
31860 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
31870 20 69 4d 65 74 61 3d 3d 30 20 7c 7c 20 69 4d 65   iMeta==0 || iMe
31880 74 61 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20  ta==1 );.       
31890 20 70 42 74 2d 3e 69 6e 63 72 56 61 63 75 75 6d   pBt->incrVacuum
318a0 20 3d 20 69 4d 65 74 61 3b 0a 20 20 20 20 20 20   = iMeta;.      
318b0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  }.#endif.    }. 
318c0 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
318d0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
318e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
318f0 20 52 65 74 75 72 6e 20 74 68 65 20 66 6c 61 67   Return the flag
31900 20 62 79 74 65 20 61 74 20 74 68 65 20 62 65 67   byte at the beg
31910 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 70 61  inning of the pa
31920 67 65 20 74 68 61 74 20 74 68 65 20 63 75 72 73  ge that the curs
31930 6f 72 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74  or.** is current
31940 6c 79 20 70 6f 69 6e 74 69 6e 67 20 74 6f 2e 0a  ly pointing to..
31950 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 42 74  */.int sqlite3Bt
31960 72 65 65 46 6c 61 67 73 28 42 74 43 75 72 73 6f  reeFlags(BtCurso
31970 72 20 2a 70 43 75 72 29 7b 0a 20 20 2f 2a 20 54  r *pCur){.  /* T
31980 4f 44 4f 3a 20 57 68 61 74 20 61 62 6f 75 74 20  ODO: What about 
31990 43 55 52 53 4f 52 5f 52 45 51 55 49 52 45 53 45  CURSOR_REQUIRESE
319a0 45 4b 20 73 74 61 74 65 3f 20 50 72 6f 62 61 62  EK state? Probab
319b0 6c 79 20 6e 65 65 64 20 74 6f 20 63 61 6c 6c 0a  ly need to call.
319c0 20 20 2a 2a 20 72 65 73 74 6f 72 65 43 75 72 73    ** restoreCurs
319d0 6f 72 50 6f 73 69 74 69 6f 6e 28 29 20 68 65 72  orPosition() her
319e0 65 2e 0a 20 20 2a 2f 0a 20 20 4d 65 6d 50 61 67  e..  */.  MemPag
319f0 65 20 2a 70 50 61 67 65 3b 0a 20 20 72 65 73 74  e *pPage;.  rest
31a00 6f 72 65 43 75 72 73 6f 72 50 6f 73 69 74 69 6f  oreCursorPositio
31a10 6e 28 70 43 75 72 29 3b 0a 20 20 70 50 61 67 65  n(pCur);.  pPage
31a20 20 3d 20 70 43 75 72 2d 3e 61 70 50 61 67 65 5b   = pCur->apPage[
31a30 70 43 75 72 2d 3e 69 50 61 67 65 5d 3b 0a 20 20  pCur->iPage];.  
31a40 61 73 73 65 72 74 28 20 63 75 72 73 6f 72 48 6f  assert( cursorHo
31a50 6c 64 73 4d 75 74 65 78 28 70 43 75 72 29 20 29  ldsMutex(pCur) )
31a60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
31a70 65 2d 3e 70 42 74 3d 3d 70 43 75 72 2d 3e 70 42  e->pBt==pCur->pB
31a80 74 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  t );.  return pP
31a90 61 67 65 20 3f 20 70 50 61 67 65 2d 3e 61 44 61  age ? pPage->aDa
31aa0 74 61 5b 70 50 61 67 65 2d 3e 68 64 72 4f 66 66  ta[pPage->hdrOff
31ab0 73 65 74 5d 20 3a 20 30 3b 0a 7d 0a 0a 0a 2f 2a  set] : 0;.}.../*
31ac0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
31ad0 61 67 65 72 20 61 73 73 6f 63 69 61 74 65 64 20  ager associated 
31ae0 77 69 74 68 20 61 20 42 54 72 65 65 2e 20 20 54  with a BTree.  T
31af0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
31b00 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
31b10 6e 67 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67  ng and debugging
31b20 20 6f 6e 6c 79 2e 0a 2a 2f 0a 50 61 67 65 72 20   only..*/.Pager 
31b30 2a 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67  *sqlite3BtreePag
31b40 65 72 28 42 74 72 65 65 20 2a 70 29 7b 0a 20 20  er(Btree *p){.  
31b50 72 65 74 75 72 6e 20 70 2d 3e 70 42 74 2d 3e 70  return p->pBt->p
31b60 50 61 67 65 72 3b 0a 7d 0a 0a 23 69 66 6e 64 65  Pager;.}..#ifnde
31b70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
31b80 54 45 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a  TEGRITY_CHECK./*
31b90 0a 2a 2a 20 41 70 70 65 6e 64 20 61 20 6d 65 73  .** Append a mes
31ba0 73 61 67 65 20 74 6f 20 74 68 65 20 65 72 72 6f  sage to the erro
31bb0 72 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67  r message string
31bc0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
31bd0 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28   checkAppendMsg(
31be0 0a 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a  .  IntegrityCk *
31bf0 70 43 68 65 63 6b 2c 0a 20 20 63 68 61 72 20 2a  pCheck,.  char *
31c00 7a 4d 73 67 31 2c 0a 20 20 63 6f 6e 73 74 20 63  zMsg1,.  const c
31c10 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 0a 20 20  har *zFormat,.  
31c20 2e 2e 2e 0a 29 7b 0a 20 20 76 61 5f 6c 69 73 74  ....){.  va_list
31c30 20 61 70 3b 0a 20 20 69 66 28 20 21 70 43 68 65   ap;.  if( !pChe
31c40 63 6b 2d 3e 6d 78 45 72 72 20 29 20 72 65 74 75  ck->mxErr ) retu
31c50 72 6e 3b 0a 20 20 70 43 68 65 63 6b 2d 3e 6d 78  rn;.  pCheck->mx
31c60 45 72 72 2d 2d 3b 0a 20 20 70 43 68 65 63 6b 2d  Err--;.  pCheck-
31c70 3e 6e 45 72 72 2b 2b 3b 0a 20 20 76 61 5f 73 74  >nErr++;.  va_st
31c80 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
31c90 3b 0a 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e  ;.  if( pCheck->
31ca0 65 72 72 4d 73 67 2e 6e 43 68 61 72 20 29 7b 0a  errMsg.nChar ){.
31cb0 20 20 20 20 73 71 6c 69 74 65 33 53 74 72 41 63      sqlite3StrAc
31cc0 63 75 6d 41 70 70 65 6e 64 28 26 70 43 68 65 63  cumAppend(&pChec
31cd0 6b 2d 3e 65 72 72 4d 73 67 2c 20 22 5c 6e 22 2c  k->errMsg, "\n",
31ce0 20 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a   1);.  }.  if( z
31cf0 4d 73 67 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  Msg1 ){.    sqli
31d00 74 65 33 53 74 72 41 63 63 75 6d 41 70 70 65 6e  te3StrAccumAppen
31d10 64 28 26 70 43 68 65 63 6b 2d 3e 65 72 72 4d 73  d(&pCheck->errMs
31d20 67 2c 20 7a 4d 73 67 31 2c 20 2d 31 29 3b 0a 20  g, zMsg1, -1);. 
31d30 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 58 50 72   }.  sqlite3VXPr
31d40 69 6e 74 66 28 26 70 43 68 65 63 6b 2d 3e 65 72  intf(&pCheck->er
31d50 72 4d 73 67 2c 20 31 2c 20 7a 46 6f 72 6d 61 74  rMsg, 1, zFormat
31d60 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
31d70 61 70 29 3b 0a 20 20 69 66 28 20 70 43 68 65 63  ap);.  if( pChec
31d80 6b 2d 3e 65 72 72 4d 73 67 2e 6d 61 6c 6c 6f 63  k->errMsg.malloc
31d90 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 70 43  Failed ){.    pC
31da0 68 65 63 6b 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  heck->mallocFail
31db0 65 64 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 23 65  ed = 1;.  }.}.#e
31dc0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
31dd0 4d 49 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48  MIT_INTEGRITY_CH
31de0 45 43 4b 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20  ECK */..#ifndef 
31df0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45  SQLITE_OMIT_INTE
31e00 47 52 49 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a  GRITY_CHECK./*.*
31e10 2a 20 41 64 64 20 31 20 74 6f 20 74 68 65 20 72  * Add 1 to the r
31e20 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
31e30 6f 72 20 70 61 67 65 20 69 50 61 67 65 2e 20 20  or page iPage.  
31e40 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 73  If this is the s
31e50 65 63 6f 6e 64 0a 2a 2a 20 72 65 66 65 72 65 6e  econd.** referen
31e60 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 2c 20  ce to the page, 
31e70 61 64 64 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  add an error mes
31e80 73 61 67 65 20 74 6f 20 70 43 68 65 63 6b 2d 3e  sage to pCheck->
31e90 7a 45 72 72 4d 73 67 2e 0a 2a 2a 20 52 65 74 75  zErrMsg..** Retu
31ea0 72 6e 20 31 20 69 66 20 74 68 65 72 65 20 61 72  rn 1 if there ar
31eb0 65 20 32 20 6f 72 65 20 6d 6f 72 65 20 72 65 66  e 2 ore more ref
31ec0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
31ed0 61 67 65 20 61 6e 64 20 30 20 69 66 0a 2a 2a 20  age and 0 if.** 
31ee0 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
31ef0 69 72 73 74 20 72 65 66 65 72 65 6e 63 65 20 74  irst reference t
31f00 6f 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  o the page..**.*
31f10 2a 20 41 6c 73 6f 20 63 68 65 63 6b 20 74 68 61  * Also check tha
31f20 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  t the page numbe
31f30 72 20 69 73 20 69 6e 20 62 6f 75 6e 64 73 2e 0a  r is in bounds..
31f40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 68  */.static int ch
31f50 65 63 6b 52 65 66 28 49 6e 74 65 67 72 69 74 79  eckRef(Integrity
31f60 43 6b 20 2a 70 43 68 65 63 6b 2c 20 69 6e 74 20  Ck *pCheck, int 
31f70 69 50 61 67 65 2c 20 63 68 61 72 20 2a 7a 43 6f  iPage, char *zCo
31f80 6e 74 65 78 74 29 7b 0a 20 20 69 66 28 20 69 50  ntext){.  if( iP
31f90 61 67 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  age==0 ) return 
31fa0 31 3b 0a 20 20 69 66 28 20 69 50 61 67 65 3e 70  1;.  if( iPage>p
31fb0 43 68 65 63 6b 2d 3e 6e 50 61 67 65 20 7c 7c 20  Check->nPage || 
31fc0 69 50 61 67 65 3c 30 20 29 7b 0a 20 20 20 20 63  iPage<0 ){.    c
31fd0 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
31fe0 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20  heck, zContext, 
31ff0 22 69 6e 76 61 6c 69 64 20 70 61 67 65 20 6e 75  "invalid page nu
32000 6d 62 65 72 20 25 64 22 2c 20 69 50 61 67 65 29  mber %d", iPage)
32010 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
32020 20 20 7d 0a 20 20 69 66 28 20 70 43 68 65 63 6b    }.  if( pCheck
32030 2d 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d 3d 3d  ->anRef[iPage]==
32040 31 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41 70  1 ){.    checkAp
32050 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20  pendMsg(pCheck, 
32060 7a 43 6f 6e 74 65 78 74 2c 20 22 32 6e 64 20 72  zContext, "2nd r
32070 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65  eference to page
32080 20 25 64 22 2c 20 69 50 61 67 65 29 3b 0a 20 20   %d", iPage);.  
32090 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
320a0 20 20 72 65 74 75 72 6e 20 20 28 70 43 68 65 63    return  (pChec
320b0 6b 2d 3e 61 6e 52 65 66 5b 69 50 61 67 65 5d 2b  k->anRef[iPage]+
320c0 2b 29 3e 31 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  +)>1;.}..#ifndef
320d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
320e0 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 43 68  OVACUUM./*.** Ch
320f0 65 63 6b 20 74 68 61 74 20 74 68 65 20 65 6e 74  eck that the ent
32100 72 79 20 69 6e 20 74 68 65 20 70 6f 69 6e 74 65  ry in the pointe
32110 72 2d 6d 61 70 20 66 6f 72 20 70 61 67 65 20 69  r-map for page i
32120 43 68 69 6c 64 20 6d 61 70 73 20 74 6f 20 0a 2a  Child maps to .*
32130 2a 20 70 61 67 65 20 69 50 61 72 65 6e 74 2c 20  * page iParent, 
32140 70 6f 69 6e 74 65 72 20 74 79 70 65 20 70 74 72  pointer type ptr
32150 54 79 70 65 2e 20 49 66 20 6e 6f 74 2c 20 61 70  Type. If not, ap
32160 70 65 6e 64 20 61 6e 20 65 72 72 6f 72 20 6d 65  pend an error me
32170 73 73 61 67 65 0a 2a 2a 20 74 6f 20 70 43 68 65  ssage.** to pChe
32180 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
32190 69 64 20 63 68 65 63 6b 50 74 72 6d 61 70 28 0a  id checkPtrmap(.
321a0 20 20 49 6e 74 65 67 72 69 74 79 43 6b 20 2a 70    IntegrityCk *p
321b0 43 68 65 63 6b 2c 20 20 20 2f 2a 20 49 6e 74 65  Check,   /* Inte
321c0 67 72 69 74 79 20 63 68 65 63 6b 20 63 6f 6e 74  grity check cont
321d0 65 78 74 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 43  ext */.  Pgno iC
321e0 68 69 6c 64 2c 20 20 20 20 20 20 20 20 20 20 20  hild,           
321f0 2f 2a 20 43 68 69 6c 64 20 70 61 67 65 20 6e 75  /* Child page nu
32200 6d 62 65 72 20 2a 2f 0a 20 20 75 38 20 65 54 79  mber */.  u8 eTy
32210 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  pe,             
32220 20 2f 2a 20 45 78 70 65 63 74 65 64 20 70 6f 69   /* Expected poi
32230 6e 74 65 72 20 6d 61 70 20 74 79 70 65 20 2a 2f  nter map type */
32240 0a 20 20 50 67 6e 6f 20 69 50 61 72 65 6e 74 2c  .  Pgno iParent,
32250 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70            /* Exp
32260 65 63 74 65 64 20 70 6f 69 6e 74 65 72 20 6d 61  ected pointer ma
32270 70 20 70 61 72 65 6e 74 20 70 61 67 65 20 6e 75  p parent page nu
32280 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a  mber */.  char *
32290 7a 43 6f 6e 74 65 78 74 20 20 20 20 20 20 20 20  zContext        
322a0 20 2f 2a 20 43 6f 6e 74 65 78 74 20 64 65 73 63   /* Context desc
322b0 72 69 70 74 69 6f 6e 20 28 75 73 65 64 20 66 6f  ription (used fo
322c0 72 20 65 72 72 6f 72 20 6d 73 67 29 20 2a 2f 0a  r error msg) */.
322d0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
322e0 38 20 65 50 74 72 6d 61 70 54 79 70 65 3b 0a 20  8 ePtrmapType;. 
322f0 20 50 67 6e 6f 20 69 50 74 72 6d 61 70 50 61 72   Pgno iPtrmapPar
32300 65 6e 74 3b 0a 0a 20 20 72 63 20 3d 20 70 74 72  ent;..  rc = ptr
32310 6d 61 70 47 65 74 28 70 43 68 65 63 6b 2d 3e 70  mapGet(pCheck->p
32320 42 74 2c 20 69 43 68 69 6c 64 2c 20 26 65 50 74  Bt, iChild, &ePt
32330 72 6d 61 70 54 79 70 65 2c 20 26 69 50 74 72 6d  rmapType, &iPtrm
32340 61 70 50 61 72 65 6e 74 29 3b 0a 20 20 69 66 28  apParent);.  if(
32350 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
32360 7b 0a 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e  {.    checkAppen
32370 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f  dMsg(pCheck, zCo
32380 6e 74 65 78 74 2c 20 22 46 61 69 6c 65 64 20 74  ntext, "Failed t
32390 6f 20 72 65 61 64 20 70 74 72 6d 61 70 20 6b 65  o read ptrmap ke
323a0 79 3d 25 64 22 2c 20 69 43 68 69 6c 64 29 3b 0a  y=%d", iChild);.
323b0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
323c0 0a 20 20 69 66 28 20 65 50 74 72 6d 61 70 54 79  .  if( ePtrmapTy
323d0 70 65 21 3d 65 54 79 70 65 20 7c 7c 20 69 50 74  pe!=eType || iPt
323e0 72 6d 61 70 50 61 72 65 6e 74 21 3d 69 50 61 72  rmapParent!=iPar
323f0 65 6e 74 20 29 7b 0a 20 20 20 20 63 68 65 63 6b  ent ){.    check
32400 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
32410 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20  , zContext, .   
32420 20 20 20 22 42 61 64 20 70 74 72 20 6d 61 70 20     "Bad ptr map 
32430 65 6e 74 72 79 20 6b 65 79 3d 25 64 20 65 78 70  entry key=%d exp
32440 65 63 74 65 64 3d 28 25 64 2c 25 64 29 20 67 6f  ected=(%d,%d) go
32450 74 3d 28 25 64 2c 25 64 29 22 2c 20 0a 20 20 20  t=(%d,%d)", .   
32460 20 20 20 69 43 68 69 6c 64 2c 20 65 54 79 70 65     iChild, eType
32470 2c 20 69 50 61 72 65 6e 74 2c 20 65 50 74 72 6d  , iParent, ePtrm
32480 61 70 54 79 70 65 2c 20 69 50 74 72 6d 61 70 50  apType, iPtrmapP
32490 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65  arent);.  }.}.#e
324a0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ndif../*.** Chec
324b0 6b 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20  k the integrity 
324c0 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
324d0 6f 72 20 6f 66 20 61 6e 20 6f 76 65 72 66 6c 6f  or of an overflo
324e0 77 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2a 20  w page list..** 
324f0 56 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  Verify that the 
32500 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
32510 6f 6e 20 74 68 65 20 6c 69 73 74 20 69 73 20 4e  on the list is N
32520 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
32530 20 63 68 65 63 6b 4c 69 73 74 28 0a 20 20 49 6e   checkList(.  In
32540 74 65 67 72 69 74 79 43 6b 20 2a 70 43 68 65 63  tegrityCk *pChec
32550 6b 2c 20 20 2f 2a 20 49 6e 74 65 67 72 69 74 79  k,  /* Integrity
32560 20 63 68 65 63 6b 69 6e 67 20 63 6f 6e 74 65 78   checking contex
32570 74 20 2a 2f 0a 20 20 69 6e 74 20 69 73 46 72 65  t */.  int isFre
32580 65 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  eList,       /* 
32590 54 72 75 65 20 66 6f 72 20 61 20 66 72 65 65 6c  True for a freel
325a0 69 73 74 2e 20 20 46 61 6c 73 65 20 66 6f 72 20  ist.  False for 
325b0 6f 76 65 72 66 6c 6f 77 20 70 61 67 65 20 6c 69  overflow page li
325c0 73 74 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61 67  st */.  int iPag
325d0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e,            /*
325e0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   Page number for
325f0 20 66 69 72 73 74 20 70 61 67 65 20 69 6e 20 74   first page in t
32600 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 69 6e 74  he list */.  int
32610 20 4e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   N,             
32620 20 20 20 2f 2a 20 45 78 70 65 63 74 65 64 20 6e     /* Expected n
32630 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
32640 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20  n the list */.  
32650 63 68 61 72 20 2a 7a 43 6f 6e 74 65 78 74 20 20  char *zContext  
32660 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65 78 74        /* Context
32670 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61   for error messa
32680 67 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ges */.){.  int 
32690 69 3b 0a 20 20 69 6e 74 20 65 78 70 65 63 74 65  i;.  int expecte
326a0 64 20 3d 20 4e 3b 0a 20 20 69 6e 74 20 69 46 69  d = N;.  int iFi
326b0 72 73 74 20 3d 20 69 50 61 67 65 3b 0a 20 20 77  rst = iPage;.  w
326c0 68 69 6c 65 28 20 4e 2d 2d 20 3e 20 30 20 26 26  hile( N-- > 0 &&
326d0 20 70 43 68 65 63 6b 2d 3e 6d 78 45 72 72 20 29   pCheck->mxErr )
326e0 7b 0a 20 20 20 20 44 62 50 61 67 65 20 2a 70 4f  {.    DbPage *pO
326f0 76 66 6c 50 61 67 65 3b 0a 20 20 20 20 75 6e 73  vflPage;.    uns
32700 69 67 6e 65 64 20 63 68 61 72 20 2a 70 4f 76 66  igned char *pOvf
32710 6c 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 69  lData;.    if( i
32720 50 61 67 65 3c 31 20 29 7b 0a 20 20 20 20 20 20  Page<1 ){.      
32730 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70  checkAppendMsg(p
32740 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c  Check, zContext,
32750 0a 20 20 20 20 20 20 20 20 20 22 25 64 20 6f 66  .         "%d of
32760 20 25 64 20 70 61 67 65 73 20 6d 69 73 73 69 6e   %d pages missin
32770 67 20 66 72 6f 6d 20 6f 76 65 72 66 6c 6f 77 20  g from overflow 
32780 6c 69 73 74 20 73 74 61 72 74 69 6e 67 20 61 74  list starting at
32790 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %d",.          
327a0 4e 2b 31 2c 20 65 78 70 65 63 74 65 64 2c 20 69  N+1, expected, i
327b0 46 69 72 73 74 29 3b 0a 20 20 20 20 20 20 62 72  First);.      br
327c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
327d0 66 28 20 63 68 65 63 6b 52 65 66 28 70 43 68 65  f( checkRef(pChe
327e0 63 6b 2c 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74  ck, iPage, zCont
327f0 65 78 74 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  ext) ) break;.  
32800 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67    if( sqlite3Pag
32810 65 72 47 65 74 28 70 43 68 65 63 6b 2d 3e 70 50  erGet(pCheck->pP
32820 61 67 65 72 2c 20 28 50 67 6e 6f 29 69 50 61 67  ager, (Pgno)iPag
32830 65 2c 20 26 70 4f 76 66 6c 50 61 67 65 29 20 29  e, &pOvflPage) )
32840 7b 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70  {.      checkApp
32850 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c 20 7a  endMsg(pCheck, z
32860 43 6f 6e 74 65 78 74 2c 20 22 66 61 69 6c 65 64  Context, "failed
32870 20 74 6f 20 67 65 74 20 70 61 67 65 20 25 64 22   to get page %d"
32880 2c 20 69 50 61 67 65 29 3b 0a 20 20 20 20 20 20  , iPage);.      
32890 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
328a0 20 70 4f 76 66 6c 44 61 74 61 20 3d 20 28 75 6e   pOvflData = (un
328b0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 73 71  signed char *)sq
328c0 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
328d0 61 28 70 4f 76 66 6c 50 61 67 65 29 3b 0a 20 20  a(pOvflPage);.  
328e0 20 20 69 66 28 20 69 73 46 72 65 65 4c 69 73 74    if( isFreeList
328f0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20   ){.      int n 
32900 3d 20 67 65 74 34 62 79 74 65 28 26 70 4f 76 66  = get4byte(&pOvf
32910 6c 44 61 74 61 5b 34 5d 29 3b 0a 23 69 66 6e 64  lData[4]);.#ifnd
32920 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
32930 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20  UTOVACUUM.      
32940 69 66 28 20 70 43 68 65 63 6b 2d 3e 70 42 74 2d  if( pCheck->pBt-
32950 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b 0a 20  >autoVacuum ){. 
32960 20 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d         checkPtrm
32970 61 70 28 70 43 68 65 63 6b 2c 20 69 50 61 67 65  ap(pCheck, iPage
32980 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  , PTRMAP_FREEPAG
32990 45 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  E, 0, zContext);
329a0 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
329b0 20 20 20 20 20 20 69 66 28 20 6e 3e 70 43 68 65        if( n>pChe
329c0 63 6b 2d 3e 70 42 74 2d 3e 75 73 61 62 6c 65 53  ck->pBt->usableS
329d0 69 7a 65 2f 34 2d 32 20 29 7b 0a 20 20 20 20 20  ize/4-2 ){.     
329e0 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73     checkAppendMs
329f0 67 28 70 43 68 65 63 6b 2c 20 7a 43 6f 6e 74 65  g(pCheck, zConte
32a00 78 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 22  xt,.           "
32a10 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20 63 6f  freelist leaf co
32a20 75 6e 74 20 74 6f 6f 20 62 69 67 20 6f 6e 20 70  unt too big on p
32a30 61 67 65 20 25 64 22 2c 20 69 50 61 67 65 29 3b  age %d", iPage);
32a40 0a 20 20 20 20 20 20 20 20 4e 2d 2d 3b 0a 20 20  .        N--;.  
32a50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32a60 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b     for(i=0; i<n;
32a70 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
32a80 20 50 67 6e 6f 20 69 46 72 65 65 50 61 67 65 20   Pgno iFreePage 
32a90 3d 20 67 65 74 34 62 79 74 65 28 26 70 4f 76 66  = get4byte(&pOvf
32aa0 6c 44 61 74 61 5b 38 2b 69 2a 34 5d 29 3b 0a 23  lData[8+i*4]);.#
32ab0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
32ac0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
32ad0 20 20 20 20 20 20 20 20 69 66 28 20 70 43 68 65          if( pChe
32ae0 63 6b 2d 3e 70 42 74 2d 3e 61 75 74 6f 56 61 63  ck->pBt->autoVac
32af0 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 20  uum ){.         
32b00 20 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70     checkPtrmap(p
32b10 43 68 65 63 6b 2c 20 69 46 72 65 65 50 61 67 65  Check, iFreePage
32b20 2c 20 50 54 52 4d 41 50 5f 46 52 45 45 50 41 47  , PTRMAP_FREEPAG
32b30 45 2c 20 30 2c 20 7a 43 6f 6e 74 65 78 74 29 3b  E, 0, zContext);
32b40 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  .          }.#en
32b50 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 63 68  dif.          ch
32b60 65 63 6b 52 65 66 28 70 43 68 65 63 6b 2c 20 69  eckRef(pCheck, i
32b70 46 72 65 65 50 61 67 65 2c 20 7a 43 6f 6e 74 65  FreePage, zConte
32b80 78 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xt);.        }. 
32b90 20 20 20 20 20 20 20 4e 20 2d 3d 20 6e 3b 0a 20         N -= n;. 
32ba0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66       }.    }.#if
32bb0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
32bc0 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
32bd0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49  else{.      /* I
32be0 66 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  f this database 
32bf0 73 75 70 70 6f 72 74 73 20 61 75 74 6f 2d 76 61  supports auto-va
32c00 63 75 75 6d 20 61 6e 64 20 69 50 61 67 65 20 69  cuum and iPage i
32c10 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 0a 20  s not the last. 
32c20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 69 6e 20       ** page in 
32c30 74 68 69 73 20 6f 76 65 72 66 6c 6f 77 20 6c 69  this overflow li
32c40 73 74 2c 20 63 68 65 63 6b 20 74 68 61 74 20 74  st, check that t
32c50 68 65 20 70 6f 69 6e 74 65 72 2d 6d 61 70 20 65  he pointer-map e
32c60 6e 74 72 79 20 66 6f 72 0a 20 20 20 20 20 20 2a  ntry for.      *
32c70 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * the following 
32c80 70 61 67 65 20 6d 61 74 63 68 65 73 20 69 50 61  page matches iPa
32c90 67 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ge..      */.   
32ca0 20 20 20 69 66 28 20 70 43 68 65 63 6b 2d 3e 70     if( pCheck->p
32cb0 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
32cc0 26 20 4e 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  & N>0 ){.       
32cd0 20 69 20 3d 20 67 65 74 34 62 79 74 65 28 70 4f   i = get4byte(pO
32ce0 76 66 6c 44 61 74 61 29 3b 0a 20 20 20 20 20 20  vflData);.      
32cf0 20 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43    checkPtrmap(pC
32d00 68 65 63 6b 2c 20 69 2c 20 50 54 52 4d 41 50 5f  heck, i, PTRMAP_
32d10 4f 56 45 52 46 4c 4f 57 32 2c 20 69 50 61 67 65  OVERFLOW2, iPage
32d20 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  , zContext);.   
32d30 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
32d40 66 0a 20 20 20 20 69 50 61 67 65 20 3d 20 67 65  f.    iPage = ge
32d50 74 34 62 79 74 65 28 70 4f 76 66 6c 44 61 74 61  t4byte(pOvflData
32d60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
32d70 67 65 72 55 6e 72 65 66 28 70 4f 76 66 6c 50 61  gerUnref(pOvflPa
32d80 67 65 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69  ge);.  }.}.#endi
32d90 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
32da0 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43 4b  _INTEGRITY_CHECK
32db0 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
32dc0 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52 49  ITE_OMIT_INTEGRI
32dd0 54 59 5f 43 48 45 43 4b 0a 2f 2a 0a 2a 2a 20 44  TY_CHECK./*.** D
32de0 6f 20 76 61 72 69 6f 75 73 20 73 61 6e 69 74 79  o various sanity
32df0 20 63 68 65 63 6b 73 20 6f 6e 20 61 20 73 69 6e   checks on a sin
32e00 67 6c 65 20 70 61 67 65 20 6f 66 20 61 20 74 72  gle page of a tr
32e10 65 65 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 74  ee.  Return.** t
32e20 68 65 20 74 72 65 65 20 64 65 70 74 68 2e 20 20  he tree depth.  
32e30 52 6f 6f 74 20 70 61 67 65 73 20 72 65 74 75 72  Root pages retur
32e40 6e 20 30 2e 20 20 50 61 72 65 6e 74 73 20 6f 66  n 0.  Parents of
32e50 20 72 6f 6f 74 20 70 61 67 65 73 0a 2a 2a 20 72   root pages.** r
32e60 65 74 75 72 6e 20 31 2c 20 61 6e 64 20 73 6f 20  eturn 1, and so 
32e70 66 6f 72 74 68 2e 0a 2a 2a 20 0a 2a 2a 20 54 68  forth..** .** Th
32e80 65 73 65 20 63 68 65 63 6b 73 20 61 72 65 20 64  ese checks are d
32e90 6f 6e 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  one:.**.**      
32ea0 31 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 74 68  1.  Make sure th
32eb0 61 74 20 63 65 6c 6c 73 20 61 6e 64 20 66 72 65  at cells and fre
32ec0 65 62 6c 6f 63 6b 73 20 64 6f 20 6e 6f 74 20 6f  eblocks do not o
32ed0 76 65 72 6c 61 70 0a 2a 2a 20 20 20 20 20 20 20  verlap.**       
32ee0 20 20 20 62 75 74 20 63 6f 6d 62 69 6e 65 20 74     but combine t
32ef0 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 63 6f 76  o completely cov
32f00 65 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20  er the page..** 
32f10 20 4e 4f 20 20 32 2e 20 20 4d 61 6b 65 20 73 75   NO  2.  Make su
32f20 72 65 20 63 65 6c 6c 20 6b 65 79 73 20 61 72 65  re cell keys are
32f30 20 69 6e 20 6f 72 64 65 72 2e 0a 2a 2a 20 20 4e   in order..**  N
32f40 4f 20 20 33 2e 20 20 4d 61 6b 65 20 73 75 72 65  O  3.  Make sure
32f50 20 6e 6f 20 6b 65 79 20 69 73 20 6c 65 73 73 20   no key is less 
32f60 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
32f70 20 7a 4c 6f 77 65 72 42 6f 75 6e 64 2e 0a 2a 2a   zLowerBound..**
32f80 20 20 4e 4f 20 20 34 2e 20 20 4d 61 6b 65 20 73    NO  4.  Make s
32f90 75 72 65 20 6e 6f 20 6b 65 79 20 69 73 20 67 72  ure no key is gr
32fa0 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
32fb0 75 61 6c 20 74 6f 20 7a 55 70 70 65 72 42 6f 75  ual to zUpperBou
32fc0 6e 64 2e 0a 2a 2a 20 20 20 20 20 20 35 2e 20 20  nd..**      5.  
32fd0 43 68 65 63 6b 20 74 68 65 20 69 6e 74 65 67 72  Check the integr
32fe0 69 74 79 20 6f 66 20 6f 76 65 72 66 6c 6f 77 20  ity of overflow 
32ff0 70 61 67 65 73 2e 0a 2a 2a 20 20 20 20 20 20 36  pages..**      6
33000 2e 20 20 52 65 63 75 72 73 69 76 65 6c 79 20 63  .  Recursively c
33010 61 6c 6c 20 63 68 65 63 6b 54 72 65 65 50 61 67  all checkTreePag
33020 65 20 6f 6e 20 61 6c 6c 20 63 68 69 6c 64 72 65  e on all childre
33030 6e 2e 0a 2a 2a 20 20 20 20 20 20 37 2e 20 20 56  n..**      7.  V
33040 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 64  erify that the d
33050 65 70 74 68 20 6f 66 20 61 6c 6c 20 63 68 69 6c  epth of all chil
33060 64 72 65 6e 20 69 73 20 74 68 65 20 73 61 6d 65  dren is the same
33070 2e 0a 2a 2a 20 20 20 20 20 20 38 2e 20 20 4d 61  ..**      8.  Ma
33080 6b 65 20 73 75 72 65 20 74 68 69 73 20 70 61 67  ke sure this pag
33090 65 20 69 73 20 61 74 20 6c 65 61 73 74 20 33 33  e is at least 33
330a0 25 20 66 75 6c 6c 20 6f 72 20 65 6c 73 65 20 69  % full or else i
330b0 74 20 69 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  t is.**         
330c0 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65   the root of the
330d0 20 74 72 65 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   tree..*/.static
330e0 20 69 6e 74 20 63 68 65 63 6b 54 72 65 65 50 61   int checkTreePa
330f0 67 65 28 0a 20 20 49 6e 74 65 67 72 69 74 79 43  ge(.  IntegrityC
33100 6b 20 2a 70 43 68 65 63 6b 2c 20 20 2f 2a 20 43  k *pCheck,  /* C
33110 6f 6e 74 65 78 74 20 66 6f 72 20 74 68 65 20 73  ontext for the s
33120 61 6e 69 74 79 20 63 68 65 63 6b 20 2a 2f 0a 20  anity check */. 
33130 20 69 6e 74 20 69 50 61 67 65 2c 20 20 20 20 20   int iPage,     
33140 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e         /* Page n
33150 75 6d 62 65 72 20 6f 66 20 74 68 65 20 70 61 67  umber of the pag
33160 65 20 74 6f 20 63 68 65 63 6b 20 2a 2f 0a 20 20  e to check */.  
33170 4d 65 6d 50 61 67 65 20 2a 70 50 61 72 65 6e 74  MemPage *pParent
33180 2c 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20  ,     /* Parent 
33190 70 61 67 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  page */.  char *
331a0 7a 50 61 72 65 6e 74 43 6f 6e 74 65 78 74 20 20  zParentContext  
331b0 2f 2a 20 50 61 72 65 6e 74 20 63 6f 6e 74 65 78  /* Parent contex
331c0 74 20 2a 2f 0a 29 7b 0a 20 20 4d 65 6d 50 61 67  t */.){.  MemPag
331d0 65 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20  e *pPage;.  int 
331e0 69 2c 20 72 63 2c 20 64 65 70 74 68 2c 20 64 32  i, rc, depth, d2
331f0 2c 20 70 67 6e 6f 2c 20 63 6e 74 3b 0a 20 20 69  , pgno, cnt;.  i
33200 6e 74 20 68 64 72 2c 20 63 65 6c 6c 53 74 61 72  nt hdr, cellStar
33210 74 3b 0a 20 20 69 6e 74 20 6e 43 65 6c 6c 3b 0a  t;.  int nCell;.
33220 20 20 75 38 20 2a 64 61 74 61 3b 0a 20 20 42 74    u8 *data;.  Bt
33230 53 68 61 72 65 64 20 2a 70 42 74 3b 0a 20 20 69  Shared *pBt;.  i
33240 6e 74 20 75 73 61 62 6c 65 53 69 7a 65 3b 0a 20  nt usableSize;. 
33250 20 63 68 61 72 20 7a 43 6f 6e 74 65 78 74 5b 31   char zContext[1
33260 30 30 5d 3b 0a 20 20 63 68 61 72 20 2a 68 69 74  00];.  char *hit
33270 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ;..  sqlite3_snp
33280 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 43 6f  rintf(sizeof(zCo
33290 6e 74 65 78 74 29 2c 20 7a 43 6f 6e 74 65 78 74  ntext), zContext
332a0 2c 20 22 50 61 67 65 20 25 64 3a 20 22 2c 20 69  , "Page %d: ", i
332b0 50 61 67 65 29 3b 0a 0a 20 20 2f 2a 20 43 68 65  Page);..  /* Che
332c0 63 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ck that the page
332d0 20 65 78 69 73 74 73 0a 20 20 2a 2f 0a 20 20 70   exists.  */.  p
332e0 42 74 20 3d 20 70 43 68 65 63 6b 2d 3e 70 42 74  Bt = pCheck->pBt
332f0 3b 0a 20 20 75 73 61 62 6c 65 53 69 7a 65 20 3d  ;.  usableSize =
33300 20 70 42 74 2d 3e 75 73 61 62 6c 65 53 69 7a 65   pBt->usableSize
33310 3b 0a 20 20 69 66 28 20 69 50 61 67 65 3d 3d 30  ;.  if( iPage==0
33320 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
33330 66 28 20 63 68 65 63 6b 52 65 66 28 70 43 68 65  f( checkRef(pChe
33340 63 6b 2c 20 69 50 61 67 65 2c 20 7a 50 61 72 65  ck, iPage, zPare
33350 6e 74 43 6f 6e 74 65 78 74 29 20 29 20 72 65 74  ntContext) ) ret
33360 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 28 72 63  urn 0;.  if( (rc
33370 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 47   = sqlite3BtreeG
33380 65 74 50 61 67 65 28 70 42 74 2c 20 28 50 67 6e  etPage(pBt, (Pgn
33390 6f 29 69 50 61 67 65 2c 20 26 70 50 61 67 65 2c  o)iPage, &pPage,
333a0 20 30 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 63   0))!=0 ){.    c
333b0 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
333c0 68 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a  heck, zContext,.
333d0 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74         "unable t
333e0 6f 20 67 65 74 20 74 68 65 20 70 61 67 65 2e 20  o get the page. 
333f0 65 72 72 6f 72 20 63 6f 64 65 3d 25 64 22 2c 20  error code=%d", 
33400 72 63 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  rc);.    return 
33410 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 72 63  0;.  }.  if( (rc
33420 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 49   = sqlite3BtreeI
33430 6e 69 74 50 61 67 65 28 70 50 61 67 65 29 29 21  nitPage(pPage))!
33440 3d 30 20 29 7b 0a 20 20 20 20 63 68 65 63 6b 41  =0 ){.    checkA
33450 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
33460 20 7a 43 6f 6e 74 65 78 74 2c 20 0a 20 20 20 20   zContext, .    
33470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
33480 73 71 6c 69 74 65 33 42 74 72 65 65 49 6e 69 74  sqlite3BtreeInit
33490 50 61 67 65 28 29 20 72 65 74 75 72 6e 73 20 65  Page() returns e
334a0 72 72 6f 72 20 63 6f 64 65 20 25 64 22 2c 20 72  rror code %d", r
334b0 63 29 3b 0a 20 20 20 20 72 65 6c 65 61 73 65 50  c);.    releaseP
334c0 61 67 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  age(pPage);.    
334d0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20  return 0;.  }.. 
334e0 20 2f 2a 20 43 68 65 63 6b 20 6f 75 74 20 61 6c   /* Check out al
334f0 6c 20 74 68 65 20 63 65 6c 6c 73 2e 0a 20 20 2a  l the cells..  *
33500 2f 0a 20 20 64 65 70 74 68 20 3d 20 30 3b 0a 20  /.  depth = 0;. 
33510 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67   for(i=0; i<pPag
33520 65 2d 3e 6e 43 65 6c 6c 20 26 26 20 70 43 68 65  e->nCell && pChe
33530 63 6b 2d 3e 6d 78 45 72 72 3b 20 69 2b 2b 29 7b  ck->mxErr; i++){
33540 0a 20 20 20 20 75 38 20 2a 70 43 65 6c 6c 3b 0a  .    u8 *pCell;.
33550 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20      int sz;.    
33560 43 65 6c 6c 49 6e 66 6f 20 69 6e 66 6f 3b 0a 0a  CellInfo info;..
33570 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 70 61 79      /* Check pay
33580 6c 6f 61 64 20 6f 76 65 72 66 6c 6f 77 20 70 61  load overflow pa
33590 67 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  ges.    */.    s
335a0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
335b0 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65 78 74 29  sizeof(zContext)
335c0 2c 20 7a 43 6f 6e 74 65 78 74 2c 0a 20 20 20 20  , zContext,.    
335d0 20 20 20 20 20 20 20 20 20 22 4f 6e 20 74 72 65           "On tre
335e0 65 20 70 61 67 65 20 25 64 20 63 65 6c 6c 20 25  e page %d cell %
335f0 64 3a 20 22 2c 20 69 50 61 67 65 2c 20 69 29 3b  d: ", iPage, i);
33600 0a 20 20 20 20 70 43 65 6c 6c 20 3d 20 66 69 6e  .    pCell = fin
33610 64 43 65 6c 6c 28 70 50 61 67 65 2c 69 29 3b 0a  dCell(pPage,i);.
33620 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
33630 50 61 72 73 65 43 65 6c 6c 50 74 72 28 70 50 61  ParseCellPtr(pPa
33640 67 65 2c 20 70 43 65 6c 6c 2c 20 26 69 6e 66 6f  ge, pCell, &info
33650 29 3b 0a 20 20 20 20 73 7a 20 3d 20 69 6e 66 6f  );.    sz = info
33660 2e 6e 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20  .nData;.    if( 
33670 21 70 50 61 67 65 2d 3e 69 6e 74 4b 65 79 20 29  !pPage->intKey )
33680 20 73 7a 20 2b 3d 20 69 6e 66 6f 2e 6e 4b 65 79   sz += info.nKey
33690 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 7a  ;.    assert( sz
336a0 3d 3d 69 6e 66 6f 2e 6e 50 61 79 6c 6f 61 64 20  ==info.nPayload 
336b0 29 3b 0a 20 20 20 20 69 66 28 20 73 7a 3e 69 6e  );.    if( sz>in
336c0 66 6f 2e 6e 4c 6f 63 61 6c 20 29 7b 0a 20 20 20  fo.nLocal ){.   
336d0 20 20 20 69 6e 74 20 6e 50 61 67 65 20 3d 20 28     int nPage = (
336e0 73 7a 20 2d 20 69 6e 66 6f 2e 6e 4c 6f 63 61 6c  sz - info.nLocal
336f0 20 2b 20 75 73 61 62 6c 65 53 69 7a 65 20 2d 20   + usableSize - 
33700 35 29 2f 28 75 73 61 62 6c 65 53 69 7a 65 20 2d  5)/(usableSize -
33710 20 34 29 3b 0a 20 20 20 20 20 20 50 67 6e 6f 20   4);.      Pgno 
33720 70 67 6e 6f 4f 76 66 6c 20 3d 20 67 65 74 34 62  pgnoOvfl = get4b
33730 79 74 65 28 26 70 43 65 6c 6c 5b 69 6e 66 6f 2e  yte(&pCell[info.
33740 69 4f 76 65 72 66 6c 6f 77 5d 29 3b 0a 23 69 66  iOverflow]);.#if
33750 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
33760 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
33770 20 20 69 66 28 20 70 42 74 2d 3e 61 75 74 6f 56    if( pBt->autoV
33780 61 63 75 75 6d 20 29 7b 0a 20 20 20 20 20 20 20  acuum ){.       
33790 20 63 68 65 63 6b 50 74 72 6d 61 70 28 70 43 68   checkPtrmap(pCh
337a0 65 63 6b 2c 20 70 67 6e 6f 4f 76 66 6c 2c 20 50  eck, pgnoOvfl, P
337b0 54 52 4d 41 50 5f 4f 56 45 52 46 4c 4f 57 31 2c  TRMAP_OVERFLOW1,
337c0 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74   iPage, zContext
337d0 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
337e0 66 0a 20 20 20 20 20 20 63 68 65 63 6b 4c 69 73  f.      checkLis
337f0 74 28 70 43 68 65 63 6b 2c 20 30 2c 20 70 67 6e  t(pCheck, 0, pgn
33800 6f 4f 76 66 6c 2c 20 6e 50 61 67 65 2c 20 7a 43  oOvfl, nPage, zC
33810 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 7d 0a 0a  ontext);.    }..
33820 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 73 61 6e      /* Check san
33830 69 74 79 20 6f 66 20 6c 65 66 74 20 63 68 69 6c  ity of left chil
33840 64 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20  d page..    */. 
33850 20 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c     if( !pPage->l
33860 65 61 66 20 29 7b 0a 20 20 20 20 20 20 70 67 6e  eaf ){.      pgn
33870 6f 20 3d 20 67 65 74 34 62 79 74 65 28 70 43 65  o = get4byte(pCe
33880 6c 6c 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ll);.#ifndef SQL
33890 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43  ITE_OMIT_AUTOVAC
338a0 55 55 4d 0a 20 20 20 20 20 20 69 66 28 20 70 42  UUM.      if( pB
338b0 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 29 7b  t->autoVacuum ){
338c0 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 50 74  .        checkPt
338d0 72 6d 61 70 28 70 43 68 65 63 6b 2c 20 70 67 6e  rmap(pCheck, pgn
338e0 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52 45 45 2c  o, PTRMAP_BTREE,
338f0 20 69 50 61 67 65 2c 20 7a 43 6f 6e 74 65 78 74   iPage, zContext
33900 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
33910 66 0a 20 20 20 20 20 20 64 32 20 3d 20 63 68 65  f.      d2 = che
33920 63 6b 54 72 65 65 50 61 67 65 28 70 43 68 65 63  ckTreePage(pChec
33930 6b 2c 70 67 6e 6f 2c 70 50 61 67 65 2c 7a 43 6f  k,pgno,pPage,zCo
33940 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20 69 66  ntext);.      if
33950 28 20 69 3e 30 20 26 26 20 64 32 21 3d 64 65 70  ( i>0 && d2!=dep
33960 74 68 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  th ){.        ch
33970 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43 68  eckAppendMsg(pCh
33980 65 63 6b 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 22  eck, zContext, "
33990 43 68 69 6c 64 20 70 61 67 65 20 64 65 70 74 68  Child page depth
339a0 20 64 69 66 66 65 72 73 22 29 3b 0a 20 20 20 20   differs");.    
339b0 20 20 7d 0a 20 20 20 20 20 20 64 65 70 74 68 20    }.      depth 
339c0 3d 20 64 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  = d2;.    }.  }.
339d0 20 20 69 66 28 20 21 70 50 61 67 65 2d 3e 6c 65    if( !pPage->le
339e0 61 66 20 29 7b 0a 20 20 20 20 70 67 6e 6f 20 3d  af ){.    pgno =
339f0 20 67 65 74 34 62 79 74 65 28 26 70 50 61 67 65   get4byte(&pPage
33a00 2d 3e 61 44 61 74 61 5b 70 50 61 67 65 2d 3e 68  ->aData[pPage->h
33a10 64 72 4f 66 66 73 65 74 2b 38 5d 29 3b 0a 20 20  drOffset+8]);.  
33a20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
33a30 74 66 28 73 69 7a 65 6f 66 28 7a 43 6f 6e 74 65  tf(sizeof(zConte
33a40 78 74 29 2c 20 7a 43 6f 6e 74 65 78 74 2c 20 0a  xt), zContext, .
33a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a60 20 20 20 20 20 22 4f 6e 20 70 61 67 65 20 25 64       "On page %d
33a70 20 61 74 20 72 69 67 68 74 20 63 68 69 6c 64 3a   at right child:
33a80 20 22 2c 20 69 50 61 67 65 29 3b 0a 23 69 66 6e   ", iPage);.#ifn
33a90 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
33aa0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
33ab0 66 28 20 70 42 74 2d 3e 61 75 74 6f 56 61 63 75  f( pBt->autoVacu
33ac0 75 6d 20 29 7b 0a 20 20 20 20 20 20 63 68 65 63  um ){.      chec
33ad0 6b 50 74 72 6d 61 70 28 70 43 68 65 63 6b 2c 20  kPtrmap(pCheck, 
33ae0 70 67 6e 6f 2c 20 50 54 52 4d 41 50 5f 42 54 52  pgno, PTRMAP_BTR
33af0 45 45 2c 20 69 50 61 67 65 2c 20 30 29 3b 0a 20  EE, iPage, 0);. 
33b00 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
33b10 63 68 65 63 6b 54 72 65 65 50 61 67 65 28 70 43  checkTreePage(pC
33b20 68 65 63 6b 2c 20 70 67 6e 6f 2c 20 70 50 61 67  heck, pgno, pPag
33b30 65 2c 20 7a 43 6f 6e 74 65 78 74 29 3b 0a 20 20  e, zContext);.  
33b40 7d 0a 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66  }. .  /* Check f
33b50 6f 72 20 63 6f 6d 70 6c 65 74 65 20 63 6f 76 65  or complete cove
33b60 72 61 67 65 20 6f 66 20 74 68 65 20 70 61 67 65  rage of the page
33b70 0a 20 20 2a 2f 0a 20 20 64 61 74 61 20 3d 20 70  .  */.  data = p
33b80 50 61 67 65 2d 3e 61 44 61 74 61 3b 0a 20 20 68  Page->aData;.  h
33b90 64 72 20 3d 20 70 50 61 67 65 2d 3e 68 64 72 4f  dr = pPage->hdrO
33ba0 66 66 73 65 74 3b 0a 20 20 68 69 74 20 3d 20 73  ffset;.  hit = s
33bb0 71 6c 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63  qlite3PageMalloc
33bc0 28 20 70 42 74 2d 3e 70 61 67 65 53 69 7a 65 20  ( pBt->pageSize 
33bd0 29 3b 0a 20 20 69 66 28 20 68 69 74 3d 3d 30 20  );.  if( hit==0 
33be0 29 7b 0a 20 20 20 20 70 43 68 65 63 6b 2d 3e 6d  ){.    pCheck->m
33bf0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
33c00 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65  .  }else{.    me
33c10 6d 73 65 74 28 68 69 74 2c 20 30 2c 20 75 73 61  mset(hit, 0, usa
33c20 62 6c 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 6d  bleSize );.    m
33c30 65 6d 73 65 74 28 68 69 74 2c 20 31 2c 20 67 65  emset(hit, 1, ge
33c40 74 32 62 79 74 65 28 26 64 61 74 61 5b 68 64 72  t2byte(&data[hdr
33c50 2b 35 5d 29 29 3b 0a 20 20 20 20 6e 43 65 6c 6c  +5]));.    nCell
33c60 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61 74   = get2byte(&dat
33c70 61 5b 68 64 72 2b 33 5d 29 3b 0a 20 20 20 20 63  a[hdr+3]);.    c
33c80 65 6c 6c 53 74 61 72 74 20 3d 20 68 64 72 20 2b  ellStart = hdr +
33c90 20 31 32 20 2d 20 34 2a 70 50 61 67 65 2d 3e 6c   12 - 4*pPage->l
33ca0 65 61 66 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  eaf;.    for(i=0
33cb0 3b 20 69 3c 6e 43 65 6c 6c 3b 20 69 2b 2b 29 7b  ; i<nCell; i++){
33cc0 0a 20 20 20 20 20 20 69 6e 74 20 70 63 20 3d 20  .      int pc = 
33cd0 67 65 74 32 62 79 74 65 28 26 64 61 74 61 5b 63  get2byte(&data[c
33ce0 65 6c 6c 53 74 61 72 74 2b 69 2a 32 5d 29 3b 0a  ellStart+i*2]);.
33cf0 20 20 20 20 20 20 75 31 36 20 73 69 7a 65 20 3d        u16 size =
33d00 20 31 30 32 34 3b 0a 20 20 20 20 20 20 69 6e 74   1024;.      int
33d10 20 6a 3b 0a 20 20 20 20 20 20 69 66 28 20 70 63   j;.      if( pc
33d20 3c 3d 75 73 61 62 6c 65 53 69 7a 65 20 29 7b 0a  <=usableSize ){.
33d30 20 20 20 20 20 20 20 20 73 69 7a 65 20 3d 20 63          size = c
33d40 65 6c 6c 53 69 7a 65 50 74 72 28 70 50 61 67 65  ellSizePtr(pPage
33d50 2c 20 26 64 61 74 61 5b 70 63 5d 29 3b 0a 20 20  , &data[pc]);.  
33d60 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
33d70 28 70 63 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61  (pc+size-1)>=usa
33d80 62 6c 65 53 69 7a 65 20 7c 7c 20 70 63 3c 30 20  bleSize || pc<0 
33d90 29 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b  ){.        check
33da0 41 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b  AppendMsg(pCheck
33db0 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20  , 0, .          
33dc0 20 20 22 43 6f 72 72 75 70 74 69 6f 6e 20 64 65    "Corruption de
33dd0 74 65 63 74 65 64 20 69 6e 20 63 65 6c 6c 20 25  tected in cell %
33de0 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 69 2c  d on page %d",i,
33df0 69 50 61 67 65 2c 30 29 3b 0a 20 20 20 20 20 20  iPage,0);.      
33e00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
33e10 6f 72 28 6a 3d 70 63 2b 73 69 7a 65 2d 31 3b 20  or(j=pc+size-1; 
33e20 6a 3e 3d 70 63 3b 20 6a 2d 2d 29 20 68 69 74 5b  j>=pc; j--) hit[
33e30 6a 5d 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  j]++;.      }.  
33e40 20 20 7d 0a 20 20 20 20 66 6f 72 28 63 6e 74 3d    }.    for(cnt=
33e50 30 2c 20 69 3d 67 65 74 32 62 79 74 65 28 26 64  0, i=get2byte(&d
33e60 61 74 61 5b 68 64 72 2b 31 5d 29 3b 20 69 3e 30  ata[hdr+1]); i>0
33e70 20 26 26 20 69 3c 75 73 61 62 6c 65 53 69 7a 65   && i<usableSize
33e80 20 26 26 20 63 6e 74 3c 31 30 30 30 30 3b 20 0a   && cnt<10000; .
33e90 20 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b             cnt++
33ea0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 69 7a  ){.      int siz
33eb0 65 20 3d 20 67 65 74 32 62 79 74 65 28 26 64 61  e = get2byte(&da
33ec0 74 61 5b 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20  ta[i+2]);.      
33ed0 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 66 28  int j;.      if(
33ee0 20 28 69 2b 73 69 7a 65 2d 31 29 3e 3d 75 73 61   (i+size-1)>=usa
33ef0 62 6c 65 53 69 7a 65 20 7c 7c 20 69 3c 30 20 29  bleSize || i<0 )
33f00 7b 0a 20 20 20 20 20 20 20 20 63 68 65 63 6b 41  {.        checkA
33f10 70 70 65 6e 64 4d 73 67 28 70 43 68 65 63 6b 2c  ppendMsg(pCheck,
33f20 20 30 2c 20 20 0a 20 20 20 20 20 20 20 20 20 20   0,  .          
33f30 20 20 22 43 6f 72 72 75 70 74 69 6f 6e 20 64 65    "Corruption de
33f40 74 65 63 74 65 64 20 69 6e 20 63 65 6c 6c 20 25  tected in cell %
33f50 64 20 6f 6e 20 70 61 67 65 20 25 64 22 2c 69 2c  d on page %d",i,
33f60 69 50 61 67 65 2c 30 29 3b 0a 20 20 20 20 20 20  iPage,0);.      
33f70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66  }else{.        f
33f80 6f 72 28 6a 3d 69 2b 73 69 7a 65 2d 31 3b 20 6a  or(j=i+size-1; j
33f90 3e 3d 69 3b 20 6a 2d 2d 29 20 68 69 74 5b 6a 5d  >=i; j--) hit[j]
33fa0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
33fb0 20 20 69 20 3d 20 67 65 74 32 62 79 74 65 28 26    i = get2byte(&
33fc0 64 61 74 61 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  data[i]);.    }.
33fd0 20 20 20 20 66 6f 72 28 69 3d 63 6e 74 3d 30 3b      for(i=cnt=0;
33fe0 20 69 3c 75 73 61 62 6c 65 53 69 7a 65 3b 20 69   i<usableSize; i
33ff0 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 68  ++){.      if( h
34000 69 74 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20  it[i]==0 ){.    
34010 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20      cnt++;.     
34020 20 7d 65 6c 73 65 20 69 66 28 20 68 69 74 5b 69   }else if( hit[i
34030 5d 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ]>1 ){.        c
34040 68 65 63 6b 41 70 70 65 6e 64 4d 73 67 28 70 43  heckAppendMsg(pC
34050 68 65 63 6b 2c 20 30 2c 0a 20 20 20 20 20 20 20  heck, 0,.       
34060 20 20 20 22 4d 75 6c 74 69 70 6c 65 20 75 73 65     "Multiple use
34070 73 20 66 6f 72 20 62 79 74 65 20 25 64 20 6f 66  s for byte %d of
34080 20 70 61 67 65 20 25 64 22 2c 20 69 2c 20 69 50   page %d", i, iP
34090 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 62 72  age);.        br
340a0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
340b0 20 7d 0a 20 20 20 20 69 66 28 20 63 6e 74 21 3d   }.    if( cnt!=
340c0 64 61 74 61 5b 68 64 72 2b 37 5d 20 29 7b 0a 20  data[hdr+7] ){. 
340d0 20 20 20 20 20 63 68 65 63 6b 41 70 70 65 6e 64       checkAppend
340e0 4d 73 67 28 70 43 68 65 63 6b 2c 20 30 2c 20 0a  Msg(pCheck, 0, .
340f0 20 20 20 20 20 20 20 20 20 20 22 46 72 61 67 6d            "Fragm
34100 65 6e 74 65 64 20 73 70 61 63 65 20 69 73 20 25  ented space is %
34110 64 20 62 79 74 65 20 72 65 70 6f 72 74 65 64 20  d byte reported 
34120 61 73 20 25 64 20 6f 6e 20 70 61 67 65 20 25 64  as %d on page %d
34130 22 2c 0a 20 20 20 20 20 20 20 20 20 20 63 6e 74  ",.          cnt
34140 2c 20 64 61 74 61 5b 68 64 72 2b 37 5d 2c 20 69  , data[hdr+7], i
34150 50 61 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Page);.    }.  }
34160 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 46 72  .  sqlite3PageFr
34170 65 65 28 68 69 74 29 3b 0a 0a 20 20 72 65 6c 65  ee(hit);..  rele
34180 61 73 65 50 61 67 65 28 70 50 61 67 65 29 3b 0a  asePage(pPage);.
34190 20 20 72 65 74 75 72 6e 20 64 65 70 74 68 2b 31    return depth+1
341a0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
341b0 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
341c0 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 23 69  ITY_CHECK */..#i
341d0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
341e0 54 5f 49 4e 54 45 47 52 49 54 59 5f 43 48 45 43  T_INTEGRITY_CHEC
341f0 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  K./*.** This rou
34200 74 69 6e 65 20 64 6f 65 73 20 61 20 63 6f 6d 70  tine does a comp
34210 6c 65 74 65 20 63 68 65 63 6b 20 6f 66 20 74 68  lete check of th
34220 65 20 67 69 76 65 6e 20 42 54 72 65 65 20 66 69  e given BTree fi
34230 6c 65 2e 20 20 61 52 6f 6f 74 5b 5d 20 69 73 0a  le.  aRoot[] is.
34240 2a 2a 20 61 6e 20 61 72 72 61 79 20 6f 66 20 70  ** an array of p
34250 61 67 65 73 20 6e 75 6d 62 65 72 73 20 77 65 72  ages numbers wer
34260 65 20 65 61 63 68 20 70 61 67 65 20 6e 75 6d 62  e each page numb
34270 65 72 20 69 73 20 74 68 65 20 72 6f 6f 74 20 70  er is the root p
34280 61 67 65 20 6f 66 0a 2a 2a 20 61 20 74 61 62 6c  age of.** a tabl
34290 65 2e 20 20 6e 52 6f 6f 74 20 69 73 20 74 68 65  e.  nRoot is the
342a0 20 6e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   number of entri
342b0 65 73 20 69 6e 20 61 52 6f 6f 74 2e 0a 2a 2a 0a  es in aRoot..**.
342c0 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 75 6d  ** Write the num
342d0 62 65 72 20 6f 66 20 65 72 72 6f 72 20 73 65 65  ber of error see
342e0 6e 20 69 6e 20 2a 70 6e 45 72 72 2e 20 20 45 78  n in *pnErr.  Ex
342f0 63 65 70 74 20 66 6f 72 20 73 6f 6d 65 20 6d 65  cept for some me
34300 6d 6f 72 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 69  mory.** allocati
34310 6f 6e 20 65 72 72 6f 72 73 2c 20 20 6e 6e 20 65  on errors,  nn e
34320 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
34330 68 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  held in memory o
34340 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20  btained from.** 
34350 6d 61 6c 6c 6f 63 20 69 73 20 72 65 74 75 72 6e  malloc is return
34360 65 64 20 69 66 20 2a 70 6e 45 72 72 20 69 73 20  ed if *pnErr is 
34370 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 49 66 20 2a 70  non-zero.  If *p
34380 6e 45 72 72 3d 3d 30 20 74 68 65 6e 20 4e 55 4c  nErr==0 then NUL
34390 4c 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  L is.** returned
343a0 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71 6c 69 74  ..*/.char *sqlit
343b0 65 33 42 74 72 65 65 49 6e 74 65 67 72 69 74 79  e3BtreeIntegrity
343c0 43 68 65 63 6b 28 0a 20 20 42 74 72 65 65 20 2a  Check(.  Btree *
343d0 70 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 62 74  p,     /* The bt
343e0 72 65 65 20 74 6f 20 62 65 20 63 68 65 63 6b 65  ree to be checke
343f0 64 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 52 6f 6f  d */.  int *aRoo
34400 74 2c 20 20 20 2f 2a 20 41 6e 20 61 72 72 61 79  t,   /* An array
34410 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 73 20 6e   of root pages n
34420 75 6d 62 65 72 73 20 66 6f 72 20 69 6e 64 69 76  umbers for indiv
34430 69 64 75 61 6c 20 74 72 65 65 73 20 2a 2f 0a 20  idual trees */. 
34440 20 69 6e 74 20 6e 52 6f 6f 74 2c 20 20 20 20 2f   int nRoot,    /
34450 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
34460 69 65 73 20 69 6e 20 61 52 6f 6f 74 5b 5d 20 2a  ies in aRoot[] *
34470 2f 0a 20 20 69 6e 74 20 6d 78 45 72 72 2c 20 20  /.  int mxErr,  
34480 20 20 2f 2a 20 53 74 6f 70 20 72 65 70 6f 72 74    /* Stop report
34490 69 6e 67 20 65 72 72 6f 72 73 20 61 66 74 65 72  ing errors after
344a0 20 74 68 69 73 20 6d 61 6e 79 20 2a 2f 0a 20 20   this many */.  
344b0 69 6e 74 20 2a 70 6e 45 72 72 20 20 20 20 2f 2a  int *pnErr    /*
344c0 20 57 72 69 74 65 20 6e 75 6d 62 65 72 20 6f 66   Write number of
344d0 20 65 72 72 6f 72 73 20 73 65 65 6e 20 74 6f 20   errors seen to 
344e0 74 68 69 73 20 76 61 72 69 61 62 6c 65 20 2a 2f  this variable */
344f0 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  .){.  int i;.  i
34500 6e 74 20 6e 52 65 66 3b 0a 20 20 49 6e 74 65 67  nt nRef;.  Integ
34510 72 69 74 79 43 6b 20 73 43 68 65 63 6b 3b 0a 20  rityCk sCheck;. 
34520 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 20 3d   BtShared *pBt =
34530 20 70 2d 3e 70 42 74 3b 0a 20 20 63 68 61 72 20   p->pBt;.  char 
34540 7a 45 72 72 5b 31 30 30 5d 3b 0a 0a 20 20 73 71  zErr[100];..  sq
34550 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
34560 70 29 3b 0a 20 20 70 42 74 2d 3e 64 62 20 3d 20  p);.  pBt->db = 
34570 70 2d 3e 64 62 3b 0a 20 20 6e 52 65 66 20 3d 20  p->db;.  nRef = 
34580 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 63  sqlite3PagerRefc
34590 6f 75 6e 74 28 70 42 74 2d 3e 70 50 61 67 65 72  ount(pBt->pPager
345a0 29 3b 0a 20 20 69 66 28 20 6c 6f 63 6b 42 74 72  );.  if( lockBtr
345b0 65 65 57 69 74 68 52 65 74 72 79 28 70 29 21 3d  eeWithRetry(p)!=
345c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
345d0 20 2a 70 6e 45 72 72 20 3d 20 31 3b 0a 20 20 20   *pnErr = 1;.   
345e0 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
345f0 76 65 28 70 29 3b 0a 20 20 20 20 72 65 74 75 72  ve(p);.    retur
34600 6e 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  n sqlite3DbStrDu
34610 70 28 30 2c 20 22 63 61 6e 6e 6f 74 20 61 63 71  p(0, "cannot acq
34620 75 69 72 65 20 61 20 72 65 61 64 20 6c 6f 63 6b  uire a read lock
34630 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
34640 22 29 3b 0a 20 20 7d 0a 20 20 73 43 68 65 63 6b  ");.  }.  sCheck
34650 2e 70 42 74 20 3d 20 70 42 74 3b 0a 20 20 73 43  .pBt = pBt;.  sC
34660 68 65 63 6b 2e 70 50 61 67 65 72 20 3d 20 70 42  heck.pPager = pB
34670 74 2d 3e 70 50 61 67 65 72 3b 0a 20 20 73 43 68  t->pPager;.  sCh
34680 65 63 6b 2e 6e 50 61 67 65 20 3d 20 70 61 67 65  eck.nPage = page
34690 72 50 61 67 65 63 6f 75 6e 74 28 73 43 68 65 63  rPagecount(sChec
346a0 6b 2e 70 50 61 67 65 72 29 3b 0a 20 20 73 43 68  k.pPager);.  sCh
346b0 65 63 6b 2e 6d 78 45 72 72 20 3d 20 6d 78 45 72  eck.mxErr = mxEr
346c0 72 3b 0a 20 20 73 43 68 65 63 6b 2e 6e 45 72 72  r;.  sCheck.nErr
346d0 20 3d 20 30 3b 0a 20 20 73 43 68 65 63 6b 2e 6d   = 0;.  sCheck.m
346e0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b  allocFailed = 0;
346f0 0a 20 20 2a 70 6e 45 72 72 20 3d 20 30 3b 0a 23  .  *pnErr = 0;.#
34700 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
34710 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
34720 69 66 28 20 70 42 74 2d 3e 6e 54 72 75 6e 63 21  if( pBt->nTrunc!
34730 3d 30 20 29 7b 0a 20 20 20 20 73 43 68 65 63 6b  =0 ){.    sCheck
34740 2e 6e 50 61 67 65 20 3d 20 70 42 74 2d 3e 6e 54  .nPage = pBt->nT
34750 72 75 6e 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  runc;.  }.#endif
34760 0a 20 20 69 66 28 20 73 43 68 65 63 6b 2e 6e 50  .  if( sCheck.nP
34770 61 67 65 3d 3d 30 20 29 7b 0a 20 20 20 20 75 6e  age==0 ){.    un
34780 6c 6f 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65  lockBtreeIfUnuse
34790 64 28 70 42 74 29 3b 0a 20 20 20 20 73 71 6c 69  d(pBt);.    sqli
347a0 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 29  te3BtreeLeave(p)
347b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
347c0 20 20 7d 0a 20 20 73 43 68 65 63 6b 2e 61 6e 52    }.  sCheck.anR
347d0 65 66 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  ef = sqlite3Mall
347e0 6f 63 28 20 28 73 43 68 65 63 6b 2e 6e 50 61 67  oc( (sCheck.nPag
347f0 65 2b 31 29 2a 73 69 7a 65 6f 66 28 73 43 68 65  e+1)*sizeof(sChe
34800 63 6b 2e 61 6e 52 65 66 5b 30 5d 29 20 29 3b 0a  ck.anRef[0]) );.
34810 20 20 69 66 28 20 21 73 43 68 65 63 6b 2e 61 6e    if( !sCheck.an
34820 52 65 66 20 29 7b 0a 20 20 20 20 75 6e 6c 6f 63  Ref ){.    unloc
34830 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28 70  kBtreeIfUnused(p
34840 42 74 29 3b 0a 20 20 20 20 2a 70 6e 45 72 72 20  Bt);.    *pnErr 
34850 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 1;.    sqlite3
34860 42 74 72 65 65 4c 65 61 76 65 28 70 29 3b 0a 20  BtreeLeave(p);. 
34870 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
34880 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 3d 73  .  for(i=0; i<=s
34890 43 68 65 63 6b 2e 6e 50 61 67 65 3b 20 69 2b 2b  Check.nPage; i++
348a0 29 7b 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b  ){ sCheck.anRef[
348b0 69 5d 20 3d 20 30 3b 20 7d 0a 20 20 69 20 3d 20  i] = 0; }.  i = 
348c0 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f 50 41 47  PENDING_BYTE_PAG
348d0 45 28 70 42 74 29 3b 0a 20 20 69 66 28 20 69 3c  E(pBt);.  if( i<
348e0 3d 73 43 68 65 63 6b 2e 6e 50 61 67 65 20 29 7b  =sCheck.nPage ){
348f0 0a 20 20 20 20 73 43 68 65 63 6b 2e 61 6e 52 65  .    sCheck.anRe
34900 66 5b 69 5d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  f[i] = 1;.  }.  
34910 73 71 6c 69 74 65 33 53 74 72 41 63 63 75 6d 49  sqlite3StrAccumI
34920 6e 69 74 28 26 73 43 68 65 63 6b 2e 65 72 72 4d  nit(&sCheck.errM
34930 73 67 2c 20 7a 45 72 72 2c 20 73 69 7a 65 6f 66  sg, zErr, sizeof
34940 28 7a 45 72 72 29 2c 20 32 30 30 30 30 29 3b 0a  (zErr), 20000);.
34950 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 65 20  .  /* Check the 
34960 69 6e 74 65 67 72 69 74 79 20 6f 66 20 74 68 65  integrity of the
34970 20 66 72 65 65 6c 69 73 74 0a 20 20 2a 2f 0a 20   freelist.  */. 
34980 20 63 68 65 63 6b 4c 69 73 74 28 26 73 43 68 65   checkList(&sChe
34990 63 6b 2c 20 31 2c 20 67 65 74 34 62 79 74 65 28  ck, 1, get4byte(
349a0 26 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44  &pBt->pPage1->aD
349b0 61 74 61 5b 33 32 5d 29 2c 0a 20 20 20 20 20 20  ata[32]),.      
349c0 20 20 20 20 20 20 67 65 74 34 62 79 74 65 28 26        get4byte(&
349d0 70 42 74 2d 3e 70 50 61 67 65 31 2d 3e 61 44 61  pBt->pPage1->aDa
349e0 74 61 5b 33 36 5d 29 2c 20 22 4d 61 69 6e 20 66  ta[36]), "Main f
349f0 72 65 65 6c 69 73 74 3a 20 22 29 3b 0a 0a 20 20  reelist: ");..  
34a00 2f 2a 20 43 68 65 63 6b 20 61 6c 6c 20 74 68 65  /* Check all the
34a10 20 74 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20   tables..  */.  
34a20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 6f 6f 74  for(i=0; i<nRoot
34a30 20 26 26 20 73 43 68 65 63 6b 2e 6d 78 45 72 72   && sCheck.mxErr
34a40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
34a50 61 52 6f 6f 74 5b 69 5d 3d 3d 30 20 29 20 63 6f  aRoot[i]==0 ) co
34a60 6e 74 69 6e 75 65 3b 0a 23 69 66 6e 64 65 66 20  ntinue;.#ifndef 
34a70 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
34a80 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 70  VACUUM.    if( p
34a90 42 74 2d 3e 61 75 74 6f 56 61 63 75 75 6d 20 26  Bt->autoVacuum &
34aa0 26 20 61 52 6f 6f 74 5b 69 5d 3e 31 20 29 7b 0a  & aRoot[i]>1 ){.
34ab0 20 20 20 20 20 20 63 68 65 63 6b 50 74 72 6d 61        checkPtrma
34ac0 70 28 26 73 43 68 65 63 6b 2c 20 61 52 6f 6f 74  p(&sCheck, aRoot
34ad0 5b 69 5d 2c 20 50 54 52 4d 41 50 5f 52 4f 4f 54  [i], PTRMAP_ROOT
34ae0 50 41 47 45 2c 20 30 2c 20 30 29 3b 0a 20 20 20  PAGE, 0, 0);.   
34af0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 68   }.#endif.    ch
34b00 65 63 6b 54 72 65 65 50 61 67 65 28 26 73 43 68  eckTreePage(&sCh
34b10 65 63 6b 2c 20 61 52 6f 6f 74 5b 69 5d 2c 20 30  eck, aRoot[i], 0
34b20 2c 20 22 4c 69 73 74 20 6f 66 20 74 72 65 65 20  , "List of tree 
34b30 72 6f 6f 74 73 3a 20 22 29 3b 0a 20 20 7d 0a 0a  roots: ");.  }..
34b40 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 65    /* Make sure e
34b50 76 65 72 79 20 70 61 67 65 20 69 6e 20 74 68 65  very page in the
34b60 20 66 69 6c 65 20 69 73 20 72 65 66 65 72 65 6e   file is referen
34b70 63 65 64 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ced.  */.  for(i
34b80 3d 31 3b 20 69 3c 3d 73 43 68 65 63 6b 2e 6e 50  =1; i<=sCheck.nP
34b90 61 67 65 20 26 26 20 73 43 68 65 63 6b 2e 6d 78  age && sCheck.mx
34ba0 45 72 72 3b 20 69 2b 2b 29 7b 0a 23 69 66 64 65  Err; i++){.#ifde
34bb0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
34bc0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
34bd0 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d   sCheck.anRef[i]
34be0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 65  ==0 ){.      che
34bf0 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68  ckAppendMsg(&sCh
34c00 65 63 6b 2c 20 30 2c 20 22 50 61 67 65 20 25 64  eck, 0, "Page %d
34c10 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 22 2c   is never used",
34c20 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6c 73 65   i);.    }.#else
34c30 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 64  .    /* If the d
34c40 61 74 61 62 61 73 65 20 73 75 70 70 6f 72 74 73  atabase supports
34c50 20 61 75 74 6f 2d 76 61 63 75 75 6d 2c 20 6d 61   auto-vacuum, ma
34c60 6b 65 20 73 75 72 65 20 6e 6f 20 74 61 62 6c 65  ke sure no table
34c70 73 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 2a 2a  s contain.    **
34c80 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 70   references to p
34c90 6f 69 6e 74 65 72 2d 6d 61 70 20 70 61 67 65 73  ointer-map pages
34ca0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
34cb0 20 73 43 68 65 63 6b 2e 61 6e 52 65 66 5b 69 5d   sCheck.anRef[i]
34cc0 3d 3d 30 20 26 26 20 0a 20 20 20 20 20 20 20 28  ==0 && .       (
34cd0 50 54 52 4d 41 50 5f 50 41 47 45 4e 4f 28 70 42  PTRMAP_PAGENO(pB
34ce0 74 2c 20 69 29 21 3d 69 20 7c 7c 20 21 70 42 74  t, i)!=i || !pBt
34cf0 2d 3e 61 75 74 6f 56 61 63 75 75 6d 29 20 29 7b  ->autoVacuum) ){
34d00 0a 20 20 20 20 20 20 63 68 65 63 6b 41 70 70 65  .      checkAppe
34d10 6e 64 4d 73 67 28 26 73 43 68 65 63 6b 2c 20 30  ndMsg(&sCheck, 0
34d20 2c 20 22 50 61 67 65 20 25 64 20 69 73 20 6e 65  , "Page %d is ne
34d30 76 65 72 20 75 73 65 64 22 2c 20 69 29 3b 0a 20  ver used", i);. 
34d40 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 43 68     }.    if( sCh
34d50 65 63 6b 2e 61 6e 52 65 66 5b 69 5d 21 3d 30 20  eck.anRef[i]!=0 
34d60 26 26 20 0a 20 20 20 20 20 20 20 28 50 54 52 4d  && .       (PTRM
34d70 41 50 5f 50 41 47 45 4e 4f 28 70 42 74 2c 20 69  AP_PAGENO(pBt, i
34d80 29 3d 3d 69 20 26 26 20 70 42 74 2d 3e 61 75 74  )==i && pBt->aut
34d90 6f 56 61 63 75 75 6d 29 20 29 7b 0a 20 20 20 20  oVacuum) ){.    
34da0 20 20 63 68 65 63 6b 41 70 70 65 6e 64 4d 73 67    checkAppendMsg
34db0 28 26 73 43 68 65 63 6b 2c 20 30 2c 20 22 50 6f  (&sCheck, 0, "Po
34dc0 69 6e 74 65 72 20 6d 61 70 20 70 61 67 65 20 25  inter map page %
34dd0 64 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 22  d is referenced"
34de0 2c 20 69 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  , i);.    }.#end
34df0 69 66 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  if.  }..  /* Mak
34e00 65 20 73 75 72 65 20 74 68 69 73 20 61 6e 61 6c  e sure this anal
34e10 79 73 69 73 20 64 69 64 20 6e 6f 74 20 6c 65 61  ysis did not lea
34e20 76 65 20 61 6e 79 20 75 6e 72 65 66 28 29 20 70  ve any unref() p
34e30 61 67 65 73 0a 20 20 2a 2f 0a 20 20 75 6e 6c 6f  ages.  */.  unlo
34e40 63 6b 42 74 72 65 65 49 66 55 6e 75 73 65 64 28  ckBtreeIfUnused(
34e50 70 42 74 29 3b 0a 20 20 69 66 28 20 6e 52 65 66  pBt);.  if( nRef
34e60 20 21 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72   != sqlite3Pager
34e70 52 65 66 63 6f 75 6e 74 28 70 42 74 2d 3e 70 50  Refcount(pBt->pP
34e80 61 67 65 72 29 20 29 7b 0a 20 20 20 20 63 68 65  ager) ){.    che
34e90 63 6b 41 70 70 65 6e 64 4d 73 67 28 26 73 43 68  ckAppendMsg(&sCh
34ea0 65 63 6b 2c 20 30 2c 20 0a 20 20 20 20 20 20 22  eck, 0, .      "
34eb0 4f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  Outstanding page
34ec0 20 63 6f 75 6e 74 20 67 6f 65 73 20 66 72 6f 6d   count goes from
34ed0 20 25 64 20 74 6f 20 25 64 20 64 75 72 69 6e 67   %d to %d during
34ee0 20 74 68 69 73 20 61 6e 61 6c 79 73 69 73 22 2c   this analysis",
34ef0 0a 20 20 20 20 20 20 6e 52 65 66 2c 20 73 71 6c  .      nRef, sql
34f00 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e  ite3PagerRefcoun
34f10 74 28 70 42 74 2d 3e 70 50 61 67 65 72 29 0a 20  t(pBt->pPager). 
34f20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20     );.  }..  /* 
34f30 43 6c 65 61 6e 20 20 75 70 20 61 6e 64 20 72 65  Clean  up and re
34f40 70 6f 72 74 20 65 72 72 6f 72 73 2e 0a 20 20 2a  port errors..  *
34f50 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  /.  sqlite3Btree
34f60 4c 65 61 76 65 28 70 29 3b 0a 20 20 73 71 6c 69  Leave(p);.  sqli
34f70 74 65 33 5f 66 72 65 65 28 73 43 68 65 63 6b 2e  te3_free(sCheck.
34f80 61 6e 52 65 66 29 3b 0a 20 20 69 66 28 20 73 43  anRef);.  if( sC
34f90 68 65 63 6b 2e 6d 61 6c 6c 6f 63 46 61 69 6c 65  heck.mallocFaile
34fa0 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  d ){.    sqlite3
34fb0 53 74 72 41 63 63 75 6d 52 65 73 65 74 28 26 73  StrAccumReset(&s
34fc0 43 68 65 63 6b 2e 65 72 72 4d 73 67 29 3b 0a 20  Check.errMsg);. 
34fd0 20 20 20 2a 70 6e 45 72 72 20 3d 20 73 43 68 65     *pnErr = sChe
34fe0 63 6b 2e 6e 45 72 72 2b 31 3b 0a 20 20 20 20 72  ck.nErr+1;.    r
34ff0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 2a  eturn 0;.  }.  *
35000 70 6e 45 72 72 20 3d 20 73 43 68 65 63 6b 2e 6e  pnErr = sCheck.n
35010 45 72 72 3b 0a 20 20 69 66 28 20 73 43 68 65 63  Err;.  if( sChec
35020 6b 2e 6e 45 72 72 3d 3d 30 20 29 20 73 71 6c 69  k.nErr==0 ) sqli
35030 74 65 33 53 74 72 41 63 63 75 6d 52 65 73 65 74  te3StrAccumReset
35040 28 26 73 43 68 65 63 6b 2e 65 72 72 4d 73 67 29  (&sCheck.errMsg)
35050 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
35060 65 33 53 74 72 41 63 63 75 6d 46 69 6e 69 73 68  e3StrAccumFinish
35070 28 26 73 43 68 65 63 6b 2e 65 72 72 4d 73 67 29  (&sCheck.errMsg)
35080 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
35090 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 54 45 47 52  LITE_OMIT_INTEGR
350a0 49 54 59 5f 43 48 45 43 4b 20 2a 2f 0a 0a 2f 2a  ITY_CHECK */../*
350b0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
350c0 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  ull pathname of 
350d0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 64  the underlying d
350e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
350f0 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 66 69  .** The pager fi
35100 6c 65 6e 61 6d 65 20 69 73 20 69 6e 76 61 72 69  lename is invari
35110 61 6e 74 20 61 73 20 6c 6f 6e 67 20 61 73 20 74  ant as long as t
35120 68 65 20 70 61 67 65 72 20 69 73 0a 2a 2a 20 6f  he pager is.** o
35130 70 65 6e 20 73 6f 20 69 74 20 69 73 20 73 61 66  pen so it is saf
35140 65 20 74 6f 20 61 63 63 65 73 73 20 77 69 74 68  e to access with
35150 6f 75 74 20 74 68 65 20 42 74 53 68 61 72 65 64  out the BtShared
35160 20 6d 75 74 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74   mutex..*/.const
35170 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74   char *sqlite3Bt
35180 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 42  reeGetFilename(B
35190 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65  tree *p){.  asse
351a0 72 74 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67  rt( p->pBt->pPag
351b0 65 72 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72  er!=0 );.  retur
351c0 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 46 69  n sqlite3PagerFi
351d0 6c 65 6e 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70  lename(p->pBt->p
351e0 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Pager);.}../*.**
351f0 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 74 68   Return the path
35200 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 69 72 65  name of the dire
35210 63 74 6f 72 79 20 74 68 61 74 20 63 6f 6e 74 61  ctory that conta
35220 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ins the database
35230 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   file..**.** The
35240 20 70 61 67 65 72 20 64 69 72 65 63 74 6f 72 79   pager directory
35250 20 6e 61 6d 65 20 69 73 20 69 6e 76 61 72 69 61   name is invaria
35260 6e 74 20 61 73 20 6c 6f 6e 67 20 61 73 20 74 68  nt as long as th
35270 65 20 70 61 67 65 72 20 69 73 0a 2a 2a 20 6f 70  e pager is.** op
35280 65 6e 20 73 6f 20 69 74 20 69 73 20 73 61 66 65  en so it is safe
35290 20 74 6f 20 61 63 63 65 73 73 20 77 69 74 68 6f   to access witho
352a0 75 74 20 74 68 65 20 42 74 53 68 61 72 65 64 20  ut the BtShared 
352b0 6d 75 74 65 78 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  mutex..*/.const 
352c0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 42 74 72  char *sqlite3Btr
352d0 65 65 47 65 74 44 69 72 6e 61 6d 65 28 42 74 72  eeGetDirname(Btr
352e0 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  ee *p){.  assert
352f0 28 20 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65 72  ( p->pBt->pPager
35300 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
35310 73 71 6c 69 74 65 33 50 61 67 65 72 44 69 72 6e  sqlite3PagerDirn
35320 61 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67  ame(p->pBt->pPag
35330 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  er);.}../*.** Re
35340 74 75 72 6e 20 74 68 65 20 70 61 74 68 6e 61 6d  turn the pathnam
35350 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
35360 20 66 69 6c 65 20 66 6f 72 20 74 68 69 73 20 64   file for this d
35370 61 74 61 62 61 73 65 2e 20 54 68 65 20 72 65 74  atabase. The ret
35380 75 72 6e 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  urn.** value of 
35390 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
353a0 74 68 65 20 73 61 6d 65 20 72 65 67 61 72 64 6c  the same regardl
353b0 65 73 73 20 6f 66 20 77 68 65 74 68 65 72 20 74  ess of whether t
353c0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
353d0 2a 2a 20 68 61 73 20 62 65 65 6e 20 63 72 65 61  ** has been crea
353e0 74 65 64 20 6f 72 20 6e 6f 74 2e 0a 2a 2a 0a 2a  ted or not..**.*
353f0 2a 20 54 68 65 20 70 61 67 65 72 20 6a 6f 75 72  * The pager jour
35400 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
35410 69 6e 76 61 72 69 61 6e 74 20 61 73 20 6c 6f 6e  invariant as lon
35420 67 20 61 73 20 74 68 65 20 70 61 67 65 72 20 69  g as the pager i
35430 73 0a 2a 2a 20 6f 70 65 6e 20 73 6f 20 69 74 20  s.** open so it 
35440 69 73 20 73 61 66 65 20 74 6f 20 61 63 63 65 73  is safe to acces
35450 73 20 77 69 74 68 6f 75 74 20 74 68 65 20 42 74  s without the Bt
35460 53 68 61 72 65 64 20 6d 75 74 65 78 2e 0a 2a 2f  Shared mutex..*/
35470 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
35480 69 74 65 33 42 74 72 65 65 47 65 74 4a 6f 75 72  ite3BtreeGetJour
35490 6e 61 6c 6e 61 6d 65 28 42 74 72 65 65 20 2a 70  nalname(Btree *p
354a0 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
354b0 70 42 74 2d 3e 70 50 61 67 65 72 21 3d 30 20 29  pBt->pPager!=0 )
354c0 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
354d0 65 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61  e3PagerJournalna
354e0 6d 65 28 70 2d 3e 70 42 74 2d 3e 70 50 61 67 65  me(p->pBt->pPage
354f0 72 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  r);.}..#ifndef S
35500 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43 55 55  QLITE_OMIT_VACUU
35510 4d 0a 2f 2a 0a 2a 2a 20 43 6f 70 79 20 74 68 65  M./*.** Copy the
35520 20 63 6f 6d 70 6c 65 74 65 20 63 6f 6e 74 65 6e   complete conten
35530 74 20 6f 66 20 70 42 74 46 72 6f 6d 20 69 6e 74  t of pBtFrom int
35540 6f 20 70 42 74 54 6f 2e 20 20 41 20 74 72 61 6e  o pBtTo.  A tran
35550 73 61 63 74 69 6f 6e 0a 2a 2a 20 6d 75 73 74 20  saction.** must 
35560 62 65 20 61 63 74 69 76 65 20 66 6f 72 20 62 6f  be active for bo
35570 74 68 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  th files..**.** 
35580 54 68 65 20 73 69 7a 65 20 6f 66 20 66 69 6c 65  The size of file
35590 20 70 54 6f 20 6d 61 79 20 62 65 20 72 65 64 75   pTo may be redu
355a0 63 65 64 20 62 79 20 74 68 69 73 20 6f 70 65 72  ced by this oper
355b0 61 74 69 6f 6e 2e 0a 2a 2a 20 49 66 20 61 6e 79  ation..** If any
355c0 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
355d0 2c 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  , the transactio
355e0 6e 20 6f 6e 20 70 54 6f 20 69 73 20 72 6f 6c 6c  n on pTo is roll
355f0 65 64 20 62 61 63 6b 2e 20 0a 2a 2a 0a 2a 2a 20  ed back. .**.** 
35600 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 43  If successful, C
35610 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
35620 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e  may be called on
35630 20 70 54 6f 20 62 65 66 6f 72 65 20 72 65 74 75   pTo before retu
35640 72 6e 69 6e 67 2e 20 0a 2a 2a 20 54 68 65 20 63  rning. .** The c
35650 61 6c 6c 65 72 20 73 68 6f 75 6c 64 20 66 69 6e  aller should fin
35660 69 73 68 20 63 6f 6d 6d 69 74 74 69 6e 67 20 74  ish committing t
35670 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f  he transaction o
35680 6e 20 70 54 6f 20 62 79 20 63 61 6c 6c 69 6e 67  n pTo by calling
35690 0a 2a 2a 20 73 71 6c 69 74 65 33 42 74 72 65 65  .** sqlite3Btree
356a0 43 6f 6d 6d 69 74 28 29 2e 0a 2a 2f 0a 73 74 61  Commit()..*/.sta
356b0 74 69 63 20 69 6e 74 20 62 74 72 65 65 43 6f 70  tic int btreeCop
356c0 79 46 69 6c 65 28 42 74 72 65 65 20 2a 70 54 6f  yFile(Btree *pTo
356d0 2c 20 42 74 72 65 65 20 2a 70 46 72 6f 6d 29 7b  , Btree *pFrom){
356e0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
356f0 54 45 5f 4f 4b 3b 0a 20 20 50 67 6e 6f 20 69 3b  TE_OK;.  Pgno i;
35700 0a 0a 20 20 50 67 6e 6f 20 6e 46 72 6f 6d 50 61  ..  Pgno nFromPa
35710 67 65 3b 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65  ge;     /* Numbe
35720 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 70 46  r of pages in pF
35730 72 6f 6d 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 54  rom */.  Pgno nT
35740 6f 50 61 67 65 3b 20 20 20 20 20 20 20 2f 2a 20  oPage;       /* 
35750 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
35760 69 6e 20 70 54 6f 20 2a 2f 0a 20 20 50 67 6e 6f  in pTo */.  Pgno
35770 20 6e 4e 65 77 50 61 67 65 3b 20 20 20 20 20 20   nNewPage;      
35780 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
35790 65 73 20 69 6e 20 70 54 6f 20 61 66 74 65 72 20  es in pTo after 
357a0 74 68 65 20 63 6f 70 79 20 2a 2f 0a 0a 20 20 50  the copy */..  P
357b0 67 6e 6f 20 69 53 6b 69 70 3b 20 20 20 20 20 20  gno iSkip;      
357c0 20 20 20 2f 2a 20 50 65 6e 64 69 6e 67 20 62 79     /* Pending by
357d0 74 65 20 70 61 67 65 20 69 6e 20 70 54 6f 20 2a  te page in pTo *
357e0 2f 0a 20 20 69 6e 74 20 6e 54 6f 50 61 67 65 53  /.  int nToPageS
357f0 69 7a 65 3b 20 20 20 20 2f 2a 20 50 61 67 65 20  ize;    /* Page 
35800 73 69 7a 65 20 6f 66 20 70 54 6f 20 69 6e 20 62  size of pTo in b
35810 79 74 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  ytes */.  int nF
35820 72 6f 6d 50 61 67 65 53 69 7a 65 3b 20 20 2f 2a  romPageSize;  /*
35830 20 50 61 67 65 20 73 69 7a 65 20 6f 66 20 70 46   Page size of pF
35840 72 6f 6d 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  rom in bytes */.
35850 0a 20 20 42 74 53 68 61 72 65 64 20 2a 70 42 74  .  BtShared *pBt
35860 54 6f 20 3d 20 70 54 6f 2d 3e 70 42 74 3b 0a 20  To = pTo->pBt;. 
35870 20 42 74 53 68 61 72 65 64 20 2a 70 42 74 46 72   BtShared *pBtFr
35880 6f 6d 20 3d 20 70 46 72 6f 6d 2d 3e 70 42 74 3b  om = pFrom->pBt;
35890 0a 20 20 70 42 74 54 6f 2d 3e 64 62 20 3d 20 70  .  pBtTo->db = p
358a0 54 6f 2d 3e 64 62 3b 0a 20 20 70 42 74 46 72 6f  To->db;.  pBtFro
358b0 6d 2d 3e 64 62 20 3d 20 70 46 72 6f 6d 2d 3e 64  m->db = pFrom->d
358c0 62 3b 0a 0a 20 20 6e 54 6f 50 61 67 65 53 69 7a  b;..  nToPageSiz
358d0 65 20 3d 20 70 42 74 54 6f 2d 3e 70 61 67 65 53  e = pBtTo->pageS
358e0 69 7a 65 3b 0a 20 20 6e 46 72 6f 6d 50 61 67 65  ize;.  nFromPage
358f0 53 69 7a 65 20 3d 20 70 42 74 46 72 6f 6d 2d 3e  Size = pBtFrom->
35900 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 69 66 28  pageSize;..  if(
35910 20 70 54 6f 2d 3e 69 6e 54 72 61 6e 73 21 3d 54   pTo->inTrans!=T
35920 52 41 4e 53 5f 57 52 49 54 45 20 7c 7c 20 70 46  RANS_WRITE || pF
35930 72 6f 6d 2d 3e 69 6e 54 72 61 6e 73 21 3d 54 52  rom->inTrans!=TR
35940 41 4e 53 5f 57 52 49 54 45 20 29 7b 0a 20 20 20  ANS_WRITE ){.   
35950 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
35960 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
35970 70 42 74 54 6f 2d 3e 70 43 75 72 73 6f 72 20 29  pBtTo->pCursor )
35980 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
35990 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 20  ITE_BUSY;.  }.. 
359a0 20 6e 54 6f 50 61 67 65 20 3d 20 70 61 67 65 72   nToPage = pager
359b0 50 61 67 65 63 6f 75 6e 74 28 70 42 74 54 6f 2d  Pagecount(pBtTo-
359c0 3e 70 50 61 67 65 72 29 3b 0a 20 20 6e 46 72 6f  >pPager);.  nFro
359d0 6d 50 61 67 65 20 3d 20 70 61 67 65 72 50 61 67  mPage = pagerPag
359e0 65 63 6f 75 6e 74 28 70 42 74 46 72 6f 6d 2d 3e  ecount(pBtFrom->
359f0 70 50 61 67 65 72 29 3b 0a 20 20 69 53 6b 69 70  pPager);.  iSkip
35a00 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 5f   = PENDING_BYTE_
35a10 50 41 47 45 28 70 42 74 54 6f 29 3b 0a 0a 20 20  PAGE(pBtTo);..  
35a20 2f 2a 20 56 61 72 69 61 62 6c 65 20 6e 4e 65 77  /* Variable nNew
35a30 50 61 67 65 20 69 73 20 74 68 65 20 6e 75 6d 62  Page is the numb
35a40 65 72 20 6f 66 20 70 61 67 65 73 20 72 65 71 75  er of pages requ
35a50 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20 74 68  ired to store th
35a60 65 0a 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 73 20  e.  ** contents 
35a70 6f 66 20 70 46 72 6f 6d 20 75 73 69 6e 67 20 74  of pFrom using t
35a80 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 2d  he current page-
35a90 73 69 7a 65 20 6f 66 20 70 54 6f 2e 0a 20 20 2a  size of pTo..  *
35aa0 2f 0a 20 20 6e 4e 65 77 50 61 67 65 20 3d 20 28  /.  nNewPage = (
35ab0 28 69 36 34 29 6e 46 72 6f 6d 50 61 67 65 20 2a  (i64)nFromPage *
35ac0 20 28 69 36 34 29 6e 46 72 6f 6d 50 61 67 65 53   (i64)nFromPageS
35ad0 69 7a 65 20 2b 20 28 69 36 34 29 6e 54 6f 50 61  ize + (i64)nToPa
35ae0 67 65 53 69 7a 65 20 2d 20 31 29 20 2f 20 0a 20  geSize - 1) / . 
35af0 20 20 20 20 20 28 69 36 34 29 6e 54 6f 50 61 67       (i64)nToPag
35b00 65 53 69 7a 65 3b 0a 0a 20 20 66 6f 72 28 69 3d  eSize;..  for(i=
35b10 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  1; rc==SQLITE_OK
35b20 20 26 26 20 28 69 3c 3d 6e 54 6f 50 61 67 65 20   && (i<=nToPage 
35b30 7c 7c 20 69 3c 3d 6e 4e 65 77 50 61 67 65 29 3b  || i<=nNewPage);
35b40 20 69 2b 2b 29 7b 0a 0a 20 20 20 20 2f 2a 20 4a   i++){..    /* J
35b50 6f 75 72 6e 61 6c 20 74 68 65 20 6f 72 69 67 69  ournal the origi
35b60 6e 61 6c 20 70 61 67 65 2e 0a 20 20 20 20 2a 2a  nal page..    **
35b70 0a 20 20 20 20 2a 2a 20 69 53 6b 69 70 20 69 73  .    ** iSkip is
35b80 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
35b90 20 6f 66 20 74 68 65 20 6c 6f 63 6b 69 6e 67 20   of the locking 
35ba0 70 61 67 65 20 28 50 45 4e 44 49 4e 47 5f 42 59  page (PENDING_BY
35bb0 54 45 5f 50 41 47 45 29 0a 20 20 20 20 2a 2a 20  TE_PAGE).    ** 
35bc0 69 6e 20 64 61 74 61 62 61 73 65 20 2a 70 54 6f  in database *pTo
35bd0 20 28 62 65 66 6f 72 65 20 74 68 65 20 63 6f 70   (before the cop
35be0 79 29 2e 20 54 68 69 73 20 70 61 67 65 20 69 73  y). This page is
35bf0 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 0a   never written .
35c00 20 20 20 20 2a 2a 20 69 6e 74 6f 20 74 68 65 20      ** into the 
35c10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 55 6e  journal file. Un
35c20 6c 65 73 73 20 69 3d 3d 69 53 6b 69 70 20 6f 72  less i==iSkip or
35c30 20 74 68 65 20 70 61 67 65 20 77 61 73 20 6e 6f   the page was no
35c40 74 0a 20 20 20 20 2a 2a 20 70 72 65 73 65 6e 74  t.    ** present
35c50 20 69 6e 20 70 54 6f 20 62 65 66 6f 72 65 20 74   in pTo before t
35c60 68 65 20 63 6f 70 79 20 6f 70 65 72 61 74 69 6f  he copy operatio
35c70 6e 2c 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  n, journal page 
35c80 69 20 66 72 6f 6d 20 70 54 6f 2e 0a 20 20 20 20  i from pTo..    
35c90 2a 2f 0a 20 20 20 20 69 66 28 20 69 21 3d 69 53  */.    if( i!=iS
35ca0 6b 69 70 20 26 26 20 69 3c 3d 6e 54 6f 50 61 67  kip && i<=nToPag
35cb0 65 20 29 7b 0a 20 20 20 20 20 20 44 62 50 61 67  e ){.      DbPag
35cc0 65 20 2a 70 44 62 50 61 67 65 20 3d 20 30 3b 0a  e *pDbPage = 0;.
35cd0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
35ce0 65 33 50 61 67 65 72 47 65 74 28 70 42 74 54 6f  e3PagerGet(pBtTo
35cf0 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20 26 70 44  ->pPager, i, &pD
35d00 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  bPage);.      if
35d10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
35d20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
35d30 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
35d40 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  e(pDbPage);.    
35d50 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
35d60 54 45 5f 4f 4b 20 26 26 20 69 3e 6e 46 72 6f 6d  TE_OK && i>nFrom
35d70 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
35d80 20 20 2f 2a 20 59 65 61 68 2e 20 20 49 74 20 73    /* Yeah.  It s
35d90 65 65 6d 73 20 77 69 65 72 64 20 74 6f 20 63 61  eems wierd to ca
35da0 6c 6c 20 44 6f 6e 74 57 72 69 74 65 28 29 20 72  ll DontWrite() r
35db0 69 67 68 74 20 61 66 74 65 72 20 57 72 69 74 65  ight after Write
35dc0 28 29 2e 20 42 75 74 0a 20 20 20 20 20 20 20 20  (). But.        
35dd0 20 20 2a 2a 20 74 68 61 74 20 69 73 20 62 65 63    ** that is bec
35de0 61 75 73 65 20 74 68 65 20 6e 61 6d 65 73 20 6f  ause the names o
35df0 66 20 74 68 6f 73 65 20 70 72 6f 63 65 64 75 72  f those procedur
35e00 65 73 20 64 6f 20 6e 6f 74 20 65 78 61 63 74 6c  es do not exactl
35e10 79 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  y .          ** 
35e20 72 65 70 72 65 73 65 6e 74 20 77 68 61 74 20 74  represent what t
35e30 68 65 79 20 64 6f 2e 20 20 57 72 69 74 65 28 29  hey do.  Write()
35e40 20 72 65 61 6c 6c 79 20 6d 65 61 6e 73 20 22 70   really means "p
35e50 75 74 20 74 68 69 73 20 70 61 67 65 20 69 6e 20  ut this page in 
35e60 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
35e70 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
35e80 6c 20 61 6e 64 20 6d 61 72 6b 20 69 74 20 61 73  l and mark it as
35e90 20 64 69 72 74 79 20 73 6f 20 74 68 61 74 20 69   dirty so that i
35ea0 74 20 77 69 6c 6c 20 62 65 20 77 72 69 74 74 65  t will be writte
35eb0 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74  n.          ** t
35ec0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
35ed0 69 6c 65 20 6c 61 74 65 72 2e 22 20 20 44 6f 6e  ile later."  Don
35ee0 74 57 72 69 74 65 28 29 20 75 6e 64 6f 65 73 20  tWrite() undoes 
35ef0 74 68 65 20 73 65 63 6f 6e 64 20 70 61 72 74 20  the second part 
35f00 6f 66 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  of.          ** 
35f10 74 68 61 74 20 61 6e 64 20 70 72 65 76 65 6e 74  that and prevent
35f20 73 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20  s the page from 
35f30 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f  being written to
35f40 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 54   the database. T
35f50 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
35f60 70 61 67 65 20 69 73 20 73 74 69 6c 6c 20 6f 6e  page is still on
35f70 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
35f80 75 72 6e 61 6c 2c 20 74 68 6f 75 67 68 2e 20 20  urnal, though.  
35f90 41 6e 64 20 74 68 61 74 20 69 73 20 74 68 65 20  And that is the 
35fa0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77 68  .          ** wh
35fb0 6f 6c 65 20 70 6f 69 6e 74 20 6f 66 20 74 68 69  ole point of thi
35fc0 73 20 62 6c 6f 63 6b 3a 20 74 6f 20 70 75 74 20  s block: to put 
35fd0 70 61 67 65 73 20 6f 6e 20 74 68 65 20 72 6f 6c  pages on the rol
35fe0 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 0a  lback journal. .
35ff0 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
36000 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
36010 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
36020 65 28 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20  e(pDbPage);.    
36030 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
36040 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
36050 70 44 62 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pDbPage);.      
36060 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
36070 4f 76 65 72 77 72 69 74 65 20 74 68 65 20 64 61  Overwrite the da
36080 74 61 20 69 6e 20 70 61 67 65 20 69 20 6f 66 20  ta in page i of 
36090 74 68 65 20 74 61 72 67 65 74 20 64 61 74 61 62  the target datab
360a0 61 73 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  ase */.    if( r
360b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
360c0 69 21 3d 69 53 6b 69 70 20 26 26 20 69 3c 3d 6e  i!=iSkip && i<=n
360d0 4e 65 77 50 61 67 65 20 29 7b 0a 0a 20 20 20 20  NewPage ){..    
360e0 20 20 44 62 50 61 67 65 20 2a 70 54 6f 50 61 67    DbPage *pToPag
360f0 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  e = 0;.      sql
36100 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 66 3b  ite3_int64 iOff;
36110 0a 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ..      rc = sql
36120 69 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74  ite3PagerGet(pBt
36130 54 6f 2d 3e 70 50 61 67 65 72 2c 20 69 2c 20 26  To->pPager, i, &
36140 70 54 6f 50 61 67 65 29 3b 0a 20 20 20 20 20 20  pToPage);.      
36150 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
36160 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
36170 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
36180 69 74 65 28 70 54 6f 50 61 67 65 29 3b 0a 20 20  ite(pToPage);.  
36190 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72      }..      for
361a0 28 0a 20 20 20 20 20 20 20 20 69 4f 66 66 3d 28  (.        iOff=(
361b0 69 2d 31 29 2a 6e 54 6f 50 61 67 65 53 69 7a 65  i-1)*nToPageSize
361c0 3b 20 0a 20 20 20 20 20 20 20 20 72 63 3d 3d 53  ; .        rc==S
361d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4f 66 66  QLITE_OK && iOff
361e0 3c 69 2a 6e 54 6f 50 61 67 65 53 69 7a 65 3b 20  <i*nToPageSize; 
361f0 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d  .        iOff +=
36200 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 0a 20   nFromPageSize. 
36210 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
36220 44 62 50 61 67 65 20 2a 70 46 72 6f 6d 50 61 67  DbPage *pFromPag
36230 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 50  e = 0;.        P
36240 67 6e 6f 20 69 46 72 6f 6d 20 3d 20 28 69 4f 66  gno iFrom = (iOf
36250 66 2f 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 29  f/nFromPageSize)
36260 2b 31 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28  +1;..        if(
36270 20 69 46 72 6f 6d 3d 3d 50 45 4e 44 49 4e 47 5f   iFrom==PENDING_
36280 42 59 54 45 5f 50 41 47 45 28 70 42 74 46 72 6f  BYTE_PAGE(pBtFro
36290 6d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  m) ){.          
362a0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
362b0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20    }..        rc 
362c0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  = sqlite3PagerGe
362d0 74 28 70 42 74 46 72 6f 6d 2d 3e 70 50 61 67 65  t(pBtFrom->pPage
362e0 72 2c 20 69 46 72 6f 6d 2c 20 26 70 46 72 6f 6d  r, iFrom, &pFrom
362f0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 69  Page);.        i
36300 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
36310 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68   ){.          ch
36320 61 72 20 2a 7a 54 6f 20 3d 20 73 71 6c 69 74 65  ar *zTo = sqlite
36330 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 54  3PagerGetData(pT
36340 6f 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  oPage);.        
36350 20 20 63 68 61 72 20 2a 7a 46 72 6f 6d 20 3d 20    char *zFrom = 
36360 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
36370 61 74 61 28 70 46 72 6f 6d 50 61 67 65 29 3b 0a  ata(pFromPage);.
36380 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e 43            int nC
36390 6f 70 79 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  opy;..          
363a0 69 66 28 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a  if( nFromPageSiz
363b0 65 3e 3d 6e 54 6f 50 61 67 65 53 69 7a 65 20 29  e>=nToPageSize )
363c0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 46  {.            zF
363d0 72 6f 6d 20 2b 3d 20 28 28 69 2d 31 29 2a 6e 54  rom += ((i-1)*nT
363e0 6f 50 61 67 65 53 69 7a 65 20 2d 20 28 28 69 46  oPageSize - ((iF
363f0 72 6f 6d 2d 31 29 2a 6e 46 72 6f 6d 50 61 67 65  rom-1)*nFromPage
36400 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Size));.        
36410 20 20 20 20 6e 43 6f 70 79 20 3d 20 6e 54 6f 50      nCopy = nToP
36420 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  ageSize;.       
36430 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
36440 20 20 20 20 20 20 7a 54 6f 20 2b 3d 20 28 28 28        zTo += (((
36450 69 46 72 6f 6d 2d 31 29 2a 6e 46 72 6f 6d 50 61  iFrom-1)*nFromPa
36460 67 65 53 69 7a 65 29 20 2d 20 28 69 2d 31 29 2a  geSize) - (i-1)*
36470 6e 54 6f 50 61 67 65 53 69 7a 65 29 3b 0a 20 20  nToPageSize);.  
36480 20 20 20 20 20 20 20 20 20 20 6e 43 6f 70 79 20            nCopy 
36490 3d 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 3b  = nFromPageSize;
364a0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
364b0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a          memcpy(z
364c0 54 6f 2c 20 7a 46 72 6f 6d 2c 20 6e 43 6f 70 79  To, zFrom, nCopy
364d0 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 50 61 67  );..  sqlite3Pag
364e0 65 72 55 6e 72 65 66 28 70 46 72 6f 6d 50 61 67  erUnref(pFromPag
364f0 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
36500 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
36510 20 70 54 6f 50 61 67 65 20 29 7b 0a 20 20 20 20   pToPage ){.    
36520 20 20 20 20 4d 65 6d 50 61 67 65 20 2a 70 20 3d      MemPage *p =
36530 20 28 4d 65 6d 50 61 67 65 20 2a 29 73 71 6c 69   (MemPage *)sqli
36540 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
36550 28 70 54 6f 50 61 67 65 29 3b 0a 20 20 20 20 20  (pToPage);.     
36560 20 20 20 70 2d 3e 69 73 49 6e 69 74 20 3d 20 30     p->isInit = 0
36570 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
36580 33 50 61 67 65 72 55 6e 72 65 66 28 70 54 6f 50  3PagerUnref(pToP
36590 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  age);.      }.  
365a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
365b0 20 74 68 69 6e 67 73 20 68 61 76 65 20 77 6f 72   things have wor
365c0 6b 65 64 20 73 6f 20 66 61 72 2c 20 74 68 65 20  ked so far, the 
365d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d 61  database file ma
365e0 79 20 6e 65 65 64 20 74 6f 20 62 65 20 0a 20 20  y need to be .  
365f0 2a 2a 20 74 72 75 6e 63 61 74 65 64 2e 20 54 68  ** truncated. Th
36600 65 20 63 6f 6d 70 6c 65 78 20 70 61 72 74 20 69  e complex part i
36610 73 20 74 68 61 74 20 69 74 20 6d 61 79 20 6e 65  s that it may ne
36620 65 64 20 74 6f 20 62 65 20 74 72 75 6e 63 61 74  ed to be truncat
36630 65 64 20 74 6f 0a 20 20 2a 2a 20 61 20 73 69 7a  ed to.  ** a siz
36640 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 6e  e that is not an
36650 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69 70 6c   integer multipl
36660 65 20 6f 66 20 6e 54 6f 50 61 67 65 53 69 7a 65  e of nToPageSize
36670 20 2d 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20   - the current. 
36680 20 2a 2a 20 70 61 67 65 20 73 69 7a 65 20 75 73   ** page size us
36690 65 64 20 62 79 20 74 68 65 20 70 61 67 65 72 20  ed by the pager 
366a0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
366b0 42 2d 54 72 65 65 20 70 54 6f 2e 0a 20 20 2a 2a  B-Tree pTo..  **
366c0 0a 20 20 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c  .  ** For exampl
366d0 65 2c 20 73 61 79 20 74 68 65 20 70 61 67 65 2d  e, say the page-
366e0 73 69 7a 65 20 6f 66 20 70 54 6f 20 69 73 20 32  size of pTo is 2
366f0 30 34 38 20 62 79 74 65 73 20 61 6e 64 20 74 68  048 bytes and th
36700 65 20 6f 72 69 67 69 6e 61 6c 20 0a 20 20 2a 2a  e original .  **
36710 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
36720 20 69 73 20 35 20 28 31 30 20 4b 42 20 66 69 6c   is 5 (10 KB fil
36730 65 29 2e 20 49 66 20 70 46 72 6f 6d 20 68 61 73  e). If pFrom has
36740 20 61 20 70 61 67 65 20 73 69 7a 65 20 6f 66 20   a page size of 
36750 31 30 32 34 20 0a 20 20 2a 2a 20 62 79 74 65 73  1024 .  ** bytes
36760 20 61 6e 64 20 39 20 70 61 67 65 73 2c 20 74 68   and 9 pages, th
36770 65 6e 20 74 68 65 20 66 69 6c 65 20 6e 65 65 64  en the file need
36780 73 20 74 6f 20 62 65 20 74 72 75 6e 63 61 74 65  s to be truncate
36790 64 20 74 6f 20 39 4b 42 2e 0a 20 20 2a 2f 0a 20  d to 9KB..  */. 
367a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
367b0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 46  OK ){.    if( nF
367c0 72 6f 6d 50 61 67 65 53 69 7a 65 21 3d 6e 54 6f  romPageSize!=nTo
367d0 50 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  PageSize ){.    
367e0 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
367f0 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 50  pFile = sqlite3P
36800 61 67 65 72 46 69 6c 65 28 70 42 74 54 6f 2d 3e  agerFile(pBtTo->
36810 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
36820 36 34 20 69 53 69 7a 65 20 3d 20 28 69 36 34 29  64 iSize = (i64)
36830 6e 46 72 6f 6d 50 61 67 65 53 69 7a 65 20 2a 20  nFromPageSize * 
36840 28 69 36 34 29 6e 46 72 6f 6d 50 61 67 65 3b 0a  (i64)nFromPage;.
36850 20 20 20 20 20 20 69 36 34 20 69 4e 6f 77 20 3d        i64 iNow =
36860 20 28 69 36 34 29 28 28 6e 54 6f 50 61 67 65 3e   (i64)((nToPage>
36870 6e 4e 65 77 50 61 67 65 29 3f 6e 54 6f 50 61 67  nNewPage)?nToPag
36880 65 3a 6e 4e 65 77 50 61 67 65 29 20 2a 20 28 69  e:nNewPage) * (i
36890 36 34 29 6e 54 6f 50 61 67 65 53 69 7a 65 3b 20  64)nToPageSize; 
368a0 0a 20 20 20 20 20 20 69 36 34 20 69 50 65 6e 64  .      i64 iPend
368b0 69 6e 67 20 3d 20 28 28 69 36 34 29 50 45 4e 44  ing = ((i64)PEND
368c0 49 4e 47 5f 42 59 54 45 5f 50 41 47 45 28 70 42  ING_BYTE_PAGE(pB
368d0 74 54 6f 29 2d 31 29 20 2a 28 69 36 34 29 6e 54  tTo)-1) *(i64)nT
368e0 6f 50 61 67 65 53 69 7a 65 3b 0a 20 20 0a 20 20  oPageSize;.  .  
368f0 20 20 20 20 61 73 73 65 72 74 28 20 69 53 69 7a      assert( iSiz
36900 65 3c 3d 69 4e 6f 77 20 29 3b 0a 20 20 0a 20 20  e<=iNow );.  .  
36910 20 20 20 20 2f 2a 20 43 6f 6d 6d 69 74 20 70 68      /* Commit ph
36920 61 73 65 20 6f 6e 65 20 73 79 6e 63 73 20 74 68  ase one syncs th
36930 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
36940 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
36950 54 6f 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e  To .      ** con
36960 74 61 69 6e 69 6e 67 20 74 68 65 20 6f 72 69 67  taining the orig
36970 69 6e 61 6c 20 64 61 74 61 2e 20 49 74 20 64 6f  inal data. It do
36980 65 73 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20  es not sync the 
36990 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
369a0 20 20 20 20 2a 2a 20 69 74 73 65 6c 66 2e 20 41      ** itself. A
369b0 66 74 65 72 20 64 6f 69 6e 67 20 74 68 69 73 20  fter doing this 
369c0 69 74 20 69 73 20 73 61 66 65 20 74 6f 20 75 73  it is safe to us
369d0 65 20 4f 73 54 72 75 6e 63 61 74 65 28 29 20 61  e OsTruncate() a
369e0 6e 64 20 6f 74 68 65 72 0a 20 20 20 20 20 20 2a  nd other.      *
369f0 2a 20 66 69 6c 65 20 41 50 49 73 20 6f 6e 20 74  * file APIs on t
36a00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
36a10 20 64 69 72 65 63 74 6c 79 2e 0a 20 20 20 20 20   directly..     
36a20 20 2a 2f 0a 20 20 20 20 20 20 70 42 74 54 6f 2d   */.      pBtTo-
36a30 3e 64 62 20 3d 20 70 54 6f 2d 3e 64 62 3b 0a 20  >db = pTo->db;. 
36a40 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
36a50 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
36a60 65 4f 6e 65 28 70 42 74 54 6f 2d 3e 70 50 61 67  eOne(pBtTo->pPag
36a70 65 72 2c 20 30 2c 20 30 2c 20 31 29 3b 0a 20 20  er, 0, 0, 1);.  
36a80 20 20 20 20 69 66 28 20 69 53 69 7a 65 3c 69 4e      if( iSize<iN
36a90 6f 77 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ow && rc==SQLITE
36aa0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
36ab0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
36ac0 6e 63 61 74 65 28 70 46 69 6c 65 2c 20 69 53 69  ncate(pFile, iSi
36ad0 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a  ze);.      }.  .
36ae0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 6f 6f        /* The loo
36af0 70 20 74 68 61 74 20 63 6f 70 69 65 64 20 64 61  p that copied da
36b00 74 61 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65  ta from database
36b10 20 70 46 72 6f 6d 20 74 6f 20 70 54 6f 20 64 69   pFrom to pTo di
36b20 64 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 70  d not.      ** p
36b30 6f 70 75 6c 61 74 65 20 74 68 65 20 6c 6f 63 6b  opulate the lock
36b40 69 6e 67 20 70 61 67 65 20 6f 66 20 64 61 74 61  ing page of data
36b50 62 61 73 65 20 70 54 6f 2e 20 49 66 20 74 68 65  base pTo. If the
36b60 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 0a 20 20   page-size of.  
36b70 20 20 20 20 2a 2a 20 70 46 72 6f 6d 20 69 73 20      ** pFrom is 
36b80 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 61  smaller than tha
36b90 74 20 6f 66 20 70 54 6f 2c 20 74 68 69 73 20 6d  t of pTo, this m
36ba0 65 61 6e 73 20 73 6f 6d 65 20 64 61 74 61 20 77  eans some data w
36bb0 69 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 74  ill.      ** not
36bc0 20 68 61 76 65 20 62 65 65 6e 20 63 6f 70 69 65   have been copie
36bd0 64 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  d. .      **.   
36be0 20 20 20 2a 2a 20 54 68 69 73 20 62 6c 6f 63 6b     ** This block
36bf0 20 63 6f 70 69 65 73 20 74 68 65 20 6d 69 73 73   copies the miss
36c00 69 6e 67 20 64 61 74 61 20 66 72 6f 6d 20 64 61  ing data from da
36c10 74 61 62 61 73 65 20 70 46 72 6f 6d 20 74 6f 20  tabase pFrom to 
36c20 70 54 6f 20 0a 20 20 20 20 20 20 2a 2a 20 75 73  pTo .      ** us
36c30 69 6e 67 20 66 69 6c 65 20 41 50 49 73 2e 20 54  ing file APIs. T
36c40 68 69 73 20 69 73 20 73 61 66 65 20 62 65 63 61  his is safe beca
36c50 75 73 65 20 61 74 20 74 68 69 73 20 70 6f 69 6e  use at this poin
36c60 74 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 0a 20  t we know that. 
36c70 20 20 20 20 20 2a 2a 20 61 6c 6c 20 6f 66 20 74       ** all of t
36c80 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
36c90 20 66 72 6f 6d 20 70 54 6f 20 68 61 73 20 62 65   from pTo has be
36ca0 65 6e 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74  en synced into t
36cb0 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  he .      ** jou
36cc0 72 6e 61 6c 20 66 69 6c 65 2e 20 41 74 20 74 68  rnal file. At th
36cd0 69 73 20 70 6f 69 6e 74 20 69 74 20 77 6f 75 6c  is point it woul
36ce0 64 20 62 65 20 73 61 66 65 20 74 6f 20 64 6f 20  d be safe to do 
36cf0 61 6e 79 74 68 69 6e 67 20 61 74 0a 20 20 20 20  anything at.    
36d00 20 20 2a 2a 20 61 6c 6c 20 74 6f 20 74 68 65 20    ** all to the 
36d10 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 65 78  database file ex
36d20 63 65 70 74 20 74 72 75 6e 63 61 74 65 20 69 74  cept truncate it
36d30 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 2e 0a   to zero bytes..
36d40 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
36d50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
36d60 20 26 26 20 6e 46 72 6f 6d 50 61 67 65 53 69 7a   && nFromPageSiz
36d70 65 3c 6e 54 6f 50 61 67 65 53 69 7a 65 20 26 26  e<nToPageSize &&
36d80 20 69 53 69 7a 65 3e 69 50 65 6e 64 69 6e 67 29   iSize>iPending)
36d90 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4f  {.        i64 iO
36da0 66 66 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ff;.        for(
36db0 0a 20 20 20 20 20 20 20 20 20 20 69 4f 66 66 3d  .          iOff=
36dc0 69 50 65 6e 64 69 6e 67 3b 20 0a 20 20 20 20 20  iPending; .     
36dd0 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
36de0 4f 4b 20 26 26 20 69 4f 66 66 3c 28 69 50 65 6e  OK && iOff<(iPen
36df0 64 69 6e 67 2b 6e 54 6f 50 61 67 65 53 69 7a 65  ding+nToPageSize
36e00 29 3b 20 0a 20 20 20 20 20 20 20 20 20 20 69 4f  ); .          iO
36e10 66 66 20 2b 3d 20 6e 46 72 6f 6d 50 61 67 65 53  ff += nFromPageS
36e20 69 7a 65 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ize.        ){. 
36e30 20 20 20 20 20 20 20 20 20 44 62 50 61 67 65 20           DbPage 
36e40 2a 70 46 72 6f 6d 50 61 67 65 20 3d 20 30 3b 0a  *pFromPage = 0;.
36e50 20 20 20 20 20 20 20 20 20 20 50 67 6e 6f 20 69            Pgno i
36e60 46 72 6f 6d 20 3d 20 28 69 4f 66 66 2f 6e 46 72  From = (iOff/nFr
36e70 6f 6d 50 61 67 65 53 69 7a 65 29 2b 31 3b 0a 20  omPageSize)+1;. 
36e80 20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20   .          if( 
36e90 69 46 72 6f 6d 3d 3d 50 45 4e 44 49 4e 47 5f 42  iFrom==PENDING_B
36ea0 59 54 45 5f 50 41 47 45 28 70 42 74 46 72 6f 6d  YTE_PAGE(pBtFrom
36eb0 29 20 7c 7c 20 69 46 72 6f 6d 3e 6e 46 72 6f 6d  ) || iFrom>nFrom
36ec0 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Page ){.        
36ed0 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
36ee0 20 20 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20          }.  .   
36ef0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
36f00 74 65 33 50 61 67 65 72 47 65 74 28 70 42 74 46  te3PagerGet(pBtF
36f10 72 6f 6d 2d 3e 70 50 61 67 65 72 2c 20 69 46 72  rom->pPager, iFr
36f20 6f 6d 2c 20 26 70 46 72 6f 6d 50 61 67 65 29 3b  om, &pFromPage);
36f30 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
36f40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
36f50 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
36f60 20 2a 7a 46 72 6f 6d 20 3d 20 73 71 6c 69 74 65   *zFrom = sqlite
36f70 33 50 61 67 65 72 47 65 74 44 61 74 61 28 70 46  3PagerGetData(pF
36f80 72 6f 6d 50 61 67 65 29 3b 0a 20 20 20 20 20 20  romPage);.      
36f90 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
36fa0 65 33 4f 73 57 72 69 74 65 28 70 46 69 6c 65 2c  e3OsWrite(pFile,
36fb0 20 7a 46 72 6f 6d 2c 20 6e 46 72 6f 6d 50 61 67   zFrom, nFromPag
36fc0 65 53 69 7a 65 2c 20 69 4f 66 66 29 3b 0a 20 20  eSize, iOff);.  
36fd0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
36fe0 33 50 61 67 65 72 55 6e 72 65 66 28 70 46 72 6f  3PagerUnref(pFro
36ff0 6d 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  mPage);.        
37000 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
37010 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f      }.  .      /
37020 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62  * Sync the datab
37030 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  ase file */.    
37040 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
37050 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
37060 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
37070 53 79 6e 63 28 70 42 74 54 6f 2d 3e 70 50 61 67  Sync(pBtTo->pPag
37080 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
37090 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
370a0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54   = sqlite3PagerT
370b0 72 75 6e 63 61 74 65 28 70 42 74 54 6f 2d 3e 70  runcate(pBtTo->p
370c0 50 61 67 65 72 2c 20 6e 4e 65 77 50 61 67 65 29  Pager, nNewPage)
370d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
370e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
370f0 0a 20 20 20 20 20 20 70 42 74 54 6f 2d 3e 70 61  .      pBtTo->pa
37100 67 65 53 69 7a 65 46 69 78 65 64 20 3d 20 30 3b  geSizeFixed = 0;
37110 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
37120 28 20 72 63 20 29 7b 0a 20 20 20 20 73 71 6c 69  ( rc ){.    sqli
37130 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
37140 28 70 54 6f 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  (pTo);.  }..  re
37150 74 75 72 6e 20 72 63 3b 20 20 0a 7d 0a 69 6e 74  turn rc;  .}.int
37160 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6f 70   sqlite3BtreeCop
37170 79 46 69 6c 65 28 42 74 72 65 65 20 2a 70 54 6f  yFile(Btree *pTo
37180 2c 20 42 74 72 65 65 20 2a 70 46 72 6f 6d 29 7b  , Btree *pFrom){
37190 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
371a0 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
371b0 54 6f 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  To);.  sqlite3Bt
371c0 72 65 65 45 6e 74 65 72 28 70 46 72 6f 6d 29 3b  reeEnter(pFrom);
371d0 0a 20 20 72 63 20 3d 20 62 74 72 65 65 43 6f 70  .  rc = btreeCop
371e0 79 46 69 6c 65 28 70 54 6f 2c 20 70 46 72 6f 6d  yFile(pTo, pFrom
371f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
37200 65 4c 65 61 76 65 28 70 46 72 6f 6d 29 3b 0a 20  eLeave(pFrom);. 
37210 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61   sqlite3BtreeLea
37220 76 65 28 70 54 6f 29 3b 0a 20 20 72 65 74 75 72  ve(pTo);.  retur
37230 6e 20 72 63 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20  n rc;.}..#endif 
37240 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  /* SQLITE_OMIT_V
37250 41 43 55 55 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ACUUM */../*.** 
37260 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
37270 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
37280 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69   is active..*/.i
37290 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
372a0 73 49 6e 54 72 61 6e 73 28 42 74 72 65 65 20 2a  sInTrans(Btree *
372b0 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d  p){.  assert( p=
372c0 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d 75  =0 || sqlite3_mu
372d0 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62 2d 3e  tex_held(p->db->
372e0 6d 75 74 65 78 29 20 29 3b 0a 20 20 72 65 74 75  mutex) );.  retu
372f0 72 6e 20 28 70 20 26 26 20 28 70 2d 3e 69 6e 54  rn (p && (p->inT
37300 72 61 6e 73 3d 3d 54 52 41 4e 53 5f 57 52 49 54  rans==TRANS_WRIT
37310 45 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  E));.}../*.** Re
37320 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66  turn non-zero if
37330 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
37340 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
37350 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ve..*/.int sqlit
37360 65 33 42 74 72 65 65 49 73 49 6e 53 74 6d 74 28  e3BtreeIsInStmt(
37370 42 74 72 65 65 20 2a 70 29 7b 0a 20 20 61 73 73  Btree *p){.  ass
37380 65 72 74 28 20 73 71 6c 69 74 65 33 42 74 72 65  ert( sqlite3Btre
37390 65 48 6f 6c 64 73 4d 75 74 65 78 28 70 29 20 29  eHoldsMutex(p) )
373a0 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 2d 3e 70  ;.  return (p->p
373b0 42 74 20 26 26 20 70 2d 3e 70 42 74 2d 3e 69 6e  Bt && p->pBt->in
373c0 53 74 6d 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Stmt);.}../*.** 
373d0 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
373e0 69 66 20 61 20 72 65 61 64 20 28 6f 72 20 77 72  if a read (or wr
373f0 69 74 65 29 20 74 72 61 6e 73 61 63 74 69 6f 6e  ite) transaction
37400 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69   is active..*/.i
37410 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  nt sqlite3BtreeI
37420 73 49 6e 52 65 61 64 54 72 61 6e 73 28 42 74 72  sInReadTrans(Btr
37430 65 65 20 2a 70 29 7b 0a 20 20 61 73 73 65 72 74  ee *p){.  assert
37440 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
37450 68 65 6c 64 28 70 2d 3e 64 62 2d 3e 6d 75 74 65  held(p->db->mute
37460 78 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 28  x) );.  return (
37470 70 20 26 26 20 28 70 2d 3e 69 6e 54 72 61 6e 73  p && (p->inTrans
37480 21 3d 54 52 41 4e 53 5f 4e 4f 4e 45 29 29 3b 0a  !=TRANS_NONE));.
37490 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
374a0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 61  nction returns a
374b0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 62 6c   pointer to a bl
374c0 6f 62 20 6f 66 20 6d 65 6d 6f 72 79 20 61 73 73  ob of memory ass
374d0 6f 63 69 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  ociated with.** 
374e0 61 20 73 69 6e 67 6c 65 20 73 68 61 72 65 64 2d  a single shared-
374f0 62 74 72 65 65 2e 20 54 68 65 20 6d 65 6d 6f 72  btree. The memor
37500 79 20 69 73 20 75 73 65 64 20 62 79 20 63 6c 69  y is used by cli
37510 65 6e 74 20 63 6f 64 65 20 66 6f 72 20 69 74 73  ent code for its
37520 20 6f 77 6e 0a 2a 2a 20 70 75 72 70 6f 73 65 73   own.** purposes
37530 20 28 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74   (for example, t
37540 6f 20 73 74 6f 72 65 20 61 20 68 69 67 68 2d 6c  o store a high-l
37550 65 76 65 6c 20 73 63 68 65 6d 61 20 61 73 73 6f  evel schema asso
37560 63 69 61 74 65 64 20 77 69 74 68 20 0a 2a 2a 20  ciated with .** 
37570 74 68 65 20 73 68 61 72 65 64 2d 62 74 72 65 65  the shared-btree
37580 29 2e 20 54 68 65 20 62 74 72 65 65 20 6c 61 79  ). The btree lay
37590 65 72 20 6d 61 6e 61 67 65 73 20 72 65 66 65 72  er manages refer
375a0 65 6e 63 65 20 63 6f 75 6e 74 69 6e 67 20 69 73  ence counting is
375b0 73 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  sues..**.** The 
375c0 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73 20  first time this 
375d0 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 73  is called on a s
375e0 68 61 72 65 64 2d 62 74 72 65 65 2c 20 6e 42 79  hared-btree, nBy
375f0 74 65 73 20 62 79 74 65 73 20 6f 66 20 6d 65 6d  tes bytes of mem
37600 6f 72 79 0a 2a 2a 20 61 72 65 20 61 6c 6c 6f 63  ory.** are alloc
37610 61 74 65 64 2c 20 7a 65 72 6f 65 64 2c 20 61 6e  ated, zeroed, an
37620 64 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  d returned to th
37630 65 20 63 61 6c 6c 65 72 2e 20 46 6f 72 20 65 61  e caller. For ea
37640 63 68 20 73 75 62 73 65 71 75 65 6e 74 20 0a 2a  ch subsequent .*
37650 2a 20 63 61 6c 6c 20 74 68 65 20 6e 42 79 74 65  * call the nByte
37660 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 69  s parameter is i
37670 67 6e 6f 72 65 64 20 61 6e 64 20 61 20 70 6f 69  gnored and a poi
37680 6e 74 65 72 20 74 6f 20 74 68 65 20 73 61 6d 65  nter to the same
37690 20 62 6c 6f 62 0a 2a 2a 20 6f 66 20 6d 65 6d 6f   blob.** of memo
376a0 72 79 20 72 65 74 75 72 6e 65 64 2e 20 0a 2a 2a  ry returned. .**
376b0 0a 2a 2a 20 49 66 20 74 68 65 20 6e 42 79 74 65  .** If the nByte
376c0 73 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 30  s parameter is 0
376d0 20 61 6e 64 20 74 68 65 20 62 6c 6f 62 20 6f 66   and the blob of
376e0 20 6d 65 6d 6f 72 79 20 68 61 73 20 6e 6f 74 20   memory has not 
376f0 79 65 74 20 62 65 65 6e 0a 2a 2a 20 61 6c 6c 6f  yet been.** allo
37700 63 61 74 65 64 2c 20 61 20 6e 75 6c 6c 20 70 6f  cated, a null po
37710 69 6e 74 65 72 20 69 73 20 72 65 74 75 72 6e 65  inter is returne
37720 64 2e 20 49 66 20 74 68 65 20 62 6c 6f 62 20 68  d. If the blob h
37730 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a  as already been.
37740 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 2c 20 69 74  ** allocated, it
37750 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 73 20   is returned as 
37760 6e 6f 72 6d 61 6c 2e 0a 2a 2a 0a 2a 2a 20 4a 75  normal..**.** Ju
37770 73 74 20 62 65 66 6f 72 65 20 74 68 65 20 73 68  st before the sh
37780 61 72 65 64 2d 62 74 72 65 65 20 69 73 20 63 6c  ared-btree is cl
37790 6f 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69  osed, the functi
377a0 6f 6e 20 70 61 73 73 65 64 20 61 73 20 74 68 65  on passed as the
377b0 20 0a 2a 2a 20 78 46 72 65 65 20 61 72 67 75 6d   .** xFree argum
377c0 65 6e 74 20 77 68 65 6e 20 74 68 65 20 6d 65 6d  ent when the mem
377d0 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 77  ory allocation w
377e0 61 73 20 6d 61 64 65 20 69 73 20 69 6e 76 6f 6b  as made is invok
377f0 65 64 20 6f 6e 20 74 68 65 20 0a 2a 2a 20 62 6c  ed on the .** bl
37800 6f 62 20 6f 66 20 61 6c 6c 6f 63 61 74 65 64 20  ob of allocated 
37810 6d 65 6d 6f 72 79 2e 20 54 68 69 73 20 66 75 6e  memory. This fun
37820 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f 74  ction should not
37830 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 72   call sqlite3_fr
37840 65 65 28 29 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d  ee().** on the m
37850 65 6d 6f 72 79 2c 20 74 68 65 20 62 74 72 65 65  emory, the btree
37860 20 6c 61 79 65 72 20 64 6f 65 73 20 74 68 61 74   layer does that
37870 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
37880 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 42 74  e3BtreeSchema(Bt
37890 72 65 65 20 2a 70 2c 20 69 6e 74 20 6e 42 79 74  ree *p, int nByt
378a0 65 73 2c 20 76 6f 69 64 28 2a 78 46 72 65 65 29  es, void(*xFree)
378b0 28 76 6f 69 64 20 2a 29 29 7b 0a 20 20 42 74 53  (void *)){.  BtS
378c0 68 61 72 65 64 20 2a 70 42 74 20 3d 20 70 2d 3e  hared *pBt = p->
378d0 70 42 74 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  pBt;.  sqlite3Bt
378e0 72 65 65 45 6e 74 65 72 28 70 29 3b 0a 20 20 69  reeEnter(p);.  i
378f0 66 28 20 21 70 42 74 2d 3e 70 53 63 68 65 6d 61  f( !pBt->pSchema
37900 20 26 26 20 6e 42 79 74 65 73 20 29 7b 0a 20 20   && nBytes ){.  
37910 20 20 70 42 74 2d 3e 70 53 63 68 65 6d 61 20 3d    pBt->pSchema =
37920 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
37930 72 6f 28 6e 42 79 74 65 73 29 3b 0a 20 20 20 20  ro(nBytes);.    
37940 70 42 74 2d 3e 78 46 72 65 65 53 63 68 65 6d 61  pBt->xFreeSchema
37950 20 3d 20 78 46 72 65 65 3b 0a 20 20 7d 0a 20 20   = xFree;.  }.  
37960 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
37970 65 28 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  e(p);.  return p
37980 42 74 2d 3e 70 53 63 68 65 6d 61 3b 0a 7d 0a 0a  Bt->pSchema;.}..
37990 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
379a0 65 20 69 66 20 61 6e 6f 74 68 65 72 20 75 73 65  e if another use
379b0 72 20 6f 66 20 74 68 65 20 73 61 6d 65 20 73 68  r of the same sh
379c0 61 72 65 64 20 62 74 72 65 65 20 61 73 20 74 68  ared btree as th
379d0 65 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 68 61  e argument.** ha
379e0 6e 64 6c 65 20 68 6f 6c 64 73 20 61 6e 20 65 78  ndle holds an ex
379f0 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20  clusive lock on 
37a00 74 68 65 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  the sqlite_maste
37a10 72 20 74 61 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20  r table..*/.int 
37a20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65  sqlite3BtreeSche
37a30 6d 61 4c 6f 63 6b 65 64 28 42 74 72 65 65 20 2a  maLocked(Btree *
37a40 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
37a50 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
37a60 6d 75 74 65 78 5f 68 65 6c 64 28 70 2d 3e 64 62  mutex_held(p->db
37a70 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
37a80 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28  lite3BtreeEnter(
37a90 70 29 3b 0a 20 20 72 63 20 3d 20 28 71 75 65 72  p);.  rc = (quer
37aa0 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c 20 4d 41  yTableLock(p, MA
37ab0 53 54 45 52 5f 52 4f 4f 54 2c 20 52 45 41 44 5f  STER_ROOT, READ_
37ac0 4c 4f 43 4b 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  LOCK)!=SQLITE_OK
37ad0 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
37ae0 65 4c 65 61 76 65 28 70 29 3b 0a 20 20 72 65 74  eLeave(p);.  ret
37af0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 23 69 66 6e  urn rc;.}...#ifn
37b00 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
37b10 53 48 41 52 45 44 5f 43 41 43 48 45 0a 2f 2a 0a  SHARED_CACHE./*.
37b20 2a 2a 20 4f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  ** Obtain a lock
37b30 20 6f 6e 20 74 68 65 20 74 61 62 6c 65 20 77 68   on the table wh
37b40 6f 73 65 20 72 6f 6f 74 20 70 61 67 65 20 69 73  ose root page is
37b50 20 69 54 61 62 2e 20 20 54 68 65 0a 2a 2a 20 6c   iTab.  The.** l
37b60 6f 63 6b 20 69 73 20 61 20 77 72 69 74 65 20 6c  ock is a write l
37b70 6f 63 6b 20 69 66 20 69 73 57 72 69 74 65 6c 6f  ock if isWritelo
37b80 63 6b 20 69 73 20 74 72 75 65 20 6f 72 20 61 20  ck is true or a 
37b90 72 65 61 64 20 6c 6f 63 6b 0a 2a 2a 20 69 66 20  read lock.** if 
37ba0 69 74 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a  it is false..*/.
37bb0 69 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65  int sqlite3Btree
37bc0 4c 6f 63 6b 54 61 62 6c 65 28 42 74 72 65 65 20  LockTable(Btree 
37bd0 2a 70 2c 20 69 6e 74 20 69 54 61 62 2c 20 75 38  *p, int iTab, u8
37be0 20 69 73 57 72 69 74 65 4c 6f 63 6b 29 7b 0a 20   isWriteLock){. 
37bf0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
37c00 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 2d 3e 73 68  _OK;.  if( p->sh
37c10 61 72 61 62 6c 65 20 29 7b 0a 20 20 20 20 75 38  arable ){.    u8
37c20 20 6c 6f 63 6b 54 79 70 65 20 3d 20 52 45 41 44   lockType = READ
37c30 5f 4c 4f 43 4b 20 2b 20 69 73 57 72 69 74 65 4c  _LOCK + isWriteL
37c40 6f 63 6b 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ock;.    assert(
37c50 20 52 45 41 44 5f 4c 4f 43 4b 2b 31 3d 3d 57 52   READ_LOCK+1==WR
37c60 49 54 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  ITE_LOCK );.    
37c70 61 73 73 65 72 74 28 20 69 73 57 72 69 74 65 4c  assert( isWriteL
37c80 6f 63 6b 3d 3d 30 20 7c 7c 20 69 73 57 72 69 74  ock==0 || isWrit
37c90 65 4c 6f 63 6b 3d 3d 31 20 29 3b 0a 20 20 20 20  eLock==1 );.    
37ca0 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
37cb0 72 28 70 29 3b 0a 20 20 20 20 72 63 20 3d 20 71  r(p);.    rc = q
37cc0 75 65 72 79 54 61 62 6c 65 4c 6f 63 6b 28 70 2c  ueryTableLock(p,
37cd0 20 69 54 61 62 2c 20 6c 6f 63 6b 54 79 70 65 29   iTab, lockType)
37ce0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
37cf0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
37d00 20 72 63 20 3d 20 6c 6f 63 6b 54 61 62 6c 65 28   rc = lockTable(
37d10 70 2c 20 69 54 61 62 2c 20 6c 6f 63 6b 54 79 70  p, iTab, lockTyp
37d20 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
37d30 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
37d40 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
37d50 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23   rc;.}.#endif..#
37d60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
37d70 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 2f 2a 0a 2a  IT_INCRBLOB./*.*
37d80 2a 20 41 72 67 75 6d 65 6e 74 20 70 43 73 72 20  * Argument pCsr 
37d90 6d 75 73 74 20 62 65 20 61 20 63 75 72 73 6f 72  must be a cursor
37da0 20 6f 70 65 6e 65 64 20 66 6f 72 20 77 72 69 74   opened for writ
37db0 69 6e 67 20 6f 6e 20 61 6e 20 0a 2a 2a 20 49 4e  ing on an .** IN
37dc0 54 4b 45 59 20 74 61 62 6c 65 20 63 75 72 72 65  TKEY table curre
37dd0 6e 74 6c 79 20 70 6f 69 6e 74 69 6e 67 20 61 74  ntly pointing at
37de0 20 61 20 76 61 6c 69 64 20 74 61 62 6c 65 20 65   a valid table e
37df0 6e 74 72 79 2e 20 0a 2a 2a 20 54 68 69 73 20 66  ntry. .** This f
37e00 75 6e 63 74 69 6f 6e 20 6d 6f 64 69 66 69 65 73  unction modifies
37e10 20 74 68 65 20 64 61 74 61 20 73 74 6f 72 65 64   the data stored
37e20 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 61 74   as part of that
37e30 20 65 6e 74 72 79 2e 0a 2a 2a 20 4f 6e 6c 79 20   entry..** Only 
37e40 74 68 65 20 64 61 74 61 20 63 6f 6e 74 65 6e 74  the data content
37e50 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 6d 6f 64   may only be mod
37e60 69 66 69 65 64 2c 20 69 74 20 69 73 20 6e 6f 74  ified, it is not
37e70 20 70 6f 73 73 69 62 6c 65 0a 2a 2a 20 74 6f 20   possible.** to 
37e80 63 68 61 6e 67 65 20 74 68 65 20 6c 65 6e 67 74  change the lengt
37e90 68 20 6f 66 20 74 68 65 20 64 61 74 61 20 73 74  h of the data st
37ea0 6f 72 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ored..*/.int sql
37eb0 69 74 65 33 42 74 72 65 65 50 75 74 44 61 74 61  ite3BtreePutData
37ec0 28 42 74 43 75 72 73 6f 72 20 2a 70 43 73 72 2c  (BtCursor *pCsr,
37ed0 20 75 33 32 20 6f 66 66 73 65 74 2c 20 75 33 32   u32 offset, u32
37ee0 20 61 6d 74 2c 20 76 6f 69 64 20 2a 7a 29 7b 0a   amt, void *z){.
37ef0 20 20 61 73 73 65 72 74 28 20 63 75 72 73 6f 72    assert( cursor
37f00 48 6f 6c 64 73 4d 75 74 65 78 28 70 43 73 72 29  HoldsMutex(pCsr)
37f10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
37f20 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
37f30 28 70 43 73 72 2d 3e 70 42 74 72 65 65 2d 3e 64  (pCsr->pBtree->d
37f40 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
37f50 73 73 65 72 74 28 70 43 73 72 2d 3e 69 73 49 6e  ssert(pCsr->isIn
37f60 63 72 62 6c 6f 62 48 61 6e 64 6c 65 29 3b 0a 0a  crblobHandle);..
37f70 20 20 72 65 73 74 6f 72 65 43 75 72 73 6f 72 50    restoreCursorP
37f80 6f 73 69 74 69 6f 6e 28 70 43 73 72 29 3b 0a 20  osition(pCsr);. 
37f90 20 61 73 73 65 72 74 28 20 70 43 73 72 2d 3e 65   assert( pCsr->e
37fa0 53 74 61 74 65 21 3d 43 55 52 53 4f 52 5f 52 45  State!=CURSOR_RE
37fb0 51 55 49 52 45 53 45 45 4b 20 29 3b 0a 20 20 69  QUIRESEEK );.  i
37fc0 66 28 20 70 43 73 72 2d 3e 65 53 74 61 74 65 21  f( pCsr->eState!
37fd0 3d 43 55 52 53 4f 52 5f 56 41 4c 49 44 20 29 7b  =CURSOR_VALID ){
37fe0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
37ff0 54 45 5f 41 42 4f 52 54 3b 0a 20 20 7d 0a 0a 20  TE_ABORT;.  }.. 
38000 20 2f 2a 20 43 68 65 63 6b 20 73 6f 6d 65 20 70   /* Check some p
38010 72 65 63 6f 6e 64 69 74 69 6f 6e 73 3a 20 0a 20  reconditions: . 
38020 20 2a 2a 20 20 20 28 61 29 20 74 68 65 20 63 75   **   (a) the cu
38030 72 73 6f 72 20 69 73 20 6f 70 65 6e 20 66 6f 72  rsor is open for
38040 20 77 72 69 74 69 6e 67 2c 0a 20 20 2a 2a 20 20   writing,.  **  
38050 20 28 62 29 20 74 68 65 72 65 20 69 73 20 6e 6f   (b) there is no
38060 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20 74 68   read-lock on th
38070 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20 6d 6f  e table being mo
38080 64 69 66 69 65 64 20 61 6e 64 0a 20 20 2a 2a 20  dified and.  ** 
38090 20 20 28 63 29 20 74 68 65 20 63 75 72 73 6f 72    (c) the cursor
380a0 20 70 6f 69 6e 74 73 20 61 74 20 61 20 76 61 6c   points at a val
380b0 69 64 20 72 6f 77 20 6f 66 20 61 6e 20 69 6e 74  id row of an int
380c0 4b 65 79 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  Key table..  */.
380d0 20 20 69 66 28 20 21 70 43 73 72 2d 3e 77 72 46    if( !pCsr->wrF
380e0 6c 61 67 20 29 7b 0a 20 20 20 20 72 65 74 75 72  lag ){.    retur
380f0 6e 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  n SQLITE_READONL
38100 59 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  Y;.  }.  assert(
38110 20 21 70 43 73 72 2d 3e 70 42 74 2d 3e 72 65 61   !pCsr->pBt->rea
38120 64 4f 6e 6c 79 20 0a 20 20 20 20 20 20 20 20 20  dOnly .         
38130 20 26 26 20 70 43 73 72 2d 3e 70 42 74 2d 3e 69   && pCsr->pBt->i
38140 6e 54 72 61 6e 73 61 63 74 69 6f 6e 3d 3d 54 52  nTransaction==TR
38150 41 4e 53 5f 57 52 49 54 45 20 29 3b 0a 20 20 69  ANS_WRITE );.  i
38160 66 28 20 63 68 65 63 6b 52 65 61 64 4c 6f 63 6b  f( checkReadLock
38170 73 28 70 43 73 72 2d 3e 70 42 74 72 65 65 2c 20  s(pCsr->pBtree, 
38180 70 43 73 72 2d 3e 70 67 6e 6f 52 6f 6f 74 2c 20  pCsr->pgnoRoot, 
38190 70 43 73 72 2c 20 30 29 20 29 7b 0a 20 20 20 20  pCsr, 0) ){.    
381a0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4c 4f  return SQLITE_LO
381b0 43 4b 45 44 3b 20 2f 2a 20 54 68 65 20 74 61 62  CKED; /* The tab
381c0 6c 65 20 70 43 75 72 20 70 6f 69 6e 74 73 20 74  le pCur points t
381d0 6f 20 68 61 73 20 61 20 72 65 61 64 20 6c 6f 63  o has a read loc
381e0 6b 20 2a 2f 0a 20 20 7d 0a 20 20 69 66 28 20 70  k */.  }.  if( p
381f0 43 73 72 2d 3e 65 53 74 61 74 65 3d 3d 43 55 52  Csr->eState==CUR
38200 53 4f 52 5f 49 4e 56 41 4c 49 44 20 7c 7c 20 21  SOR_INVALID || !
38210 70 43 73 72 2d 3e 61 70 50 61 67 65 5b 70 43 73  pCsr->apPage[pCs
38220 72 2d 3e 69 50 61 67 65 5d 2d 3e 69 6e 74 4b 65  r->iPage]->intKe
38230 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
38240 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
38250 7d 0a 0a 20 20 72 65 74 75 72 6e 20 61 63 63 65  }..  return acce
38260 73 73 50 61 79 6c 6f 61 64 28 70 43 73 72 2c 20  ssPayload(pCsr, 
38270 6f 66 66 73 65 74 2c 20 61 6d 74 2c 20 28 75 6e  offset, amt, (un
38280 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 7a 2c  signed char *)z,
38290 20 30 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a   0, 1);.}../* .*
382a0 2a 20 53 65 74 20 61 20 66 6c 61 67 20 6f 6e 20  * Set a flag on 
382b0 74 68 69 73 20 63 75 72 73 6f 72 20 74 6f 20 63  this cursor to c
382c0 61 63 68 65 20 74 68 65 20 6c 6f 63 61 74 69 6f  ache the locatio
382d0 6e 73 20 6f 66 20 70 61 67 65 73 20 66 72 6f 6d  ns of pages from
382e0 20 74 68 65 20 0a 2a 2a 20 6f 76 65 72 66 6c 6f   the .** overflo
382f0 77 20 6c 69 73 74 20 66 6f 72 20 74 68 65 20 63  w list for the c
38300 75 72 72 65 6e 74 20 72 6f 77 2e 20 54 68 69 73  urrent row. This
38310 20 69 73 20 75 73 65 64 20 62 79 20 63 75 72 73   is used by curs
38320 6f 72 73 20 6f 70 65 6e 65 64 0a 2a 2a 20 66 6f  ors opened.** fo
38330 72 20 69 6e 63 72 65 6d 65 6e 74 61 6c 20 62 6c  r incremental bl
38340 6f 62 20 49 4f 20 6f 6e 6c 79 2e 0a 2a 2a 0a 2a  ob IO only..**.*
38350 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
38360 73 65 74 73 20 61 20 66 6c 61 67 20 6f 6e 6c 79  sets a flag only
38370 2e 20 54 68 65 20 61 63 74 75 61 6c 20 70 61 67  . The actual pag
38380 65 20 6c 6f 63 61 74 69 6f 6e 20 63 61 63 68 65  e location cache
38390 0a 2a 2a 20 28 73 74 6f 72 65 64 20 69 6e 20 42  .** (stored in B
383a0 74 43 75 72 73 6f 72 2e 61 4f 76 65 72 66 6c 6f  tCursor.aOverflo
383b0 77 5b 5d 29 20 69 73 20 61 6c 6c 6f 63 61 74 65  w[]) is allocate
383c0 64 20 61 6e 64 20 75 73 65 64 20 62 79 20 66 75  d and used by fu
383d0 6e 63 74 69 6f 6e 0a 2a 2a 20 61 63 63 65 73 73  nction.** access
383e0 50 61 79 6c 6f 61 64 28 29 20 28 74 68 65 20 77  Payload() (the w
383f0 6f 72 6b 65 72 20 66 75 6e 63 74 69 6f 6e 20 66  orker function f
38400 6f 72 20 73 71 6c 69 74 65 33 42 74 72 65 65 44  or sqlite3BtreeD
38410 61 74 61 28 29 20 61 6e 64 0a 2a 2a 20 73 71 6c  ata() and.** sql
38420 69 74 65 33 42 74 72 65 65 50 75 74 44 61 74 61  ite3BtreePutData
38430 28 29 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ())..*/.void sql
38440 69 74 65 33 42 74 72 65 65 43 61 63 68